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

Commits:

24 changed files:

Changes:

  • client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/ContentUIActionSupport.java
    ... ... @@ -93,6 +93,10 @@ public abstract class ContentUIActionSupport<U extends ContentUI> extends JCompo
    93 93
             }
    
    94 94
             super.defaultInit(inputMap, actionMap);
    
    95 95
         }
    
    96
    +    @Override
    
    97
    +    public void updateEditorTexts() {
    
    98
    +        super.updateEditorTexts();
    
    99
    +    }
    
    96 100
     
    
    97 101
         public void doAction() {
    
    98 102
             doActionPerformed(null, ui);
    

  • client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/open/ContentOpen.java
    ... ... @@ -67,7 +67,9 @@ import javax.swing.AbstractButton;
    67 67
     import javax.swing.Action;
    
    68 68
     import javax.swing.ActionMap;
    
    69 69
     import javax.swing.InputMap;
    
    70
    +import javax.swing.JButton;
    
    70 71
     import javax.swing.JComponent;
    
    72
    +import javax.swing.JMenuItem;
    
    71 73
     import javax.swing.JOptionPane;
    
    72 74
     import javax.swing.JPanel;
    
    73 75
     import javax.swing.JPopupMenu;
    
    ... ... @@ -78,6 +80,8 @@ import javax.swing.MenuElement;
    78 80
     import javax.swing.SwingUtilities;
    
    79 81
     import javax.swing.event.ChangeEvent;
    
    80 82
     import javax.swing.event.ChangeListener;
    
    83
    +import javax.swing.event.TableModelEvent;
    
    84
    +import java.awt.event.InputEvent;
    
    81 85
     import java.beans.PropertyChangeListener;
    
    82 86
     import java.util.LinkedHashMap;
    
    83 87
     import java.util.List;
    
    ... ... @@ -115,7 +119,7 @@ public class ContentOpen<U extends ContentUI> {
    115 119
         protected JTabbedPaneValidator tabbedPaneValidator;
    
    116 120
         protected JTabbedPaneValidator subTabbedPaneValidator;
    
    117 121
         private ArrayListMultimap<String, JComponent> focusComponents;
    
    118
    -    private final ArrayListMultimap<ContentTableUI<?, ?, ?>, JComponent> configureActions;
    
    122
    +    private final ArrayListMultimap<ContentUI, JComponent> configureActions;
    
    119 123
         private List<JTable> tables;
    
    120 124
         private ActionMap newActionMap;
    
    121 125
         private InputMap newInputMap;
    
    ... ... @@ -472,6 +476,18 @@ public class ContentOpen<U extends ContentUI> {
    472 476
             ui.getModel().getStates().setModified(ui.getModel().getStates().isCreatingMode());
    
    473 477
         }
    
    474 478
     
    
    479
    +    public void addConfigureActions(ContentUI subUi, boolean move) {
    
    480
    +        MenuElement[] subElements = subUi.getConfigurePopup().getSubElements();
    
    481
    +        for (MenuElement subElement : subElements) {
    
    482
    +            JComponent subElement1 = (JComponent) subElement;
    
    483
    +            if (move && subElement1 instanceof AbstractButton) {
    
    484
    +                ConfigureMenuAction<?> action = (ConfigureMenuAction<?>) ((AbstractButton) subElement1).getAction();
    
    485
    +                action.moveTo(ui.getToggleConfigure());
    
    486
    +            }
    
    487
    +            configureActions.put(subUi, subElement1);
    
    488
    +        }
    
    489
    +    }
    
    490
    +
    
    475 491
         public final <D extends DataDto, C extends ContainerChildDto, SubUi extends ContentTableUI<D, C, SubUi>> void initTabUI(SubUi subUi, JPanel subUiPane, int tabIndex, Consumer<D> dataConsumer) {
    
    476 492
             subUiMap.put(subUi, subUiPane);
    
    477 493
             subUiPane.remove(subUi);
    
    ... ... @@ -493,24 +509,29 @@ public class ContentOpen<U extends ContentUI> {
    493 509
                 if (subElements.length > 0) {
    
    494 510
                     subUi.putClientProperty(ContentUIHandler.CLIENT_PROPERTY_TAB_INDEX, tabIndex);
    
    495 511
                 }
    
    496
    -            subElements = subUi.getConfigurePopup().getSubElements();
    
    497
    -            for (MenuElement subElement : subElements) {
    
    498
    -                JComponent subElement1 = (JComponent) subElement;
    
    499
    -                if (subElement1 instanceof AbstractButton) {
    
    500
    -                    ConfigureMenuAction<?> action = (ConfigureMenuAction<?>) ((AbstractButton) subElement1).getAction();
    
    501
    -                    action.moveTo(ui.getToggleConfigure());
    
    502
    -                }
    
    503
    -                configureActions.put(subUi, subElement1);
    
    504
    -            }
    
    512
    +            addConfigureActions(subUi, true);
    
    505 513
                 model.getStates().getTableModel().addTableModelListener(e -> {
    
    506 514
                     if (ui.getModel().getStates().isReadingMode()) {
    
    507 515
                         return;
    
    508 516
                     }
    
    517
    +                if (subUi.getModel().getStates().getTableModel().isCreate())
    
    518
    +                    if (e.getType() == TableModelEvent.DELETE || e.getType() == TableModelEvent.INSERT) {
    
    519
    +                        return;
    
    520
    +                    }
    
    521
    +                if (ui.getModel().getStates().isResetEdit()) {
    
    522
    +                    return;
    
    523
    +                }
    
    509 524
                     dataConsumer.accept(subUi.getModel().getStates().getBeanToSave());
    
    510 525
                 });
    
    511 526
             }
    
    512 527
         }
    
    513 528
     
    
    529
    +
    
    530
    +    public void registerInnerAction(JButton button, InputMap inputMap, ActionMap actionMap) {
    
    531
    +        ContentUIActionSupport<?> action = (ContentUIActionSupport<?>) button.getAction();
    
    532
    +        action.register(inputMap, actionMap);
    
    533
    +    }
    
    534
    +
    
    514 535
         public final void startEditTabUIModel() {
    
    515 536
             ContentUIModelStates states = ui.getModel().getStates();
    
    516 537
             for (ContentTableUI<?, ?, ?> tableUI : subUiMap.keySet()) {
    
    ... ... @@ -676,9 +697,23 @@ public class ContentOpen<U extends ContentUI> {
    676 697
             }
    
    677 698
         }
    
    678 699
     
    
    679
    -    public void updateConfigurePopup(ContentTableUI<?, ?, ?> subUi) {
    
    700
    +    public void prefixAction(JMenuItem button, String prefix) {
    
    701
    +        ContentUIActionSupport<?> action = (ContentUIActionSupport<?>) button.getAction();
    
    702
    +        KeyStroke accelerator = action.getKeyStroke();
    
    703
    +        action.setKeyStroke(KeyStroke.getKeyStroke(accelerator.getKeyCode(), InputEvent.SHIFT_DOWN_MASK));
    
    704
    +        action.setText(prefix + action.getText());
    
    705
    +        if (action.getTooltipText() != null) {
    
    706
    +            action.setTooltipText(prefix + action.getTooltipText());
    
    707
    +        }
    
    708
    +        action.updateEditorTexts();
    
    709
    +        button.setAccelerator(action.getKeyStroke());
    
    710
    +    }
    
    711
    +
    
    712
    +    public void updateConfigurePopup(ContentUI subUi, boolean reset) {
    
    680 713
             JPopupMenu popup = ui.getConfigurePopup();
    
    681
    -        popup.removeAll();
    
    714
    +        if (reset) {
    
    715
    +            popup.removeAll();
    
    716
    +        }
    
    682 717
             InputMap inputMap = ui.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
    
    683 718
             ActionMap actionMap = ui.getActionMap();
    
    684 719
             if (subUi != null) {
    
    ... ... @@ -690,7 +725,9 @@ public class ContentOpen<U extends ContentUI> {
    690 725
                         action.defaultInit(inputMap, actionMap);
    
    691 726
                     }
    
    692 727
                 }
    
    693
    -            subUi.getSelectToolbar().setVisible(subUi.getTableModel().getRowCount() > 1);
    
    728
    +            if (subUi instanceof ContentTableUI<?, ?, ?>) {
    
    729
    +                ((ContentTableUI<?, ?, ?>) subUi).getSelectToolbar().setVisible(((ContentTableUI<?, ?, ?>) subUi).getTableModel().getRowCount() > 1);
    
    730
    +            }
    
    694 731
             }
    
    695 732
             ui.getHandler().fixToggleMenuVisibility();
    
    696 733
         }
    

  • client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/edit/ContentEditUIHandler.java
    ... ... @@ -53,7 +53,7 @@ public abstract class ContentEditUIHandler<D extends EditableDto, U extends Cont
    53 53
         }
    
    54 54
     
    
    55 55
         @Override
    
    56
    -    protected final ContentOpenWithValidator<U> createContentOpen(U ui) {
    
    56
    +    protected ContentOpenWithValidator<U> createContentOpen(U ui) {
    
    57 57
             ContentEditUIOpenExecutor<D, U> executor = new ContentEditUIOpenExecutor<>();
    
    58 58
             return new ContentOpenWithValidator<>(ui, executor, executor);
    
    59 59
         }
    

  • client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/open/ContentOpenableUIHandler.java
    ... ... @@ -82,7 +82,7 @@ public abstract class ContentOpenableUIHandler<D extends OpenableDto, U extends
    82 82
         }
    
    83 83
     
    
    84 84
         @Override
    
    85
    -    protected final ContentOpenWithValidator<U> createContentOpen(U ui) {
    
    85
    +    protected ContentOpenWithValidator<U> createContentOpen(U ui) {
    
    86 86
             ContentOpenableUIOpenExecutor<D, U> executor = new ContentOpenableUIOpenExecutor<>();
    
    87 87
             return new ContentOpenWithValidator<>(ui, executor, executor);
    
    88 88
         }
    

  • client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/ContentTableUI.jcss
    ... ... @@ -95,7 +95,7 @@
    95 95
     
    
    96 96
     #save {
    
    97 97
       visible:{states.isEnabled()};
    
    98
    -  enabled:{states.isValid() && (states.isModified() || states.isCreatingMode() || tableModel.isCreate())};
    
    98
    +  enabled:{states.isValid() && !states.isCanSaveRow() && states.isModified()};
    
    99 99
     }
    
    100 100
     
    
    101 101
     #showTechnicalInformations {
    

  • client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/ContentTableUITableModel.java
    ... ... @@ -342,7 +342,9 @@ public abstract class ContentTableUITableModel<D extends DataDto, C extends Cont
    342 342
     
    
    343 343
             updateBeanList(false);
    
    344 344
     
    
    345
    +        this.create= true;
    
    345 346
             fireTableRowsInserted(row, row);
    
    347
    +        this.create=false;
    
    346 348
             updateEmpty();
    
    347 349
     
    
    348 350
             // on est en mode creation
    

  • client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/landing/LandingUI.jaxx
    ... ... @@ -152,4 +152,5 @@
    152 152
       <Object id="delegateContentUI" initializer="mainTabbedPane"/>
    
    153 153
       <LandingPartUIModelStates id='landingPartStates' initializer="landingPartUI.getModel().getStates()"/>
    
    154 154
       <JButton id='selectTransshipment'/>
    
    155
    +  <JButton id='save'/>
    
    155 156
     </fr.ird.observe.client.datasource.editor.api.content.data.open.ContentOpenableUI>

  • client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/landing/LandingUI.jcss
    ... ... @@ -28,10 +28,10 @@
    28 28
       landingPartUIModel:{landingPartUI.getModel()};
    
    29 29
     }
    
    30 30
     
    
    31
    -/*#mainTabbedPane {
    
    32
    -  _focusComponent:{newComponentArray(dataSource,landingPartUI.getSpecies())};
    
    33
    -}*/
    
    34
    -
    
    35 31
     #landingPartUI {
    
    36 32
      _tab:{"landingPartTab"};
    
    37 33
     }
    
    34
    +
    
    35
    +#save {
    
    36
    +  enabled:{states.isValid() && !landingPartStates.isCanSaveRow() && (states.isModified() || states.isCreatingMode())};
    
    37
    +}

  • client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/landing/LandingUIHandler.java
    ... ... @@ -23,9 +23,17 @@ package fr.ird.observe.client.datasource.editor.ll.data.landing;
    23 23
      */
    
    24 24
     
    
    25 25
     import fr.ird.observe.client.datasource.editor.api.content.ContentUIInitializer;
    
    26
    +import fr.ird.observe.client.datasource.editor.api.content.actions.open.ContentOpenWithValidator;
    
    27
    +import fr.ird.observe.client.datasource.editor.api.content.data.open.ContentOpenableUIOpenExecutor;
    
    28
    +import fr.ird.observe.client.util.init.DefaultUIInitializerResult;
    
    26 29
     import fr.ird.observe.dto.data.ll.landing.LandingDto;
    
    30
    +import fr.ird.observe.dto.data.ll.landing.LandingPartDto;
    
    27 31
     import fr.ird.observe.dto.referential.ll.landing.DataSourceReference;
    
    32
    +import fr.ird.observe.spi.decoration.ObserveI18nDecoratorHelper;
    
    28 33
     
    
    34
    +import javax.swing.ActionMap;
    
    35
    +import javax.swing.InputMap;
    
    36
    +import javax.swing.JComponent;
    
    29 37
     import java.beans.PropertyChangeListener;
    
    30 38
     
    
    31 39
     /**
    
    ... ... @@ -44,21 +52,46 @@ class LandingUIHandler extends GeneratedLandingUIHandler {
    44 52
     
    
    45 53
         @Override
    
    46 54
         protected void onBeforeInit(LandingUI ui, ContentUIInitializer<LandingUI> initializer) {
    
    47
    -        LandingPartUIModel partUIModel = LandingPartUIModel.create(ui);
    
    48
    -        initializer.registerDependencies(partUIModel);
    
    55
    +        initializer.registerDependencies(LandingPartUIModel.create(ui));
    
    49 56
         }
    
    50 57
     
    
    51 58
         @Override
    
    52
    -    public void onInit(LandingUI ui) {
    
    53
    -        super.onInit(ui);
    
    54
    -        getContentOpen().initTabUI(ui.getLandingPartUI(), ui.getLandingPartPanel(), 1, d -> ui.getModel().getStates().getBean().setLandingPart(d.getLandingPart()));
    
    55
    -        ui.getHarbour().getToolbarRight().add(ui.getSelectTransshipment());
    
    59
    +    protected ContentOpenWithValidator<LandingUI> createContentOpen(LandingUI ui) {
    
    60
    +        ContentOpenableUIOpenExecutor<LandingDto, LandingUI> executor = new ContentOpenableUIOpenExecutor<>();
    
    61
    +        return new ContentOpenWithValidator<>(ui, executor, executor) {
    
    62
    +            @Override
    
    63
    +            public DefaultUIInitializerResult init(ContentUIInitializer<LandingUI> initializer) {
    
    64
    +                DefaultUIInitializerResult result = super.init(initializer);
    
    65
    +                String type = ObserveI18nDecoratorHelper.getType(LandingPartDto.class) + " - ";
    
    66
    +                InputMap inputMap = ui.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
    
    67
    +                ActionMap actionMap = ui.getActionMap();
    
    68
    +
    
    69
    +                prefixAction(ui.getLandingPartUI().getDeleteEntry(), type);
    
    70
    +                prefixAction(ui.getLandingPartUI().getShowTechnicalInformations(), type);
    
    71
    +                registerInnerAction(ui.getLandingPartUI().getResetEntry(), inputMap, actionMap);
    
    72
    +                registerInnerAction(ui.getLandingPartUI().getSaveEntry(), inputMap, actionMap);
    
    73
    +                registerInnerAction(ui.getLandingPartUI().getSaveAndNewEntry(), inputMap, actionMap);
    
    74
    +
    
    75
    +                addConfigureActions(ui, false);
    
    76
    +                initTabUI(ui.getLandingPartUI(), ui.getLandingPartPanel(), 1, d -> ui.getModel().getStates().getBean().setLandingPart(d.getLandingPart()));
    
    77
    +                ui.getHarbour().getToolbarRight().add(ui.getSelectTransshipment());
    
    78
    +                return result;
    
    79
    +            }
    
    80
    +        };
    
    56 81
         }
    
    57 82
     
    
    83
    +
    
    58 84
         @Override
    
    59 85
         public void onMainTabChanged(int previousIndex, int selectedIndex) {
    
    60 86
             super.onMainTabChanged(previousIndex, selectedIndex);
    
    61
    -        ui.getLandingPartUI().getSelectToolbar().setVisible(selectedIndex == 1 && ui.getLandingPartUI().getTableModel().getRowCount() > 1);
    
    87
    +        LandingPartUI subUi = ui.getLandingPartUI();
    
    88
    +        boolean partTab = selectedIndex == 1;
    
    89
    +        subUi.getSelectToolbar().setVisible(partTab && subUi.getTableModel().getRowCount() > 1);
    
    90
    +        getContentOpen().updateConfigurePopup(ui, true);
    
    91
    +        if (partTab) {
    
    92
    +            ui.getConfigurePopup().addSeparator();
    
    93
    +            getContentOpen().updateConfigurePopup(subUi, false);
    
    94
    +        }
    
    62 95
         }
    
    63 96
     
    
    64 97
         @Override
    

  • client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/ActivitySampleUI.jaxx
    ... ... @@ -64,4 +64,5 @@
    64 64
         <SamplePartUIModelStates id='samplePartStates' initializer="samplePartUI.getModel().getStates()"/>
    
    65 65
     
    
    66 66
         <JMenuItem id='move' styleClass="ifOpen"/>
    
    67
    +    <JButton id='save'/>
    
    67 68
     </fr.ird.observe.client.datasource.editor.api.content.data.edit.ContentEditUI>

  • client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/ActivitySampleUI.jcss
    ... ... @@ -29,3 +29,7 @@
    29 29
     #move {
    
    30 30
       enabled:{states.isEditable() && !states.isModified()};
    
    31 31
     }
    
    32
    +
    
    33
    +#save {
    
    34
    +  enabled:{states.isValid() && !samplePartStates.isCanSaveRow() && (states.isModified() || states.isCreatingMode())};
    
    35
    +}
    \ No newline at end of file

  • client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/ActivitySampleUIHandler.java
    ... ... @@ -24,11 +24,20 @@ package fr.ird.observe.client.datasource.editor.ll.data.logbook;
    24 24
     
    
    25 25
     import fr.ird.observe.client.datasource.editor.api.content.ContentUIInitializer;
    
    26 26
     import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveAction;
    
    27
    +import fr.ird.observe.client.datasource.editor.api.content.actions.open.ContentOpenWithValidator;
    
    28
    +import fr.ird.observe.client.datasource.editor.api.content.data.edit.ContentEditUIOpenExecutor;
    
    27 29
     import fr.ird.observe.client.datasource.editor.api.content.data.table.ContentTableUIHandler;
    
    28 30
     import fr.ird.observe.client.datasource.editor.ll.data.logbook.sample.SampleUIHelper;
    
    31
    +import fr.ird.observe.client.util.init.DefaultUIInitializerResult;
    
    32
    +import fr.ird.observe.dto.data.ll.logbook.ActivitySampleDto;
    
    33
    +import fr.ird.observe.dto.data.ll.logbook.SamplePartDto;
    
    34
    +import fr.ird.observe.spi.decoration.ObserveI18nDecoratorHelper;
    
    29 35
     import io.ultreia.java4all.i18n.I18n;
    
    30 36
     
    
    31 37
     import javax.swing.AbstractButton;
    
    38
    +import javax.swing.ActionMap;
    
    39
    +import javax.swing.InputMap;
    
    40
    +import javax.swing.JComponent;
    
    32 41
     import javax.swing.SwingUtilities;
    
    33 42
     import java.util.Objects;
    
    34 43
     
    
    ... ... @@ -56,6 +65,38 @@ public class ActivitySampleUIHandler extends GeneratedActivitySampleUIHandler {
    56 65
             ui.getSamplePartUI().getSelectToolbar().setVisible(true);
    
    57 66
         }
    
    58 67
     
    
    68
    +    @Override
    
    69
    +    protected ContentOpenWithValidator<ActivitySampleUI> createContentOpen(ActivitySampleUI ui) {
    
    70
    +        ContentEditUIOpenExecutor<ActivitySampleDto, ActivitySampleUI> executor = new ContentEditUIOpenExecutor<>();
    
    71
    +
    
    72
    +        return new ContentOpenWithValidator<>(ui, executor, executor) {
    
    73
    +
    
    74
    +            @Override
    
    75
    +            public DefaultUIInitializerResult init(ContentUIInitializer<ActivitySampleUI> initializer) {
    
    76
    +                DefaultUIInitializerResult result = super.init(initializer);
    
    77
    +                String type = ObserveI18nDecoratorHelper.getType(SamplePartDto.class) + " - ";
    
    78
    +                InputMap inputMap = ui.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
    
    79
    +                ActionMap actionMap = ui.getActionMap();
    
    80
    +
    
    81
    +                SamplePartUI subUi = ui.getSamplePartUI();
    
    82
    +                prefixAction(subUi.getDeleteEntry(), type);
    
    83
    +                prefixAction(subUi.getShowTechnicalInformations(), type);
    
    84
    +                registerInnerAction(subUi.getResetEntry(), inputMap, actionMap);
    
    85
    +                registerInnerAction(subUi.getSaveEntry(), inputMap, actionMap);
    
    86
    +                registerInnerAction(subUi.getSaveAndNewEntry(), inputMap, actionMap);
    
    87
    +
    
    88
    +                addConfigureActions(ui, false);
    
    89
    +                initTabUI(subUi, ui.getSamplePartPanel(), 1, d -> ui.getModel().getStates().getBean().setSamplePart(d.getSamplePart()));
    
    90
    +
    
    91
    +                getContentOpen().updateConfigurePopup(ui, true);
    
    92
    +                ui.getConfigurePopup().addSeparator();
    
    93
    +                getContentOpen().updateConfigurePopup(subUi, false);
    
    94
    +
    
    95
    +                return result;
    
    96
    +            }
    
    97
    +        };
    
    98
    +    }
    
    99
    +
    
    59 100
         @Override
    
    60 101
         public void onEndOpenUI() {
    
    61 102
             super.onEndOpenUI();
    
    ... ... @@ -65,7 +106,6 @@ public class ActivitySampleUIHandler extends GeneratedActivitySampleUIHandler {
    65 106
                 SwingUtilities.invokeLater(() -> {
    
    66 107
                     AbstractButton editor = (AbstractButton) ui.getSamplePartUI().getClientProperty(ContentTableUIHandler.CLIENT_PROPERTY_CREATE_ACTION);
    
    67 108
                     Objects.requireNonNull(editor).doClick();
    
    68
    -
    
    69 109
                     SwingUtilities.invokeLater(() -> {
    
    70 110
                         ui.getSamplePartUI().getSpecies().requestFocusInWindow();
    
    71 111
                     });
    

  • client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/SampleUI.jaxx
    ... ... @@ -89,4 +89,5 @@
    89 89
     
    
    90 90
       <Object id="delegateContentUI" initializer="mainTabbedPane"/>
    
    91 91
       <SamplePartUIModelStates id='samplePartStates' initializer="samplePartUI.getModel().getStates()"/>
    
    92
    +  <JButton id='save'/>
    
    92 93
     </fr.ird.observe.client.datasource.editor.api.content.data.open.ContentOpenableUI>

  • client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/SampleUI.jcss
    ... ... @@ -37,3 +37,7 @@
    37 37
     #samplePartUI {
    
    38 38
      _tab:{"samplePartTab"};
    
    39 39
     }
    
    40
    +
    
    41
    +#save {
    
    42
    +  enabled:{states.isValid() && !samplePartStates.isCanSaveRow() && (states.isModified() || states.isCreatingMode())};
    
    43
    +}
    \ No newline at end of file

  • client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/SampleUIHandler.java
    ... ... @@ -22,11 +22,19 @@ package fr.ird.observe.client.datasource.editor.ll.data.logbook;
    22 22
      * #L%
    
    23 23
      */
    
    24 24
     
    
    25
    -import fr.ird.observe.client.datasource.editor.api.content.ContentMode;
    
    26 25
     import fr.ird.observe.client.datasource.editor.api.content.ContentUIInitializer;
    
    27 26
     import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveAction;
    
    27
    +import fr.ird.observe.client.datasource.editor.api.content.actions.open.ContentOpenWithValidator;
    
    28
    +import fr.ird.observe.client.datasource.editor.api.content.data.open.ContentOpenableUIOpenExecutor;
    
    28 29
     import fr.ird.observe.client.datasource.editor.ll.data.logbook.sample.SampleUIHelper;
    
    30
    +import fr.ird.observe.client.util.init.DefaultUIInitializerResult;
    
    29 31
     import fr.ird.observe.dto.data.ll.logbook.SampleDto;
    
    32
    +import fr.ird.observe.dto.data.ll.logbook.SamplePartDto;
    
    33
    +import fr.ird.observe.spi.decoration.ObserveI18nDecoratorHelper;
    
    34
    +
    
    35
    +import javax.swing.ActionMap;
    
    36
    +import javax.swing.InputMap;
    
    37
    +import javax.swing.JComponent;
    
    30 38
     
    
    31 39
     /**
    
    32 40
      * Created on 12/5/14.
    
    ... ... @@ -37,29 +45,43 @@ import fr.ird.observe.dto.data.ll.logbook.SampleDto;
    37 45
     class SampleUIHandler extends GeneratedSampleUIHandler {
    
    38 46
         @Override
    
    39 47
         protected void onBeforeInit(SampleUI ui, ContentUIInitializer<SampleUI> initializer) {
    
    40
    -        SamplePartUIModel partUIModel = SamplePartUIModel.create(ui);
    
    41
    -        initializer.registerDependencies(partUIModel);
    
    48
    +        initializer.registerDependencies(SamplePartUIModel.create(ui));
    
    42 49
         }
    
    43 50
     
    
    44 51
         @Override
    
    45
    -    public void onInit(SampleUI ui) {
    
    46
    -        super.onInit(ui);
    
    47
    -        getContentOpen().initTabUI(ui.getSamplePartUI(), ui.getSamplePartPanel(), 1, d -> ui.getModel().getStates().getBean().setSamplePart(d.getSamplePart()));
    
    52
    +    protected ContentOpenWithValidator<SampleUI> createContentOpen(SampleUI ui) {
    
    53
    +        ContentOpenableUIOpenExecutor<SampleDto, SampleUI> executor = new ContentOpenableUIOpenExecutor<>();
    
    54
    +        return new ContentOpenWithValidator<>(ui, executor, executor) {
    
    55
    +            @Override
    
    56
    +            public DefaultUIInitializerResult init(ContentUIInitializer<SampleUI> initializer) {
    
    57
    +                DefaultUIInitializerResult result = super.init(initializer);
    
    58
    +                String type = ObserveI18nDecoratorHelper.getType(SamplePartDto.class) + " - ";
    
    59
    +                InputMap inputMap = ui.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
    
    60
    +                ActionMap actionMap = ui.getActionMap();
    
    61
    +
    
    62
    +                prefixAction(ui.getSamplePartUI().getDeleteEntry(), type);
    
    63
    +                prefixAction(ui.getSamplePartUI().getShowTechnicalInformations(), type);
    
    64
    +                registerInnerAction(ui.getSamplePartUI().getResetEntry(), inputMap, actionMap);
    
    65
    +                registerInnerAction(ui.getSamplePartUI().getSaveEntry(), inputMap, actionMap);
    
    66
    +                registerInnerAction(ui.getSamplePartUI().getSaveAndNewEntry(), inputMap, actionMap);
    
    67
    +
    
    68
    +                addConfigureActions(ui, false);
    
    69
    +                initTabUI(ui.getSamplePartUI(), ui.getSamplePartPanel(), 1, d -> ui.getModel().getStates().getBean().setSamplePart(d.getSamplePart()));
    
    70
    +                return result;
    
    71
    +            }
    
    72
    +        };
    
    48 73
         }
    
    49 74
     
    
    50 75
         @Override
    
    51 76
         public void onMainTabChanged(int previousIndex, int selectedIndex) {
    
    52 77
             super.onMainTabChanged(previousIndex, selectedIndex);
    
    53
    -        ui.getSamplePartUI().getSelectToolbar().setVisible(selectedIndex == 1 && ui.getSamplePartUI().getTableModel().getRowCount() > 1);
    
    54
    -    }
    
    55
    -
    
    56
    -    @Override
    
    57
    -    public void onModeChanged(ContentMode newMode) {
    
    58
    -        boolean showParts = newMode != ContentMode.CREATE;
    
    59
    -        getUi().getSamplePartTab().setEnabled(showParts);
    
    60
    -        if (!showParts && ui.getMainTabbedPane().getSelectedIndex() > 1) {
    
    61
    -            // go back to first tab
    
    62
    -            ui.getMainTabbedPane().setSelectedIndex(0);
    
    78
    +        SamplePartUI subUi = ui.getSamplePartUI();
    
    79
    +        boolean partTab = selectedIndex == 1;
    
    80
    +        subUi.getSelectToolbar().setVisible(partTab && subUi.getTableModel().getRowCount() > 1);
    
    81
    +        getContentOpen().updateConfigurePopup(ui, true);
    
    82
    +        if (partTab) {
    
    83
    +            ui.getConfigurePopup().addSeparator();
    
    84
    +            getContentOpen().updateConfigurePopup(subUi, false);
    
    63 85
             }
    
    64 86
         }
    
    65 87
     
    

  • client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/SetGlobalCompositionUIHandler.java
    ... ... @@ -75,7 +75,7 @@ class SetGlobalCompositionUIHandler extends GeneratedSetGlobalCompositionUIHandl
    75 75
                     subUi = ui.getBaitsCompositionUI();
    
    76 76
                     break;
    
    77 77
             }
    
    78
    -        getContentOpen().updateConfigurePopup(subUi);
    
    78
    +        getContentOpen().updateConfigurePopup(subUi, true);
    
    79 79
         }
    
    80 80
     
    
    81 81
         @Override
    

  • client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/observation/SetGlobalCompositionUIHandler.java
    ... ... @@ -75,7 +75,7 @@ class SetGlobalCompositionUIHandler extends GeneratedSetGlobalCompositionUIHandl
    75 75
                     subUi = ui.getBaitsCompositionUI();
    
    76 76
                     break;
    
    77 77
             }
    
    78
    -        getContentOpen().updateConfigurePopup(subUi);
    
    78
    +        getContentOpen().updateConfigurePopup(subUi, true);
    
    79 79
         }
    
    80 80
     
    
    81 81
     
    

  • core/api/dto/src/main/java/fr/ird/observe/dto/data/ll/logbook/SampleDto.java
    ... ... @@ -25,18 +25,10 @@ package fr.ird.observe.dto.data.ll.logbook;
    25 25
     import fr.ird.observe.spi.decoration.I18nDecoratorHelper;
    
    26 26
     import io.ultreia.java4all.bean.spi.GenerateJavaBeanDefinition;
    
    27 27
     
    
    28
    -import java.util.List;
    
    29
    -
    
    30 28
     @GenerateJavaBeanDefinition
    
    31 29
     public class SampleDto extends GeneratedSampleDto {
    
    32 30
     
    
    33 31
         public String getCoordinateStr() {
    
    34 32
             return I18nDecoratorHelper.decorateCoordinate(getLatitude(), getLongitude());
    
    35 33
         }
    
    36
    -
    
    37
    -    @Override
    
    38
    -    public void setSamplePart(List<SamplePartDto> samplePart) {
    
    39
    -        this.samplePart = samplePart;
    
    40
    -        firePropertyChange(PROPERTY_SAMPLE_PART, samplePart);
    
    41
    -    }
    
    42 34
     }

  • core/api/dto/src/main/java/fr/ird/observe/spi/validation/validators/AbstractSpeciesFieldDtoValidator.java
    ... ... @@ -24,7 +24,6 @@ package fr.ird.observe.spi.validation.validators;
    24 24
     
    
    25 25
     import com.opensymphony.xwork2.validator.ValidationException;
    
    26 26
     import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;
    
    27
    -import fr.ird.observe.dto.referential.common.SpeciesDto;
    
    28 27
     import fr.ird.observe.dto.referential.common.SpeciesReference;
    
    29 28
     import io.ultreia.java4all.lang.Numbers;
    
    30 29
     import org.nuiton.jaxx.validator.ValidatorUtil;
    
    ... ... @@ -98,7 +97,7 @@ public abstract class AbstractSpeciesFieldDtoValidator extends FieldValidatorSup
    98 97
         /**
    
    99 98
          * Bound found from species
    
    100 99
          *
    
    101
    -     * @see SpeciesDto
    
    100
    +     * @see SpeciesReference
    
    102 101
          */
    
    103 102
         private Bound bound;
    
    104 103
         /**
    
    ... ... @@ -106,9 +105,9 @@ public abstract class AbstractSpeciesFieldDtoValidator extends FieldValidatorSup
    106 105
          */
    
    107 106
         private Bound computedBound;
    
    108 107
     
    
    109
    -    protected abstract Float getBoundMin(SpeciesDto species);
    
    108
    +    protected abstract Float getBoundMin(SpeciesReference species);
    
    110 109
     
    
    111
    -    protected abstract Float getBoundMax(SpeciesDto species);
    
    110
    +    protected abstract Float getBoundMax(SpeciesReference species);
    
    112 111
     
    
    113 112
         @Override
    
    114 113
         public void validate(Object object) throws ValidationException {
    
    ... ... @@ -155,9 +154,7 @@ public abstract class AbstractSpeciesFieldDtoValidator extends FieldValidatorSup
    155 154
     
    
    156 155
             log.debug(String.format("Species to validate : %s", speciesRef));
    
    157 156
     
    
    158
    -        SpeciesDto speciesDto = (SpeciesDto) stack.findValue("getSpecies(\"" + speciesRef.getId() + "\")");
    
    159
    -
    
    160
    -        bound = getBound(speciesDto);
    
    157
    +        bound = getBound(speciesRef);
    
    161 158
     
    
    162 159
             log.debug(String.format("Species Bound to validate : %s", bound));
    
    163 160
     
    
    ... ... @@ -255,7 +252,7 @@ public abstract class AbstractSpeciesFieldDtoValidator extends FieldValidatorSup
    255 252
             return answer;
    
    256 253
         }
    
    257 254
     
    
    258
    -    private Bound getBound(SpeciesDto species) {
    
    255
    +    private Bound getBound(SpeciesReference species) {
    
    259 256
     
    
    260 257
             Float min = getBoundMin(species);
    
    261 258
             Float max = getBoundMax(species);
    

  • core/api/dto/src/main/java/fr/ird/observe/spi/validation/validators/SpeciesLengthFieldDtoValidator.java
    ... ... @@ -22,7 +22,7 @@ package fr.ird.observe.spi.validation.validators;
    22 22
      * #L%
    
    23 23
      */
    
    24 24
     
    
    25
    -import fr.ird.observe.dto.referential.common.SpeciesDto;
    
    25
    +import fr.ird.observe.dto.referential.common.SpeciesReference;
    
    26 26
     
    
    27 27
     /**
    
    28 28
      * Validateurs sur la taille d'une species.
    
    ... ... @@ -33,12 +33,12 @@ import fr.ird.observe.dto.referential.common.SpeciesDto;
    33 33
     public class SpeciesLengthFieldDtoValidator extends AbstractSpeciesFieldDtoValidator {
    
    34 34
     
    
    35 35
         @Override
    
    36
    -    protected Float getBoundMin(SpeciesDto species) {
    
    36
    +    protected Float getBoundMin(SpeciesReference species) {
    
    37 37
             return species.getMinLength();
    
    38 38
         }
    
    39 39
     
    
    40 40
         @Override
    
    41
    -    protected Float getBoundMax(SpeciesDto species) {
    
    41
    +    protected Float getBoundMax(SpeciesReference species) {
    
    42 42
             return species.getMaxLength();
    
    43 43
         }
    
    44 44
     
    

  • core/api/dto/src/main/java/fr/ird/observe/spi/validation/validators/SpeciesWeightFieldDtoValidator.java
    ... ... @@ -22,7 +22,7 @@ package fr.ird.observe.spi.validation.validators;
    22 22
      * #L%
    
    23 23
      */
    
    24 24
     
    
    25
    -import fr.ird.observe.dto.referential.common.SpeciesDto;
    
    25
    +import fr.ird.observe.dto.referential.common.SpeciesReference;
    
    26 26
     
    
    27 27
     /**
    
    28 28
      * Validateur sur le weight d'une species.
    
    ... ... @@ -33,12 +33,12 @@ import fr.ird.observe.dto.referential.common.SpeciesDto;
    33 33
     public class SpeciesWeightFieldDtoValidator extends AbstractSpeciesFieldDtoValidator {
    
    34 34
     
    
    35 35
         @Override
    
    36
    -    protected Float getBoundMin(SpeciesDto species) {
    
    36
    +    protected Float getBoundMin(SpeciesReference species) {
    
    37 37
             return species.getMinWeight();
    
    38 38
         }
    
    39 39
     
    
    40 40
         @Override
    
    41
    -    protected Float getBoundMax(SpeciesDto species) {
    
    41
    +    protected Float getBoundMax(SpeciesReference species) {
    
    42 42
             return species.getMaxWeight();
    
    43 43
         }
    
    44 44
     
    

  • core/services/i18n/src/main/i18n/translations/services_en_GB.properties
    ... ... @@ -78,8 +78,8 @@ observe.Common.countDepredated=Count depredated
    78 78
     observe.Common.countDepredated.short=Count depredated
    
    79 79
     observe.Common.country=Country
    
    80 80
     observe.Common.createDate=Create date
    
    81
    -observe.Common.currentDirection=Current direction
    
    82
    -observe.Common.currentSpeed=Current speed
    
    81
    +observe.Common.currentDirection=Current direction (°)
    
    82
    +observe.Common.currentSpeed=Current speed (kts)
    
    83 83
     observe.Common.dataQuality=Data quality
    
    84 84
     observe.Common.departureHarbour=Departure port
    
    85 85
     observe.Common.deploymentEnd=Deployment end
    
    ... ... @@ -150,7 +150,7 @@ observe.Common.haulingStartTimeStamp=Start timestamp
    150 150
     observe.Common.homeId=Home id
    
    151 151
     observe.Common.homeId.short=Home id
    
    152 152
     observe.Common.hookLost=Hook lost
    
    153
    -observe.Common.hookOffset=Offset
    
    153
    +observe.Common.hookOffset=Offset (°)
    
    154 154
     observe.Common.hookOffset.short=Offset
    
    155 155
     observe.Common.hookPosition=Hook position
    
    156 156
     observe.Common.hookSize=Size
    
    ... ... @@ -339,7 +339,7 @@ observe.Common.survey=Survey
    339 339
     observe.Common.swivelWeight=swivel weight (kg)
    
    340 340
     observe.Common.tagNumber=Tag number
    
    341 341
     observe.Common.technicalInformation=Technical information of type %1$s
    
    342
    -observe.Common.timeBetweenHooks=time between hooks
    
    342
    +observe.Common.timeBetweenHooks=Time between hooks (s)
    
    343 343
     observe.Common.timeSinceContact=Time since contact
    
    344 344
     observe.Common.timeStamp=Timestamp
    
    345 345
     observe.Common.timer=Timer
    
    ... ... @@ -396,8 +396,8 @@ observe.Common.well=Well
    396 396
     observe.Common.well.short=Well
    
    397 397
     observe.Common.whenArriving=When arriving
    
    398 398
     observe.Common.whenLeaving=When leaving
    
    399
    -observe.Common.wind=Wind
    
    400
    -observe.Common.windDirection=Wind direction
    
    399
    +observe.Common.wind=Wind - Sea appearance
    
    400
    +observe.Common.windDirection=Wind direction (°)
    
    401 401
     observe.business.module.common=Common
    
    402 402
     observe.business.module.common.package.common=Common
    
    403 403
     observe.business.module.common.short=Common
    
    ... ... @@ -619,7 +619,7 @@ observe.data.ll.logbook.BaitsComposition.type=Baits composition
    619 619
     observe.data.ll.logbook.BranchlinesComposition.action.create=Create a new branchline
    
    620 620
     observe.data.ll.logbook.BranchlinesComposition.action.save=Insert this branchline
    
    621 621
     observe.data.ll.logbook.BranchlinesComposition.action.save.tip=Insert this branchline
    
    622
    -observe.data.ll.logbook.BranchlinesComposition.length=Length
    
    622
    +observe.data.ll.logbook.BranchlinesComposition.length=Length (m)
    
    623 623
     observe.data.ll.logbook.BranchlinesComposition.length.short=Length
    
    624 624
     observe.data.ll.logbook.BranchlinesComposition.type=Branchlines composition
    
    625 625
     observe.data.ll.logbook.Catch.action.create=New catch
    
    ... ... @@ -639,7 +639,7 @@ observe.data.ll.logbook.Catch.type=Catch
    639 639
     observe.data.ll.logbook.FloatlinesComposition.action.create=Create a new floatline
    
    640 640
     observe.data.ll.logbook.FloatlinesComposition.action.save=Insert this floatline
    
    641 641
     observe.data.ll.logbook.FloatlinesComposition.action.save.tip=Insert this floatline
    
    642
    -observe.data.ll.logbook.FloatlinesComposition.length=Length
    
    642
    +observe.data.ll.logbook.FloatlinesComposition.length=Length (m)
    
    643 643
     observe.data.ll.logbook.FloatlinesComposition.length.short=Length
    
    644 644
     observe.data.ll.logbook.FloatlinesComposition.type=Floatlines composition
    
    645 645
     observe.data.ll.logbook.HooksComposition.action.create=Create a new hook
    

  • core/services/i18n/src/main/i18n/translations/services_es_ES.properties
    ... ... @@ -150,8 +150,8 @@ observe.Common.haulingStartTimeStamp=Timestamp del inicio
    150 150
     observe.Common.homeId=Identificador
    
    151 151
     observe.Common.homeId.short=Id
    
    152 152
     observe.Common.hookLost=Anzuelo erdido
    
    153
    -observe.Common.hookOffset=Offset
    
    154
    -observe.Common.hookOffset.short=Offset (°)
    
    153
    +observe.Common.hookOffset=Offset (°)
    
    154
    +observe.Common.hookOffset.short=Offset
    
    155 155
     observe.Common.hookPosition=Posición del gancho
    
    156 156
     observe.Common.hookSize=Tamaño
    
    157 157
     observe.Common.hookSize.short=Tamaño
    
    ... ... @@ -619,8 +619,8 @@ observe.data.ll.logbook.BaitsComposition.type=BaitsComposition
    619 619
     observe.data.ll.logbook.BranchlinesComposition.action.create=Crear una nueva arponcillo
    
    620 620
     observe.data.ll.logbook.BranchlinesComposition.action.save=Insertar este arponcillo
    
    621 621
     observe.data.ll.logbook.BranchlinesComposition.action.save.tip=Insertar este arponcillo
    
    622
    -observe.data.ll.logbook.BranchlinesComposition.length=Longitud (m)
    
    623
    -observe.data.ll.logbook.BranchlinesComposition.length.short=Longitud (m)
    
    622
    +observe.data.ll.logbook.BranchlinesComposition.length=Talla (m)
    
    623
    +observe.data.ll.logbook.BranchlinesComposition.length.short=Talla (m)
    
    624 624
     observe.data.ll.logbook.BranchlinesComposition.type=BranchlinesComposition
    
    625 625
     observe.data.ll.logbook.Catch.action.create=Nueva captura
    
    626 626
     observe.data.ll.logbook.Catch.action.save=Insertar esta captura
    
    ... ... @@ -639,7 +639,7 @@ observe.data.ll.logbook.Catch.type=Captura
    639 639
     observe.data.ll.logbook.FloatlinesComposition.action.create=Crear una nueva orinque
    
    640 640
     observe.data.ll.logbook.FloatlinesComposition.action.save=Insertar este orinque
    
    641 641
     observe.data.ll.logbook.FloatlinesComposition.action.save.tip=Insertar este orinque
    
    642
    -observe.data.ll.logbook.FloatlinesComposition.length=Longitud (m)
    
    642
    +observe.data.ll.logbook.FloatlinesComposition.length=Talla (m)
    
    643 643
     observe.data.ll.logbook.FloatlinesComposition.length.short=Longitud (m)
    
    644 644
     observe.data.ll.logbook.FloatlinesComposition.type=FloatlinesComposition
    
    645 645
     observe.data.ll.logbook.HooksComposition.action.create=Crear una nueva anzuelo
    

  • model/src/main/models/Observe/dto/class/references.properties
    ... ... @@ -94,7 +94,7 @@ referential.common.LengthWeightParameter=uri,oceanLabel,sexLabel,species,startDa
    94 94
     referential.common.Ocean=code,label,uri,northEastAllowed,southEastAllowed,southWestAllowed,northWestAllowed
    
    95 95
     referential.common.Person=firstName,lastName,uri,captain,observer,dataEntryOperator,dataSource,psSampler
    
    96 96
     referential.common.ShipOwner=code,label,uri,startDate,endDate
    
    97
    -referential.common.Species=code,label,uri,faoCode,scientificLabel,sizeMeasureTypeId,weightMeasureTypeId,speciesGroupId,wormsId,faoCode,minWeight,maxWeight
    
    97
    +referential.common.Species=code,label,uri,faoCode,scientificLabel,sizeMeasureTypeId,weightMeasureTypeId,speciesGroupId,wormsId,faoCode,minWeight,maxWeight,minLength,maxLength
    
    98 98
     referential.common.Vessel=code,label,uri,wellRegex,vesselType,fleetCountry,flagCountry,vesselSizeCategory,shipOwner,startDate,endDate
    
    99 99
     referential.common.VesselSizeCategory=code,uri,gaugeLabel,capacityLabel
    
    100 100
     referential.common.Wind=code,label,uri,minSpeed,maxSpeed,minSwellHeight,maxSwellHeight