Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe

Commits:

29 changed files:

Changes:

  • client/datasource/actions/src/main/i18n/getters/java-enumeration.getter
    ... ... @@ -20,9 +20,9 @@ observe.constant.AdminStep.SYNCHRONIZE
    20 20
     observe.constant.AdminStep.SYNCHRONIZE.description
    
    21 21
     observe.constant.AdminStep.VALIDATE
    
    22 22
     observe.constant.AdminStep.VALIDATE.description
    
    23
    -observe.constant.ReferentialSynchronizeMode.BOTH
    
    24
    -observe.constant.ReferentialSynchronizeMode.FROM_LEFT_TO_RIGHT
    
    25
    -observe.constant.ReferentialSynchronizeMode.FROM_RIGHT_TO_LEFT
    
    23
    +observe.constant.SynchronizeMode.BOTH
    
    24
    +observe.constant.SynchronizeMode.FROM_LEFT_TO_RIGHT
    
    25
    +observe.constant.SynchronizeMode.FROM_RIGHT_TO_LEFT
    
    26 26
     observe.constant.ValidationModelMode.DATA
    
    27 27
     observe.constant.ValidationModelMode.DATA.description
    
    28 28
     observe.constant.ValidationModelMode.REFERENTIEL
    

  • client/datasource/actions/src/main/i18n/getters/java.getter
    ... ... @@ -13,6 +13,7 @@ observe.ui.action.choose.export.csv.directory
    13 13
     observe.ui.action.choose.reportFile
    
    14 14
     observe.ui.action.close
    
    15 15
     observe.ui.action.close.synchro.tip
    
    16
    +observe.ui.action.config.export.required.read.data
    
    16 17
     observe.ui.action.config.export.required.write.data
    
    17 18
     observe.ui.action.config.left.datasource.required.write.data
    
    18 19
     observe.ui.action.configuration.tip
    
    ... ... @@ -104,6 +105,7 @@ observe.ui.datasource.editor.actions.synchro.data.launch.operation
    104 105
     observe.ui.datasource.editor.actions.synchro.data.message.data.loaded
    
    105 106
     observe.ui.datasource.editor.actions.synchro.data.title
    
    106 107
     observe.ui.datasource.editor.actions.synchro.data.title.tip
    
    108
    +observe.ui.datasource.editor.actions.synchro.data.withMode
    
    107 109
     observe.ui.datasource.editor.actions.synchro.launch.operation
    
    108 110
     observe.ui.datasource.editor.actions.synchro.prepare.operation
    
    109 111
     observe.ui.datasource.editor.actions.synchro.referential
    

  • client/datasource/actions/src/main/i18n/getters/jaxx.getter
    ... ... @@ -27,8 +27,8 @@ observe.ui.datasource.editor.actions.report.copy.row.headers.tip
    27 27
     observe.ui.datasource.editor.actions.report.select.file
    
    28 28
     observe.ui.datasource.editor.actions.report.select.file.tip
    
    29 29
     observe.ui.datasource.editor.actions.report.variables
    
    30
    +observe.ui.datasource.editor.actions.synchro.config.mode
    
    30 31
     observe.ui.datasource.editor.actions.synchro.data.actionsToPerform
    
    31
    -observe.ui.datasource.editor.actions.synchro.referential.config.mode
    
    32 32
     observe.ui.datasource.editor.actions.synchro.referential.obsolete.entities.list
    
    33 33
     observe.ui.datasource.editor.actions.synchro.referential.obsolete.entity.fix
    
    34 34
     observe.ui.datasource.editor.actions.synchro.referential.safe.entity.to.choose.label
    

  • client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/SelectSynchronizeMode.java
    1
    +package fr.ird.observe.client.datasource.actions.synchronize;
    
    2
    +
    
    3
    +/*-
    
    4
    + * #%L
    
    5
    + * ObServe Client :: DataSource :: Actions
    
    6
    + * %%
    
    7
    + * Copyright (C) 2008 - 2024 IRD, Ultreia.io
    
    8
    + * %%
    
    9
    + * This program is free software: you can redistribute it and/or modify
    
    10
    + * it under the terms of the GNU General Public License as
    
    11
    + * published by the Free Software Foundation, either version 3 of the
    
    12
    + * License, or (at your option) any later version.
    
    13
    + *
    
    14
    + * This program is distributed in the hope that it will be useful,
    
    15
    + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    
    16
    + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    
    17
    + * GNU General Public License for more details.
    
    18
    + *
    
    19
    + * You should have received a copy of the GNU General Public
    
    20
    + * License along with this program.  If not, see
    
    21
    + * <http://www.gnu.org/licenses/gpl-3.0.html>.
    
    22
    + * #L%
    
    23
    + */
    
    24
    +
    
    25
    +import org.nuiton.jaxx.runtime.swing.action.JAXXObjectActionSupport;
    
    26
    +
    
    27
    +import javax.swing.ActionMap;
    
    28
    +import javax.swing.InputMap;
    
    29
    +import javax.swing.JComponent;
    
    30
    +import java.awt.event.ActionEvent;
    
    31
    +
    
    32
    +/**
    
    33
    + * To select synchronize mode on admin config ui.
    
    34
    + * <p>
    
    35
    + * Created at 25/06/2024.
    
    36
    + *
    
    37
    + * @author Tony Chemit - dev@tchemit.fr
    
    38
    + * @since 9.3.6
    
    39
    + */
    
    40
    +public class SelectSynchronizeMode extends JAXXObjectActionSupport<SynchronizeConfigUI> {
    
    41
    +
    
    42
    +    private final SynchronizeMode mode;
    
    43
    +
    
    44
    +    public SelectSynchronizeMode(SynchronizeMode mode) {
    
    45
    +        super(SelectSynchronizeMode.class.getName() + "#" + mode, mode.getLabel(), mode.getLabel(), mode.getIconName(), mode.getKeyStroke());
    
    46
    +        this.mode = mode;
    
    47
    +    }
    
    48
    +
    
    49
    +    @Override
    
    50
    +    protected InputMap getInputMap(SynchronizeConfigUI ui, int inputMapCondition) {
    
    51
    +        return ui.getInputMap(inputMapCondition);
    
    52
    +    }
    
    53
    +
    
    54
    +    @Override
    
    55
    +    protected int getInputMapCondition() {
    
    56
    +        return JComponent.WHEN_IN_FOCUSED_WINDOW;
    
    57
    +    }
    
    58
    +
    
    59
    +    @Override
    
    60
    +    protected ActionMap getActionMap(SynchronizeConfigUI ui) {
    
    61
    +        return ui.getActionMap();
    
    62
    +    }
    
    63
    +
    
    64
    +    @Override
    
    65
    +    protected void doActionPerformed(ActionEvent e, SynchronizeConfigUI ui) {
    
    66
    +        ui.getStepModel().setSynchronizeMode(mode);
    
    67
    +    }
    
    68
    +}

  • client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/SynchronizeConfigUI.java
    1
    +package fr.ird.observe.client.datasource.actions.synchronize;
    
    2
    +
    
    3
    +/*-
    
    4
    + * #%L
    
    5
    + * ObServe Client :: DataSource :: Actions
    
    6
    + * %%
    
    7
    + * Copyright (C) 2008 - 2024 IRD, Ultreia.io
    
    8
    + * %%
    
    9
    + * This program is free software: you can redistribute it and/or modify
    
    10
    + * it under the terms of the GNU General Public License as
    
    11
    + * published by the Free Software Foundation, either version 3 of the
    
    12
    + * License, or (at your option) any later version.
    
    13
    + *
    
    14
    + * This program is distributed in the hope that it will be useful,
    
    15
    + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    
    16
    + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    
    17
    + * GNU General Public License for more details.
    
    18
    + *
    
    19
    + * You should have received a copy of the GNU General Public
    
    20
    + * License along with this program.  If not, see
    
    21
    + * <http://www.gnu.org/licenses/gpl-3.0.html>.
    
    22
    + * #L%
    
    23
    + */
    
    24
    +
    
    25
    +import fr.ird.observe.client.datasource.actions.AdminUIModel;
    
    26
    +import fr.ird.observe.client.datasource.editor.api.wizard.connexion.DataSourceSelectorModel;
    
    27
    +import org.apache.logging.log4j.LogManager;
    
    28
    +import org.apache.logging.log4j.Logger;
    
    29
    +import org.nuiton.jaxx.runtime.JAXXObject;
    
    30
    +import org.nuiton.jaxx.runtime.swing.JAXXButtonGroup;
    
    31
    +
    
    32
    +import javax.swing.ActionMap;
    
    33
    +import javax.swing.InputMap;
    
    34
    +import javax.swing.JToggleButton;
    
    35
    +import java.util.EnumSet;
    
    36
    +
    
    37
    +/**
    
    38
    + * Contract of admin config ui when using synchronize mode.
    
    39
    + * <p>
    
    40
    + * Created at 25/06/2024.
    
    41
    + *
    
    42
    + * @author Tony Chemit - dev@tchemit.fr
    
    43
    + * @since 9.3.6
    
    44
    + */
    
    45
    +public interface SynchronizeConfigUI extends JAXXObject {
    
    46
    +    Logger log = LogManager.getLogger(SynchronizeConfigUI.class);
    
    47
    +
    
    48
    +    JToggleButton getBOTH();
    
    49
    +
    
    50
    +    JToggleButton getFROM_LEFT_TO_RIGHT();
    
    51
    +
    
    52
    +    JToggleButton getFROM_RIGHT_TO_LEFT();
    
    53
    +
    
    54
    +    AdminUIModel getModel();
    
    55
    +
    
    56
    +    SynchronizeModel getStepModel();
    
    57
    +
    
    58
    +    JAXXButtonGroup getSynchronizeMode();
    
    59
    +
    
    60
    +    ActionMap getActionMap();
    
    61
    +
    
    62
    +    InputMap getInputMap(int condition);
    
    63
    +
    
    64
    +    default void updateSynchroModes() {
    
    65
    +        AdminUIModel model = getModel();
    
    66
    +        SynchronizeModel stepModel = getStepModel();
    
    67
    +        SynchronizeMode synchronizeMode = stepModel.getSynchronizeMode();
    
    68
    +        log.info(String.format("Will update synchro modes (previous value: %s)", synchronizeMode));
    
    69
    +        DataSourceSelectorModel leftSourceModel = model.getConfigModel().getLeftSourceModel();
    
    70
    +        if (!leftSourceModel.isInit()) {
    
    71
    +            return;
    
    72
    +        }
    
    73
    +        DataSourceSelectorModel rightSourceModel = model.getConfigModel().getRightSourceModel();
    
    74
    +        if (!rightSourceModel.isInit()) {
    
    75
    +            return;
    
    76
    +        }
    
    77
    +        boolean dataSourcesValid = leftSourceModel.validateExt() && rightSourceModel.validateExt();
    
    78
    +        boolean leftToRightEnabled = dataSourcesValid && stepModel.isCanWrite(rightSourceModel);
    
    79
    +        log.debug(String.format("Update synchro modes: leftToRight: %s", leftToRightEnabled));
    
    80
    +        boolean rightToLeftEnabled = dataSourcesValid && stepModel.isCanWrite(leftSourceModel);
    
    81
    +        log.debug(String.format("Update synchro modes: rightToLeft: %s", rightToLeftEnabled));
    
    82
    +        boolean bothEnabled = leftToRightEnabled && rightToLeftEnabled;
    
    83
    +        log.debug(String.format("Update synchro modes: both: %s", bothEnabled));
    
    84
    +        getFROM_LEFT_TO_RIGHT().setEnabled(leftToRightEnabled);
    
    85
    +        getFROM_RIGHT_TO_LEFT().setEnabled(rightToLeftEnabled);
    
    86
    +        getBOTH().setEnabled(bothEnabled);
    
    87
    +        EnumSet<SynchronizeMode> candidates = EnumSet.allOf(SynchronizeMode.class);
    
    88
    +        if (!leftToRightEnabled) {
    
    89
    +            candidates.remove(SynchronizeMode.FROM_LEFT_TO_RIGHT);
    
    90
    +        }
    
    91
    +        if (!rightToLeftEnabled) {
    
    92
    +            candidates.remove(SynchronizeMode.FROM_RIGHT_TO_LEFT);
    
    93
    +        }
    
    94
    +        if (!bothEnabled) {
    
    95
    +            candidates.remove(SynchronizeMode.BOTH);
    
    96
    +        }
    
    97
    +        if (!candidates.contains(synchronizeMode)) {
    
    98
    +            if (candidates.isEmpty()) {
    
    99
    +                synchronizeMode = null;
    
    100
    +            } else {
    
    101
    +                synchronizeMode = candidates.iterator().next();
    
    102
    +            }
    
    103
    +        }
    
    104
    +        log.info(String.format("Will update synchro modes (new value: %s)", synchronizeMode));
    
    105
    +        stepModel.setSynchronizeMode(null);
    
    106
    +        stepModel.setSynchronizeMode(synchronizeMode);
    
    107
    +    }
    
    108
    +}

  • client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/actions/SelectReferentialSynchronizeMode.javaclient/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/SynchronizeConfigUI.jcss
    1
    -package fr.ird.observe.client.datasource.actions.synchronize.referential.ng.actions;
    
    2
    -
    
    3
    -/*-
    
    1
    +/*
    
    4 2
      * #%L
    
    5 3
      * ObServe Client :: DataSource :: Actions
    
    6 4
      * %%
    
    ... ... @@ -22,23 +20,19 @@ package fr.ird.observe.client.datasource.actions.synchronize.referential.ng.acti
    22 20
      * #L%
    
    23 21
      */
    
    24 22
     
    
    25
    -import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchroConfigUI;
    
    26
    -import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchronizeMode;
    
    27
    -import org.nuiton.jaxx.runtime.swing.action.JComponentActionSupport;
    
    28
    -
    
    29
    -import java.awt.event.ActionEvent;
    
    30
    -
    
    31
    -public class SelectReferentialSynchronizeMode extends JComponentActionSupport<ReferentialSynchroConfigUI> {
    
    32
    -
    
    33
    -    private final ReferentialSynchronizeMode mode;
    
    23
    +#synchronizeConfigPanel {
    
    24
    +  border:{new TitledBorder(t("observe.ui.datasource.editor.actions.synchro.config.mode") +  "")};
    
    25
    +}
    
    34 26
     
    
    35
    -    public SelectReferentialSynchronizeMode(ReferentialSynchronizeMode mode) {
    
    36
    -        super(SelectReferentialSynchronizeMode.class.getName() + "#" + mode, mode.getLabel(), mode.getLabel(), mode.getIconName(), mode.getKeyStroke());
    
    37
    -        this.mode = mode;
    
    38
    -    }
    
    27
    +#synchronizeMode {
    
    28
    +  selectedValue:{stepModel.getSynchronizeMode()};
    
    29
    +}
    
    39 30
     
    
    40
    -    @Override
    
    41
    -    protected void doActionPerformed(ActionEvent e, ReferentialSynchroConfigUI ui) {
    
    42
    -        ui.getStepModel().setSynchronizeMode(mode);
    
    43
    -    }
    
    31
    +.synchronizeMode {
    
    32
    +  buttonGroup:"synchronizeMode";
    
    33
    +  enabled:false;
    
    34
    +  selected:{java.util.Objects.equals(fr.ird.observe.client.datasource.actions.synchronize.SynchronizeMode.%%, stepModel.getSynchronizeMode())};
    
    35
    +  value:{fr.ird.observe.client.datasource.actions.synchronize.SynchronizeMode.%%};
    
    36
    +  action:{new fr.ird.observe.client.datasource.actions.synchronize.SelectSynchronizeMode(fr.ird.observe.client.datasource.actions.synchronize.SynchronizeMode.%%)};
    
    44 37
     }
    
    38
    +

  • client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/ReferentialSynchronizeMode.javaclient/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/SynchronizeMode.java
    1
    -package fr.ird.observe.client.datasource.actions.synchronize.referential.ng;
    
    1
    +package fr.ird.observe.client.datasource.actions.synchronize;
    
    2 2
     
    
    3 3
     /*-
    
    4 4
      * #%L
    
    ... ... @@ -30,7 +30,7 @@ import io.ultreia.java4all.i18n.spi.enumeration.TranslateEnumeration;
    30 30
     import javax.swing.KeyStroke;
    
    31 31
     
    
    32 32
     /**
    
    33
    - * Type de synchronisation de référentiel. Définit quelles bases sont en écriture.
    
    33
    + * Synchronize mode, defines on which side we can write.
    
    34 34
      * <p>
    
    35 35
      * Created on 10/08/16.
    
    36 36
      *
    
    ... ... @@ -38,8 +38,7 @@ import javax.swing.KeyStroke;
    38 38
      * @since 5.0
    
    39 39
      */
    
    40 40
     @TranslateEnumeration(name = I18nDecoratorHelper.I18N_CONSTANT_LABEL, pattern = I18nDecoratorHelper.I18N_CONSTANT_LABEL_PATTERN)
    
    41
    -public enum ReferentialSynchronizeMode {
    
    42
    -
    
    41
    +public enum SynchronizeMode {
    
    43 42
         /**
    
    44 43
          * La base de gauche est en lecture, la base de droite est en écriture.
    
    45 44
          */
    
    ... ... @@ -52,7 +51,6 @@ public enum ReferentialSynchronizeMode {
    52 51
          * La base de gauche est en écriture, la base de droite est en écriture.
    
    53 52
          */
    
    54 53
         BOTH(true, true, "copyToBoth");
    
    55
    -
    
    56 54
         /**
    
    57 55
          * Est ce que la source de gauche est en écriture ?
    
    58 56
          */
    
    ... ... @@ -66,7 +64,7 @@ public enum ReferentialSynchronizeMode {
    66 64
     
    
    67 65
         private final String iconName;
    
    68 66
     
    
    69
    -    ReferentialSynchronizeMode(boolean leftWrite, boolean rightWrite, String iconName) {
    
    67
    +    SynchronizeMode(boolean leftWrite, boolean rightWrite, String iconName) {
    
    70 68
             this.leftWrite = leftWrite;
    
    71 69
             this.rightWrite = rightWrite;
    
    72 70
             this.keyStroke = ObserveKeyStrokesSupport.getFunctionKeyStroke(ordinal() + 1);
    
    ... ... @@ -90,6 +88,6 @@ public enum ReferentialSynchronizeMode {
    90 88
         }
    
    91 89
     
    
    92 90
         public String getLabel() {
    
    93
    -        return ReferentialSynchronizeModeI18n.getLabel(this);
    
    91
    +        return SynchronizeModeI18n.getLabel(this);
    
    94 92
         }
    
    95 93
     }

  • client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/SynchronizeModel.java
    1
    +package fr.ird.observe.client.datasource.actions.synchronize;
    
    2
    +
    
    3
    +/*-
    
    4
    + * #%L
    
    5
    + * ObServe Client :: DataSource :: Actions
    
    6
    + * %%
    
    7
    + * Copyright (C) 2008 - 2024 IRD, Ultreia.io
    
    8
    + * %%
    
    9
    + * This program is free software: you can redistribute it and/or modify
    
    10
    + * it under the terms of the GNU General Public License as
    
    11
    + * published by the Free Software Foundation, either version 3 of the
    
    12
    + * License, or (at your option) any later version.
    
    13
    + *
    
    14
    + * This program is distributed in the hope that it will be useful,
    
    15
    + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    
    16
    + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    
    17
    + * GNU General Public License for more details.
    
    18
    + *
    
    19
    + * You should have received a copy of the GNU General Public
    
    20
    + * License along with this program.  If not, see
    
    21
    + * <http://www.gnu.org/licenses/gpl-3.0.html>.
    
    22
    + * #L%
    
    23
    + */
    
    24
    +
    
    25
    +import fr.ird.observe.client.datasource.actions.AdminActionModel;
    
    26
    +import fr.ird.observe.client.datasource.actions.AdminUI;
    
    27
    +import fr.ird.observe.client.datasource.actions.AdminUIModel;
    
    28
    +import fr.ird.observe.client.datasource.actions.synchronize.data.DataSynchroModel;
    
    29
    +import fr.ird.observe.client.datasource.editor.api.wizard.connexion.DataSourceSelectorModel;
    
    30
    +import io.ultreia.java4all.bean.JavaBean;
    
    31
    +
    
    32
    +/**
    
    33
    + * Contract of {@link AdminActionModel} model when using synchronize mode.
    
    34
    + * <p>
    
    35
    + * Created at 25/06/2024.
    
    36
    + *
    
    37
    + * @author Tony Chemit - dev@tchemit.fr
    
    38
    + * @since 9.3.6
    
    39
    + */
    
    40
    +public interface SynchronizeModel extends JavaBean {
    
    41
    +
    
    42
    +    String SYNCHRONIZE_MODE_PROPERTY_NAME = "synchronizeMode";
    
    43
    +
    
    44
    +    SynchronizeMode getSynchronizeMode();
    
    45
    +
    
    46
    +    void setSynchronizeMode(SynchronizeMode synchronizeMode);
    
    47
    +
    
    48
    +    default void start(AdminUIModel uiModel) {
    
    49
    +
    
    50
    +        addPropertyChangeListener(SYNCHRONIZE_MODE_PROPERTY_NAME, evt -> {
    
    51
    +            if (uiModel.isWasStarted()) {
    
    52
    +                // on ne propage plus rien (il n'y a plus de configuration possible...)
    
    53
    +                return;
    
    54
    +            }
    
    55
    +            uiModel.validate();
    
    56
    +        });
    
    57
    +
    
    58
    +        setSynchronizeMode(SynchronizeMode.FROM_LEFT_TO_RIGHT);
    
    59
    +    }
    
    60
    +
    
    61
    +    default void afterInit(AdminUI parentUI) {
    
    62
    +        addPropertyChangeListener(DataSynchroModel.SYNCHRONIZE_MODE_PROPERTY_NAME, evt -> {
    
    63
    +            SynchronizeMode newValue = (SynchronizeMode) evt.getNewValue();
    
    64
    +            if (parentUI.getTabs().getComponentCount() > 1 && newValue != null) {
    
    65
    +                parentUI.getTabs().setTitleAt(1, getTitleWithMode(newValue));
    
    66
    +            }
    
    67
    +        });
    
    68
    +    }
    
    69
    +
    
    70
    +    boolean isCanWrite(DataSourceSelectorModel dataSourceSelectorModel);
    
    71
    +
    
    72
    +    String getTitleWithMode(SynchronizeMode mode);
    
    73
    +}

  • client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/DataSynchroConfigUI.jaxx
    1
    +<!--
    
    2
    +  #%L
    
    3
    +  ObServe Client :: DataSource :: Actions
    
    4
    +  %%
    
    5
    +  Copyright (C) 2008 - 2023 IRD, Ultreia.io
    
    6
    +  %%
    
    7
    +  This program is free software: you can redistribute it and/or modify
    
    8
    +  it under the terms of the GNU General Public License as
    
    9
    +  published by the Free Software Foundation, either version 3 of the
    
    10
    +  License, or (at your option) any later version.
    
    11
    +  This program is distributed in the hope that it will be useful,
    
    12
    +  but WITHOUT ANY WARRANTY; without even the implied warranty of
    
    13
    +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    
    14
    +  GNU General Public License for more details.
    
    15
    +  You should have received a copy of the GNU General Public
    
    16
    +  License along with this program.  If not, see
    
    17
    +  <http://www.gnu.org/licenses/gpl-3.0.html>.
    
    18
    +  #L%
    
    19
    +  -->
    
    20
    +<JPanel id="dataSynchronizeConfig" layout="{new BorderLayout()}" implements="fr.ird.observe.client.datasource.actions.synchronize.SynchronizeConfigUI">
    
    21
    +
    
    22
    +  <style source="../SynchronizeConfigUI.jcss"/>
    
    23
    +  <import>
    
    24
    +    fr.ird.observe.client.datasource.actions.AdminUIModel
    
    25
    +
    
    26
    +    io.ultreia.java4all.i18n.I18n
    
    27
    +
    
    28
    +    static io.ultreia.java4all.i18n.I18n.t
    
    29
    +    static fr.ird.observe.client.util.UIHelper.getStringValue
    
    30
    +  </import>
    
    31
    +
    
    32
    +  <DataSynchroUIHandler id='handler' initializer='getContextValue(DataSynchroUIHandler.class)'/>
    
    33
    +  <AdminUIModel id='model' initializer='getContextValue(AdminUIModel.class)'/>
    
    34
    +  <DataSynchroModel id='stepModel' initializer='model.getDataSynchroModel()'/>
    
    35
    +  <ButtonGroup id='synchronizeMode'/>
    
    36
    +
    
    37
    +  <script><![CDATA[
    
    38
    +public void destroy() {
    
    39
    +    model = null;
    
    40
    +    stepModel = null;
    
    41
    +}
    
    42
    +]]>
    
    43
    +  </script>
    
    44
    +
    
    45
    +  <JPanel id="synchronizeConfigPanel" constraints='BorderLayout.CENTER' layout='{new GridLayout(0, 1)}'>
    
    46
    +    <JToggleButton id="FROM_LEFT_TO_RIGHT" styleClass="synchronizeMode"/>
    
    47
    +    <JToggleButton id="FROM_RIGHT_TO_LEFT" styleClass="synchronizeMode"/>
    
    48
    +    <JToggleButton id="BOTH" styleClass="synchronizeMode"/>
    
    49
    +  </JPanel>
    
    50
    +</JPanel>

  • client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/DataSynchroModel.java
    ... ... @@ -25,11 +25,14 @@ package fr.ird.observe.client.datasource.actions.synchronize.data;
    25 25
     import fr.ird.observe.client.datasource.actions.AdminActionModel;
    
    26 26
     import fr.ird.observe.client.datasource.actions.AdminStep;
    
    27 27
     import fr.ird.observe.client.datasource.actions.AdminUIModel;
    
    28
    +import fr.ird.observe.client.datasource.actions.synchronize.SynchronizeMode;
    
    29
    +import fr.ird.observe.client.datasource.actions.synchronize.SynchronizeModel;
    
    28 30
     import fr.ird.observe.client.datasource.actions.synchronize.data.tree.DataSelectionTreePaneModel;
    
    29 31
     import fr.ird.observe.client.datasource.api.data.DataTaskSupport;
    
    30 32
     import fr.ird.observe.client.datasource.api.data.TaskSide;
    
    31 33
     import fr.ird.observe.client.datasource.editor.api.wizard.connexion.DataSourceSelectorModel;
    
    32 34
     import fr.ird.observe.datasource.configuration.ObserveDataSourceInformation;
    
    35
    +import io.ultreia.java4all.i18n.I18n;
    
    33 36
     import io.ultreia.java4all.util.TwoSideContext;
    
    34 37
     import org.apache.logging.log4j.LogManager;
    
    35 38
     import org.apache.logging.log4j.Logger;
    
    ... ... @@ -43,8 +46,7 @@ import javax.swing.DefaultListModel;
    43 46
      * @author Tony Chemit - dev@tchemit.fr
    
    44 47
      * @since 5.0
    
    45 48
      */
    
    46
    -public class DataSynchroModel extends AdminActionModel implements TwoSideContext<TaskSide, DataSelectionTreePaneModel> {
    
    47
    -
    
    49
    +public class DataSynchroModel extends AdminActionModel implements SynchronizeModel, TwoSideContext<TaskSide, DataSelectionTreePaneModel> {
    
    48 50
         public static final String LEFT_MODEL = "leftModel";
    
    49 51
         public static final String RIGHT_MODEL = "rightModel";
    
    50 52
         private static final String TASKS_EMPTY_PROPERTY_NAME = "tasksEmpty";
    
    ... ... @@ -57,11 +59,14 @@ public class DataSynchroModel extends AdminActionModel implements TwoSideContext
    57 59
          * Right model.
    
    58 60
          */
    
    59 61
         private final DataSelectionTreePaneModel rightModel = new DataSelectionTreePaneModel();
    
    60
    -
    
    61 62
         /**
    
    62 63
          * Registered tasks to apply.
    
    63 64
          */
    
    64 65
         private final DefaultListModel<DataTaskSupport> tasks = new DefaultListModel<>();
    
    66
    +    /**
    
    67
    +     * Synchronize mode.
    
    68
    +     */
    
    69
    +    private SynchronizeMode synchronizeMode;
    
    65 70
     
    
    66 71
         public DataSynchroModel() {
    
    67 72
             super(AdminStep.DATA_SYNCHRONIZE);
    
    ... ... @@ -86,6 +91,29 @@ public class DataSynchroModel extends AdminActionModel implements TwoSideContext
    86 91
             rightSourceModel.setRequiredReadOnReferential(true);
    
    87 92
             rightSourceModel.setRequiredReadOnData(true);
    
    88 93
             fireTasksEmptyChanged();
    
    94
    +        SynchronizeModel.super.start(uiModel);
    
    95
    +    }
    
    96
    +
    
    97
    +    @Override
    
    98
    +    public boolean isCanWrite(DataSourceSelectorModel dataSourceSelectorModel) {
    
    99
    +        return dataSourceSelectorModel.isCanWriteData();
    
    100
    +    }
    
    101
    +
    
    102
    +    @Override
    
    103
    +    public String getTitleWithMode(SynchronizeMode mode) {
    
    104
    +        return I18n.t("observe.ui.datasource.editor.actions.synchro.data.withMode", mode.getLabel());
    
    105
    +    }
    
    106
    +
    
    107
    +    @Override
    
    108
    +    public SynchronizeMode getSynchronizeMode() {
    
    109
    +        return synchronizeMode;
    
    110
    +    }
    
    111
    +
    
    112
    +    @Override
    
    113
    +    public void setSynchronizeMode(SynchronizeMode synchronizeMode) {
    
    114
    +        Object oldValue = getSynchronizeMode();
    
    115
    +        this.synchronizeMode = synchronizeMode;
    
    116
    +        firePropertyChange(SYNCHRONIZE_MODE_PROPERTY_NAME, oldValue, synchronizeMode);
    
    89 117
         }
    
    90 118
     
    
    91 119
         @Override
    

  • client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/DataSynchroUIHandler.java
    ... ... @@ -29,6 +29,7 @@ import fr.ird.observe.client.datasource.actions.synchronize.data.tree.DataSelect
    29 29
     import fr.ird.observe.client.datasource.api.data.TaskSide;
    
    30 30
     import fr.ird.observe.client.datasource.editor.api.selection.actions.SelectUnselectWithOpposite;
    
    31 31
     import fr.ird.observe.client.datasource.editor.api.wizard.StorageUIModel;
    
    32
    +import fr.ird.observe.client.util.UIHelper;
    
    32 33
     import fr.ird.observe.client.util.init.UIInitHelper;
    
    33 34
     import org.nuiton.jaxx.runtime.spi.UIHandler;
    
    34 35
     
    
    ... ... @@ -64,15 +65,21 @@ class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> implements U
    64 65
             SelectUnselectWithOpposite.init(ui.getLeftTreePane().getTree(), null, new SelectUnselectWithOpposite(ui.getRightTreePane().getTree()));
    
    65 66
             JScrollPane descriptionPane = ui.getDescriptionPane();
    
    66 67
             descriptionPane.getParent().remove(descriptionPane);
    
    67
    -
    
    68 68
             hideFixedPanelLabel(ui);
    
    69
    +        ui.getStepModel().afterInit(parentUI);
    
    69 70
         }
    
    70 71
     
    
    71 72
         @Override
    
    72 73
         protected void initConfig(ConfigUI configUI) {
    
    74
    +        configUI.getLeftSourceConfig().getSourceInfoLabel().setVisible(true);
    
    73 75
             configUI.getLeftSourceModel().setSourceLabel(t("observe.ui.datasource.storage.config.left.storage"));
    
    76
    +        configUI.getLeftSourceConfig().getSourceInfoLabel().setText(t("observe.ui.action.config.export.required.read.data"));
    
    77
    +        configUI.getRightSourceConfig().getSourceInfoLabel().setText(t("observe.ui.action.config.export.required.read.data"));
    
    74 78
             configUI.getRightSourceModel().setSourceLabel(t("observe.ui.datasource.storage.config.right.storage"));
    
    79
    +        DataSynchroConfigUI extraConfig = new DataSynchroConfigUI(UIHelper.initialContext(configUI, this));
    
    80
    +        configUI.getExtraConfig().add(extraConfig);
    
    75 81
             ConfigModel configModel = configUI.getStepModel();
    
    82
    +        configModel.addPropertyChangeListener(StorageUIModel.VALID_STEP_PROPERTY_NAME, evt -> extraConfig.updateSynchroModes());
    
    76 83
             configModel.addPropertyChangeListener(StorageUIModel.VALID_PROPERTY_NAME, evt -> getModel().validate());
    
    77 84
         }
    
    78 85
     
    

  • client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/actions/Start.java
    ... ... @@ -72,12 +72,18 @@ public class Start extends DataSynchroUIActionSupport {
    72 72
                     rightModel.setSource(rightSource);
    
    73 73
     
    
    74 74
                     DataSelectionTreePane leftTreePane = tabUI.getLeftTreePane();
    
    75
    -                DataSelectionTreePaneHandler.initDatasource(configModel.getLeftSourceModel(), rightSource.getDataSourceInformation().canWriteData(), leftTreePane, leftModel.getIdStates());
    
    75
    +                boolean rightCanWrite = rightSource.getDataSourceInformation().canWriteData()
    
    76
    +                        && configModel.getRightSourceModel().isCanWriteReferential()
    
    77
    +                        && stepModel.getSynchronizeMode().isRightWrite();
    
    78
    +                DataSelectionTreePaneHandler.initDatasource(configModel.getLeftSourceModel(), rightCanWrite, stepModel.getSynchronizeMode().isLeftWrite(),leftTreePane, leftModel.getIdStates());
    
    76 79
                     progressModel.increments();
    
    77 80
                     sendMessage(t("observe.ui.datasource.editor.actions.synchro.data.message.data.loaded", leftSourceLabel));
    
    78 81
     
    
    79 82
                     DataSelectionTreePane rightTreePane = tabUI.getRightTreePane();
    
    80
    -                DataSelectionTreePaneHandler.initDatasource(configModel.getRightSourceModel(), leftSource.getDataSourceInformation().canWriteData(), rightTreePane, rightModel.getIdStates());
    
    83
    +                boolean leftCanWrite = leftSource.getDataSourceInformation().canWriteData()
    
    84
    +                        && configModel.getLeftSourceModel().isCanWriteReferential()
    
    85
    +                        && stepModel.getSynchronizeMode().isLeftWrite();
    
    86
    +                DataSelectionTreePaneHandler.initDatasource(configModel.getRightSourceModel(), leftCanWrite, stepModel.getSynchronizeMode().isRightWrite(),rightTreePane, rightModel.getIdStates());
    
    81 87
                     progressModel.increments();
    
    82 88
                     sendMessage(t("observe.ui.datasource.editor.actions.synchro.data.message.data.loaded", rightSourceLabel));
    
    83 89
     
    

  • client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/tree/DataSelectionTreePane.jaxx
    ... ... @@ -30,9 +30,10 @@
    30 30
         <JToggleButton id="toggleNewer"/>
    
    31 31
         <JToggleButton id="toggleOlder"/>
    
    32 32
         <JToggleButton id="toggleEquals"/>
    
    33
    -    <JSeparator orientation='{JSeparator.VERTICAL}'/>
    
    34
    -    <JButton id="copy" enabled="false"/>
    
    35
    -    <JButton id="delete" enabled="false"/>
    
    36 33
       </JToolBar>
    
    37 34
       <SelectionTreePane id='tree' constructorParams="!side.onLeft()" constraints='BorderLayout.CENTER'/>
    
    35
    +  <JToolBar id="middleActions" layout="{new GridLayout(0, 1)}" constraints='BorderLayout.EAST'>
    
    36
    +    <JButton id="copy" enabled="false" visible="{model.isCanCopy()}"/>
    
    37
    +    <JButton id="delete" enabled="false" visible="{model.isCanDelete()}"/>
    
    38
    +  </JToolBar>
    
    38 39
     </JPanel>

  • client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/tree/DataSelectionTreePaneHandler.java
    ... ... @@ -49,6 +49,7 @@ import javax.swing.JPopupMenu;
    49 49
     import javax.swing.SwingUtilities;
    
    50 50
     import javax.swing.ToolTipManager;
    
    51 51
     import javax.swing.tree.TreePath;
    
    52
    +import java.awt.BorderLayout;
    
    52 53
     import java.awt.Color;
    
    53 54
     import java.awt.Component;
    
    54 55
     import java.awt.event.MouseAdapter;
    
    ... ... @@ -63,9 +64,8 @@ import java.util.function.Consumer;
    63 64
      */
    
    64 65
     public class DataSelectionTreePaneHandler implements UIHandler<DataSelectionTreePane> {
    
    65 66
     
    
    66
    -    private static final Logger log = LogManager.getLogger(DataSelectionTreePaneHandler.class);
    
    67
    -
    
    68 67
         public static final TwoSideContext<TaskSide, String> MODEL_NAMES = TwoSideContext.of(DataSynchroModel.LEFT_MODEL, DataSynchroModel.RIGHT_MODEL);
    
    68
    +    private static final Logger log = LogManager.getLogger(DataSelectionTreePaneHandler.class);
    
    69 69
     
    
    70 70
         static DataSelectionTreePaneModel getModel(DataSelectionTreePane ui) {
    
    71 71
             return ui.getContextValue(DataSelectionTreePaneModel.class, MODEL_NAMES.onSameSide(ui.getSide()));
    
    ... ... @@ -92,6 +92,11 @@ public class DataSelectionTreePaneHandler implements UIHandler<DataSelectionTree
    92 92
             for (Component component : ui.getToolbar().getComponents()) {
    
    93 93
                 treePane.getToolbar().add(component);
    
    94 94
             }
    
    95
    +        boolean isLeft = taskSide.onLeft();
    
    96
    +        if (!isLeft) {
    
    97
    +            ui.remove(ui.getMiddleActions());
    
    98
    +            ui.add(ui.getMiddleActions(), BorderLayout.WEST);
    
    99
    +        }
    
    95 100
     
    
    96 101
             Consumer<TreeConfigUI> consumer = TreeConfigUIHandler::hideOptions;
    
    97 102
             Consumer<TreeConfigUI> apply = u -> rebuildTree(parent.getModel().getDataSynchroModel(), ui, true);
    
    ... ... @@ -104,14 +109,13 @@ public class DataSelectionTreePaneHandler implements UIHandler<DataSelectionTree
    104 109
             DataSelectionTreePaneModel model = ui.getModel();
    
    105 110
             model.setSelectionDataModel(treeModel);
    
    106 111
             // When model idStates has changed, rebuild the tree (but not the flat model)
    
    107
    -        model.addPropertyChangeListener(DataSelectionTreePaneModel.ID_STATES_PROPERTY_NAME,
    
    108
    -                                        evt -> DataSelectionTreePaneHandler.rebuildTree(parent.getStepModel(), ui, false));
    
    112
    +        model.addPropertyChangeListener(DataSelectionTreePaneModel.ID_STATES_PROPERTY_NAME, evt -> rebuildTree(parent.getStepModel(), ui, false));
    
    109 113
     
    
    110 114
             // When tree model has changed, rebuild accessibility to copy and delete action
    
    111 115
             treeModel.addPropertyChangeListener(evt -> {
    
    112 116
                 boolean withDataSelected = !treeModel.isSelectionEmpty();
    
    113
    -            ui.getCopy().setEnabled(withDataSelected);
    
    114
    -            ui.getDelete().setEnabled(withDataSelected);
    
    117
    +            ui.getCopy().setEnabled(ui.getModel().isCanCopy() && withDataSelected);
    
    118
    +            ui.getDelete().setEnabled(ui.getModel().isCanDelete() && withDataSelected);
    
    115 119
             });
    
    116 120
             // When use double clicks in tree, update selection state of the selected node
    
    117 121
             tree.addMouseListener(new MouseAdapter() {
    
    ... ... @@ -131,15 +135,14 @@ public class DataSelectionTreePaneHandler implements UIHandler<DataSelectionTree
    131 135
             });
    
    132 136
         }
    
    133 137
     
    
    134
    -    public static void initDatasource(DataSourceSelectorModel sourceModel, boolean oppositeCanWriteData, DataSelectionTreePane ui, EnumSet<IdState> idStates) {
    
    138
    +    public static void initDatasource(DataSourceSelectorModel sourceModel, boolean oppositeCanWrite, boolean canWrite, DataSelectionTreePane ui, EnumSet<IdState> idStates) {
    
    135 139
     
    
    136 140
             ui.setContextValue(sourceModel);
    
    137 141
     
    
    138
    -        boolean canWriteData = sourceModel.getDataSourceInformation().canWriteData();
    
    142
    +        boolean canWriteData = canWrite && sourceModel.isCanWriteData();
    
    139 143
             Color color = canWriteData ? Color.BLACK : Color.RED;
    
    140
    -
    
    141
    -        ui.getDelete().setEnabled(canWriteData);
    
    142
    -        ui.getCopy().setEnabled(oppositeCanWriteData);
    
    144
    +        ui.getModel().setCanCopy(oppositeCanWrite);
    
    145
    +        ui.getModel().setCanDelete(canWriteData);
    
    143 146
             ui.getToggleEquals().setSelected(idStates.contains(IdState.EQUALS));
    
    144 147
             ui.getToggleOlder().setSelected(idStates.contains(IdState.OBSOLETE));
    
    145 148
             ui.getToggleNewer().setSelected(idStates.contains(IdState.UPDATED));
    
    ... ... @@ -180,5 +183,4 @@ public class DataSelectionTreePaneHandler implements UIHandler<DataSelectionTree
    180 183
         public void beforeInit(DataSelectionTreePane ui) {
    
    181 184
             ui.setComponentPopupMenu(new JPopupMenu());
    
    182 185
         }
    
    183
    -
    
    184 186
     }

  • client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/tree/DataSelectionTreePaneModel.java
    ... ... @@ -60,6 +60,8 @@ public class DataSelectionTreePaneModel extends AbstractJavaBean {
    60 60
         public static final String ID_STATES_PROPERTY_NAME = "idStates";
    
    61 61
         private static final Logger log = LogManager.getLogger(DataSelectionTreePaneModel.class);
    
    62 62
         private static final String SOURCE_PROPERTY_NAME = "source";
    
    63
    +    private static final String CAN_COPY_PROPERTY_NAME = "canCopy";
    
    64
    +    private static final String CAN_DELETE_PROPERTY_NAME = "canDelete";
    
    63 65
         /**
    
    64 66
          * Which id states we use in tree model.
    
    65 67
          */
    
    ... ... @@ -88,6 +90,14 @@ public class DataSelectionTreePaneModel extends AbstractJavaBean {
    88 90
          */
    
    89 91
         private List<IdAndLastUpdateDate> dataIds = List.of();
    
    90 92
     
    
    93
    +    /**
    
    94
    +     * Can we copy from this side?
    
    95
    +     */
    
    96
    +    private boolean canCopy;
    
    97
    +    /**
    
    98
    +     * Can we delete from this side?
    
    99
    +     */
    
    100
    +    private boolean canDelete;
    
    91 101
         public void dispose() {
    
    92 102
             source = null;
    
    93 103
             treeFlatModel = null;
    
    ... ... @@ -104,6 +114,26 @@ public class DataSelectionTreePaneModel extends AbstractJavaBean {
    104 114
             firePropertyChange(SOURCE_PROPERTY_NAME, source);
    
    105 115
         }
    
    106 116
     
    
    117
    +    public boolean isCanCopy() {
    
    118
    +        return canCopy;
    
    119
    +    }
    
    120
    +
    
    121
    +    public void setCanCopy(boolean canCopy) {
    
    122
    +        boolean oldValue = this.canCopy;
    
    123
    +        this.canCopy = canCopy;
    
    124
    +        firePropertyChange(CAN_COPY_PROPERTY_NAME, oldValue, canCopy);
    
    125
    +    }
    
    126
    +
    
    127
    +    public boolean isCanDelete() {
    
    128
    +        return canDelete;
    
    129
    +    }
    
    130
    +
    
    131
    +    public void setCanDelete(boolean canDelete) {
    
    132
    +        boolean oldValue = this.canDelete;
    
    133
    +        this.canDelete = canDelete;
    
    134
    +        firePropertyChange(CAN_DELETE_PROPERTY_NAME, oldValue, canDelete);
    
    135
    +    }
    
    136
    +
    
    107 137
         public SelectionTreeModel getSelectionDataModel() {
    
    108 138
             return selectionDataModel;
    
    109 139
         }
    

  • client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/ReferentialSynchroConfigUI.jaxx
    ... ... @@ -17,21 +17,14 @@
    17 17
       <http://www.gnu.org/licenses/gpl-3.0.html>.
    
    18 18
       #L%
    
    19 19
       -->
    
    20
    -<JPanel id="referentialSynchronizeConfig" layout="{new BorderLayout()}">
    
    20
    +<JPanel id="referentialSynchronizeConfig" layout="{new BorderLayout()}" implements="fr.ird.observe.client.datasource.actions.synchronize.SynchronizeConfigUI">
    
    21 21
     
    
    22
    +  <style source="../../SynchronizeConfigUI.jcss"/>
    
    22 23
       <import>
    
    23
    -    fr.ird.observe.client.configuration.ClientConfig
    
    24
    -    fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchronizeMode
    
    25
    -    fr.ird.observe.client.datasource.actions.synchronize.referential.ng.actions.SelectReferentialSynchronizeMode
    
    26 24
         fr.ird.observe.client.datasource.actions.AdminUIModel
    
    27 25
     
    
    28
    -    org.nuiton.validator.NuitonValidatorScope
    
    29 26
         io.ultreia.java4all.i18n.I18n
    
    30 27
     
    
    31
    -    java.io.File
    
    32
    -    java.util.Objects
    
    33
    -    javax.swing.JComboBox
    
    34
    -
    
    35 28
         static io.ultreia.java4all.i18n.I18n.t
    
    36 29
         static fr.ird.observe.client.util.UIHelper.getStringValue
    
    37 30
       </import>
    
    ... ... @@ -49,7 +42,7 @@ public void destroy() {
    49 42
     ]]>
    
    50 43
       </script>
    
    51 44
     
    
    52
    -  <JPanel id="referentialSynchronizeConfigPanel" constraints='BorderLayout.CENTER' layout='{new GridLayout(0, 1)}'>
    
    45
    +  <JPanel id="synchronizeConfigPanel" constraints='BorderLayout.CENTER' layout='{new GridLayout(0, 1)}'>
    
    53 46
         <JToggleButton id="FROM_LEFT_TO_RIGHT" styleClass="synchronizeMode"/>
    
    54 47
         <JToggleButton id="FROM_RIGHT_TO_LEFT" styleClass="synchronizeMode"/>
    
    55 48
         <JToggleButton id="BOTH" styleClass="synchronizeMode"/>
    
    ... ... @@ -57,8 +50,7 @@ public void destroy() {
    57 50
       <Table constraints='BorderLayout.SOUTH' weightx='1'>
    
    58 51
         <row>
    
    59 52
           <cell>
    
    60
    -        <JCheckBox id='showProperties'
    
    61
    -                   onStateChanged='getStepModel().setShowProperties(((JCheckBox)event.getSource()).isSelected())'/>
    
    53
    +        <JCheckBox id='showProperties' onStateChanged='getStepModel().setShowProperties(((JCheckBox)event.getSource()).isSelected())'/>
    
    62 54
           </cell>
    
    63 55
         </row>
    
    64 56
         <row>
    

  • client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/ReferentialSynchroConfigUI.jcss
    ... ... @@ -20,22 +20,6 @@
    20 20
      * #L%
    
    21 21
      */
    
    22 22
     
    
    23
    -#referentialSynchronizeConfigPanel {
    
    24
    -  border:{new TitledBorder(t("observe.ui.datasource.editor.actions.synchro.referential.config.mode") +  "")};
    
    25
    -}
    
    26
    -
    
    27
    -#synchronizeMode {
    
    28
    -  selectedValue:{stepModel.getSynchronizeMode()};
    
    29
    -}
    
    30
    -
    
    31
    -.synchronizeMode {
    
    32
    -  buttonGroup:"synchronizeMode";
    
    33
    -  enabled:false;
    
    34
    -  selected:{Objects.equals(ReferentialSynchronizeMode.%%, stepModel.getSynchronizeMode())};
    
    35
    -  value:{ReferentialSynchronizeMode.%%};
    
    36
    -  action:{new SelectReferentialSynchronizeMode(ReferentialSynchronizeMode.%%)};
    
    37
    -}
    
    38
    -
    
    39 23
     #showProperties {
    
    40 24
       text:"observe.ui.action.show.properties";
    
    41 25
       toolTipText:"observe.ui.action.show.properties.tip";
    

  • client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/ReferentialSynchroModel.java
    ... ... @@ -27,6 +27,8 @@ import fr.ird.observe.client.datasource.actions.AdminActionModel;
    27 27
     import fr.ird.observe.client.datasource.actions.AdminStep;
    
    28 28
     import fr.ird.observe.client.datasource.actions.AdminUIModel;
    
    29 29
     import fr.ird.observe.client.datasource.actions.config.ConfigModel;
    
    30
    +import fr.ird.observe.client.datasource.actions.synchronize.SynchronizeMode;
    
    31
    +import fr.ird.observe.client.datasource.actions.synchronize.SynchronizeModel;
    
    30 32
     import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.task.ReferentialSynchronizeTaskListModel;
    
    31 33
     import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.task.SwingReferentialSynchronizeTask;
    
    32 34
     import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.ReferentialSynchronizeTreeModel;
    
    ... ... @@ -43,6 +45,7 @@ import fr.ird.observe.services.service.referential.SynchronizeEngine;
    43 45
     import fr.ird.observe.services.service.referential.differential.DifferentialModelBuilder;
    
    44 46
     import fr.ird.observe.services.service.referential.differential.DifferentialType;
    
    45 47
     import fr.ird.observe.services.service.referential.synchro.SynchronizeTaskType;
    
    48
    +import io.ultreia.java4all.i18n.I18n;
    
    46 49
     import io.ultreia.java4all.util.LeftOrRight;
    
    47 50
     import io.ultreia.java4all.util.LeftOrRightContext;
    
    48 51
     import org.apache.logging.log4j.LogManager;
    
    ... ... @@ -64,9 +67,8 @@ import java.util.Set;
    64 67
      * @since 5.0
    
    65 68
      */
    
    66 69
     @SuppressWarnings("unused")
    
    67
    -public class ReferentialSynchroModel extends AdminActionModel {
    
    70
    +public class ReferentialSynchroModel extends AdminActionModel implements SynchronizeModel {
    
    68 71
     
    
    69
    -    public static final String SYNCHRONIZE_MODE_PROPERTY_NAME = "synchronizeMode";
    
    70 72
         public static final String SHOW_PROPERTIES_PROPERTY_NAME = "showProperties";
    
    71 73
         public static final String LEFT_SOURCE_PROPERTY_NAME = "leftSource";
    
    72 74
         public static final String RIGHT_SOURCE_PROPERTY_NAME = "rightSource";
    
    ... ... @@ -91,7 +93,7 @@ public class ReferentialSynchroModel extends AdminActionModel {
    91 93
         private final LeftOrRightContext<ReferentialSynchronizeTreeModel> treeModels;
    
    92 94
         private ObserveSwingDataSource leftSource;
    
    93 95
         private ObserveSwingDataSource rightSource;
    
    94
    -    private ReferentialSynchronizeMode synchronizeMode;
    
    96
    +    private SynchronizeMode synchronizeMode;
    
    95 97
         private boolean showProperties;
    
    96 98
         private ReferentialSynchronizeTreeModel leftTreeModel;
    
    97 99
         private ReferentialSynchronizeTreeModel rightTreeModel;
    
    ... ... @@ -147,6 +149,17 @@ public class ReferentialSynchroModel extends AdminActionModel {
    147 149
             };
    
    148 150
         }
    
    149 151
     
    
    152
    +    @Override
    
    153
    +    public boolean isCanWrite(DataSourceSelectorModel dataSourceSelectorModel) {
    
    154
    +        return dataSourceSelectorModel.isCanWriteReferential();
    
    155
    +    }
    
    156
    +
    
    157
    +    @Override
    
    158
    +    public String getTitleWithMode(SynchronizeMode mode) {
    
    159
    +        return I18n.t("observe.ui.datasource.editor.actions.synchro.referential.withMode", mode.getLabel());
    
    160
    +    }
    
    161
    +
    
    162
    +
    
    150 163
         @Override
    
    151 164
         public void start(AdminUIModel uiModel) {
    
    152 165
     
    
    ... ... @@ -154,21 +167,13 @@ public class ReferentialSynchroModel extends AdminActionModel {
    154 167
             configModel.getLeftSourceModel().setRequiredReadOnReferential(true);
    
    155 168
             configModel.getRightSourceModel().setRequiredReadOnReferential(true);
    
    156 169
     
    
    157
    -        addPropertyChangeListener(SYNCHRONIZE_MODE_PROPERTY_NAME, evt -> {
    
    158
    -            if (uiModel.isWasStarted()) {
    
    159
    -                // on ne propage plus rien (il n'y a plus de configuration possible...)
    
    160
    -                log.debug("Stop propagation, was started... " + evt.getPropertyName());
    
    161
    -                return;
    
    162
    -            }
    
    163
    -            uiModel.validate();
    
    164
    -        });
    
    165
    -        setSynchronizeMode(ReferentialSynchronizeMode.FROM_LEFT_TO_RIGHT);
    
    170
    +        SynchronizeModel.super.start(uiModel);
    
    166 171
             setShowProperties(true);
    
    167 172
         }
    
    168 173
     
    
    169 174
         @Override
    
    170 175
         public boolean validateConfig(AdminUIModel uiModel) {
    
    171
    -        ReferentialSynchronizeMode synchronizeMode = uiModel.getReferentialSynchroModel().getSynchronizeMode();
    
    176
    +        SynchronizeMode synchronizeMode = uiModel.getReferentialSynchroModel().getSynchronizeMode();
    
    172 177
             if (synchronizeMode == null) {
    
    173 178
                 log.info("No synchronize mode selected");
    
    174 179
                 return false;
    
    ... ... @@ -212,11 +217,13 @@ public class ReferentialSynchroModel extends AdminActionModel {
    212 217
             rightTreeModel = null;
    
    213 218
         }
    
    214 219
     
    
    215
    -    public ReferentialSynchronizeMode getSynchronizeMode() {
    
    220
    +    @Override
    
    221
    +    public SynchronizeMode getSynchronizeMode() {
    
    216 222
             return synchronizeMode;
    
    217 223
         }
    
    218 224
     
    
    219
    -    public void setSynchronizeMode(ReferentialSynchronizeMode synchronizeMode) {
    
    225
    +    @Override
    
    226
    +    public void setSynchronizeMode(SynchronizeMode synchronizeMode) {
    
    220 227
             Object oldValue = getSynchronizeMode();
    
    221 228
             this.synchronizeMode = synchronizeMode;
    
    222 229
             firePropertyChange(SYNCHRONIZE_MODE_PROPERTY_NAME, oldValue, synchronizeMode);
    

  • client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/ReferentialSynchroUIHandler.java
    ... ... @@ -23,17 +23,12 @@ package fr.ird.observe.client.datasource.actions.synchronize.referential.ng;
    23 23
      */
    
    24 24
     
    
    25 25
     import fr.ird.observe.client.datasource.actions.AdminTabUIHandler;
    
    26
    -import fr.ird.observe.client.datasource.actions.AdminUIModel;
    
    27 26
     import fr.ird.observe.client.datasource.actions.config.ConfigUI;
    
    28 27
     import fr.ird.observe.client.datasource.editor.api.wizard.StorageUIModel;
    
    29
    -import fr.ird.observe.client.datasource.editor.api.wizard.connexion.DataSourceSelectorModel;
    
    30 28
     import fr.ird.observe.client.util.UIHelper;
    
    31
    -import org.apache.logging.log4j.LogManager;
    
    32
    -import org.apache.logging.log4j.Logger;
    
    33 29
     import org.nuiton.jaxx.runtime.spi.UIHandler;
    
    34 30
     
    
    35 31
     import javax.swing.ToolTipManager;
    
    36
    -import java.util.EnumSet;
    
    37 32
     
    
    38 33
     import static io.ultreia.java4all.i18n.I18n.t;
    
    39 34
     
    
    ... ... @@ -45,21 +40,13 @@ import static io.ultreia.java4all.i18n.I18n.t;
    45 40
      */
    
    46 41
     public class ReferentialSynchroUIHandler extends AdminTabUIHandler<ReferentialSynchroUI> implements UIHandler<ReferentialSynchroUI> {
    
    47 42
     
    
    48
    -    private static final Logger log = LogManager.getLogger(ReferentialSynchroUIHandler.class);
    
    49
    -
    
    50 43
         @Override
    
    51 44
         public void afterInit(ReferentialSynchroUI ui) {
    
    52 45
             super.afterInit(ui);
    
    53 46
             setAutoStart(ui.getStart());
    
    54 47
             ui.getLeftTreePane().init();
    
    55 48
             ui.getRightTreePane().init();
    
    56
    -        ui.getStepModel().addPropertyChangeListener(ReferentialSynchroModel.SYNCHRONIZE_MODE_PROPERTY_NAME, evt -> {
    
    57
    -
    
    58
    -            ReferentialSynchronizeMode newValue = (ReferentialSynchronizeMode) evt.getNewValue();
    
    59
    -            if (parentUI.getTabs().getComponentCount() > 1 && newValue != null) {
    
    60
    -                parentUI.getTabs().setTitleAt(1, t("observe.ui.datasource.editor.actions.synchro.referential.withMode", newValue.getLabel()));
    
    61
    -            }
    
    62
    -        });
    
    49
    +        ui.getStepModel().afterInit(parentUI);
    
    63 50
             hideFixedPanelLabel(ui);
    
    64 51
             ToolTipManager.sharedInstance().registerComponent(ui.getLeftTreePane().getTree());
    
    65 52
             ToolTipManager.sharedInstance().registerComponent(ui.getRightTreePane().getTree());
    
    ... ... @@ -72,50 +59,6 @@ public class ReferentialSynchroUIHandler extends AdminTabUIHandler<ReferentialSy
    72 59
             configUI.getExtraConfig().add(extraConfig);
    
    73 60
             configUI.getLeftSourceModel().setSourceLabel(t("observe.ui.datasource.storage.config.left.storage"));
    
    74 61
             configUI.getRightSourceModel().setSourceLabel(t("observe.ui.datasource.storage.config.right.storage"));
    
    75
    -        configUI.getStepModel().addPropertyChangeListener(StorageUIModel.VALID_STEP_PROPERTY_NAME, evt -> updateSynchroModes(extraConfig));
    
    76
    -    }
    
    77
    -
    
    78
    -    private void updateSynchroModes(ReferentialSynchroConfigUI extraConfig) {
    
    79
    -        AdminUIModel model = getUi().getModel();
    
    80
    -        ReferentialSynchronizeMode synchronizeMode = model.getReferentialSynchroModel().getSynchronizeMode();
    
    81
    -        log.info(String.format("Will update synchro modes (previous value: %s)", synchronizeMode));
    
    82
    -        DataSourceSelectorModel leftSourceModel = model.getConfigModel().getLeftSourceModel();
    
    83
    -        if (!leftSourceModel.isInit()) {
    
    84
    -            return;
    
    85
    -        }
    
    86
    -        DataSourceSelectorModel rightSourceModel = model.getConfigModel().getRightSourceModel();
    
    87
    -        if (!rightSourceModel.isInit()) {
    
    88
    -            return;
    
    89
    -        }
    
    90
    -        boolean dataSourcesValid = leftSourceModel.validateExt() && rightSourceModel.validateExt();
    
    91
    -        boolean leftToRightEnabled = dataSourcesValid && rightSourceModel.isCanWriteReferential();
    
    92
    -        log.debug(String.format("Update synchro modes: leftToRight: %s", leftToRightEnabled));
    
    93
    -        boolean rightToLeftEnabled = dataSourcesValid && leftSourceModel.isCanWriteReferential();
    
    94
    -        log.debug(String.format("Update synchro modes: rightToLeft: %s", rightToLeftEnabled));
    
    95
    -        boolean bothEnabled = leftToRightEnabled && rightToLeftEnabled;
    
    96
    -        log.debug(String.format("Update synchro modes: both: %s", bothEnabled));
    
    97
    -        extraConfig.getFROM_LEFT_TO_RIGHT().setEnabled(leftToRightEnabled);
    
    98
    -        extraConfig.getFROM_RIGHT_TO_LEFT().setEnabled(rightToLeftEnabled);
    
    99
    -        extraConfig.getBOTH().setEnabled(bothEnabled);
    
    100
    -        EnumSet<ReferentialSynchronizeMode> candidates = EnumSet.allOf(ReferentialSynchronizeMode.class);
    
    101
    -        if (!leftToRightEnabled) {
    
    102
    -            candidates.remove(ReferentialSynchronizeMode.FROM_LEFT_TO_RIGHT);
    
    103
    -        }
    
    104
    -        if (!rightToLeftEnabled) {
    
    105
    -            candidates.remove(ReferentialSynchronizeMode.FROM_RIGHT_TO_LEFT);
    
    106
    -        }
    
    107
    -        if (!bothEnabled) {
    
    108
    -            candidates.remove(ReferentialSynchronizeMode.BOTH);
    
    109
    -        }
    
    110
    -        if (!candidates.contains(synchronizeMode)) {
    
    111
    -            if (candidates.isEmpty()) {
    
    112
    -                synchronizeMode = null;
    
    113
    -            } else {
    
    114
    -                synchronizeMode = candidates.iterator().next();
    
    115
    -            }
    
    116
    -        }
    
    117
    -        log.info(String.format("Will update synchro modes (new value: %s)", synchronizeMode));
    
    118
    -        model.getReferentialSynchroModel().setSynchronizeMode(null);
    
    119
    -        model.getReferentialSynchroModel().setSynchronizeMode(synchronizeMode);
    
    62
    +        configUI.getStepModel().addPropertyChangeListener(StorageUIModel.VALID_STEP_PROPERTY_NAME, evt -> extraConfig.updateSynchroModes());
    
    120 63
         }
    
    121 64
     }

  • client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/actions/Start.java
    ... ... @@ -23,9 +23,9 @@ package fr.ird.observe.client.datasource.actions.synchronize.referential.ng.acti
    23 23
      */
    
    24 24
     
    
    25 25
     import fr.ird.observe.client.datasource.actions.AdminUIModel;
    
    26
    +import fr.ird.observe.client.datasource.actions.synchronize.SynchronizeMode;
    
    26 27
     import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchroModel;
    
    27 28
     import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchroUI;
    
    28
    -import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchronizeMode;
    
    29 29
     import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.ReferentialSelectionTree;
    
    30 30
     import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.ReferentialSelectionTreePane;
    
    31 31
     import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.ReferentialSynchronizeTreeModel;
    
    ... ... @@ -66,7 +66,7 @@ public class Start extends ReferentialSynchroUIActionSupport {
    66 66
                 try (ObserveSwingDataSource rightSource = ui.getModel().getConfigModel().getRightSourceModel().getSafeSource(true)) {
    
    67 67
                     stepModel.setRightSource(rightSource);
    
    68 68
                     DifferentialModelBuilder engine = stepModel.newDifferentialModelBuilder();
    
    69
    -                ReferentialSynchronizeMode synchronizeMode = stepModel.getSynchronizeMode();
    
    69
    +                SynchronizeMode synchronizeMode = stepModel.getSynchronizeMode();
    
    70 70
                     ProgressionModel progressionModel = stepModel.getProgressModel();
    
    71 71
                     ReferentialSynchronizeTreeModelsBuilder treeModelsBuilder = new ReferentialSynchronizeTreeModelsBuilder(synchronizeMode, stepModel.isShowProperties(), engine, progressionModel);
    
    72 72
                     LeftOrRightContext<ReferentialSynchronizeTreeModel> treePair = treeModelsBuilder.build();
    
    ... ... @@ -97,11 +97,11 @@ public class Start extends ReferentialSynchroUIActionSupport {
    97 97
     
    
    98 98
         private void initTree(ReferentialSelectionTreePane pane, ReferentialSynchronizeTreeModel treeModel, DataSourceSelectorModel dataSourceSelectorModel, String message, PropertyChangeListener listener) {
    
    99 99
             ReferentialSelectionTree tree = pane.getTree();
    
    100
    -        ReferentialSynchronizeMode newValue = ui.getStepModel().getSynchronizeMode();
    
    100
    +        SynchronizeMode synchronizeMode = ui.getStepModel().getSynchronizeMode();
    
    101 101
     
    
    102 102
             pane.setContextValue(dataSourceSelectorModel);
    
    103 103
             Color color =
    
    104
    -                (treeModel.isLeft() && newValue.isLeftWrite() || !treeModel.isLeft() && newValue.isRightWrite()) ?
    
    104
    +                (treeModel.isLeft() && synchronizeMode.isLeftWrite() || !treeModel.isLeft() && synchronizeMode.isRightWrite()) ?
    
    105 105
                             Color.BLACK : Color.RED;
    
    106 106
             pane.setBorder(new TitledBorder(""));
    
    107 107
             String label = dataSourceSelectorModel.getLabel();
    
    ... ... @@ -110,9 +110,17 @@ public class Start extends ReferentialSynchroUIActionSupport {
    110 110
             pane.getDataSourceLabel().setText(dataSourceSelectorModel.getSource().getLabel() + " " + labelWithUrl);
    
    111 111
             pane.getDataSourceLabel().setForeground(color);
    
    112 112
     
    
    113
    +        boolean isRight = pane.isRight();
    
    114
    +        boolean canCopy = isRight ? synchronizeMode.isLeftWrite() : synchronizeMode.isRightWrite();
    
    115
    +        boolean canRevert = isRight ? synchronizeMode.isRightWrite() : synchronizeMode.isLeftWrite();
    
    116
    +        pane.getCopy().setVisible(canCopy);
    
    117
    +        pane.getRevert().setVisible(canRevert);
    
    118
    +        pane.getDeactivate().setVisible(canRevert);
    
    119
    +        pane.getDeactivateWithReplace().setVisible(canRevert);
    
    120
    +        pane.getDelete().setVisible(canRevert);
    
    121
    +
    
    113 122
             tree.setModel(treeModel);
    
    114 123
             treeModel.addPropertyChangeListener(ReferentialSynchronizeTreeModel.SELECTED_COUNT, listener);
    
    115
    -
    
    116 124
             listener.propertyChange(null);
    
    117 125
             sendMessage(message);
    
    118 126
         }
    

  • client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/tree/ReferentialSelectionTreePaneHandler.java
    ... ... @@ -22,16 +22,17 @@ package fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree
    22 22
      * #L%
    
    23 23
      */
    
    24 24
     
    
    25
    -import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchroModel;
    
    26
    -import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchroUI;
    
    27
    -import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchroUIHandler;
    
    28
    -import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchronizeMode;
    
    29
    -import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.actions.*;
    
    25
    +import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.actions.RegisterCopy;
    
    26
    +import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.actions.RegisterDeactivate;
    
    27
    +import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.actions.RegisterDeactivateWithReplacement;
    
    28
    +import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.actions.RegisterDelete;
    
    29
    +import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.actions.RegisterRevert;
    
    30
    +import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.actions.SelectUnselect;
    
    30 31
     import fr.ird.observe.client.util.init.DefaultUIInitializer;
    
    31 32
     import io.ultreia.java4all.util.LeftOrRight;
    
    32 33
     import org.nuiton.jaxx.runtime.spi.UIHandler;
    
    33 34
     
    
    34
    -import java.awt.*;
    
    35
    +import java.awt.BorderLayout;
    
    35 36
     
    
    36 37
     /**
    
    37 38
      * @author Tony Chemit - dev@tchemit.fr
    
    ... ... @@ -45,16 +46,13 @@ public class ReferentialSelectionTreePaneHandler implements UIHandler<Referentia
    45 46
         }
    
    46 47
     
    
    47 48
         void init(ReferentialSelectionTreePane ui) {
    
    48
    -        ReferentialSynchroUI parent = ui.getContextValue(ReferentialSynchroUI.class, ReferentialSynchroUIHandler.ADMIN_TAB_UI);
    
    49
    -        ReferentialSynchroModel stepModel = parent.getStepModel();
    
    50
    -        stepModel.addPropertyChangeListener(ReferentialSynchroModel.SYNCHRONIZE_MODE_PROPERTY_NAME, evt -> onUpdateMode(ui, (ReferentialSynchronizeMode) evt.getNewValue()));
    
    51 49
             boolean isLeft = ui.isLeft();
    
    52
    -        LeftOrRight side = isLeft?LeftOrRight.LEFT : LeftOrRight.RIGHT;
    
    53
    -        RegisterCopy.init(ui, ui.copy, new RegisterCopy(ui, side));
    
    54
    -        RegisterRevert.init(ui, ui.revert, new RegisterRevert(ui, side));
    
    55
    -        RegisterDeactivate.init(ui, ui.deactivate, new RegisterDeactivate(ui, side));
    
    56
    -        RegisterDeactivateWithReplacement.init(ui, ui.deactivateWithReplace, new RegisterDeactivateWithReplacement(ui, side));
    
    57
    -        RegisterDelete.init(ui, ui.delete, new RegisterDelete(ui, side));
    
    50
    +        LeftOrRight side = isLeft ? LeftOrRight.LEFT : LeftOrRight.RIGHT;
    
    51
    +        RegisterCopy.init(ui, ui.getCopy(), new RegisterCopy(ui, side));
    
    52
    +        RegisterRevert.init(ui, ui.getRevert(), new RegisterRevert(ui, side));
    
    53
    +        RegisterDeactivate.init(ui, ui.getDeactivate(), new RegisterDeactivate(ui, side));
    
    54
    +        RegisterDeactivateWithReplacement.init(ui, ui.getDeactivateWithReplace(), new RegisterDeactivateWithReplacement(ui, side));
    
    55
    +        RegisterDelete.init(ui, ui.getDelete(), new RegisterDelete(ui, side));
    
    58 56
             SelectUnselect.init(ui, null, new SelectUnselect(ui));
    
    59 57
             if (!isLeft) {
    
    60 58
                 ui.remove(ui.getMiddleActions());
    
    ... ... @@ -65,20 +63,5 @@ public class ReferentialSelectionTreePaneHandler implements UIHandler<Referentia
    65 63
             // an update is asked using the deleted data...)
    
    66 64
             ui.getMiddleActions().remove(ui.delete);
    
    67 65
         }
    
    68
    -
    
    69
    -    private void onUpdateMode(ReferentialSelectionTreePane ui, ReferentialSynchronizeMode synchronizeMode) {
    
    70
    -        if (synchronizeMode == null) {
    
    71
    -            return;
    
    72
    -        }
    
    73
    -        boolean isRight = ui.isRight();
    
    74
    -        boolean canCopy = isRight ? synchronizeMode.isLeftWrite() : synchronizeMode.isRightWrite();
    
    75
    -        boolean canRevert = isRight ? synchronizeMode.isRightWrite() : synchronizeMode.isLeftWrite();
    
    76
    -        ui.copy.setVisible(canCopy);
    
    77
    -        ui.revert.setVisible(canRevert);
    
    78
    -        ui.deactivate.setVisible(canRevert);
    
    79
    -        ui.deactivateWithReplace.setVisible(canRevert);
    
    80
    -        ui.delete.setVisible(canRevert);
    
    81
    -    }
    
    82
    -
    
    83 66
     }
    
    84 67
     

  • client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/tree/ReferentialSynchronizeTreeModelsBuilder.java
    ... ... @@ -23,7 +23,7 @@ package fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree
    23 23
      */
    
    24 24
     
    
    25 25
     import fr.ird.observe.client.WithClientUIContextApi;
    
    26
    -import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchronizeMode;
    
    26
    +import fr.ird.observe.client.datasource.actions.synchronize.SynchronizeMode;
    
    27 27
     import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.node.ReferentialAddedSynchroNode;
    
    28 28
     import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.node.ReferentialPropertyUpdatedNode;
    
    29 29
     import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.node.ReferentialSynchroNodeSupport;
    
    ... ... @@ -130,7 +130,7 @@ public class ReferentialSynchronizeTreeModelsBuilder implements WithClientUICont
    130 130
         }
    
    131 131
     
    
    132 132
     
    
    133
    -    public ReferentialSynchronizeTreeModelsBuilder(ReferentialSynchronizeMode synchronizeMode, boolean showProperties, DifferentialModelBuilder engine, ProgressionModel progressionModel) {
    
    133
    +    public ReferentialSynchronizeTreeModelsBuilder(SynchronizeMode synchronizeMode, boolean showProperties, DifferentialModelBuilder engine, ProgressionModel progressionModel) {
    
    134 134
             this.engine = Objects.requireNonNull(engine);
    
    135 135
             this.leftRootNode = new RootSynchroNode(true, Objects.requireNonNull(synchronizeMode).isLeftWrite(), showProperties);
    
    136 136
             this.rightRootNode = new RootSynchroNode(false, synchronizeMode.isRightWrite(), showProperties);
    

  • client/datasource/editor/api/src/main/i18n/getters/java.getter
    ... ... @@ -268,7 +268,7 @@ observe.ui.datasource.storage.no.data.import
    268 268
     observe.ui.datasource.storage.no.referentiel.import
    
    269 269
     observe.ui.datasource.storage.report.can.migrate
    
    270 270
     observe.ui.datasource.storage.report.can.not.migrate
    
    271
    -observe.ui.datasource.storage.required.rw.on.data
    
    271
    +observe.ui.datasource.storage.required.read.on.data
    
    272 272
     observe.ui.datasource.storage.server.dataBase.name
    
    273 273
     observe.ui.datasource.storage.server.default.dataBase
    
    274 274
     observe.ui.datasource.storage.server.sessionExpire
    

  • client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/actions/SaveStorageToFile.java
    ... ... @@ -60,7 +60,7 @@ public class SaveStorageToFile extends MenuActionSupport implements Runnable {
    60 60
                 if (!service.isLocal() && !(service.canReadData() && service.canWriteData())) {
    
    61 61
                     askToUser(
    
    62 62
                             t("observe.ui.title.can.not.export.obstuna"),
    
    63
    -                        t("observe.ui.datasource.storage.required.rw.on.data", service),
    
    63
    +                        t("observe.ui.datasource.storage.required.read.on.data", service),
    
    64 64
                             JOptionPane.ERROR_MESSAGE,
    
    65 65
                             new Object[]{t("observe.ui.choice.cancel")},
    
    66 66
                             0
    

  • client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/wizard/connexion/DataSourceSelectorModel.java
    ... ... @@ -134,6 +134,10 @@ public class DataSourceSelectorModel extends StorageUIModel {
    134 134
             return isLocal() || Optional.ofNullable(getDataSourceInformation()).map(ObserveDataSourceInformation::canWriteReferential).orElse(false);
    
    135 135
         }
    
    136 136
     
    
    137
    +    public boolean isCanWriteData() {
    
    138
    +        return isLocal() || Optional.ofNullable(getDataSourceInformation()).map(ObserveDataSourceInformation::canWriteData).orElse(false);
    
    139
    +    }
    
    140
    +
    
    137 141
         public boolean validateExt() {
    
    138 142
             setValidationMessage(null);
    
    139 143
             if (!isValid()) {
    

  • client/runner/src/main/i18n/translations/client-runner_en_GB.properties
    ... ... @@ -208,9 +208,6 @@ observe.constant.ObstunaAdminAction.SECURITY=Update security
    208 208
     observe.constant.ObstunaAdminAction.SECURITY.description=Update security
    
    209 209
     observe.constant.ObstunaAdminAction.UPDATE=Update
    
    210 210
     observe.constant.ObstunaAdminAction.UPDATE.description=Update a  database
    
    211
    -observe.constant.ReferentialSynchronizeMode.BOTH=Bi directional
    
    212
    -observe.constant.ReferentialSynchronizeMode.FROM_LEFT_TO_RIGHT=From left to right
    
    213
    -observe.constant.ReferentialSynchronizeMode.FROM_RIGHT_TO_LEFT=From right to left
    
    214 211
     observe.constant.StorageStep.BACKUP=Save
    
    215 212
     observe.constant.StorageStep.BACKUP.description=Save local database before changing data source
    
    216 213
     observe.constant.StorageStep.CHOOSE_DB_MODE=Mode
    
    ... ... @@ -227,6 +224,9 @@ observe.constant.StorageStep.ROLES=Security
    227 224
     observe.constant.StorageStep.ROLES.description=Apply security on database roles
    
    228 225
     observe.constant.StorageStep.SELECT_DATA=Data selection
    
    229 226
     observe.constant.StorageStep.SELECT_DATA.description=Select data to export in backup
    
    227
    +observe.constant.SynchronizeMode.BOTH=Bi directional
    
    228
    +observe.constant.SynchronizeMode.FROM_LEFT_TO_RIGHT=From left to right
    
    229
    +observe.constant.SynchronizeMode.FROM_RIGHT_TO_LEFT=From right to left
    
    230 230
     observe.constant.ValidationModelMode.DATA=Only data
    
    231 231
     observe.constant.ValidationModelMode.DATA.description=Only data
    
    232 232
     observe.constant.ValidationModelMode.REFERENTIEL=Only referential
    
    ... ... @@ -360,6 +360,7 @@ observe.ui.action.commandline.launch.h2.server.mode=Launch ObServe in server mod
    360 360
     observe.ui.action.commandline.launch.remote.admin.ui=Launch an administration task on remote
    
    361 361
     observe.ui.action.commandline.launch.server.admin.ui=Launch an administration task on server
    
    362 362
     observe.ui.action.commandline.use.jmx=Add JMX support
    
    363
    +observe.ui.action.config.export.required.read.data=Read permission is required on data for this operation
    
    363 364
     observe.ui.action.config.export.required.read.referentiel=Read permission is required on referential for this operation
    
    364 365
     observe.ui.action.config.export.required.write.data=Write permission is required on data for this operation
    
    365 366
     observe.ui.action.config.left.datasource.required.write.data=Write permission is required on data for this operation
    
    ... ... @@ -591,6 +592,7 @@ observe.ui.datasource.editor.actions.report.variables=Variables configuration
    591 592
     observe.ui.datasource.editor.actions.saveLocal=Save local database
    
    592 593
     observe.ui.datasource.editor.actions.saveLocal.description=Save modifications on local database
    
    593 594
     observe.ui.datasource.editor.actions.synchro.cancel.tip=Cancel
    
    595
    +observe.ui.datasource.editor.actions.synchro.config.mode=Synchronisation mode
    
    594 596
     observe.ui.datasource.editor.actions.synchro.copy.tip=Copy result of report in clipboard
    
    595 597
     observe.ui.datasource.editor.actions.synchro.data=Advanced data management
    
    596 598
     observe.ui.datasource.editor.actions.synchro.data.actionsToPerform=Operations to perform
    
    ... ... @@ -600,6 +602,7 @@ observe.ui.datasource.editor.actions.synchro.data.launch.operation=Get data fro
    600 602
     observe.ui.datasource.editor.actions.synchro.data.message.data.loaded=Database «%s» - Data loaded
    
    601 603
     observe.ui.datasource.editor.actions.synchro.data.title=Advanced data management
    
    602 604
     observe.ui.datasource.editor.actions.synchro.data.title.tip=Advanced data management
    
    605
    +observe.ui.datasource.editor.actions.synchro.data.withMode=Advanced data management (%s)
    
    603 606
     observe.ui.datasource.editor.actions.synchro.launch.operation=Launch operation < %1$S >
    
    604 607
     observe.ui.datasource.editor.actions.synchro.prepare.operation=Prepare operation < %1$s >
    
    605 608
     observe.ui.datasource.editor.actions.synchro.referential=Advanced referential management
    
    ... ... @@ -613,7 +616,6 @@ observe.ui.datasource.editor.actions.synchro.referential.action.deleteFromLeft.t
    613 616
     observe.ui.datasource.editor.actions.synchro.referential.action.deleteFromRight.tip=Delete selected referential(s) from right database
    
    614 617
     observe.ui.datasource.editor.actions.synchro.referential.action.revertFromLeft.tip=Revert selected referential(s) into left database
    
    615 618
     observe.ui.datasource.editor.actions.synchro.referential.action.revertFromRight.tip=Revert selected referential(s) into right database
    
    616
    -observe.ui.datasource.editor.actions.synchro.referential.config.mode=Synchronisation mode
    
    617 619
     observe.ui.datasource.editor.actions.synchro.referential.description=Advanced referential management
    
    618 620
     observe.ui.datasource.editor.actions.synchro.referential.launch.operation=Compute differentials of referential
    
    619 621
     observe.ui.datasource.editor.actions.synchro.referential.legacy=Update referential
    
    ... ... @@ -832,7 +834,7 @@ observe.ui.datasource.storage.remoteConfiguration.presets.save=Save current conf
    832 834
     observe.ui.datasource.storage.report.action.migrate=Update policy
    
    833 835
     observe.ui.datasource.storage.report.can.migrate=Update if necessary (current version\: %1$s)
    
    834 836
     observe.ui.datasource.storage.report.can.not.migrate=No update possible
    
    835
    -observe.ui.datasource.storage.required.rw.on.data=You don't have sufficient credentials to perform this operation.\n\nTo perform this operation, you need Read/Write permissions on data.
    
    837
    +observe.ui.datasource.storage.required.read.on.data=You don't have sufficient credentials to perform this operation.\n\nTo perform this operation, you need Read permission on data.
    
    836 838
     observe.ui.datasource.storage.server.dataBase=Databases
    
    837 839
     observe.ui.datasource.storage.server.dataBase.name=Database
    
    838 840
     observe.ui.datasource.storage.server.default.dataBase=default
    

  • client/runner/src/main/i18n/translations/client-runner_es_ES.properties
    ... ... @@ -208,9 +208,6 @@ observe.constant.ObstunaAdminAction.SECURITY=Actualización de seguridad de base
    208 208
     observe.constant.ObstunaAdminAction.SECURITY.description=Actualización de securidad de una base remota
    
    209 209
     observe.constant.ObstunaAdminAction.UPDATE=Actualización de une base remota
    
    210 210
     observe.constant.ObstunaAdminAction.UPDATE.description=Actualización de una base remota
    
    211
    -observe.constant.ReferentialSynchronizeMode.BOTH=Bidireccional
    
    212
    -observe.constant.ReferentialSynchronizeMode.FROM_LEFT_TO_RIGHT=De izquierda a derecha
    
    213
    -observe.constant.ReferentialSynchronizeMode.FROM_RIGHT_TO_LEFT=De derecha a izquierda
    
    214 211
     observe.constant.StorageStep.BACKUP=Copia de seguridad
    
    215 212
     observe.constant.StorageStep.BACKUP.description=Guardadar la base local antes de cambiar la fuente de datos
    
    216 213
     observe.constant.StorageStep.CHOOSE_DB_MODE=Modo
    
    ... ... @@ -227,6 +224,9 @@ observe.constant.StorageStep.ROLES=Seguridad
    227 224
     observe.constant.StorageStep.ROLES.description=Configuración de la seguridad
    
    228 225
     observe.constant.StorageStep.SELECT_DATA=Selección de datos
    
    229 226
     observe.constant.StorageStep.SELECT_DATA.description=Seleccionar los datos a exportar en la copia de seguridad
    
    227
    +observe.constant.SynchronizeMode.BOTH=Bidireccional
    
    228
    +observe.constant.SynchronizeMode.FROM_LEFT_TO_RIGHT=De izquierda a derecha
    
    229
    +observe.constant.SynchronizeMode.FROM_RIGHT_TO_LEFT=De derecha a izquierda
    
    230 230
     observe.constant.ValidationModelMode.DATA=Datos
    
    231 231
     observe.constant.ValidationModelMode.DATA.description=Datos
    
    232 232
     observe.constant.ValidationModelMode.REFERENTIEL=Referencial
    
    ... ... @@ -360,6 +360,7 @@ observe.ui.action.commandline.launch.h2.server.mode=Ejecutar ObServe en modo ser
    360 360
     observe.ui.action.commandline.launch.remote.admin.ui=Ejecutar una operación de administración sobre remota
    
    361 361
     observe.ui.action.commandline.launch.server.admin.ui=Lancer une opération d'administration sur un serveur \#TODO
    
    362 362
     observe.ui.action.commandline.use.jmx=Mostrar el soporte JMX
    
    363
    +observe.ui.action.config.export.required.read.data=Debe tener derechos de lectura sobre los datos para esta operación
    
    363 364
     observe.ui.action.config.export.required.read.referentiel=Debe tener derechos de lectura sobre el referencial de datos para esta operación
    
    364 365
     observe.ui.action.config.export.required.write.data=Debe tener derechos de escritura sobre los datos para esta operación
    
    365 366
     observe.ui.action.config.left.datasource.required.write.data=Write permission is required on data for this operation \#TODO
    
    ... ... @@ -591,6 +592,7 @@ observe.ui.datasource.editor.actions.report.variables=Configuración de variable
    591 592
     observe.ui.datasource.editor.actions.saveLocal=Copia de seguridad de la base local
    
    592 593
     observe.ui.datasource.editor.actions.saveLocal.description=Guardar las modificationes realizadas en la base locale
    
    593 594
     observe.ui.datasource.editor.actions.synchro.cancel.tip=Cancelar
    
    595
    +observe.ui.datasource.editor.actions.synchro.config.mode=Modo de synchronización
    
    594 596
     observe.ui.datasource.editor.actions.synchro.copy.tip=Copiar el informe en el portapapeles
    
    595 597
     observe.ui.datasource.editor.actions.synchro.data=Gestión avanzada de los datos
    
    596 598
     observe.ui.datasource.editor.actions.synchro.data.actionsToPerform=Operaciones a realisar
    
    ... ... @@ -600,6 +602,7 @@ observe.ui.datasource.editor.actions.synchro.data.launch.operation=Recuperar los
    600 602
     observe.ui.datasource.editor.actions.synchro.data.message.data.loaded=Base «%s» - Datos recuperadas.
    
    601 603
     observe.ui.datasource.editor.actions.synchro.data.title=Gestión avanzada de los datos
    
    602 604
     observe.ui.datasource.editor.actions.synchro.data.title.tip=Sincronización bi-directionnal de los datos de los usaurios
    
    605
    +observe.ui.datasource.editor.actions.synchro.data.withMode=Gestión avanzada de los datos (%s)
    
    603 606
     observe.ui.datasource.editor.actions.synchro.launch.operation=Comenzar la operación < %1$s >
    
    604 607
     observe.ui.datasource.editor.actions.synchro.prepare.operation=Preparar la operación <%1$s>
    
    605 608
     observe.ui.datasource.editor.actions.synchro.referential=Gestión avanzada del referencial
    
    ... ... @@ -613,7 +616,6 @@ observe.ui.datasource.editor.actions.synchro.referential.action.deleteFromLeft.t
    613 616
     observe.ui.datasource.editor.actions.synchro.referential.action.deleteFromRight.tip=Eliminar el referencial seleccionado en la base de la derecha
    
    614 617
     observe.ui.datasource.editor.actions.synchro.referential.action.revertFromLeft.tip=Volver atrás el referencial seleccionado en la izquierda
    
    615 618
     observe.ui.datasource.editor.actions.synchro.referential.action.revertFromRight.tip=Volver atrás el referencial seleccionado en la derecha
    
    616
    -observe.ui.datasource.editor.actions.synchro.referential.config.mode=Modo de synchronización
    
    617 619
     observe.ui.datasource.editor.actions.synchro.referential.description=Gestión avanzada del referencial
    
    618 620
     observe.ui.datasource.editor.actions.synchro.referential.launch.operation=Calcular el diferencial de los referenciales de los fuentes de datos
    
    619 621
     observe.ui.datasource.editor.actions.synchro.referential.legacy=Actualización del referencial
    
    ... ... @@ -832,7 +834,7 @@ observe.ui.datasource.storage.remoteConfiguration.presets.save=Enregister cette
    832 834
     observe.ui.datasource.storage.report.action.migrate=Politica de actualización
    
    833 835
     observe.ui.datasource.storage.report.can.migrate=Actualizar si es necesario (version actual \: %1$s)
    
    834 836
     observe.ui.datasource.storage.report.can.not.migrate=No es posible actualizar
    
    835
    -observe.ui.datasource.storage.required.rw.on.data=No tiene los permisos necesarios para realizar esta operación.\n\nDebe tener permios de lectura y escritura de los datos del obaservador.
    
    837
    +observe.ui.datasource.storage.required.read.on.data=No tiene los permisos necesarios para realizar esta operación.\n\nDebe tener permios de lectura de los datos del obaservador.
    
    836 838
     observe.ui.datasource.storage.server.dataBase=Base de datos
    
    837 839
     observe.ui.datasource.storage.server.dataBase.name=Database \#TODO
    
    838 840
     observe.ui.datasource.storage.server.default.dataBase=default \#TODO
    

  • client/runner/src/main/i18n/translations/client-runner_fr_FR.properties
    ... ... @@ -208,9 +208,6 @@ observe.constant.ObstunaAdminAction.SECURITY=Mise à jour de la sécurité d'une
    208 208
     observe.constant.ObstunaAdminAction.SECURITY.description=Mise à jour de la sécurité d'une base distante
    
    209 209
     observe.constant.ObstunaAdminAction.UPDATE=Mise à jour d'une base distante
    
    210 210
     observe.constant.ObstunaAdminAction.UPDATE.description=Mise à jour d'une base distante
    
    211
    -observe.constant.ReferentialSynchronizeMode.BOTH=Bidirectionnel
    
    212
    -observe.constant.ReferentialSynchronizeMode.FROM_LEFT_TO_RIGHT=De la gauche vers la droite
    
    213
    -observe.constant.ReferentialSynchronizeMode.FROM_RIGHT_TO_LEFT=De la droite vers la gauche
    
    214 211
     observe.constant.StorageStep.BACKUP=Sauvegarde
    
    215 212
     observe.constant.StorageStep.BACKUP.description=Sauvegarder la base locale avant de changer de source de données
    
    216 213
     observe.constant.StorageStep.CHOOSE_DB_MODE=Mode
    
    ... ... @@ -227,6 +224,9 @@ observe.constant.StorageStep.ROLES=Sécurité
    227 224
     observe.constant.StorageStep.ROLES.description=Mise en place de la sécurité
    
    228 225
     observe.constant.StorageStep.SELECT_DATA=Sélection données
    
    229 226
     observe.constant.StorageStep.SELECT_DATA.description=Sélectionner les données à exporter dans la sauvegarde
    
    227
    +observe.constant.SynchronizeMode.BOTH=Bidirectionnel
    
    228
    +observe.constant.SynchronizeMode.FROM_LEFT_TO_RIGHT=De la gauche vers la droite
    
    229
    +observe.constant.SynchronizeMode.FROM_RIGHT_TO_LEFT=De la droite vers la gauche
    
    230 230
     observe.constant.ValidationModelMode.DATA=Données
    
    231 231
     observe.constant.ValidationModelMode.DATA.description=Données
    
    232 232
     observe.constant.ValidationModelMode.REFERENTIEL=Référentiel
    
    ... ... @@ -360,6 +360,7 @@ observe.ui.action.commandline.launch.h2.server.mode=Lancer ObServe en mode serve
    360 360
     observe.ui.action.commandline.launch.remote.admin.ui=Lancer une opération d'administration sur une base distante
    
    361 361
     observe.ui.action.commandline.launch.server.admin.ui=Lancer une opération d'administration sur un serveur
    
    362 362
     observe.ui.action.commandline.use.jmx=Ajouter le support JMX
    
    363
    +observe.ui.action.config.export.required.read.data=Lecture sur les données requis pour cette opération
    
    363 364
     observe.ui.action.config.export.required.read.referentiel=Lecture sur le référentiel requis pour cette opération
    
    364 365
     observe.ui.action.config.export.required.write.data=Écriture sur les données requis pour cette opération
    
    365 366
     observe.ui.action.config.left.datasource.required.write.data=Écriture sur les données requis pour cette opération
    
    ... ... @@ -591,6 +592,7 @@ observe.ui.datasource.editor.actions.report.variables=Configuration des variable
    591 592
     observe.ui.datasource.editor.actions.saveLocal=Sauvegarde de la base locale
    
    592 593
     observe.ui.datasource.editor.actions.saveLocal.description=Sauvegarder les modifications effectuées vers la base locale
    
    593 594
     observe.ui.datasource.editor.actions.synchro.cancel.tip=Annuler
    
    595
    +observe.ui.datasource.editor.actions.synchro.config.mode=Mode de synchronisation
    
    594 596
     observe.ui.datasource.editor.actions.synchro.copy.tip=Copier le rapport dans le presse-papier
    
    595 597
     observe.ui.datasource.editor.actions.synchro.data=Gestion avancée de données
    
    596 598
     observe.ui.datasource.editor.actions.synchro.data.actionsToPerform=Opérations à réaliser
    
    ... ... @@ -600,6 +602,7 @@ observe.ui.datasource.editor.actions.synchro.data.launch.operation=Récupérer l
    600 602
     observe.ui.datasource.editor.actions.synchro.data.message.data.loaded=Source «%s» - Données récupérées.
    
    601 603
     observe.ui.datasource.editor.actions.synchro.data.title=Gestion avancée de données
    
    602 604
     observe.ui.datasource.editor.actions.synchro.data.title.tip=Synchronisation bidirectionnelle des données utilisateurs
    
    605
    +observe.ui.datasource.editor.actions.synchro.data.withMode=Gestion avancée de données (%s)
    
    603 606
     observe.ui.datasource.editor.actions.synchro.launch.operation=Démarrer l'opération < %1$s >
    
    604 607
     observe.ui.datasource.editor.actions.synchro.prepare.operation=Préparer l'opération <%1$s>
    
    605 608
     observe.ui.datasource.editor.actions.synchro.referential=Gestion avancée du référentiel
    
    ... ... @@ -613,7 +616,6 @@ observe.ui.datasource.editor.actions.synchro.referential.action.deleteFromLeft.t
    613 616
     observe.ui.datasource.editor.actions.synchro.referential.action.deleteFromRight.tip=Supprimer le référentiel sélectionnée de la base de droite
    
    614 617
     observe.ui.datasource.editor.actions.synchro.referential.action.revertFromLeft.tip=Revenir en arrière du référentiel sélectionné à gauche
    
    615 618
     observe.ui.datasource.editor.actions.synchro.referential.action.revertFromRight.tip=Revenir en arrière du référentiel sélectionné à droite
    
    616
    -observe.ui.datasource.editor.actions.synchro.referential.config.mode=Mode de synchronisation
    
    617 619
     observe.ui.datasource.editor.actions.synchro.referential.description=Gestion avancée du référentiel
    
    618 620
     observe.ui.datasource.editor.actions.synchro.referential.launch.operation=Calculer le différentiel des référentiels des sources de données
    
    619 621
     observe.ui.datasource.editor.actions.synchro.referential.legacy=Mise à jour du référentiel
    
    ... ... @@ -832,7 +834,7 @@ observe.ui.datasource.storage.remoteConfiguration.presets.save=Enregister cette
    832 834
     observe.ui.datasource.storage.report.action.migrate=Politique de mise à jour
    
    833 835
     observe.ui.datasource.storage.report.can.migrate=Mise à jour si nécessaire (version actuelle \: %1$s)
    
    834 836
     observe.ui.datasource.storage.report.can.not.migrate=Pas de mise à jour possible
    
    835
    -observe.ui.datasource.storage.required.rw.on.data=Vous n'avez pas les droits suffisants pour effectuer cette opération.\n\nPour effectuer cette opération vous devez avoir les droits de lecture et d'écriture sur les données observateur.
    
    837
    +observe.ui.datasource.storage.required.read.on.data=Vous n'avez pas les droits suffisants pour effectuer cette opération.\n\nPour effectuer cette opération vous devez avoir les droits de lecture sur les données observateur.
    
    836 838
     observe.ui.datasource.storage.server.dataBase=Base de données
    
    837 839
     observe.ui.datasource.storage.server.dataBase.name=Base
    
    838 840
     observe.ui.datasource.storage.server.default.dataBase=par défaut
    

  • toolkit/api-i18n/src/main/i18n/translations/toolkit-api-i18n_fr_FR.properties
    ... ... @@ -137,7 +137,7 @@ observe.referential.common.Wind.speedRange=Vitesse (nd)
    137 137
     observe.referential.common.Wind.swellHeight=Houle (m)
    
    138 138
     observe.referential.diff.loading.type=Chargement du référentiel %-2d/%d «%s»
    
    139 139
     observe.referential.package.title=%sRéférentiel %s
    
    140
    -observe.service.error.method.unauthorized=Vous n'avez pas les autorisations nécessaire pour appeler le service '%s → %s'
    
    140
    +observe.service.error.method.unauthorized=Vous n'avez pas les droits suffisants pour appeler le service '%s → %s'
    
    141 141
     observe.services.topia.error.concurrentModification=La donnée %s est plus récente en base (%s) que votre version (%s)
    
    142 142
     observe.services.topia.error.data.not.found=Donnée [%s] (de type\: %s) non trouvée.
    
    143 143
     observe.services.topia.error.data.source.with.no.referential=Impossible de créer la base (aucun import référentiel)