Skip to content

Commit 992817a

Browse files
committed
completed AI training interface
1 parent e038284 commit 992817a

File tree

14 files changed

+195
-34
lines changed

14 files changed

+195
-34
lines changed

logicaldoc-gui/src/main/java/com/logicaldoc/gui/common/client/util/ItemFactory.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -997,8 +997,8 @@ public static SelectItem newAutomationRoutineSelector(String name, Long value, f
997997
select.setOptionDataSource(new AutomationRoutinesDS(showEmpty));
998998
select.setValue(value);
999999

1000-
ChangedHandler setNullOnEmpty = (ChangedEvent event) -> {
1001-
if (event != null && event.getValue().equals("")) {
1000+
ChangedHandler setNullOnEmpty = changed -> {
1001+
if (changed != null && changed.getValue().equals("")) {
10021002
select.setValue((String) null);
10031003
select.clearValue();
10041004
}
@@ -1204,7 +1204,6 @@ public static SelectItem newOCRStatusSelector(Integer value) {
12041204

12051205
public static SelectItem newFolderSecurityOption(String name) {
12061206
SelectItem securityOption = newSelectItem(name);
1207-
// securityOption.setWidth(80);
12081207
LinkedHashMap<String, String> opts = new LinkedHashMap<>();
12091208
opts.put("none", I18N.message("none").toLowerCase());
12101209
opts.put("inherit", I18N.message("inheritparentsec").toLowerCase());
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.logicaldoc.gui.frontend.client.ai.model;
2+
3+
import java.util.HashSet;
4+
import java.util.Set;
5+
6+
/**
7+
* Implements the Observer pattern to distribute events on the models
8+
*
9+
* @author Marco Meschieri - LogicalDOC
10+
* @since 9.2
11+
*/
12+
public class ModelController {
13+
14+
private static ModelController instance = new ModelController();
15+
16+
private Set<ModelObserver> observers = new HashSet<>();
17+
18+
private ModelController() {
19+
}
20+
21+
public static ModelController get() {
22+
return instance;
23+
}
24+
25+
public synchronized void addObserver(ModelObserver observer) {
26+
if (observer != null && !observers.contains(observer)) {
27+
observers.add(observer);
28+
}
29+
}
30+
31+
public synchronized void removeObserver(ModelObserver observer) {
32+
if (observer != null && observers.contains(observer)) {
33+
observers.remove(observer);
34+
}
35+
}
36+
37+
public void changed(GUIModel model) {
38+
synchronized (observers) {
39+
for (ModelObserver observer : observers)
40+
try {
41+
observer.onModelChanged(model);
42+
} catch (Exception t) {
43+
// Nothing to do
44+
}
45+
}
46+
}
47+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.logicaldoc.gui.frontend.client.ai.model;
2+
3+
/**
4+
* A listener to react to model changes
5+
*
6+
* @author Marco Meschieri - LogicalDOC
7+
* @since 9.2
8+
*
9+
*/
10+
public interface ModelObserver {
11+
12+
/**
13+
* Called when something changes in the model
14+
*
15+
* @param model The updated model
16+
*/
17+
public void onModelChanged(GUIModel model);
18+
}

logicaldoc-gui/src/main/java/com/logicaldoc/gui/frontend/client/ai/model/ModelProperties.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,8 @@ private void refresh() {
118118
features.addChangedHandler(changedHandler);
119119
features.setColSpan(4);
120120
features.setWidth(400);
121-
features.setHint(I18N.message("valuescommaseparated"));
121+
features.setHint(I18N.message("featuresseparated"));
122+
features.setShowHintInField(true);
122123
features.setShowHintInField(true);
123124
features.setValue(model.getFeatures());
124125
setNeuralNetworkVisibility(features);
@@ -128,7 +129,7 @@ private void refresh() {
128129
categories.setColSpan(4);
129130
categories.setValue(model.getCategories());
130131
categories.setWidth(400);
131-
categories.setHint(I18N.message("valuescommaseparated"));
132+
categories.setHint(I18N.message("catvalsseparated"));
132133
categories.setShowHintInField(true);
133134
setNeuralNetworkVisibility(categories);
134135

logicaldoc-gui/src/main/java/com/logicaldoc/gui/frontend/client/ai/model/ModelTraining.java

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@
2020
* @author Marco Meschieri - LogicalDOC
2121
* @since 9.2
2222
*/
23-
public class ModelTraining extends ModelDetailsTab {
23+
public class ModelTraining extends ModelDetailsTab implements ModelObserver {
2424

2525
private static final String ENABLED = "enabled";
2626

2727
private DynamicForm form = new DynamicForm();
2828

29+
private TextAreaItem report;
30+
2931
private HLayout container = new HLayout();
3032

3133
private SamplerSelector sampler;
@@ -37,14 +39,17 @@ public ModelTraining(GUIModel model, final ChangedHandler changedHandler) {
3739

3840
setMembers(container);
3941

42+
ModelController.get().addObserver(this);
43+
4044
refresh();
4145
}
4246

4347
private void refresh() {
4448
if (Boolean.TRUE.equals(container.contains(form)))
4549
container.removeChild(form);
4650

47-
ToggleItem enableSchedule = ItemFactory.newToggleItem(ENABLED, "enableschedule", model.getTraining().isEnabled());
51+
ToggleItem enableSchedule = ItemFactory.newToggleItem(ENABLED, "enableschedule",
52+
model.getTraining().isEnabled());
4853
enableSchedule.setWrapTitle(false);
4954
enableSchedule.addChangedHandler(changedHandler);
5055

@@ -75,12 +80,9 @@ private void refresh() {
7580
container.setMembersMargin(3);
7681
container.addMember(form);
7782

78-
TextAreaItem report = ItemFactory.newTextAreaItem("report",
79-
model.getTraining().getLastTrained() != null
80-
? I18N.message("lasttrainedon", I18N.formatDate(model.getTraining().getLastTrained()))
81-
: I18N.message("report"),
82-
model.getTraining().getReport());
83+
report = ItemFactory.newTextAreaItem("report", model.getTraining().getReport());
8384
report.setWidth("*");
85+
onModelChanged(model);
8486

8587
DynamicForm reportForm = new DynamicForm();
8688
reportForm.setWidth100();
@@ -109,4 +111,14 @@ public boolean equals(Object other) {
109111
public int hashCode() {
110112
return super.hashCode();
111113
}
114+
115+
@Override
116+
public void onModelChanged(GUIModel mdl) {
117+
if (this.model.getId() == mdl.getId()) {
118+
report.setValue(mdl.getTraining().getReport());
119+
report.setTitle(mdl.getTraining().getLastTrained() != null
120+
? I18N.message("lasttrainedon", I18N.formatDate(mdl.getTraining().getLastTrained()))
121+
: I18N.message("report"));
122+
}
123+
}
112124
}

logicaldoc-gui/src/main/java/com/logicaldoc/gui/frontend/client/ai/model/ModelsPanel.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,10 @@ public void updateRecord(GUIModel model) {
243243
rec.setAttribute("name", model.getName());
244244
rec.setAttribute(LABEL, model.getLabel() != null ? model.getLabel() : model.getName());
245245
rec.setAttribute(DESCRIPTION, model.getDescription());
246-
rec.setAttribute(TRAINING, model.getTraining().isTraining());
246+
if(!rec.getAttributeAsBoolean(TRAINING).equals(model.getTraining().isTraining())) {
247+
rec.setAttribute(TRAINING, model.getTraining().isTraining());
248+
ModelController.get().changed(model);
249+
}
247250
list.refreshRow(list.getRecordIndex(rec));
248251

249252
}

logicaldoc-gui/src/main/java/com/logicaldoc/gui/frontend/client/ai/sampler/SamplerProperties.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@
66
import com.logicaldoc.gui.common.client.util.ItemFactory;
77
import com.logicaldoc.gui.common.client.widgets.DocumentSelector;
88
import com.logicaldoc.gui.common.client.widgets.FolderSelector;
9+
import com.logicaldoc.gui.frontend.client.metadata.template.AttributeSelector;
910
import com.smartgwt.client.data.AdvancedCriteria;
1011
import com.smartgwt.client.types.AutoFitWidthApproach;
1112
import com.smartgwt.client.types.OperatorId;
1213
import com.smartgwt.client.types.SelectionStyle;
1314
import com.smartgwt.client.types.TitleOrientation;
15+
import com.smartgwt.client.types.VerticalAlignment;
1416
import com.smartgwt.client.widgets.form.DynamicForm;
17+
import com.smartgwt.client.widgets.form.fields.FormItemIcon;
1518
import com.smartgwt.client.widgets.form.fields.SelectItem;
1619
import com.smartgwt.client.widgets.form.fields.StaticTextItem;
1720
import com.smartgwt.client.widgets.form.fields.TextAreaItem;
@@ -148,16 +151,45 @@ private void refresh() {
148151

149152
TextItem category = ItemFactory.newTextItem("category", sampler.getCategory());
150153
category.addChangedHandler(changedHandler);
154+
category.setHint(I18N.message("extattrname"));
155+
category.setShowHintInField(true);
156+
category.setIconVAlign(VerticalAlignment.CENTER);
151157
category.setVisibleWhen(new AdvancedCriteria(TYPE, OperatorId.EQUALS, METADATA));
158+
FormItemIcon takeAttributeForCategory = new FormItemIcon();
159+
takeAttributeForCategory.setName("takeattributes");
160+
takeAttributeForCategory.setSrc("[SKIN]/ballot.svg");
161+
takeAttributeForCategory.setPrompt(I18N.message("takeattributes"));
162+
takeAttributeForCategory.addFormItemClickHandler(click -> new AttributeSelector(
163+
selection -> click.getItem().setValue(selection[0].getAttributeAsString("name"))).show());
164+
category.setIcons(takeAttributeForCategory);
152165

153166
TextItem features = ItemFactory.newTextItem("features", sampler.getFeatures());
154167
features.addChangedHandler(changedHandler);
155168
features.setColSpan(4);
156169
features.setWidth(400);
157-
features.setHint(I18N.message("valuescommaseparated"));
170+
features.setHint(I18N.message("extattrnamesseparated"));
158171
features.setShowHintInField(true);
172+
features.setIconVAlign(VerticalAlignment.CENTER);
159173
features.setVisibleWhen(new AdvancedCriteria(TYPE, OperatorId.EQUALS, METADATA));
160174

175+
FormItemIcon takeAttributeForFeatures = new FormItemIcon();
176+
takeAttributeForFeatures.setName("takeattributes");
177+
takeAttributeForFeatures.setSrc("[SKIN]/ballot.svg");
178+
takeAttributeForFeatures.setPrompt(I18N.message("takeattributes"));
179+
takeAttributeForFeatures.addFormItemClickHandler(click -> new AttributeSelector(selection -> {
180+
String str = click.getItem().getValue() != null ? click.getItem().getValue().toString() : "";
181+
for (ListGridRecord listGridRecord : selection) {
182+
String attrName = listGridRecord.getAttributeAsString("name");
183+
if (!attrName.equals(category.getValue())) {
184+
if (!str.isEmpty())
185+
str += ",";
186+
str += attrName;
187+
}
188+
}
189+
click.getItem().setValue(str);
190+
}).show());
191+
features.setIcons(takeAttributeForFeatures);
192+
161193
form.setItems(id, typeValue, type, name, label, delimiter, quote, folderSelector, documentSelector, category,
162194
features, automation, description);
163195

logicaldoc-gui/src/main/java/com/logicaldoc/gui/frontend/client/metadata/template/AddTemplateAttributeDialog.java renamed to logicaldoc-gui/src/main/java/com/logicaldoc/gui/frontend/client/metadata/template/AttributeSelector.java

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,25 @@
1717
import com.smartgwt.client.widgets.toolbar.ToolStrip;
1818
import com.smartgwt.client.widgets.toolbar.ToolStripButton;
1919

20-
public class AddTemplateAttributeDialog extends Window {
20+
/**
21+
* A window to select extended attributes.
22+
*
23+
* @author Marco Meschieri - LogicalDOC
24+
* @since 9.2
25+
*/
26+
public class AttributeSelector extends Window {
2127

2228
private static final String PRESET = "preset";
2329

2430
private static final String LABEL = "label";
2531

2632
private ListGrid setAttributesList;
2733

28-
private TemplatePropertiesPanel propertiesPanel;
29-
30-
public AddTemplateAttributeDialog(TemplatePropertiesPanel panel) {
31-
this.propertiesPanel = panel;
34+
private AttributeSelectorCallback callback;
3235

36+
public AttributeSelector(AttributeSelectorCallback callback) {
3337
setHeaderControls(HeaderControls.HEADER_LABEL, HeaderControls.CLOSE_BUTTON);
34-
setTitle(I18N.message("attributesets"));
38+
setTitle(I18N.message("attributesselector"));
3539
setWidth(500);
3640
setHeight(400);
3741
setIsModal(true);
@@ -41,6 +45,8 @@ public AddTemplateAttributeDialog(TemplatePropertiesPanel panel) {
4145
setAutoSize(true);
4246

4347
addCloseClickHandler(event -> destroy());
48+
49+
this.callback = callback;
4450
}
4551

4652
@Override
@@ -103,14 +109,14 @@ public void onDraw() {
103109

104110
toolStrip.addSeparator();
105111

106-
ToolStripButton add = new ToolStripButton();
107-
add.setTitle(I18N.message("addselection"));
108-
toolStrip.addButton(add);
109-
add.addClickHandler(event -> {
112+
ToolStripButton select = new ToolStripButton();
113+
select.setTitle(I18N.message("select"));
114+
toolStrip.addButton(select);
115+
select.addClickHandler(event -> {
110116
if (setAttributesList.getSelectedRecords() == null || setAttributesList.getSelectedRecords().length < 1)
111117
SC.warn(I18N.message("pleaseselectanattribute"));
112118
else
113-
propertiesPanel.addAttributes(setAttributesList.getSelectedRecords());
119+
callback.onSelection(setAttributesList.getSelectedRecords());
114120
});
115121

116122
ToolStripButton close = new ToolStripButton();
@@ -152,7 +158,7 @@ public void onSuccess(GUIAttributeSet set) {
152158
}
153159
});
154160
}
155-
161+
156162
@Override
157163
public boolean equals(Object other) {
158164
return super.equals(other);
@@ -162,4 +168,8 @@ public boolean equals(Object other) {
162168
public int hashCode() {
163169
return super.hashCode();
164170
}
171+
172+
public interface AttributeSelectorCallback {
173+
public void onSelection(ListGridRecord[] selection);
174+
}
165175
}

logicaldoc-gui/src/main/java/com/logicaldoc/gui/frontend/client/metadata/template/TemplatePropertiesPanel.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import com.smartgwt.client.types.SelectionStyle;
2525
import com.smartgwt.client.types.TitleOrientation;
2626
import com.smartgwt.client.widgets.Button;
27-
import com.smartgwt.client.widgets.events.DropCompleteEvent;
2827
import com.smartgwt.client.widgets.form.DynamicForm;
2928
import com.smartgwt.client.widgets.form.ValuesManager;
3029
import com.smartgwt.client.widgets.form.fields.CheckboxItem;
@@ -50,7 +49,7 @@
5049
* @author Matteo Caruso - LogicalDOC
5150
* @since 6.0
5251
*/
53-
public class TemplatePropertiesPanel extends HLayout {
52+
public class TemplatePropertiesPanel extends HLayout implements AttributeSelector.AttributeSelectorCallback {
5453

5554
private static final String DEPENDSON = "dependson";
5655

@@ -101,7 +100,7 @@ public TemplatePropertiesPanel(GUITemplate template, ChangedHandler changedHandl
101100
refresh();
102101
}
103102

104-
public void addAttributes(ListGridRecord[] recs) {
103+
private void addAttributes(ListGridRecord[] recs) {
105104
if (recs == null)
106105
return;
107106

@@ -220,7 +219,7 @@ private void prepareTemplateAttributes() {
220219
dependsOn.setAutoFitWidth(true);
221220
dependsOn.setMinWidth(70);
222221

223-
attributesList.addDropCompleteHandler((DropCompleteEvent event) -> {
222+
attributesList.addDropCompleteHandler(dropCompleted -> {
224223
List<String> attributes = new ArrayList<>();
225224
for (int i = 0; i < attributesList.getTotalRows(); i++) {
226225
ListGridRecord rec = attributesList.getRecord(i);
@@ -236,7 +235,7 @@ private void prepareTemplateAttributes() {
236235
Button addAttributes = new Button(I18N.message("addattributes"));
237236
addAttributes.setMargin(2);
238237
addAttributes.setHeight(30);
239-
addAttributes.addClickHandler(click -> new AddTemplateAttributeDialog(TemplatePropertiesPanel.this).show());
238+
addAttributes.addClickHandler(click -> new AttributeSelector(TemplatePropertiesPanel.this).show());
240239

241240
Button addSection = new Button(I18N.message("addsection"));
242241
addSection.setMargin(2);
@@ -881,4 +880,9 @@ public boolean equals(Object other) {
881880
public int hashCode() {
882881
return super.hashCode();
883882
}
883+
884+
@Override
885+
public void onSelection(ListGridRecord[] selection) {
886+
addAttributes(selection);
887+
}
884888
}
Lines changed: 1 addition & 0 deletions
Loading

0 commit comments

Comments
 (0)