Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 85eefd69 by Tony Chemit at 2022-04-20T17:22:32+02:00 Amélioration de la sélection des marées dans les interfaces graphiques de déplacement. - See #2270 - - - - - 021b27c4 by Tony Chemit at 2022-04-20T17:24:54+02:00 update toolkit - - - - - 11 changed files: - client/datasource/actions/src/main/i18n/getters/java.getter - client/datasource/editor/api/src/main/i18n/getters/java.getter - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/config/TreeConfigUIHandler.java - + client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/layout/MoveLayoutApplyNavigationConfiguration.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/layout/MoveLayoutRequestBuilder.java - client/runner/src/main/i18n/translations/client-runner_en_GB.properties - client/runner/src/main/i18n/translations/client-runner_es_ES.properties - client/runner/src/main/i18n/translations/client-runner_fr_FR.properties - core/services/local/src/main/java/fr/ird/observe/services/local/service/NavigationServiceLocalSupport.java - pom.xml - server/core/src/main/filtered-resources/META-INF/mapping-api-client.wm Changes: ===================================== client/datasource/actions/src/main/i18n/getters/java.getter ===================================== @@ -15,6 +15,7 @@ observe.ui.action.close observe.ui.action.close.synchro.tip observe.ui.action.config.export.required.write.data observe.ui.action.config.left.datasource.required.write.data +observe.ui.action.configuration.tip observe.ui.action.continue observe.ui.action.copy.to.clipBoard observe.ui.action.do.backup.tip @@ -25,7 +26,6 @@ observe.ui.action.goto.previous.stage.tip observe.ui.action.info.storage.tip observe.ui.choice.cancel observe.ui.choice.replace -observe.ui.content.action.configure.tip observe.ui.datasource.actions.config.data.sources.equals observe.ui.datasource.editor.actions.activity.pairing observe.ui.datasource.editor.actions.consolidate ===================================== client/datasource/editor/api/src/main/i18n/getters/java.getter ===================================== @@ -165,6 +165,7 @@ observe.ui.action.info.storage observe.ui.action.info.storage.tip observe.ui.action.load.from.file observe.ui.action.load.from.file.tip +observe.ui.action.move.groupBy.configuration observe.ui.action.move.layout.multiple.message observe.ui.action.move.layout.single.message observe.ui.action.move.message ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/config/TreeConfigUIHandler.java ===================================== @@ -157,8 +157,6 @@ public class TreeConfigUIHandler implements UIHandler<TreeConfigUI>, PropertyCha disableOption(ui, TreeConfig.LOAD_DATA); disableOption(ui, TreeConfig.LOAD_REFERENTIAL); disableOption(ui, TreeConfig.LOAD_EMPTY_GROUP_BY); -// disableOption(ui, TreeConfig.LOAD_DISABLED_GROUP_BY); -// disableOption(ui, TreeConfig.LOAD_NULL_GROUP_BY); } public static void disableOption(TreeConfigUI ui, String id) { @@ -170,6 +168,10 @@ public class TreeConfigUIHandler implements UIHandler<TreeConfigUI>, PropertyCha ui.getSelectionPanel().setVisible(false); } + public static void hideModule(TreeConfigUI ui) { + ui.getModuleChoose().setVisible(false); + } + public TreeConfigUIHandler() { allModules = new TreeMap<>(); allGroupBy = ArrayListMultimap.create(); @@ -223,6 +225,16 @@ public class TreeConfigUIHandler implements UIHandler<TreeConfigUI>, PropertyCha reset(bean); } + public void updateOptions(){ + for (Map.Entry<String, Collection<AbstractButton>> entry : groupByOptions.asMap().entrySet()) { + entry.getValue().forEach(c -> { + if (Objects.equals(true, c.getClientProperty(DISABLED))) { + c.setEnabled(false); + } + }); + } + } + @Override public void propertyChange(PropertyChangeEvent evt) { String propertyName = evt.getPropertyName(); ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/layout/MoveLayoutApplyNavigationConfiguration.java ===================================== @@ -0,0 +1,51 @@ +package fr.ird.observe.client.datasource.editor.api.content.actions.move.layout; + +/*- + * #%L + * ObServe Client :: DataSource :: Editor :: API + * %% + * Copyright (C) 2008 - 2022 IRD, Code Lutin, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ird.observe.client.datasource.editor.api.config.TreeConfigUI; +import fr.ird.observe.client.datasource.editor.api.config.actions.ApplyConfigurationSupport; +import fr.ird.observe.navigation.tree.TreeConfig; + +/** + * Created on 19/04/2022. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 9.0.0 + */ +public class MoveLayoutApplyNavigationConfiguration extends ApplyConfigurationSupport { + private final MoveLayoutRequestBuilder moveLayoutRequestBuilder; + + public MoveLayoutApplyNavigationConfiguration(MoveLayoutRequestBuilder moveLayoutRequestBuilder) { + this.moveLayoutRequestBuilder = moveLayoutRequestBuilder; + } + + @Override + protected void saveConfiguration(TreeConfig originalConfig) { + // never save to application configuration + } + + @Override + protected void applyConsumer(TreeConfigUI ui, boolean canReselectNode) { + moveLayoutRequestBuilder.updateConfiguration(ui.getModel().getBean()); + } +} ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/layout/MoveLayoutRequestBuilder.java ===================================== @@ -22,10 +22,17 @@ package fr.ird.observe.client.datasource.editor.api.content.actions.move.layout; * #L% */ -import fr.ird.observe.client.ClientUIContextApplicationComponent; +import fr.ird.observe.client.WithClientUIContextApi; import fr.ird.observe.client.datasource.editor.api.DataSourceEditor; import fr.ird.observe.client.datasource.editor.api.ObserveKeyStrokesEditorApi; +import fr.ird.observe.client.datasource.editor.api.config.TreeConfigUI; +import fr.ird.observe.client.datasource.editor.api.config.TreeConfigUIHandler; +import fr.ird.observe.client.datasource.editor.api.config.TreeStatistics; +import fr.ird.observe.client.datasource.editor.api.config.TreeStatisticsTemplate; import fr.ird.observe.client.datasource.editor.api.content.actions.mode.ChangeMode; +import fr.ird.observe.client.datasource.editor.api.navigation.NavigationTreeModel; +import fr.ird.observe.client.datasource.editor.api.navigation.NavigationUI; +import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavigationInitializer; import fr.ird.observe.client.datasource.usage.UsageUIHandlerSupport; import fr.ird.observe.client.util.DtoIconHelper; import fr.ird.observe.client.util.UIHelper; @@ -33,9 +40,15 @@ import fr.ird.observe.dto.BusinessDto; import fr.ird.observe.dto.ToolkitIdDtoBean; import fr.ird.observe.dto.ToolkitIdLabel; import fr.ird.observe.dto.data.DataDto; +import fr.ird.observe.dto.data.DataGroupByDto; import fr.ird.observe.dto.data.DataGroupByParameter; +import fr.ird.observe.dto.reference.DataGroupByDtoSet; import fr.ird.observe.navigation.id.CloseNodeVetoException; import fr.ird.observe.navigation.id.IdNode; +import fr.ird.observe.navigation.tree.GroupByHelper; +import fr.ird.observe.navigation.tree.TreeConfig; +import fr.ird.observe.navigation.tree.io.request.ToolkitTreeFlatModelRootRequest; +import fr.ird.observe.services.service.NavigationService; import fr.ird.observe.services.service.data.MoveLayoutRequest; import fr.ird.observe.spi.decoration.I18nDecoratorHelper; import io.ultreia.java4all.decoration.Decorator; @@ -46,15 +59,21 @@ import org.apache.logging.log4j.Logger; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ActionMap; +import javax.swing.BorderFactory; +import javax.swing.DefaultComboBoxModel; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JCheckBox; +import javax.swing.JComboBox; import javax.swing.JComponent; +import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JLayeredPane; import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.JPopupMenu; import javax.swing.JSeparator; +import javax.swing.JToolBar; import javax.swing.KeyStroke; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; @@ -62,6 +81,7 @@ import java.awt.BorderLayout; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; +import java.awt.event.ItemEvent; import java.util.LinkedHashSet; import java.util.List; import java.util.Objects; @@ -79,7 +99,7 @@ import static io.ultreia.java4all.i18n.I18n.t; * @since 8.0.1 */ @SuppressWarnings("UnusedReturnValue") -public class MoveLayoutRequestBuilder { +public class MoveLayoutRequestBuilder implements WithClientUIContextApi { private static final Logger log = LogManager.getLogger(MoveLayoutRequestBuilder.class); /** @@ -102,6 +122,10 @@ public class MoveLayoutRequestBuilder { * Apply action. */ private final AbstractAction applyAction; + /** + * Apply action. + */ + private final AbstractAction configureAction; /** * Optional edit node. */ @@ -144,6 +168,16 @@ public class MoveLayoutRequestBuilder { * Selected layout types. */ private Set<Class<? extends DataDto>> selectedLayoutTypes; + private DataSourceEditor dataSourceEditor; + private FilterableComboBox<ToolkitIdLabel> parentEditor; + private JPanel groupByNamePanel; + private JLabel groupByNameLabel; + private GroupByHelper groupByHelper; + private ToolkitTreeFlatModelRootRequest rootRequest; + private JComboBox<DataGroupByDto<?>> groupByValuesEditor; + private DataGroupByDtoSet<?, ?> dataGroupByDtoSet; + private TreeConfig treeConfig; + private String groupByParameterValue; static class BuilderImpl implements StepSetParentCandidates, StepBuild { private final MoveLayoutRequestBuilder builder; @@ -215,12 +249,24 @@ public class MoveLayoutRequestBuilder { applyAction = new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { - log.info("Apply :)"); jButton.doClick(); } }; applyAction.putValue(Action.ACCELERATOR_KEY, keyStroke); applyAction.putValue(Action.NAME, t); + keyStroke = ObserveKeyStrokesEditorApi.KEY_STROKE_INSERT_CONFIGURE; + t = ObserveKeyStrokesEditorApi.suffixTextWithKeyStroke("", keyStroke); + String tip = ObserveKeyStrokesEditorApi.suffixTextWithKeyStroke(t("observe.ui.tree.action.configure.tip"), keyStroke); + configureAction = new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + doConfigure(); + } + }; + configureAction.putValue(Action.LARGE_ICON_KEY, UIHelper.getUIManagerActionIcon("generate")); + configureAction.putValue(Action.ACCELERATOR_KEY, keyStroke); + configureAction.putValue(Action.NAME, t); + configureAction.putValue(Action.SHORT_DESCRIPTION, tip); } private MoveLayoutRequestBuilder setEditNode(IdNode<?> editNode) { @@ -244,6 +290,7 @@ public class MoveLayoutRequestBuilder { } public Optional<MoveLayoutRequest> build(DataSourceEditor dataSourceEditor) { + this.dataSourceEditor = dataSourceEditor; if (parentTargetDtoType == null) { parentTargetDtoType = oldParentId.getType(); } @@ -254,8 +301,19 @@ public class MoveLayoutRequestBuilder { askNewParentMessage = I18nDecoratorHelper.getPropertyI18nKey(dtoType, "action.move.all.choose.parent.message"); } Objects.requireNonNull(availableLayoutTypes, "No availableLayoutTypes declared in builder"); - DataGroupByParameter groupBy = Objects.requireNonNull(this.groupByValueSupplier, "No groupByValue supplier set.").get(); - List<ToolkitIdLabel> parentCandidates = Objects.requireNonNull(this.parentCandidates, "No parent candidates set.").apply(groupBy, oldParentId.getId()); + DataGroupByParameter dataGroupByParameter = Objects.requireNonNull(this.groupByValueSupplier, "No groupByValue supplier set.").get(); + + groupByParameterValue = dataGroupByParameter.getValue(); + + NavigationTreeModel navigationTreeModel = dataSourceEditor.getNavigationUI().getTree().getModel(); + groupByHelper = navigationTreeModel.getGroupByHelper(); + + RootNavigationInitializer initializer = navigationTreeModel.getRoot().getInitializer(); + rootRequest = initializer.getRequest(); + dataGroupByDtoSet = initializer.getGroupBy(); + treeConfig = new TreeConfig(); + treeConfig.init(navigationTreeModel.getConfig()); + List<ToolkitIdLabel> parentCandidates = Objects.requireNonNull(this.parentCandidates, "No parent candidates set.").apply(dataGroupByParameter, oldParentId.getId()); ToolkitIdLabel newParentId = askNewParent(parentCandidates, askNewParentTitle, askNewParentMessage).orElse(null); if (newParentId == null) { return Optional.empty(); @@ -275,14 +333,13 @@ public class MoveLayoutRequestBuilder { } private Optional<ToolkitIdLabel> askNewParent(List<ToolkitIdLabel> parentCandidates, String dialogTitle, String dialogMessage) { - Decorator decorator = ClientUIContextApplicationComponent.value().getDecoratorService().getToolkitIdLabelDecoratorByType(parentTargetDtoType); - FilterableComboBox<ToolkitIdLabel> editor = UIHelper.newToolkitIdLabelFilterableComboBox(parentTargetDtoType, decorator, parentCandidates); + Decorator decorator = getDecoratorService().getToolkitIdLabelDecoratorByType(parentTargetDtoType); + parentEditor = UIHelper.newToolkitIdLabelFilterableComboBox(parentTargetDtoType, decorator, parentCandidates); String continueActionText = (String) applyAction.getValue(Action.NAME); Object[] options = {continueActionText}; JPanel panel = new JPanel(new BorderLayout(3, 3)); - JPanel panelNorth = new JPanel(new BorderLayout()); JPanel panelMessages = new JPanel(new BorderLayout(3, 3)); boolean single = availableLayoutTypes.size() == 1; @@ -297,20 +354,42 @@ public class MoveLayoutRequestBuilder { panelMessages.add(BorderLayout.NORTH, new JLabel(message)); - JPanel panelMessage2 = new JPanel(new GridLayout(0, 1)); - panelMessage2.add(new JLabel()); - panelMessage2.add(new JLabel(t(dialogMessage))); - panelMessages.add(BorderLayout.SOUTH, panelMessage2); + groupByNamePanel = new JPanel(new BorderLayout()); + groupByNamePanel.setBorder(BorderFactory.createTitledBorder(/*BorderFactory.createLoweredBevelBorder(),*/ t("observe.Common.navigation.config.groupByName") + " ")); - panelNorth.add(BorderLayout.NORTH, panelMessages); - panelNorth.add(BorderLayout.CENTER, editor); + JToolBar toolBar = new JToolBar(); + toolBar.setBorderPainted(false); + toolBar.setFloatable(false); + toolBar.add(new JButton(configureAction)); + + groupByNamePanel.add(BorderLayout.CENTER, groupByNameLabel = new JLabel("")); + groupByNamePanel.add(BorderLayout.EAST, toolBar); + groupByNamePanel.add(BorderLayout.SOUTH, groupByValuesEditor = new JComboBox<>()); + + + JPanel panelConfiguration = new JPanel(new BorderLayout()); + parentEditor.setBorder(BorderFactory.createTitledBorder(/*BorderFactory.createLoweredBevelBorder(),*/t(dialogMessage) + " ")); + + panelConfiguration.add(BorderLayout.CENTER, groupByNamePanel); + panelConfiguration.add(BorderLayout.SOUTH, parentEditor); + + updateConfigurationLabel(); + + updateGroupByValues(); + + groupByValuesEditor.addItemListener(e -> { + if (e.getStateChange() != ItemEvent.SELECTED) { + return; + } + DataGroupByDto<?> newGroupByValue = (DataGroupByDto<?>) e.getItem(); + onGroupByValueChanged(newGroupByValue); + }); JPanel panelSelectTarget = new JPanel(new GridLayout(0, 1)); //FIXME:Move Add a default client configuration option to set this value selectTarget.setSelected(true); panelSelectTarget.add(new JLabel()); panelSelectTarget.add(selectTarget); - panelNorth.add(BorderLayout.SOUTH, panelSelectTarget); JPanel panelSouth = new JPanel(new GridLayout(0, 1)); panelSouth.add(BorderLayout.NORTH, new JSeparator(SwingConstants.HORIZONTAL)); @@ -318,19 +397,27 @@ public class MoveLayoutRequestBuilder { information.setFont(information.getFont().deriveFont(Font.ITALIC).deriveFont(11f)); panelSouth.add(BorderLayout.CENTER, information); + JPanel panelNorth = new JPanel(new BorderLayout()); + panelNorth.add(BorderLayout.NORTH, panelMessages); + panelNorth.add(BorderLayout.CENTER, panelConfiguration); + panelNorth.add(BorderLayout.SOUTH, panelSelectTarget); + panel.add(BorderLayout.NORTH, panelNorth); panel.add(BorderLayout.SOUTH, panelSouth); InputMap inputMap1 = panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); inputMap1.put((KeyStroke) selectTargetAction.getValue(Action.ACCELERATOR_KEY), "selectTarget"); + inputMap1.put((KeyStroke) configureAction.getValue(Action.ACCELERATOR_KEY), "configure"); InputMap inputMap = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); inputMap.put((KeyStroke) selectTargetAction.getValue(Action.ACCELERATOR_KEY), "selectTarget"); inputMap.put((KeyStroke) applyAction.getValue(Action.ACCELERATOR_KEY), "apply"); + inputMap.put((KeyStroke) configureAction.getValue(Action.ACCELERATOR_KEY), "configure"); ActionMap actionMap = panel.getActionMap(); actionMap.put("selectTarget", selectTargetAction); actionMap.put("apply", applyAction); + actionMap.put("configure", configureAction); optionPane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.DEFAULT_OPTION, null, options, options[0]) { @@ -343,18 +430,18 @@ public class MoveLayoutRequestBuilder { inputMap.put(KeyStroke.getKeyStroke("pressed ENTER"), "none"); inputMap.put(KeyStroke.getKeyStroke("ctrl pressed ENTER"), "none"); - if (editor.getCombobox().getModel().getSize() == 1) { + if (parentEditor.getCombobox().getModel().getSize() == 1) { // auto-select unique data - editor.setSelectedItem(parentCandidates.get(0)); + parentEditor.setSelectedItem(parentCandidates.get(0)); } - SwingUtilities.invokeLater(editor.getCombobox()::requestFocus); + SwingUtilities.invokeLater(parentEditor.getCombobox()::requestFocus); } }; + optionPane.setComponentPopupMenu(new JPopupMenu()); jButton = UsageUIHandlerSupport.findButton(optionPane, continueActionText); Objects.requireNonNull(jButton).setIcon(UIHelper.getUIManagerActionIcon("move")); jButton.setEnabled(false); - editor.getModel().addPropertyChangeListener("selectedItem", evt -> jButton.setEnabled(canMove(evt.getNewValue()))); - + parentEditor.getModel().addPropertyChangeListener("selectedItem", evt -> jButton.setEnabled(canMove(evt.getNewValue()))); if (!single) { JPanel typesPanel = new JPanel(new GridLayout(0, 1)); int index = 1; @@ -363,7 +450,7 @@ public class MoveLayoutRequestBuilder { Action typeAction = new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { - jButton.setEnabled(updateSelectedType(typeEditor, type, editor)); + jButton.setEnabled(updateSelectedType(typeEditor, type, parentEditor)); } }; String actionName = "Select-" + type.getName(); @@ -382,15 +469,15 @@ public class MoveLayoutRequestBuilder { typesPanel.add(typeEditor); index++; } - panelMessages.add(BorderLayout.CENTER, typesPanel); } - int response = UIHelper.askUser(ClientUIContextApplicationComponent.value().getMainUI(), optionPane, t(dialogTitle), options); + panelMessages.add(BorderLayout.SOUTH, new JLabel("")); + int response = UIHelper.askUser(getMainUI(), optionPane, t(dialogTitle), options); ToolkitIdLabel newParent = null; if (response == 0) { // will replace and delete - newParent = editor.getModel().getSelectedItem(); + newParent = parentEditor.getModel().getSelectedItem(); log.info(String.format("Selected parent id: %s", newParent)); } if (newParent == null || selectedLayoutTypes.isEmpty()) { @@ -399,6 +486,82 @@ public class MoveLayoutRequestBuilder { return Optional.of(newParent); } + private void onGroupByValueChanged(DataGroupByDto<?> newGroupByValue) { + DataGroupByParameter newGroupBy = new DataGroupByParameter(rootRequest.getGroupByName(), rootRequest.getGroupByFlavor(), newGroupByValue.getFilterValue()); + + List<ToolkitIdLabel> newParentCandidates = parentCandidates.apply(newGroupBy, oldParentId.getId()); + ToolkitIdLabel selectedItem = parentEditor.getModel().getSelectedItem(); + parentEditor.setData(newParentCandidates); + parentEditor.setSelectedItem(newParentCandidates.contains(selectedItem) ? selectedItem : null); + + if (parentEditor.getCombobox().getModel().getSize() == 1) { + // auto-select unique data + parentEditor.setSelectedItem(newParentCandidates.get(0)); + } + SwingUtilities.invokeLater(parentEditor.getCombobox()::requestFocus); + } + + private void doConfigure() { + SwingUtilities.invokeLater(() -> { + NavigationUI ui = dataSourceEditor.getNavigationUI(); + + TreeConfigUI configUI = TreeConfigUIHandler.createUI(ui, + treeConfig, + ui.getTree().getModel().getGroupByHelper(), + new MoveLayoutApplyNavigationConfiguration(this), + ui.getTree()); + + TreeConfigUIHandler.hideOptions(configUI); + TreeConfigUIHandler.hideModule(configUI); + configUI.getHandler().updateOptions(); + configUI.setComponentPopupMenu(optionPane.getComponentPopupMenu()); + SwingUtilities.invokeLater(() -> TreeConfigUIHandler.showPanel(groupByNamePanel, configUI)); + }); + } + + public void updateConfiguration(TreeConfig bean) { + treeConfig = bean; + rootRequest = bean.toRootRequest(groupByHelper); + log.warn(String.format("Will use new request: %s", rootRequest)); + + updateConfigurationLabel(); + + NavigationService navigationService = getDataSourcesManager().getMainDataSource().getNavigationService(); + dataGroupByDtoSet = navigationService.getGroupByDtoSet(rootRequest); + getDecoratorService().installDecorator(dataGroupByDtoSet); + + groupByParameterValue = dataGroupByDtoSet.size() == 0 ? null : dataGroupByDtoSet.toList().get(0).getFilterValue(); + updateGroupByValues(); + SwingUtilities.invokeLater(() -> { + JDialog dialog = (JDialog) SwingUtilities.getAncestorOfClass(JDialog.class, optionPane); + dialog.pack(); + }); + } + + private void updateConfigurationLabel() { + TreeStatistics statistics = new TreeStatistics( + rootRequest, + groupByHelper, + () -> 0, + () -> 0L, + () -> 0L); + String statisticsText = TreeStatisticsTemplate.generateTreeStatisticsText(statistics); + groupByNameLabel.setText(statisticsText.substring(0, statisticsText.lastIndexOf(" /"))); + + } + + private void updateGroupByValues() { + + @SuppressWarnings("unchecked") List<DataGroupByDto<?>> groupByValues = (List<DataGroupByDto<?>>) dataGroupByDtoSet.toList(); + + DataGroupByDto<?> selectedGroupByValue = groupByParameterValue == null ? null : dataGroupByDtoSet.tryGetReferenceById(groupByParameterValue).orElse(null); + + DefaultComboBoxModel<DataGroupByDto<?>> model = (DefaultComboBoxModel<DataGroupByDto<?>>) groupByValuesEditor.getModel(); + model.removeAllElements(); + model.addAll(groupByValues); + model.setSelectedItem(selectedGroupByValue != null ? selectedGroupByValue : groupByValues.isEmpty() ? null : groupByValues.get(0)); + } + private boolean updateSelectedType(JCheckBox typeEditor, Class<? extends DataDto> type, FilterableComboBox<ToolkitIdLabel> editor) { if (selectedLayoutTypes.contains(type)) { selectedLayoutTypes.remove(type); @@ -416,6 +579,7 @@ public class MoveLayoutRequestBuilder { public interface StepSetParentCandidates { + StepSetParentCandidates setEditNode(IdNode<?> editNode); StepSetParentCandidates setGroupByValue(Supplier<DataGroupByParameter> groupByValue); ===================================== client/runner/src/main/i18n/translations/client-runner_en_GB.properties ===================================== @@ -373,6 +373,7 @@ observe.ui.action.locale.fr=French observe.ui.action.locale.fr.tip=Change application's language in french observe.ui.action.locale.uk=English observe.ui.action.locale.uk.tip=Change application's language in english +observe.ui.action.move.groupBy.configuration=Criteria configuration\: observe.ui.action.move.layout.multiple.message=Your are about to move some object from type '%s' beyond the following list\: observe.ui.action.move.layout.single.message=Your are about to move all object of type '%s'. observe.ui.action.move.message=Your are about to move %d object(s) of type '%s'\: ===================================== client/runner/src/main/i18n/translations/client-runner_es_ES.properties ===================================== @@ -373,6 +373,7 @@ observe.ui.action.locale.fr=Francés observe.ui.action.locale.fr.tip=Cambiar el idioma de la applicación al francés observe.ui.action.locale.uk=Inglés observe.ui.action.locale.uk.tip=Cambiar el idioma de la applicación al inglés +observe.ui.action.move.groupBy.configuration=Criteria configuration\: observe.ui.action.move.layout.multiple.message=Your are about to move some object from type '%s' beyond the fowolling list\: observe.ui.action.move.layout.single.message=Your are about to move all object of type '%s'. observe.ui.action.move.message=Your are about to move %d object(s) of type '%s'\: \#TODO ===================================== client/runner/src/main/i18n/translations/client-runner_fr_FR.properties ===================================== @@ -373,6 +373,7 @@ observe.ui.action.locale.fr=Français observe.ui.action.locale.fr.tip=Changer la langue de l'application en français observe.ui.action.locale.uk=Anglais observe.ui.action.locale.uk.tip=Changer la langue de l'application en anglais +observe.ui.action.move.groupBy.configuration=Configuration des critères \: observe.ui.action.move.layout.multiple.message=Vous êtes sur le point de déplacer un ensemble de données sur le type '%s' à sélectionner dans la liste suivante \: observe.ui.action.move.layout.single.message=Vous êtes sur le point de déplacer toutes les données de type '%s'. observe.ui.action.move.message=Vous êtes sur le point de déplacer %d donnée(s) de type '%s'\: ===================================== core/services/local/src/main/java/fr/ird/observe/services/local/service/NavigationServiceLocalSupport.java ===================================== @@ -23,6 +23,7 @@ package fr.ird.observe.services.local.service; */ import fr.ird.observe.dto.db.configuration.ObserveDataSourceConnection; +import fr.ird.observe.dto.reference.DataGroupByDtoSet; import fr.ird.observe.entities.data.DataEntity; import fr.ird.observe.navigation.tree.NavigationResult; import fr.ird.observe.navigation.tree.io.ToolkitTreeFlatModel; @@ -45,6 +46,11 @@ import java.util.Optional; */ public class NavigationServiceLocalSupport extends ObserveServiceLocal implements NavigationService { + @Override + public DataGroupByDtoSet<?, ?> getGroupByDtoSet(ToolkitTreeFlatModelRootRequest request) { + return newTreeBuilder().buildDataGroupByDtoSet(request, now()); + } + @Override public NavigationResult getNavigation(ToolkitTreeFlatModelRootRequest request, Date timestamp) { if (timestamp == null) { ===================================== pom.xml ===================================== @@ -155,7 +155,7 @@ <!-- build timestamp configuration --> <maven.build.timestamp.format>dd/MM/yyyy HH:mm z</maven.build.timestamp.format> <buildDate>${maven.build.timestamp}</buildDate> - <lib.version.toolkit>6.0.9-SNAPSHOT</lib.version.toolkit> + <lib.version.toolkit>6.0.9</lib.version.toolkit> <lib.version.ognl>3.1.29</lib.version.ognl> <!-- FIXME <lib.version.ognl>3.3.2</lib.version.ognl>--> <lib.version.h2>1.4.196</lib.version.h2> ===================================== server/core/src/main/filtered-resources/META-INF/mapping-api-client.wm ===================================== @@ -45,6 +45,7 @@ GET /DataSourceService/produceCreateSqlScript Data GET /DataSourceService/produceDeleteSqlScript DataSourceServiceRestApi.produceDeleteSqlScript GET /DataSourceService/produceMoveSqlScript DataSourceServiceRestApi.produceMoveSqlScript GET /DataSourceService/retainExistingIds DataSourceServiceRestApi.retainExistingIds +GET /NavigationService/getGroupByDtoSet NavigationServiceRestApi.getGroupByDtoSet GET /NavigationService/getNavigation NavigationServiceRestApi.getNavigation GET /NavigationService/loadNavigationPath NavigationServiceRestApi.loadNavigationPath GET /NavigationService/loadNavigationRoot NavigationServiceRestApi.loadNavigationRoot View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/3ae092172bfc924bd25051af4... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/3ae092172bfc924bd25051af4... You're receiving this email because of your account on gitlab.com.