Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 905a3a8f by Tony Chemit at 2021-02-11T09:09:38+01:00 Review some start action accelerator (replace Alt+Q by Alt+S) (the first one looks more than a quit command...) - - - - - e961cb3b by Tony Chemit at 2021-02-11T09:10:43+01:00 Improve data management messages - - - - - eb3f89cf by Tony Chemit at 2021-02-11T09:55:53+01:00 Déplacement de marées pas effectif - See #1786 Pouvoir appliquer l'action sur une sélection multiple - - - - - db1c77ff by Tony Chemit at 2021-02-11T12:14:55+01:00 Add nice NavigationResult.getProgram method - - - - - 3a7b5612 by Tony Chemit at 2021-02-11T12:16:19+01:00 Déplacement de marées pas effectif - See #1786 Mauvais paramétrage des provider de nœuds - - - - - cbb69419 by Tony Chemit at 2021-02-11T12:16:43+01:00 Déplacement de marées pas effectif - See #1786 Suppression capability non utilisée - - - - - ae75ca80 by Tony Chemit at 2021-02-11T14:23:04+01:00 Déplacement de marées pas effectif - See #1786 Rendre effective le déplacement multiple depuis un nœud de type liste. - - - - - 5b9d1633 by Tony Chemit at 2021-02-11T15:02:24+01:00 On en voit plus les DCP! - Closes #1782 Déplacement de marées pas effectif - Closes #1786 - - - - - 31e9b8fe by Tony Chemit at 2021-02-11T17:24:33+01:00 On en voit plus les DCP! - Closes #1782 Déplacement de marées pas effectif - Closes #1786 Amélioration de la boite de dialogue de suppression - Closes #1787 - - - - - 24 changed files: - client/datasource/actions/src/main/i18n/getters/java.getter - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/actions/DataManager.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/actions/Apply.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/actions/Apply.java - client/datasource/editor/api/src/main/i18n/getters/java.getter - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/ObserveKeyStrokesEditorApi.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/id/ChangeId.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/MoveRequest.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/MoveRequestBuilder.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/tree/DefaultMultipleMoveTreeAdapter.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/list/ContentListUI.jcss - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/list/ContentListUINavigationNode.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/NavigationNode.java - − client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/capability/ReferenceListContainerCapability.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/root/RootNavigationCapability.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/root/RootNavigationTreeNodeProvider.java - client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/LlRootNavigationTreeNodeProvider.java - client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/PsRootNavigationTreeNodeProvider.java - client/i18n/src/main/i18n/translations/observe_en_GB.properties - client/i18n/src/main/i18n/translations/observe_es_ES.properties - client/i18n/src/main/i18n/translations/observe_fr_FR.properties - models/dto/java/src/main/java/fr/ird/observe/dto/referential/common/ProgramReference.java - pom.xml - services/api/src/main/java/fr/ird/observe/services/service/data/NavigationResult.java Changes: ===================================== client/datasource/actions/src/main/i18n/getters/java.getter ===================================== @@ -40,10 +40,16 @@ observe.ui.datasource.editor.actions.consolidate.message.trip observe.ui.datasource.editor.actions.consolidate.start.trip observe.ui.datasource.editor.actions.consolidate.title observe.ui.datasource.editor.actions.consolidate.title.tip +observe.ui.datasource.editor.actions.data.copy +observe.ui.datasource.editor.actions.data.delete +observe.ui.datasource.editor.actions.data.delete.result +observe.ui.datasource.editor.actions.data.export.result +observe.ui.datasource.editor.actions.data.import.add.missing.referential +observe.ui.datasource.editor.actions.data.import.add.missing.referential.for.type +observe.ui.datasource.editor.actions.data.import.result +observe.ui.datasource.editor.actions.data.import.title.require.add.missing.referential observe.ui.datasource.editor.actions.exportData observe.ui.datasource.editor.actions.exportData.description -observe.ui.datasource.editor.actions.exportData.message.add.missing.referential -observe.ui.datasource.editor.actions.exportData.message.add.missing.referentials2 observe.ui.datasource.editor.actions.exportData.message.not.possible observe.ui.datasource.editor.actions.exportData.message.operation.needFix observe.ui.datasource.editor.actions.exportData.message.prepare.data @@ -88,11 +94,6 @@ observe.ui.datasource.editor.actions.synchro.data.deleteFromRight.tip observe.ui.datasource.editor.actions.synchro.data.description observe.ui.datasource.editor.actions.synchro.data.launch.operation observe.ui.datasource.editor.actions.synchro.data.message.data.loaded -observe.ui.datasource.editor.actions.synchro.data.prepare.copyToTask -observe.ui.datasource.editor.actions.synchro.data.prepare.deleteTask -observe.ui.datasource.editor.actions.synchro.data.result.delete.trip -observe.ui.datasource.editor.actions.synchro.data.result.export.trip -observe.ui.datasource.editor.actions.synchro.data.result.import.trip observe.ui.datasource.editor.actions.synchro.data.task.copyToLeft observe.ui.datasource.editor.actions.synchro.data.task.copyToRight observe.ui.datasource.editor.actions.synchro.data.task.deleteFromLeft @@ -190,7 +191,6 @@ observe.ui.datasource.storage.config.source.storage observe.ui.datasource.storage.step.label observe.ui.message.no.report.selected observe.ui.message.select.report -observe.ui.title.can.not.export.data2 observe.ui.title.choose.db.dump.directory observe.ui.title.choose.reportFile observe.ui.title.storage.info ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/actions/DataManager.java ===================================== @@ -49,13 +49,14 @@ import io.ultreia.java4all.lang.Strings; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.runtime.swing.wizard.ext.WizardState; import javax.swing.JOptionPane; import java.util.Collection; import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static io.ultreia.java4all.i18n.I18n.n; import static io.ultreia.java4all.i18n.I18n.t; @@ -119,6 +120,7 @@ public class DataManager { return targetSourceLabel; } + @SuppressWarnings({"unchecked", "rawtypes"}) public WizardState insertMissingReferential(Collection<String> idsToCopy) { progressModel.increments(); @@ -141,7 +143,7 @@ public class DataManager { UsageForDisplayUI<ReferentialDtoReference> usagesUI = UsageForDisplayUIHandler.showMissingReferential(getMessage(), usages); int response = ClientUIContext.askUser(null, - t("observe.ui.title.can.not.export.data2", getTargetSourceLabel()), + t("observe.ui.datasource.editor.actions.data.import.title.require.add.missing.referential", getTargetSourceLabel()), usagesUI, JOptionPane.WARNING_MESSAGE, new Object[]{ @@ -154,18 +156,18 @@ public class DataManager { return WizardState.CANCELED; } - log.info(String.format("Base «%s» - Insertion des référentiels manquants.", getTargetSourceLabel())); - + StringBuilder parameters = new StringBuilder(); DecoratorService decoratorService = action.getDecoratorService(); for (Class<? extends ReferentialDtoReference> key : ReferentialDtoReference.filterReferentialReference(usages.types())) { Set<? extends ReferentialDtoReference> references = usages.get(key); String type = t(ContentReferentialUII18nHelper.getType(key)); - action.sendMessage(t("observe.ui.datasource.editor.actions.exportData.message.add.missing.referentials2", getTargetSourceLabel(), references.size(), type)); - Decorator<?> decorator = decoratorService.getReferenceDecorator(key); - for (DtoReference reference : references) { - action.sendMessage(t("observe.ui.datasource.editor.actions.exportData.message.add.missing.referential", reference)); - } + decoratorService.installDecorator(key, (Stream) references.stream()); + String labels = references.stream().map(Object::toString).collect(Collectors.joining("\n\t * ")); + parameters.append(t("observe.ui.datasource.editor.actions.data.import.add.missing.referential.for.type", getTargetSourceLabel(), references.size(), type, labels)); + parameters.append("\n"); } + action.sendMessage(t("observe.ui.datasource.editor.actions.data.import.add.missing.referential", getTargetSourceLabel(), parameters.toString())); + progressModel.increments(); targetReferentialService.insertMissingReferential(missingReferentialResult.getSqlCode()); return WizardState.SUCCESSED; @@ -178,11 +180,11 @@ public class DataManager { String tripId = trip.getId(); - action.sendMessage(t("observe.ui.datasource.editor.actions.synchro.data.prepare.deleteTask", getTargetSourceLabel(), program, trip)); + action.sendMessage(t("observe.ui.datasource.editor.actions.data.delete", getTargetSourceLabel(), program, trip)); progressModel.increments(); DeleteTripRequest deleteTripRequest = new DeleteTripRequest(programId, tripId); DeleteTripResult deleteTripResult = targetSource.getTripManagementService().deleteTrip(deleteTripRequest); - logDeleteResult(n("observe.ui.datasource.editor.actions.synchro.data.result.delete.trip"), + logDeleteResult(n("observe.ui.datasource.editor.actions.data.delete.result"), getTargetSourceLabel(), deleteTripResult, program, @@ -199,11 +201,11 @@ public class DataManager { decoratorService.registerDecoratorInReference(program); decoratorService.registerDecoratorInReference((DtoReference) trip); - action.sendMessage(t("observe.ui.datasource.editor.actions.synchro.data.prepare.copyToTask", targetSourceLabel, program, trip)); + action.sendMessage(t("observe.ui.datasource.editor.actions.data.copy", targetSourceLabel, program, trip)); progressModel.increments(); ExportTripRequest exportTripRequest = new ExportTripRequest(!targetSource.isLocal(), programId, tripId); ExportTripResult exportTripResult = incomingSource.getTripManagementService().exportTrip(exportTripRequest); - logExportResult(n("observe.ui.datasource.editor.actions.synchro.data.result.export.trip"), + logExportResult(n("observe.ui.datasource.editor.actions.data.export.result"), getIncomingSourceLabel(), exportTripResult, program, @@ -211,10 +213,10 @@ public class DataManager { progressModel.increments(); ImportTripRequest importTripRequest = new ImportTripRequest(exportTripResult); - log.info("Use import script: "+importTripRequest.getSqlContent().getLocation()); + log.info("Use import script: " + importTripRequest.getSqlContent().getLocation()); ImportTripResult importTripResult = targetSource.getTripManagementService().importTrip(importTripRequest); - logImportResult(n("observe.ui.datasource.editor.actions.synchro.data.result.import.trip"), - n("observe.ui.datasource.editor.actions.synchro.data.result.delete.trip"), + logImportResult(n("observe.ui.datasource.editor.actions.data.import.result"), + n("observe.ui.datasource.editor.actions.data.delete.result"), targetSourceLabel, importTripResult, program, ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/actions/Apply.java ===================================== @@ -52,7 +52,7 @@ import static io.ultreia.java4all.i18n.I18n.t; public class Apply extends DataSynchroUIActionSupport { public Apply() { - super(t("observe.ui.action.apply"), t("observe.ui.action.apply"), "accept", 'Q'); + super(t("observe.ui.action.apply"), t("observe.ui.action.apply"), "accept", 'S'); } @Override ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/actions/Apply.java ===================================== @@ -54,7 +54,7 @@ import static io.ultreia.java4all.i18n.I18n.t; public class Apply extends ReferentialSynchroUIActionSupport { public Apply() { - super(t("observe.ui.action.apply"), t("observe.ui.action.apply"), "accept", 'Q'); + super(t("observe.ui.action.apply"), t("observe.ui.action.apply"), "accept", 'S'); } @Override ===================================== client/datasource/editor/api/src/main/i18n/getters/java.getter ===================================== @@ -190,7 +190,9 @@ observe.ui.action.test.remote observe.ui.action.test.remote.tip observe.ui.action.test.server observe.ui.action.test.server.tip +observe.ui.choice.apply observe.ui.choice.cancel +observe.ui.choice.cancel.tip observe.ui.choice.confirm.delete observe.ui.choice.confirm.replace observe.ui.choice.continue @@ -293,6 +295,7 @@ observe.ui.message.show.usage.for.desactivated observe.ui.message.show.usages observe.ui.message.table.editBean.modified observe.ui.message.table.editBean.modified.but.invalid +observe.ui.move.selectTarget observe.ui.title.can.not.delete.referentiel observe.ui.title.can.not.export.obstuna observe.ui.title.choose.db.dump ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/ObserveKeyStrokesEditorApi.java ===================================== @@ -70,6 +70,8 @@ public class ObserveKeyStrokesEditorApi extends ObserveKeyStrokesSupport { public static final KeyStroke KEY_STROKE_COPY_VALUES_AND_SAVE = KeyStroke.getKeyStroke("ctrl pressed T"); + public static final KeyStroke KEY_STROKE_SELECT_TARGET = KeyStroke.getKeyStroke("pressed F2"); + public static final KeyStroke KEY_STROKE_GO_TO_OPEN = KeyStroke.getKeyStroke("alt pressed O"); public static final KeyStroke KEY_STROKE_TOGGLE_OBSERVATION_AVAILABILITY = KeyStroke.getKeyStroke("ctrl pressed F1"); public static final KeyStroke KEY_STROKE_TOGGLE_LOGBOOK_AVAILABILITY = KeyStroke.getKeyStroke("ctrl pressed F2"); ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/id/ChangeId.java ===================================== @@ -72,6 +72,8 @@ public class ChangeId<U extends ContentUI> extends ContentUIActionSupport<U> imp ui.open(); NavigationTree tree = ui.getHandler().getDataSourceEditor().getNavigationUI().getTree(); NavigationNode selectedNode = tree.getSelectedNode(); + //FIXME:Tree No on a such referential node, there is no child! no no need to do this + //FIXME:Test use a less brutal node method selectedNode.updateNode(); selectedNode.nodeChanged(); ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/MoveRequest.java ===================================== @@ -58,14 +58,19 @@ public class MoveRequest { * Id of parent data where move. */ private final String newParentId; + /** + * to select target node after move operation. + */ + private final boolean selectTarget; - public MoveRequest(Class<? extends DataDtoReference> referenceType, Class<? extends DtoReference> parentReferenceType, Class<? extends DtoReference> parentTargetReferenceType, String oldParentId, ImmutableSet<String> ids, String newParentId) { + public MoveRequest(Class<? extends DataDtoReference> referenceType, Class<? extends DtoReference> parentReferenceType, Class<? extends DtoReference> parentTargetReferenceType, String oldParentId, ImmutableSet<String> ids, String newParentId, boolean selectTarget) { this.referenceType = referenceType; this.parentReferenceType = parentReferenceType; this.parentTargetReferenceType = parentTargetReferenceType; this.oldParentId = oldParentId; this.ids = ids; this.newParentId = newParentId; + this.selectTarget = selectTarget; } public Class<? extends DataDtoReference> getReferenceType() { @@ -96,6 +101,10 @@ public class MoveRequest { return ids.iterator().next(); } + public boolean isSelectTarget() { + return selectTarget; + } + public boolean isSingle() { return ids.size() == 1; } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/MoveRequestBuilder.java ===================================== @@ -24,6 +24,7 @@ package fr.ird.observe.client.datasource.editor.api.content.actions.move; import com.google.common.collect.ImmutableSet; import fr.ird.observe.client.ClientUIContextApplicationComponent; +import fr.ird.observe.client.datasource.editor.api.ObserveKeyStrokesEditorApi; import fr.ird.observe.client.datasource.editor.api.content.data.edit.ContentEditUIModel; import fr.ird.observe.client.datasource.editor.api.content.data.list.ContentListUIModel; import fr.ird.observe.client.datasource.editor.api.content.data.open.ContentOpenableUII18nHelper; @@ -38,11 +39,25 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.nuiton.decorator.JXPathDecorator; +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.ActionMap; +import javax.swing.InputMap; import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComponent; import javax.swing.JLabel; +import javax.swing.JLayeredPane; import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.JSeparator; +import javax.swing.KeyStroke; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; import java.awt.BorderLayout; +import java.awt.Font; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -56,6 +71,7 @@ import static io.ultreia.java4all.i18n.I18n.t; * @author Tony Chemit - dev@tchemit.fr * @since 8.0.1 */ +@SuppressWarnings("UnusedReturnValue") public class MoveRequestBuilder { private static final Logger log = LogManager.getLogger(MoveRequestBuilder.class); @@ -75,6 +91,12 @@ public class MoveRequestBuilder { * Ids to move. */ private final ImmutableSet<String> ids; + /** + * To get selected target request value. + */ + private final JCheckBox selectTarget; + private final AbstractAction selectTargetAction; + private final AbstractAction applyAction; /** * To get parent candidates. */ @@ -91,6 +113,8 @@ public class MoveRequestBuilder { * Message of dialog to select new parent. */ private String askNewParentMessage; + private JButton jButton; + private JOptionPane optionPane; static class BuilderImpl implements StepSetParentCandidates, StepBuild { private final MoveRequestBuilder builder; @@ -151,6 +175,32 @@ public class MoveRequestBuilder { this.parentReferenceType = Objects.requireNonNull(parentReferenceType); this.oldParentId = Objects.requireNonNull(oldParentId); this.ids = Objects.requireNonNull(ids); + KeyStroke keyStroke = ObserveKeyStrokesEditorApi.KEY_STROKE_SELECT_TARGET; + String t = ObserveKeyStrokesEditorApi.suffixTextWithKeyStroke(t("observe.ui.move.selectTarget"), keyStroke); + this.selectTarget = new JCheckBox(t); + selectTargetAction = new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + selectTarget.setSelected(!selectTarget.isSelected()); + log.info(String.format("select target? %s", selectTarget.isSelected())); + } + }; + selectTargetAction.putValue(Action.ACCELERATOR_KEY, keyStroke); + selectTargetAction.putValue(Action.NAME, t); + selectTarget.setFocusable(false); + keyStroke = ObserveKeyStrokesEditorApi.KEY_STROKE_APPLY; + t = ObserveKeyStrokesEditorApi.suffixTextWithKeyStroke(t("observe.ui.choice.apply"), keyStroke); + + 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); +// selectTarget.setAction(selectTargetAction); } public MoveRequestBuilder setParentTargetReferenceType(Class<? extends DtoReference> parentTargetReferenceType) { @@ -189,7 +239,7 @@ public class MoveRequestBuilder { if (newParentId == null) { return Optional.empty(); } - return Optional.of(new MoveRequest(referenceType, parentReferenceType, parentTargetReferenceType, oldParentId, ids, newParentId)); + return Optional.of(new MoveRequest(referenceType, parentReferenceType, parentTargetReferenceType, oldParentId, ids, newParentId, selectTarget.isSelected())); } private Optional<String> askNewParent(List<? extends DtoReference> parentCandidates, String dialogTitle, String dialogMessage) { @@ -199,20 +249,66 @@ public class MoveRequestBuilder { (JXPathDecorator) ClientUIContextApplicationComponent.value().getDecoratorService().getReferenceDecorator(parentTargetReferenceType), parentCandidates); - String continueActionText = t("observe.ui.choice.continue"); - Object[] options = {continueActionText, t("observe.ui.choice.cancel")}; - JPanel panel = new JPanel(new BorderLayout()); - panel.add(BorderLayout.NORTH, new JLabel(t(dialogMessage))); - panel.add(BorderLayout.CENTER, editor); + String continueActionText = (String) applyAction.getValue(Action.NAME); + Object[] options = {continueActionText}; + JPanel panel = new JPanel(new BorderLayout(3, 3)); + + JPanel panel0 = new JPanel(new BorderLayout(3, 3)); + + JPanel panel2 = new JPanel(new GridLayout(0, 1)); + + panel0.add(BorderLayout.NORTH, new JLabel(t(dialogMessage))); + panel0.add(BorderLayout.CENTER, editor); + panel0.add(BorderLayout.SOUTH, panel2); + + //FIXME:Move Add a default client configuration option to set this value + selectTarget.setSelected(false); + + panel2.add(new JLabel()); + panel2.add(selectTarget); + + JLabel information = new JLabel(t("observe.ui.choice.cancel.tip"), UIHelper.getUIManagerActionIcon("information"), SwingConstants.LEFT); + information.setFont(information.getFont().deriveFont(Font.ITALIC).deriveFont(11f)); + + JPanel panel4 = new JPanel(new GridLayout(0, 1)); + JPanel panel5 = new JPanel(new BorderLayout()); + panel4.add(panel5); + panel4.add(BorderLayout.NORTH, new JSeparator(SwingConstants.HORIZONTAL)); + panel4.add(BorderLayout.CENTER, information); - JOptionPane pane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.DEFAULT_OPTION, null, options, options[0]); + panel.add(BorderLayout.NORTH, panel0); + panel.add(BorderLayout.SOUTH, panel4); - JButton jButton = UsageUIHandlerSupport.findButton(pane, continueActionText); + InputMap inputMap1 = panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + inputMap1.put((KeyStroke) selectTargetAction.getValue(Action.ACCELERATOR_KEY), "selectTarget"); + + 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"); + + ActionMap actionMap = panel.getActionMap(); + actionMap.put("selectTarget", selectTargetAction); + actionMap.put("apply", applyAction); + + optionPane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.DEFAULT_OPTION, null, options, options[0]) { + @Override + public void selectInitialValue() { + + JLayeredPane parent = (JLayeredPane) optionPane.getParent().getParent(); + + InputMap inputMap = parent.getRootPane().getInputMap(2); + + inputMap.put(KeyStroke.getKeyStroke("pressed ENTER"), "none"); + inputMap.put(KeyStroke.getKeyStroke("ctrl pressed ENTER"), "none"); + + SwingUtilities.invokeLater(editor.getCombobox()::requestFocus); + } + }; + jButton = UsageUIHandlerSupport.findButton(optionPane, continueActionText); Objects.requireNonNull(jButton); jButton.setEnabled(false); editor.getModel().addPropertyChangeListener("selectedItem", evt -> jButton.setEnabled(evt.getNewValue() != null)); - - int response = UIHelper.askUser(ClientUIContextApplicationComponent.value().getMainUI(), pane, t(dialogTitle), options); + int response = UIHelper.askUser(ClientUIContextApplicationComponent.value().getMainUI(), optionPane, t(dialogTitle), options); DtoReference newParent = null; if (response == 0) { ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/tree/DefaultMultipleMoveTreeAdapter.java ===================================== @@ -22,9 +22,13 @@ package fr.ird.observe.client.datasource.editor.api.content.actions.move.tree; * #L% */ +import com.google.common.collect.ImmutableSet; import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveRequest; +import fr.ird.observe.client.datasource.editor.api.content.data.list.ContentListUINavigationNode; import fr.ird.observe.client.datasource.editor.api.navigation.NavigationTree; import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; +import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavigationNode; +import fr.ird.observe.dto.referential.common.ProgramReference; /** * Created on 15/10/2020. @@ -36,15 +40,70 @@ public class DefaultMultipleMoveTreeAdapter implements MoveTreeAdapter { @Override public void adaptTree(MoveRequest request, NavigationTree tree) { + ImmutableSet<String> ids = request.getIds(); + // get old parent node + ContentListUINavigationNode oldParentNode = (ContentListUINavigationNode) tree.getSelectedNode().upToReferenceContainerNode(request.getReferenceType()); - NavigationNode selectedNode = tree.getSelectedNode(); - NavigationNode oldChildContainerNode = selectedNode.upToReferenceContainerNode(request.getParentReferenceType()); - oldChildContainerNode.updateNode(); + // get shared ancestor of tow parents + NavigationNode parentContainerNode = oldParentNode.upToReferenceContainerNode(request.getParentReferenceType()); - NavigationNode oldParentContainerReferenceNode = selectedNode.upToReferenceContainerNode(request.getParentReferenceType()); + // get new parent node + ContentListUINavigationNode newParentNode = getNewParentNode(request, parentContainerNode); - NavigationNode newParentNode = oldParentContainerReferenceNode.downToReferenceNode(request.getParentTargetReferenceType(), request.getNewParentId()); - newParentNode.updateNode(); + // update it + newParentNode.addChildren(ids); + + // clean old paren node + cleanOldParentNode(tree, ids, oldParentNode); + + if (request.isSelectTarget()) { + // select new parent node + tree.selectSafeNode(newParentNode); + } else { + if (oldParentNode.getParent() == null) { + // limit case: select first node in tree (previous old parent node was removed) + tree.selectFirstNode(); + } + } + } + + protected void cleanOldParentNode(NavigationTree tree, ImmutableSet<String> ids, ContentListUINavigationNode oldParentNode) { + if (oldParentNode.getChildCount() == ids.size() && oldParentNode.getParent().isRoot()) { + RootNavigationNode root = (RootNavigationNode) oldParentNode.getParent(); + if (!root.getInitializer().getConfig().isLoadEmptyProgram()) { + // limit case : node will be empty, must remove it + root.remove(oldParentNode); + return; + } + } + // clean it + oldParentNode.removeChildren(ids); + + // reload node + oldParentNode.reloadNodeData(); + + // re-select the node (to update associated form) + tree.reSelectSafeNode(oldParentNode); + } + + protected ContentListUINavigationNode getNewParentNode(MoveRequest request, NavigationNode oldParentContainerNode) { + String newParentId = request.getNewParentId(); + if (oldParentContainerNode.isRoot()) { + RootNavigationNode root = (RootNavigationNode) oldParentContainerNode; + boolean loadEmptyProgram = root.getInitializer().getConfig().isLoadEmptyProgram(); + if (!loadEmptyProgram) { + NavigationNode result = root.findChildById(newParentId); + if (result == null) { + // limit case : node does not exist (was empty previously), need to create it + ProgramReference reference = root.getInitializer().getNavigationResult().getProgram(newParentId); + result = root.getCapability().createChildNode(reference); + int position = root.getCapability().getNodePosition(reference); + root.insert(result, position); + } + return (ContentListUINavigationNode) result; + } + } + return (ContentListUINavigationNode) oldParentContainerNode.downToReferenceNode(request.getParentTargetReferenceType(), newParentId); } -} +} \ No newline at end of file ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/list/ContentListUI.jcss ===================================== @@ -60,12 +60,8 @@ visible:{states.isEditable()}; } -/*#create { - enabled:{states.isEditable()}; -}*/ - #move { - enabled:{states.isUpdatingMode() && states.isOneOrMoreSelectedData()}; + enabled:{states.isEditable() && states.isOneOrMoreSelectedData()}; } #delete { ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/list/ContentListUINavigationNode.java ===================================== @@ -22,6 +22,7 @@ package fr.ird.observe.client.datasource.editor.api.content.data.list; * #L% */ +import com.google.common.collect.ImmutableSet; import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; import fr.ird.observe.dto.reference.DataDtoReference; import fr.ird.observe.dto.reference.DtoReference; @@ -29,6 +30,7 @@ import fr.ird.observe.dto.reference.LazyDataDtoReferenceSet; import io.ultreia.java4all.lang.Objects2; import java.util.List; +import java.util.Set; /** * Created on 07/10/2020. @@ -79,4 +81,25 @@ public abstract class ContentListUINavigationNode extends NavigationNode { return getInitializer().getParentReference(); } + public void removeChildren(ImmutableSet<String> ids) { + for (String id : ids) { + NavigationNode childNode = findChildById(id); + childNode.removeFromParent(); + } + } + + public void addChildren(Set<String> ids) { + ContentListUINavigationInitializer initializer = getInitializer(); + boolean notLoaded = isNotLoaded(); + reloadNodeData(); + List<? extends DataDtoReference> references = initializer.getReferences(); + ContentListUINavigationCapability<?> capability = getCapability(); + for (DataDtoReference reference : references) { + if (notLoaded || ids.contains(reference.getId())) { + NavigationNode childNode = capability.createChildNode(reference); + int nodePosition = capability.getNodePosition(reference); + insert(childNode, nodePosition); + } + } + } } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/NavigationNode.java ===================================== @@ -30,7 +30,6 @@ import fr.ird.observe.client.datasource.editor.api.navigation.tree.capability.Nu import fr.ird.observe.client.datasource.editor.api.navigation.tree.capability.ReferenceCapability; import fr.ird.observe.client.datasource.editor.api.navigation.tree.capability.ReferenceContainerCapability; import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavigationNode; -import fr.ird.observe.dto.reference.DataDtoReference; import fr.ird.observe.dto.reference.DtoReference; import fr.ird.observe.toolkit.dto.navigation.NavigationModelNode; import fr.ird.observe.toolkit.dto.navigation.edit.EditNode; @@ -276,7 +275,7 @@ public abstract class NavigationNode extends DefaultMutableTreeNode implements W // Update methods //-------------------------------------------------------------------------------------------- - public final <R extends DataDtoReference> int getChildrenPosition(R reference, Comparator<R> referenceComparator) { + public final <R extends DtoReference> int getChildrenPosition(R reference, Comparator<R> referenceComparator) { List<R> list = getChildrenReferences(reference); list.add(reference); list.sort(referenceComparator); ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/capability/ReferenceListContainerCapability.java deleted ===================================== @@ -1,35 +0,0 @@ -package fr.ird.observe.client.datasource.editor.api.navigation.tree.capability; - -/*- - * #%L - * ObServe Client :: DataSource :: Editor :: API - * %% - * Copyright (C) 2008 - 2021 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.navigation.tree.NavigationNode; - -/** - * Created on 08/11/2020. - * - * @author Tony Chemit - dev@tchemit.fr - * @since 8.0.1 - */ -public interface ReferenceListContainerCapability<N extends NavigationNode> extends ContainerCapability<N> { - -} ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/root/RootNavigationCapability.java ===================================== @@ -28,7 +28,6 @@ import fr.ird.observe.client.configuration.NavigationTreeConfig; import fr.ird.observe.client.datasource.editor.api.content.referential.ReferentialHomeUINavigationNode; import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; import fr.ird.observe.client.datasource.editor.api.navigation.tree.capability.ReferenceContainerCapability; -import fr.ird.observe.client.datasource.editor.api.navigation.tree.capability.ReferenceListContainerCapability; import fr.ird.observe.dto.reference.DtoReference; import fr.ird.observe.dto.referential.ReferentialDto; import fr.ird.observe.dto.referential.common.ProgramReference; @@ -45,7 +44,7 @@ import java.util.stream.Collectors; * @author Tony Chemit - dev@tchemit.fr * @since 8.0.1 */ -public class RootNavigationCapability implements ReferenceContainerCapability<RootNavigationNode>, ReferenceListContainerCapability<RootNavigationNode> { +public class RootNavigationCapability implements ReferenceContainerCapability<RootNavigationNode> { private final RootNavigationNode node; @@ -55,7 +54,7 @@ public class RootNavigationCapability implements ReferenceContainerCapability<Ro public RootNavigationCapability(RootNavigationNode node) { this.node = Objects.requireNonNull(node); this.acceptedNodeTypes = SingletonSupplier.of(() -> getNode().getInitializer().getRootNodeProviders().stream().flatMap(m -> m.getAcceptedNodeTypes().stream()).collect(ImmutableList.toImmutableList())); - this.acceptedTypes = SingletonSupplier.of(() -> getNode().getInitializer().getRootNodeProviders().stream().map(RootNavigationTreeNodeProvider::getAcceptedType).filter(Objects::nonNull).collect(ImmutableList.toImmutableList())); + this.acceptedTypes = SingletonSupplier.of(() -> getNode().getInitializer().getRootNodeProviders().stream().map(RootNavigationTreeNodeProvider::getAcceptedType).filter(Objects::nonNull).distinct().collect(ImmutableList.toImmutableList())); } @Override @@ -95,7 +94,7 @@ public class RootNavigationCapability implements ReferenceContainerCapability<Ro @Override public int getNodePosition(DtoReference reference) { - return 0; + return getNode().getChildrenPosition((ProgramReference) reference, ProgramReference.COMPARATOR_WITH_GEAR_PREFIX); } public RootNavigationTreeNodeProvider<?> getProvider(ProgramReference referenceType) { ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/root/RootNavigationTreeNodeProvider.java ===================================== @@ -28,7 +28,7 @@ import fr.ird.observe.client.configuration.NavigationTreeConfig; import fr.ird.observe.client.datasource.editor.api.content.data.list.ContentListUINavigationNode; import fr.ird.observe.client.datasource.editor.api.content.referential.ReferentialHomeUINavigationNode; import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; -import fr.ird.observe.dto.reference.DataDtoReference; +import fr.ird.observe.dto.reference.DtoReference; import fr.ird.observe.dto.referential.ReferentialDto; import fr.ird.observe.dto.referential.common.ProgramReference; import fr.ird.observe.services.service.data.NavigationResult; @@ -53,7 +53,7 @@ public abstract class RootNavigationTreeNodeProvider<B extends fr.ird.observe.sp private final B module; private final int priority; private final ImmutableList<Class<? extends NavigationNode>> acceptedNodeTypes; - private final Class<? extends DataDtoReference> acceptedType; + private final Class<? extends DtoReference> acceptedType; public static synchronized List<RootNavigationTreeNodeProvider<?>> getProviders() { if (PROVIDERS == null) { @@ -66,7 +66,7 @@ public abstract class RootNavigationTreeNodeProvider<B extends fr.ird.observe.sp return PROVIDERS; } - protected RootNavigationTreeNodeProvider(BusinessProject project, B module, ImmutableList<Class<? extends NavigationNode>> acceptedNodeTypes, Class<? extends DataDtoReference> acceptedType) { + protected RootNavigationTreeNodeProvider(BusinessProject project, B module, ImmutableList<Class<? extends NavigationNode>> acceptedNodeTypes, Class<? extends DtoReference> acceptedType) { this.module = Objects.requireNonNull(module); this.acceptedNodeTypes = acceptedNodeTypes; this.acceptedType = acceptedType; @@ -112,7 +112,7 @@ public abstract class RootNavigationTreeNodeProvider<B extends fr.ird.observe.sp return acceptedNodeTypes; } - public Class<? extends DataDtoReference> getAcceptedType() { + public Class<? extends DtoReference> getAcceptedType() { return acceptedType; } ===================================== client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/LlRootNavigationTreeNodeProvider.java ===================================== @@ -27,7 +27,6 @@ import com.google.common.collect.ImmutableList; import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavigationNode; import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavigationTreeNodeProvider; import fr.ird.observe.client.datasource.editor.ll.data.common.TripListUINavigationNode; -import fr.ird.observe.dto.data.ll.common.TripReference; import fr.ird.observe.dto.referential.common.ProgramReference; import fr.ird.observe.spi.module.ObserveBusinessProject; import fr.ird.observe.spi.module.ll.BusinessModule; @@ -45,7 +44,7 @@ public class LlRootNavigationTreeNodeProvider extends RootNavigationTreeNodeProv fr.ird.observe.client.datasource.editor.ll.referential.common.ReferentialHomeUINavigationNode.class, fr.ird.observe.client.datasource.editor.ll.referential.landing.ReferentialHomeUINavigationNode.class, fr.ird.observe.client.datasource.editor.ll.referential.observation.ReferentialHomeUINavigationNode.class), - TripReference.class); + ProgramReference.class); } @Override ===================================== client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/PsRootNavigationTreeNodeProvider.java ===================================== @@ -27,7 +27,6 @@ import com.google.common.collect.ImmutableList; import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavigationNode; import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavigationTreeNodeProvider; import fr.ird.observe.client.datasource.editor.ps.data.common.TripListUINavigationNode; -import fr.ird.observe.dto.data.ll.common.TripReference; import fr.ird.observe.dto.referential.common.ProgramReference; import fr.ird.observe.spi.module.ObserveBusinessProject; import fr.ird.observe.spi.module.ps.BusinessModule; @@ -44,7 +43,7 @@ public class PsRootNavigationTreeNodeProvider extends RootNavigationTreeNodeProv ImmutableList.of(TripListUINavigationNode.class, fr.ird.observe.client.datasource.editor.ps.referential.common.ReferentialHomeUINavigationNode.class, fr.ird.observe.client.datasource.editor.ps.referential.observation.ReferentialHomeUINavigationNode.class), - TripReference.class); + ProgramReference.class); } @Override ===================================== client/i18n/src/main/i18n/translations/observe_en_GB.properties ===================================== @@ -1295,7 +1295,9 @@ observe.ui.action.test.server.tip=Click here to validate server connexion observe.ui.action.translate=Translate observe.ui.action.translate.tip=Translate application observe.ui.action.validate.config.generateReport=Generate validation report +observe.ui.choice.apply=Apply observe.ui.choice.cancel=Cancel +observe.ui.choice.cancel.tip=To cancel, press ESCAPE key. observe.ui.choice.confirm.delete=Confirm delete observe.ui.choice.confirm.insert=Confirm to insert observe.ui.choice.confirm.replace=Replace @@ -1326,10 +1328,16 @@ observe.ui.datasource.editor.actions.consolidate.message.trip=Data consolidate f observe.ui.datasource.editor.actions.consolidate.start.trip=Start consolidate data on trip %s / %s (%s) observe.ui.datasource.editor.actions.consolidate.title=Consolidate data observe.ui.datasource.editor.actions.consolidate.title.tip=Consolidate observed data +observe.ui.datasource.editor.actions.data.copy=Database «%s» - Register operation copy to database\: %s - %s +observe.ui.datasource.editor.actions.data.delete=Database «%s» - Register operation delete from database\: %s - %s +observe.ui.datasource.editor.actions.data.delete.result=Database «%s» - Trip %s - %s was removed from database. +observe.ui.datasource.editor.actions.data.export.result=Database «%s» - Trip %s - %s was exported from database. +observe.ui.datasource.editor.actions.data.import.add.missing.referential=Database «%s» - Insert all missing referentials\n%s +observe.ui.datasource.editor.actions.data.import.add.missing.referential.for.type=Database «%s» - Insert %s missing referentials of type «%s»\:%s +observe.ui.datasource.editor.actions.data.import.result=Database «%s» - Trip %s - %s was imported into database. +observe.ui.datasource.editor.actions.data.import.title.require.add.missing.referential=Need to confirm missing referential insertion observe.ui.datasource.editor.actions.exportData=Export data observe.ui.datasource.editor.actions.exportData.description=Export data -observe.ui.datasource.editor.actions.exportData.message.add.missing.referential=\t%s -observe.ui.datasource.editor.actions.exportData.message.add.missing.referentials2=Database «%s» - Insert %s missing referentials of type «%s» observe.ui.datasource.editor.actions.exportData.message.not.possible=Export is not possible (see above messages) observe.ui.datasource.editor.actions.exportData.message.operation.needFix=Select data to export. observe.ui.datasource.editor.actions.exportData.message.prepare.data=Prepare data to export... @@ -1392,11 +1400,6 @@ observe.ui.datasource.editor.actions.synchro.data.deleteFromRight.tip=Delete sel observe.ui.datasource.editor.actions.synchro.data.description=Advanced data management observe.ui.datasource.editor.actions.synchro.data.launch.operation=Get data fro databases observe.ui.datasource.editor.actions.synchro.data.message.data.loaded=Database «%s» - Data loaded -observe.ui.datasource.editor.actions.synchro.data.prepare.copyToTask=Database «%s» - Register operation copy to database\: %s - %s -observe.ui.datasource.editor.actions.synchro.data.prepare.deleteTask=Database «%s» - Register operation delete from database\: %s - %s -observe.ui.datasource.editor.actions.synchro.data.result.delete.trip=Database «%s» - Trip %s - %s was removed from database. -observe.ui.datasource.editor.actions.synchro.data.result.export.trip=Database «%s» - Trip %s - %s was exported from database. -observe.ui.datasource.editor.actions.synchro.data.result.import.trip=Database «%s» - Trip %s - %s was imported into database. observe.ui.datasource.editor.actions.synchro.data.task.copyToLeft=Copy to left database\: <i>%s</i> - «<b>%s</b>» observe.ui.datasource.editor.actions.synchro.data.task.copyToRight=Copy to right database\: <i>%s</i> - «<b>%s</b>» observe.ui.datasource.editor.actions.synchro.data.task.deleteFromLeft=Delete from left database\: <i>%s</i> - «<b>%s</b>» @@ -1672,22 +1675,20 @@ observe.ui.message.reload.i18n=You have modified i18n, application must be resta observe.ui.message.save.configuration=Save configuration in file %1$s observe.ui.message.select.report=Select a report observe.ui.message.server.info=Local database %1$s is ready in server mode. -observe.ui.message.show.missing.referential=List of missing referential observe.ui.message.show.usage.for.delete=Referential %1$s "%2$s" can be deleted if you choose a replacement. observe.ui.message.show.usage.for.delete2=Some data are using this referential, see following references. observe.ui.message.show.usage.for.delete3=Choose a replacement reference to be able to delete. observe.ui.message.show.usage.for.desactivated=Referential %1$s "%2$s" will be disabled. observe.ui.message.show.usage.for.desactivated2=Some data are using this referential, see following reference observe.ui.message.show.usage.for.desactivated3=Those data need to use another enabled referential to be saved. -observe.ui.message.show.usage.for.missingReferentials2=There is some referentials present in «%s» source but not in the «%s» one. observe.ui.message.show.usages=List of usage of referential %1$s\: '%2$s' observe.ui.message.table.editBean.modified=Current entry is modifed and valid. observe.ui.message.table.editBean.modified.but.invalid=Current entry is modified but not valid. observe.ui.message.warning.will.be.delete=%1$s\n\nBe ware, export will replace existing data. +observe.ui.move.selectTarget=Select new parent node after move? observe.ui.textArea.tip=<html><body><ul><li>To focus on next widget, use accelerator <b>Ctrl + Tab</b></li><li>To focus on previous widget, use accelerator <b>Ctrl + Shift + Tab</b></body></html> observe.ui.title.about=About observe.ui.title.can.not.delete.referentiel=Impossible to delete a referentiel data... -observe.ui.title.can.not.export.data2=Could not export data to «%s» source observe.ui.title.can.not.export.obstuna=Could not export obstuna data... observe.ui.title.choose.db.dump=Choose a database backup observe.ui.title.choose.db.dump.directory=Chhose directory of backup ===================================== client/i18n/src/main/i18n/translations/observe_es_ES.properties ===================================== @@ -1295,7 +1295,9 @@ observe.ui.action.test.server.tip=Pulsar para comprobar la conexión con el serv observe.ui.action.translate=Traduire \#TODO observe.ui.action.translate.tip=Traduire l'application \#TODO observe.ui.action.validate.config.generateReport=Generar un informe de validación +observe.ui.choice.apply=Utilizar observe.ui.choice.cancel=Cancelar +observe.ui.choice.cancel.tip=To cancel, press ESCAPE key. \#TODO observe.ui.choice.confirm.delete=Eliminar observe.ui.choice.confirm.insert=Confirmer l'insertion \#TODO observe.ui.choice.confirm.replace=Reemplazar @@ -1326,10 +1328,16 @@ observe.ui.datasource.editor.actions.consolidate.message.trip=Datos calculados p observe.ui.datasource.editor.actions.consolidate.start.trip=Démarrage de la consolidation pour la marée %s / %s (%s) \#TODO observe.ui.datasource.editor.actions.consolidate.title=Consolidar los datos observados observe.ui.datasource.editor.actions.consolidate.title.tip=Consolidar los datos observados +observe.ui.datasource.editor.actions.data.copy=Base «%s» - Preparación de la copia \: %s - %s +observe.ui.datasource.editor.actions.data.delete=Base «%s» - Preparación de la eliminación de la base \: %s - %s +observe.ui.datasource.editor.actions.data.delete.result=Base «%s» - Eliminación de la marea %s - %s en la base. +observe.ui.datasource.editor.actions.data.export.result=Base «%s» - Exportación de la marea %s - %s desde la base. +observe.ui.datasource.editor.actions.data.import.add.missing.referential=Database «%s» - Insert all missing referentials\n%s +observe.ui.datasource.editor.actions.data.import.add.missing.referential.for.type=Base «%s» - Insertion de %s référentiels de type «%s»\:%s\#TODO +observe.ui.datasource.editor.actions.data.import.result=Base «%s» - Inserción de la marea %s - %s en la base. +observe.ui.datasource.editor.actions.data.import.title.require.add.missing.referential=Need to confirm missing referential insertion \#TODO observe.ui.datasource.editor.actions.exportData=Exportar los datos observados observe.ui.datasource.editor.actions.exportData.description=Exportar los datos observados en la base central -observe.ui.datasource.editor.actions.exportData.message.add.missing.referential=\t%s -observe.ui.datasource.editor.actions.exportData.message.add.missing.referentials2=Base «%s» - Insertion de %s référentiels de type «%s»\#TODO observe.ui.datasource.editor.actions.exportData.message.not.possible=La exportación no es posible (vea el mensaje anterior). observe.ui.datasource.editor.actions.exportData.message.operation.needFix=Seleccione las mareas a exportar. observe.ui.datasource.editor.actions.exportData.message.prepare.data=Preparación de los datos a exportar... @@ -1392,11 +1400,6 @@ observe.ui.datasource.editor.actions.synchro.data.deleteFromRight.tip=Eliminar l observe.ui.datasource.editor.actions.synchro.data.description=Gestión avanzada de los datos de los usuarios observe.ui.datasource.editor.actions.synchro.data.launch.operation=Recuperar los datos de las fuentes de datos observe.ui.datasource.editor.actions.synchro.data.message.data.loaded=Base «%s» - Datos recuperadas. -observe.ui.datasource.editor.actions.synchro.data.prepare.copyToTask=Base «%s» - Preparación de la copia \: %s - %s -observe.ui.datasource.editor.actions.synchro.data.prepare.deleteTask=Base «%s» - Preparación de la eliminación de la base \: %s - %s -observe.ui.datasource.editor.actions.synchro.data.result.delete.trip=Base «%s» - Eliminación de la marea %s - %s en la base. -observe.ui.datasource.editor.actions.synchro.data.result.export.trip=Base «%s» - Exportación de la marea %s - %s desde la base. -observe.ui.datasource.editor.actions.synchro.data.result.import.trip=Base «%s» - Inserción de la marea %s - %s en la base. observe.ui.datasource.editor.actions.synchro.data.task.copyToLeft=Copiar en la base de la izquierda \: <i>%s</i> - «<b>%s</b>» observe.ui.datasource.editor.actions.synchro.data.task.copyToRight=Copiar en la base de la derecha \: <i>%s</i> - «<b>%s</b>» observe.ui.datasource.editor.actions.synchro.data.task.deleteFromLeft=Eliminar en la base de la izquierda \: <i>%s</i> - «<b>%s</b>» @@ -1672,22 +1675,20 @@ observe.ui.message.reload.i18n=Vous avez modifié des traductions, le redémarra observe.ui.message.save.configuration=Guardar la configuración en el archivo %1$s observe.ui.message.select.report=Seleccione informe observe.ui.message.server.info=Información modo servidor -observe.ui.message.show.missing.referential=List of missing referential \#TODO observe.ui.message.show.usage.for.delete=El referencial %1$s "%2$s" no se puede eliminar sin hacer una sustitución antes. observe.ui.message.show.usage.for.delete2=Los objetos están usando actualmente las referencias que se enumeran a continuación. observe.ui.message.show.usage.for.delete3=Elija una referencia de reemplazo para poder borrar. observe.ui.message.show.usage.for.desactivated=El referencial %1$s "%2$s" se desactivará. observe.ui.message.show.usage.for.desactivated2=Los objetos están usando actualmente las referencias que se enumeran a continuación.. observe.ui.message.show.usage.for.desactivated3=Estos objetos deben usar otro referencial (no desactivado) para poder actualizarse. -observe.ui.message.show.usage.for.missingReferentials2=There is some referentials present in «%s» source but not in the «%s» one. observe.ui.message.show.usages=Listas de usos de referenciales %1$s \: '%2$s' observe.ui.message.table.editBean.modified=El registro actual se ha modificado y es válido. observe.ui.message.table.editBean.modified.but.invalid=El registro actual se ha modificado pero no es válido. observe.ui.message.warning.will.be.delete=%1$s\n\nAtención, la exportación reemplazará la marea existente. +observe.ui.move.selectTarget=Select new parent node after move? \#TODO observe.ui.textArea.tip=<html><body><ul><li>To focus on next widget, use accelerator <b>Ctrl + Tab</b></li><li>To focus on previous widget, use accelerator <b>Ctrl + Shift + Tab</b></body></html> \#TODO observe.ui.title.about=A proposito de ObServe... observe.ui.title.can.not.delete.referentiel=Impossible eliminar un referencial en proceso de utilización... -observe.ui.title.can.not.export.data2=Impossible d'exporter les données vers la base «%s»... \#TODO observe.ui.title.can.not.export.obstuna=Impossible exportar los datos de obstuna... observe.ui.title.choose.db.dump=Seleccionar una copia de seguridad de base local observe.ui.title.choose.db.dump.directory=Seleccionar e directorio de destinación de la copia de seguridad ===================================== client/i18n/src/main/i18n/translations/observe_fr_FR.properties ===================================== @@ -1295,7 +1295,9 @@ observe.ui.action.test.server.tip=Cliquer pour valider la connexion au serveur observe.ui.action.translate=Traduire observe.ui.action.translate.tip=Traduire l'application observe.ui.action.validate.config.generateReport=Générer un rapport de validation +observe.ui.choice.apply=Appliquer observe.ui.choice.cancel=Annuler +observe.ui.choice.cancel.tip=Pour annuler, presser la touche ÉCHAP. observe.ui.choice.confirm.delete=Supprimer observe.ui.choice.confirm.insert=Confirmer l'insertion observe.ui.choice.confirm.replace=Remplacer @@ -1326,10 +1328,16 @@ observe.ui.datasource.editor.actions.consolidate.message.trip=Données calculée observe.ui.datasource.editor.actions.consolidate.start.trip=Démarrage de la consolidation pour la marée %s / %s (%s) observe.ui.datasource.editor.actions.consolidate.title=Consolider les données observateur observe.ui.datasource.editor.actions.consolidate.title.tip=Consolider les données observateur +observe.ui.datasource.editor.actions.data.copy=Source «%s» - Préparation de la recopie \: %s - %s +observe.ui.datasource.editor.actions.data.delete=Source «%s» - Préparation de la suppression \: %s - %s +observe.ui.datasource.editor.actions.data.delete.result=Source «%s» - Suppression de la marée %s - %s effectuée. +observe.ui.datasource.editor.actions.data.export.result=Source «%s» - Export de la marée %s - %s effectuée. +observe.ui.datasource.editor.actions.data.import.add.missing.referential=Source «%s» - Insertion de %d référentiels manquants\n%s +observe.ui.datasource.editor.actions.data.import.add.missing.referential.for.type=Source «%s» - Insertion de %s référentiels de type «%s» \:%s +observe.ui.datasource.editor.actions.data.import.result=Source «%s» - Insertion de la marée %s - %s effectuée. +observe.ui.datasource.editor.actions.data.import.title.require.add.missing.referential=Confirmation requise pour insérer les référentiels manquants observe.ui.datasource.editor.actions.exportData=Exporter les données observateurs observe.ui.datasource.editor.actions.exportData.description=Exporter les données observateurs vers la base centrale -observe.ui.datasource.editor.actions.exportData.message.add.missing.referential=\t%s -observe.ui.datasource.editor.actions.exportData.message.add.missing.referentials2=Source «%s» - Insertion de %s référentiels de type «%s» observe.ui.datasource.editor.actions.exportData.message.not.possible=L'opération d'export n'est pas possible (voir les messages précédents). observe.ui.datasource.editor.actions.exportData.message.operation.needFix=Veuillez sélectionner les marées à exporter. observe.ui.datasource.editor.actions.exportData.message.prepare.data=Préparation des données à exporter... @@ -1392,11 +1400,6 @@ observe.ui.datasource.editor.actions.synchro.data.deleteFromRight.tip=Supprimer observe.ui.datasource.editor.actions.synchro.data.description=Gestion avancée des données utilisateurs observe.ui.datasource.editor.actions.synchro.data.launch.operation=Récupérer les données des sources de données observe.ui.datasource.editor.actions.synchro.data.message.data.loaded=Source «%s» - Données récupérées. -observe.ui.datasource.editor.actions.synchro.data.prepare.copyToTask=Source «%s» - Préparation de la recopie \: %s - %s -observe.ui.datasource.editor.actions.synchro.data.prepare.deleteTask=Source «%s» - Préparation de la suppression \: %s - %s -observe.ui.datasource.editor.actions.synchro.data.result.delete.trip=Source «%s» - Suppression de la marée %s - %s effectuée. -observe.ui.datasource.editor.actions.synchro.data.result.export.trip=Source «%s» - Export de la marée %s - %s effectuée. -observe.ui.datasource.editor.actions.synchro.data.result.import.trip=Source «%s» - Insertion de la marée %s - %s effectuée. observe.ui.datasource.editor.actions.synchro.data.task.copyToLeft=Copier vers la base de gauche \: <i>%s</i> - «<b>%s</b>» observe.ui.datasource.editor.actions.synchro.data.task.copyToRight=Copier vers la base de droite \: <i>%s</i> - «<b>%s</b>» observe.ui.datasource.editor.actions.synchro.data.task.deleteFromLeft=Supprimer de la base de gauche \: <i>%s</i> - «<b>%s</b>» @@ -1672,22 +1675,20 @@ observe.ui.message.reload.i18n=Vous avez modifié des traductions, le redémarra observe.ui.message.save.configuration=Sauvegarde de la configuration dans le fichier %1$s observe.ui.message.select.report=Choisissez une requête observe.ui.message.server.info=La base locale %1$s est démarrée en mode serveur. -observe.ui.message.show.missing.referential=Liste des référentiels manquants observe.ui.message.show.usage.for.delete=Le référentiel %1$s "%2$s" ne peut pas être supprimé sans effectuer au préalable un remplacement. observe.ui.message.show.usage.for.delete2=Des objets utilisent actuellement cet entité dont les références sont citées plus bas. observe.ui.message.show.usage.for.delete3=Pour pouvoir supprimer l'objet, vous devez choisir une autre référence de remplacement. observe.ui.message.show.usage.for.desactivated=Le référentiel %1$s "%2$s" va être désactivé. observe.ui.message.show.usage.for.desactivated2=Des objets utilisent actuellement cet entité dont les références sont citées plus bas. observe.ui.message.show.usage.for.desactivated3=Ces objets devront utiliser un autre référentiel (non désactivé) pour pouvoir être mis à jour. -observe.ui.message.show.usage.for.missingReferentials2=Il existe des référentiels présents dans la base «%s» mais non présents dans la base «%s». observe.ui.message.show.usages=Listes des utilisations du référentiel %1$s \: '%2$s' observe.ui.message.table.editBean.modified=L'entrée en cours d'édition a été modifiée et est valide. observe.ui.message.table.editBean.modified.but.invalid=L'entrée en cours d'édition a été modifiée, mais n'est pas valide. observe.ui.message.warning.will.be.delete=%1$s\n\nAttention, l'export remplacera la marée existante. +observe.ui.move.selectTarget=Se positionner sur le nœud destination après le déplacement ? observe.ui.textArea.tip=<html><body><ul><li>Pour accéder au composant suivant, utilisez les raccourci clavier <b>Ctrl + Tab</b></li><li>Pour accéder au composant précédent, utilisez les raccourci clavier <b>Ctrl + Shift + Tab</b></body></html> observe.ui.title.about=A propos d'ObServe... observe.ui.title.can.not.delete.referentiel=Impossible de supprimer un référentiel en cours d'utilisation... -observe.ui.title.can.not.export.data2=Impossible d'exporter les données vers la base «%s»... observe.ui.title.can.not.export.obstuna=Impossible d'exporter des données d'obstuna... observe.ui.title.choose.db.dump=Choisir une sauvegarder de base locale observe.ui.title.choose.db.dump.directory=Choisir le répertoire de destination de la sauvegarde ===================================== models/dto/java/src/main/java/fr/ird/observe/dto/referential/common/ProgramReference.java ===================================== @@ -37,7 +37,7 @@ import static io.ultreia.java4all.i18n.I18n.t; @GenerateJavaBeanDefinition public class ProgramReference extends GeneratedProgramReference { - public static Comparator<ProgramReference> COMPARATOR_WITH_GEAR_PREFIX = Comparator.comparing(p -> p.getGearTypePrefix() + " " + p.getLabel()); + public static Comparator<ProgramReference> COMPARATOR_WITH_GEAR_PREFIX = Comparator.<ProgramReference>comparingInt(p->isProgramLongline(p) ? 0 : -1).thenComparing(p -> p.getGearTypePrefix() + " " + p.getLabel()); public static boolean isProgramLongline(ProgramReference programDtoRef) { boolean result = false; ===================================== pom.xml ===================================== @@ -147,7 +147,7 @@ <maven.build.timestamp.format>dd/MM/yyyy HH:mm z</maven.build.timestamp.format> <buildDate>${maven.build.timestamp}</buildDate> - <toolkit.version>5.0.2-SNAPSHOT</toolkit.version> + <toolkit.version>5.0.2</toolkit.version> <lib.version.ognl>3.1.28</lib.version.ognl> <!--can't use 1.4.197 (date has changed + blob also)--> ===================================== services/api/src/main/java/fr/ird/observe/services/service/data/NavigationResult.java ===================================== @@ -77,4 +77,8 @@ public class NavigationResult implements ObserveDto { public Date getTimestamp() { return timestamp; } + + public ProgramReference getProgram(String programId) { + return programs.stream().filter(p->programId.equals(p.getId())).findFirst().orElseThrow(); + } } View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/c1620875650a55fab1e9ba07e... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/c1620875650a55fab1e9ba07e... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT