Skip to content
This repository was archived by the owner on Apr 22, 2025. It is now read-only.

Commit 9b68cdd

Browse files
committed
Update the new development progress
1 parent 0ed8cc1 commit 9b68cdd

File tree

11 files changed

+140
-76
lines changed

11 files changed

+140
-76
lines changed

mycollab-dao/src/main/java/com/mycollab/db/query/CustomSqlParam.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ import com.mycollab.db.arguments.NoValueSearchField
2222
* @author MyCollab Ltd.
2323
* @since 4.5.0
2424
*/
25-
abstract class CustomSqlParam(id: String) : Param(id) {
25+
abstract class CustomSqlParam<V>(id: String) : Param(id) {
2626

27-
abstract fun buildPropertyParamInList(oper: String, value: Collection<String>?): NoValueSearchField?
27+
abstract fun buildPropertyParamInList(oper: String, value: Collection<V>?): NoValueSearchField?
2828

29-
abstract fun buildPropertyParamNotInList(oper: String, value: Collection<String>?): NoValueSearchField?
29+
abstract fun buildPropertyParamNotInList(oper: String, value: Collection<V>?): NoValueSearchField?
3030
}

mycollab-services/src/main/java/com/mycollab/module/project/domain/criteria/BugSearchCriteria.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,16 @@ class BugSearchCriteria : SearchCriteria() {
4949
var statuses: SetSearchField<String>? = null
5050
var projectId: NumberSearchField? = null
5151

52-
class BugTypeCustomSqlParam internal constructor(id: String, private val type: String) : CustomSqlParam(id) {
52+
class BugTypeCustomSqlParam internal constructor(id: String, private val type: String) : CustomSqlParam<Int>(id) {
5353

54-
override fun buildPropertyParamInList(oper: String, values: Collection<String>?): NoValueSearchField? {
54+
override fun buildPropertyParamInList(oper: String, values: Collection<Int>?): NoValueSearchField? {
5555
if (values == null || values.isEmpty()) {
5656
return null
5757
}
5858
val sqlResult = StringBuilder()
5959
val array = values.toTypedArray()
6060
for (i in array.indices) {
61-
val affectedVersion = Integer.parseInt(array[i])
61+
val affectedVersion = array[i]
6262
val result = object : SQL() {
6363
init {
6464
SELECT("COUNT(*)")
@@ -86,14 +86,14 @@ class BugSearchCriteria : SearchCriteria() {
8686
return NoValueSearchField(oper, sqlResult.toString())
8787
}
8888

89-
override fun buildPropertyParamNotInList(oper: String, values: Collection<String>?): NoValueSearchField? {
89+
override fun buildPropertyParamNotInList(oper: String, values: Collection<Int>?): NoValueSearchField? {
9090
if (values == null || values.isEmpty()) {
9191
return null
9292
}
9393
val sqlResult = StringBuilder()
9494
val array = values.toTypedArray()
9595
for (i in array.indices) {
96-
val affectedVersion = Integer.parseInt(array[i])
96+
val affectedVersion = array[i]
9797
val result = object : SQL() {
9898
init {
9999
SELECT("COUNT(*)")

mycollab-services/src/main/java/com/mycollab/module/project/domain/criteria/ProjectTicketSearchCriteria.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import com.mycollab.module.project.ProjectTypeConstants
2323
import com.mycollab.module.project.i18n.MilestoneI18nEnum
2424
import com.mycollab.module.project.i18n.OptionI18nEnum.Priority
2525
import com.mycollab.module.project.i18n.ProjectI18nEnum
26+
import com.mycollab.module.project.i18n.TicketI18nEnum
27+
import org.apache.ibatis.jdbc.SQL
2628

2729
/**
2830
* @author MyCollab Ltd.
@@ -50,6 +52,10 @@ class ProjectTicketSearchCriteria : SearchCriteria() {
5052

5153
var typeIds: SetSearchField<Int>? = null
5254

55+
var versionIds: SetSearchField<Int>? = null
56+
57+
var componentIds: SetSearchField<Int>? = null
58+
5359
companion object {
5460
private const val serialVersionUID = 1L
5561

@@ -115,5 +121,6 @@ class ProjectTicketSearchCriteria : SearchCriteria() {
115121
@JvmField
116122
val p_projectIds = CacheParamMapper.register(ProjectTypeConstants.TICKET, ProjectI18nEnum.LIST,
117123
PropertyListParam<Int>("projectid", "mainTbl", "projectId"))
124+
118125
}
119126
}

mycollab-services/src/main/resources/sqlMap/project/ProjectTicketMapper.xml

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,34 @@
157157
${searchCriteria.dueDate.operation} mainTbl.dueDate ${searchCriteria.dueDate.comparison} @{searchCriteria.dueDate.value}
158158
#end
159159
160+
#ifnotnull($searchCriteria.versionIds)
161+
${searchCriteria.versionIds.operation} EXISTS (SELECT 1
162+
FROM m_prj_ticket_relation
163+
WHERE m_prj_ticket_relation.rel IN ('AffVersion', 'FixVersion')
164+
AND m_prj_ticket_relation.type = 'Project-Version'
165+
AND m_prj_ticket_relation.ticketType = 'Project-Bug'
166+
AND m_prj_ticket_relation.ticketId = mainTbl.id
167+
AND m_prj_ticket_relation.typeId IN
168+
#repeat(${searchCriteria.versionIds.values} $versionId "," "(" ")")
169+
@{versionId}
170+
#end
171+
LIMIT 1)
172+
#end
173+
174+
#ifnotnull($searchCriteria.componentIds)
175+
${searchCriteria.componentIds.operation} EXISTS (SELECT 1
176+
FROM m_prj_ticket_relation
177+
WHERE m_prj_ticket_relation.rel IN ('Component')
178+
AND m_prj_ticket_relation.type = 'Project-Component'
179+
AND m_prj_ticket_relation.ticketType = 'Project-Bug'
180+
AND m_prj_ticket_relation.ticketId = mainTbl.id
181+
AND m_prj_ticket_relation.typeId IN
182+
#repeat(${searchCriteria.componentIds.values} $componentId "," "(" ")")
183+
@{componentId}
184+
#end
185+
LIMIT 1)
186+
#end
187+
160188
#selectExpr($searchCriteria.extraFields)
161189
]]>
162190
</sql>
@@ -221,6 +249,34 @@
221249
${searchCriteria.dueDate.operation} mainTbl.dueDate ${searchCriteria.dueDate.comparison} @{searchCriteria.dueDate.value}
222250
#end
223251
252+
#ifnotnull($searchCriteria.versionIds)
253+
${searchCriteria.versionIds.operation} EXISTS (SELECT 1
254+
FROM m_prj_ticket_relation
255+
WHERE m_prj_ticket_relation.rel IN ('AffVersion', 'FixVersion')
256+
AND m_prj_ticket_relation.type = 'Project-Version'
257+
AND m_prj_ticket_relation.ticketType = 'Project-Task'
258+
AND m_prj_ticket_relation.ticketId = mainTbl.id
259+
AND m_prj_ticket_relation.typeId IN
260+
#repeat(${searchCriteria.versionIds.values} $versionId "," "(" ")")
261+
@{versionId}
262+
#end
263+
LIMIT 1)
264+
#end
265+
266+
#ifnotnull($searchCriteria.componentIds)
267+
${searchCriteria.componentIds.operation} EXISTS (SELECT 1
268+
FROM m_prj_ticket_relation
269+
WHERE m_prj_ticket_relation.rel IN ('Component')
270+
AND m_prj_ticket_relation.type = 'Project-Component'
271+
AND m_prj_ticket_relation.ticketType = 'Project-Task'
272+
AND m_prj_ticket_relation.ticketId = mainTbl.id
273+
AND m_prj_ticket_relation.typeId IN
274+
#repeat(${searchCriteria.componentIds.values} $componentId "," "(" ")")
275+
@{componentId}
276+
#end
277+
LIMIT 1)
278+
#end
279+
224280
#selectExpr($searchCriteria.extraFields)
225281
]]>
226282
</sql>

mycollab-web/src/main/java/com/mycollab/module/project/view/settings/ComponentAddViewImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ protected AdvancedEditBeanForm<Component> initPreviewForm() {
6969

7070
@Override
7171
protected IFormLayoutFactory initFormLayoutFactory() {
72-
return new DefaultDynaFormLayout(ProjectTypeConstants.COMPONENT, ComponentDefaultFormLayoutFactory.getForm(), "id");
72+
return new DefaultDynaFormLayout(ProjectTypeConstants.COMPONENT, ComponentDefaultFormLayoutFactory.getAddForm(), "id");
7373
}
7474

7575
@Override

mycollab-web/src/main/java/com/mycollab/module/project/view/settings/ComponentDefaultFormLayoutFactory.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,15 @@
2525
import com.mycollab.module.project.i18n.BugI18nEnum;
2626
import com.mycollab.module.project.i18n.ComponentI18nEnum;
2727
import com.mycollab.module.project.domain.Component;
28+
import com.mycollab.module.project.i18n.ProjectCommonI18nEnum;
2829

2930
/**
3031
* @author MyCollab Ltd.
3132
* @since 4.5.4
3233
*/
3334
public class ComponentDefaultFormLayoutFactory {
34-
private static final DynaForm defaultForm;
3535

36-
static {
37-
defaultForm = new DynaForm();
36+
private static DynaSection mainSection() {
3837
DynaSection mainSection = new DynaSectionBuilder().layoutType(LayoutType.ONE_COLUMN).build();
3938

4039
mainSection.fields(new TextDynaFieldBuilder().fieldName(Component.Field.name)
@@ -48,13 +47,21 @@ public class ComponentDefaultFormLayoutFactory {
4847
mainSection.fields(new TextDynaFieldBuilder().fieldName(Component.Field.userlead)
4948
.displayName(ComponentI18nEnum.FORM_LEAD)
5049
.fieldIndex(2).build());
50+
return mainSection;
51+
}
5152

52-
mainSection.fields(new TextDynaFieldBuilder().fieldName(Component.Field.id).displayName(BugI18nEnum.LIST).fieldIndex(3).build());
53+
private static DynaSection assignmentSection() {
54+
DynaSection assignmentSection = new DynaSectionBuilder().layoutType(LayoutType.ONE_COLUMN).header(ProjectCommonI18nEnum.OPT_ASSIGNMENT_LIST).build();
55+
assignmentSection.fields(new TextDynaFieldBuilder().fieldName("section-assignments")
56+
.fieldIndex(6).colSpan(true).build());
57+
return assignmentSection;
58+
}
5359

54-
defaultForm.sections(mainSection);
60+
public static DynaForm getAddForm() {
61+
return new DynaForm(mainSection());
5562
}
5663

57-
public static DynaForm getForm() {
58-
return defaultForm;
64+
public static DynaForm getReadForm() {
65+
return new DynaForm(mainSection(), assignmentSection());
5966
}
6067
}

mycollab-web/src/main/java/com/mycollab/module/project/view/settings/ComponentPreviewForm.java

Lines changed: 45 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,19 @@
1616
*/
1717
package com.mycollab.module.project.view.settings;
1818

19-
import com.mycollab.db.arguments.NumberSearchField;
19+
import com.mycollab.core.utils.DateTimeUtils;
20+
import com.mycollab.db.arguments.DateSearchField;
21+
import com.mycollab.db.arguments.SearchField;
2022
import com.mycollab.db.arguments.SetSearchField;
2123
import com.mycollab.module.project.CurrentProjectVariables;
2224
import com.mycollab.module.project.ProjectTypeConstants;
23-
import com.mycollab.module.project.view.bug.BugRowRenderer;
24-
import com.mycollab.module.project.view.settings.component.ProjectUserFormLinkField;
2525
import com.mycollab.module.project.domain.Component;
26-
import com.mycollab.module.project.domain.SimpleBug;
26+
import com.mycollab.module.project.domain.ProjectTicket;
2727
import com.mycollab.module.project.domain.SimpleComponent;
28-
import com.mycollab.module.project.domain.criteria.BugSearchCriteria;
29-
import com.mycollab.module.project.service.BugService;
28+
import com.mycollab.module.project.domain.criteria.ProjectTicketSearchCriteria;
29+
import com.mycollab.module.project.service.ProjectTicketService;
30+
import com.mycollab.module.project.view.settings.component.ProjectUserFormLinkField;
31+
import com.mycollab.module.project.view.ticket.TicketRowRenderer;
3032
import com.mycollab.spring.AppContextUtil;
3133
import com.mycollab.vaadin.UserUIContext;
3234
import com.mycollab.vaadin.ui.AbstractBeanFieldGroupViewFieldFactory;
@@ -36,9 +38,9 @@
3638
import com.mycollab.vaadin.web.ui.DefaultBeanPagedList;
3739
import com.mycollab.vaadin.web.ui.DefaultDynaFormLayout;
3840
import com.mycollab.vaadin.web.ui.field.ContainerViewField;
41+
import com.vaadin.data.HasValue;
3942
import com.vaadin.ui.Alignment;
4043
import com.vaadin.ui.CheckBox;
41-
import com.vaadin.data.HasValue;
4244
import com.vaadin.ui.Label;
4345
import org.vaadin.viritin.layouts.MHorizontalLayout;
4446
import org.vaadin.viritin.layouts.MVerticalLayout;
@@ -52,7 +54,7 @@
5254
public class ComponentPreviewForm extends AdvancedPreviewBeanForm<SimpleComponent> {
5355
@Override
5456
public void setBean(SimpleComponent bean) {
55-
setFormLayoutFactory(new DefaultDynaFormLayout(ProjectTypeConstants.COMPONENT, ComponentDefaultFormLayoutFactory.getForm(),
57+
setFormLayoutFactory(new DefaultDynaFormLayout(ProjectTypeConstants.COMPONENT, ComponentDefaultFormLayoutFactory.getReadForm(),
5658
Component.Field.name.name()));
5759
setBeanFormFieldFactory(new ReadFormFieldFactory(this));
5860
super.setBean(bean);
@@ -71,9 +73,9 @@ protected HasValue<?> onCreateField(Object propertyId) {
7173
if (Component.Field.userlead.equalTo(propertyId)) {
7274
return new ProjectUserFormLinkField(beanItem.getProjectid(), beanItem.getUserlead(),
7375
beanItem.getUserLeadAvatarId(), beanItem.getUserLeadFullName());
74-
} else if (Component.Field.id.equalTo(propertyId)) {
76+
} else if ("section-assignments".equals(propertyId)) {
7577
ContainerViewField containerField = new ContainerViewField();
76-
containerField.addComponentField(new BugsComp(beanItem));
78+
containerField.addComponentField(new TicketsComp(beanItem));
7779
return containerField;
7880
} else if (Component.Field.description.equalTo(propertyId)) {
7981
return new RichTextViewField();
@@ -82,60 +84,53 @@ protected HasValue<?> onCreateField(Object propertyId) {
8284
}
8385
}
8486

85-
private static class BugsComp extends MVerticalLayout {
86-
private BugSearchCriteria searchCriteria;
87-
private DefaultBeanPagedList<BugService, BugSearchCriteria, SimpleBug> bugList;
87+
private static class TicketsComp extends MVerticalLayout {
88+
private ProjectTicketSearchCriteria searchCriteria;
89+
private DefaultBeanPagedList<ProjectTicketService, ProjectTicketSearchCriteria, ProjectTicket> ticketList;
8890

89-
BugsComp(SimpleComponent beanItem) {
91+
TicketsComp(SimpleComponent beanItem) {
9092
withMargin(false).withFullWidth();
9193
MHorizontalLayout header = new MHorizontalLayout().withFullWidth();
9294

93-
final CheckBox openSelection = new BugStatusCheckbox(StatusI18nEnum.Open, true);
94-
CheckBox reOpenSelection = new BugStatusCheckbox(StatusI18nEnum.ReOpen, true);
95-
CheckBox verifiedSelection = new BugStatusCheckbox(StatusI18nEnum.Verified, true);
96-
CheckBox resolvedSelection = new BugStatusCheckbox(StatusI18nEnum.Resolved, true);
95+
CheckBox openSelection = new CheckBox(UserUIContext.getMessage(StatusI18nEnum.Open), true);
96+
openSelection.addValueChangeListener(valueChangeEvent -> {
97+
if (openSelection.getValue()) {
98+
searchCriteria.setOpen(new SearchField());
99+
} else {
100+
searchCriteria.setOpen(null);
101+
}
102+
updateSearchStatus();
103+
});
104+
105+
CheckBox overdueSelection = new CheckBox(UserUIContext.getMessage(StatusI18nEnum.Overdue), false);
106+
overdueSelection.addValueChangeListener(valueChangeEvent -> {
107+
if (overdueSelection.getValue()) {
108+
searchCriteria.setDueDate(new DateSearchField(DateTimeUtils.getCurrentDateWithoutMS().toLocalDate(),
109+
DateSearchField.LESS_THAN));
110+
} else {
111+
searchCriteria.setDueDate(null);
112+
}
113+
updateSearchStatus();
114+
});
97115

98116
Label spacingLbl1 = new Label("");
99117

100-
header.with(openSelection, reOpenSelection, verifiedSelection,
101-
resolvedSelection, spacingLbl1).alignAll(Alignment.MIDDLE_LEFT).expand(spacingLbl1);
118+
header.with(openSelection, overdueSelection, spacingLbl1).alignAll(Alignment.MIDDLE_LEFT).expand(spacingLbl1);
102119

103-
bugList = new DefaultBeanPagedList(AppContextUtil.getSpringBean(BugService.class), new BugRowRenderer());
104-
bugList.setControlStyle("");
120+
ticketList = new DefaultBeanPagedList(AppContextUtil.getSpringBean(ProjectTicketService.class), new TicketRowRenderer());
121+
ticketList.setControlStyle("");
105122

106-
searchCriteria = new BugSearchCriteria();
107-
searchCriteria.setProjectId(new NumberSearchField(CurrentProjectVariables.getProjectId()));
108-
searchCriteria.setComponentids(new SetSearchField<>(beanItem.getId()));
109-
searchCriteria.setStatuses(new SetSearchField<>(StatusI18nEnum.Open.name(), StatusI18nEnum.ReOpen.name(),
110-
StatusI18nEnum.Verified.name(), StatusI18nEnum.Resolved.name()));
123+
searchCriteria = new ProjectTicketSearchCriteria();
124+
searchCriteria.setProjectIds(new SetSearchField<>(CurrentProjectVariables.getProjectId()));
125+
searchCriteria.setComponentIds(new SetSearchField<>(beanItem.getId()));
126+
searchCriteria.setTypes(new SetSearchField<>(ProjectTypeConstants.BUG, ProjectTypeConstants.TASK));
111127
updateSearchStatus();
112128

113-
this.with(header, bugList);
114-
}
115-
116-
private void updateTypeSearchStatus(boolean selection, String type) {
117-
SetSearchField<String> types = searchCriteria.getStatuses();
118-
if (types == null) {
119-
types = new SetSearchField<>();
120-
}
121-
if (selection) {
122-
types.addValue(type);
123-
} else {
124-
types.removeValue(type);
125-
}
126-
searchCriteria.setStatuses(types);
127-
updateSearchStatus();
129+
this.with(header, ticketList);
128130
}
129131

130132
private void updateSearchStatus() {
131-
bugList.setSearchCriteria(searchCriteria);
132-
}
133-
134-
private class BugStatusCheckbox extends CheckBox {
135-
BugStatusCheckbox(final Enum name, boolean defaultValue) {
136-
super(UserUIContext.getMessage(name), defaultValue);
137-
this.addValueChangeListener(valueChangeEvent -> updateTypeSearchStatus(BugStatusCheckbox.this.getValue(), name.name()));
138-
}
133+
ticketList.setSearchCriteria(searchCriteria);
139134
}
140135
}
141136
}

mycollab-web/src/main/java/com/mycollab/module/project/view/settings/ComponentReadPresenter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public void onCancel() {
9292
public void onPrint(Object source, SimpleComponent data) {
9393
PrintButton btn = (PrintButton) source;
9494
btn.doPrint(data, new FormReportLayout(ProjectTypeConstants.COMPONENT, Component.Field.name.name(),
95-
ComponentDefaultFormLayoutFactory.getForm(), Component.Field.id.name()));
95+
ComponentDefaultFormLayoutFactory.getAddForm(), Component.Field.id.name()));
9696
}
9797

9898
@Override

0 commit comments

Comments
 (0)