Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 5526b362 by Tony Chemit at 2023-12-13T12:02:41+01:00 Set focus to delete actions when deleting (instead of cancel) - - - - - db37308f by Tony Chemit at 2023-12-13T12:05:39+01:00 Add selection to states to replace single selection and adapt some code using it - - - - - 276c661e by Tony Chemit at 2023-12-13T12:06:07+01:00 Review delete action code for multiple selected references - - - - - 5687b830 by Tony Chemit at 2023-12-13T12:06:15+01:00 Merge branch 'feature/issue-2746' into develop Suppression de références en masse - Closes #2746 - - - - - 8 changed files: - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/edit/actions/DeleteEdit.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/ContentReferentialUI.jaxx - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/ContentReferentialUI.jcss - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/ContentReferentialUIHandler.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/ContentReferentialUIModelStates.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/actions/DeleteReferential.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/actions/ReferentialResetAdapter.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/actions/SaveContentReferentialUIAdapter.java Changes: ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/edit/actions/DeleteEdit.java ===================================== @@ -104,7 +104,7 @@ public final class DeleteEdit<D extends EditableDto, U extends ContentEditUI<D, JOptionPane.WARNING_MESSAGE, new Object[]{t("observe.ui.choice.confirm.delete"), t("observe.ui.choice.cancel")}, - 1); + 0); } finally { busyModel.popTask(); } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/ContentReferentialUI.jaxx ===================================== @@ -41,6 +41,7 @@ javax.swing.DefaultListModel javax.swing.ListSelectionModel + javax.swing.DefaultListSelectionModel javax.swing.JTable javax.swing.JTextField javax.swing.UIManager ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/ContentReferentialUI.jcss ===================================== @@ -35,7 +35,8 @@ JLabel { } #list { - selectionMode:{ListSelectionModel.SINGLE_SELECTION}; + selectionMode:{DefaultListSelectionModel.MULTIPLE_INTERVAL_SELECTION}; + selectionModel:{new DefaultListSelectionModel()}; model:{new DefaultListModel()}; } @@ -61,11 +62,11 @@ JLabel { } #modify { - enabled:{states.isSelectedBean()}; + enabled:{states.isSelectionSingle()}; } #detail { - enabled:{states.isSelectedBean()}; + enabled:{states.isSelectionSingle()}; } #editTable { @@ -91,11 +92,11 @@ JLabel { } #delete { - enabled:{states.isEditable() && states.isSelectedBean()}; + enabled:{states.isEditable() && !states.isSelectionEmpty()}; } #showTechnicalInformations { - enabled:{!states.isCreatingMode() && (states.isEditing() || states.isSelectedBean())}; + enabled:{!states.isCreatingMode() && (states.isEditing() || states.isSelectionSingle())}; } #showUniqueKeys { ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/ContentReferentialUIHandler.java ===================================== @@ -115,7 +115,7 @@ public class ContentReferentialUIHandler<D extends ReferentialDto, R extends Ref list.setFixedCellWidth(200); list.addListSelectionListener(e -> { if (!e.getValueIsAdjusting()) { - selectBean(list.getSelectedValue()); + selectBean(list.getSelectedValuesList()); } }); list.addMouseListener(new MouseAdapter() { @@ -315,17 +315,18 @@ public class ContentReferentialUIHandler<D extends ReferentialDto, R extends Ref getClientValidationContext().setEditingReferentielList(data); } - final void selectBean(R selectedReference) { + final void selectBean(List<R> selectedReference) { ContentReferentialUIModel<D, R> model = getModel(); - log.info(String.format("%sWill select entity [%s]", prefix, selectedReference)); - if (selectedReference == null) { - model.getStates().setSelectedBeanReference(null); - } else { - model.getStates().setSelectedBeanReference(selectedReference); - - //TODO update data cache - log.debug("Need update referential cache"); - } + log.info(String.format("%sWill select entity(ies) [%s]", prefix, selectedReference)); + model.getStates().setSelection(selectedReference); +// if (selectedReference == null) { +// model.getStates().setSelectedBeanReference(null); +// } else { +// model.getStates().setSelectedBeanReference(selectedReference); +// +// //TODO update data cache +// log.debug("Need update referential cache"); +// } if (!model.getStates().isResetEdit()) { getContentOpen().selectFirstTab(); } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/ContentReferentialUIModelStates.java ===================================== @@ -52,7 +52,6 @@ import java.util.Objects; */ public abstract class ContentReferentialUIModelStates<D extends ReferentialDto, R extends ReferentialDtoReference> extends ContentUIModelStates { public static final String PROPERTY_SELECTED_BEAN_REFERENCE = "selectedBeanReference"; - public static final String PROPERTY_SELECTED_BEAN = "selectedBean"; /** * Reference cache. */ @@ -64,13 +63,11 @@ public abstract class ContentReferentialUIModelStates<D extends ReferentialDto, private final Class<D> mainType; private final Class<R> mainReferenceType; private final ContentReferentialUINavigationNode source; - private R selectedBeanReference; + private List<R> selection; private Form<D> form; private ToolkitIdLabel replaceReference; private ContentReferentialUI<D, R, ?> ui; - public abstract R toReference(D bean, ReferentialLocale referentialLocale); - public ContentReferentialUIModelStates(ContentReferentialUIModel<D, R> model, D bean) { source = Objects.requireNonNull(model).getSource(); this.referenceCache = source.getContext().newReferenceCache(); @@ -80,6 +77,8 @@ public abstract class ContentReferentialUIModelStates<D extends ReferentialDto, model.getDecoratorService().installDecorator(bean); } + public abstract R toReference(D bean, ReferentialLocale referentialLocale); + public ContentReferentialUINavigationNode source() { return source; } @@ -101,7 +100,7 @@ public abstract class ContentReferentialUIModelStates<D extends ReferentialDto, super.open(model); ListModel<R> listModel = ui.getList().getModel(); if (listModel.getSize() > 0) { - setSelectedBeanReference(listModel.getElementAt(0)); + setSelection(List.of(listModel.getElementAt(0))); } } @@ -128,14 +127,37 @@ public abstract class ContentReferentialUIModelStates<D extends ReferentialDto, } public R getSelectedBeanReference() { - return selectedBeanReference; + return isSelectionSingle() ? getSelection().get(0) : null; + } + + public boolean isSelectionEmpty() { + return getSelection() == null || getSelection().isEmpty(); + } + + public boolean isSelectionSingle() { + return getSelection() != null && getSelection().size() == 1; + } + + public boolean isSelectionMultiple() { + return getSelection() != null && getSelection().size() > 1; } - public void setSelectedBeanReference(R selectedBeanReference) { - R oldValue = getSelectedBeanReference(); - this.selectedBeanReference = selectedBeanReference; - firePropertyChange(PROPERTY_SELECTED_BEAN_REFERENCE, oldValue, selectedBeanReference); - firePropertyChange(PROPERTY_SELECTED_BEAN, isSelectedBean()); + public List<R> getSelection() { + return selection; + } + + public void setSelection(List<R> selection) { + List<R> oldValue = getSelection(); + R oldSelectionBean = getSelectedBeanReference(); + boolean oldSelectionEmpty = isSelectionEmpty(); + boolean oldSelectionSingle = isSelectionSingle(); + boolean oldSelectionMultiple = isSelectionMultiple(); + this.selection = selection; + firePropertyChange("selection", oldValue, selection); + firePropertyChange("selectionEmpty", oldSelectionEmpty, isSelectionEmpty()); + firePropertyChange("selectionSingle", oldSelectionSingle, isSelectionSingle()); + firePropertyChange("selectionMultiple", oldSelectionMultiple, isSelectionMultiple()); + firePropertyChange(PROPERTY_SELECTED_BEAN_REFERENCE, oldSelectionBean, getSelectedBeanReference()); } public ToolkitIdLabel getReplaceReference() { @@ -157,10 +179,6 @@ public abstract class ContentReferentialUIModelStates<D extends ReferentialDto, return referenceCache; } - public boolean isSelectedBean() { - return getSelectedBeanReference() != null; - } - public final List<R> getReferentialReferences(String... ids) { ObserveSwingDataSource mainDataSource = getDataSourcesManager().getMainDataSource(); LinkedList<R> result = new LinkedList<>(mainDataSource.getReferentialReferences(mainReferenceType, ids)); ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/actions/DeleteReferential.java ===================================== @@ -29,7 +29,6 @@ import fr.ird.observe.client.datasource.editor.api.content.referential.ContentRe import fr.ird.observe.client.datasource.editor.api.content.referential.ContentReferentialUIModel; import fr.ird.observe.client.datasource.editor.api.content.referential.usage.UsageForDeleteUIHandler; import fr.ird.observe.client.datasource.editor.api.navigation.NavigationTree; -import fr.ird.observe.client.datasource.editor.api.navigation.NavigationTreeModel; import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavigationNode; import fr.ird.observe.dto.I18nDecoratorHelper; @@ -46,7 +45,9 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.awt.event.ActionEvent; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import static io.ultreia.java4all.i18n.I18n.n; @@ -63,39 +64,42 @@ public final class DeleteReferential<D extends ReferentialDto, R extends Referen private ToolkitIdLabel replaceReference; + public DeleteReferential(Class<D> dataType) { + super(dataType, n("observe.Common.action.delete"), I18n.t("observe.referential.Referential.action.delete.tip", I18nDecoratorHelper.getType(dataType)), "content-delete-16", ObserveKeyStrokesEditorApi.KEY_STROKE_DELETE_DATA_GLOBAL); + } + public static <D extends ReferentialDto, R extends ReferentialDtoReference, U extends ContentReferentialUI<D, R, U>> void installAction(U ui) { DeleteReferential<D, R, U> action = new DeleteReferential<>(ui.getModel().getScope().getMainType()); init(ui, ui.getDelete(), action); } - public DeleteReferential(Class<D> dataType) { - super(dataType, n("observe.Common.action.delete"), I18n.t("observe.referential.Referential.action.delete.tip", I18nDecoratorHelper.getType(dataType)), "content-delete-16", ObserveKeyStrokesEditorApi.KEY_STROKE_DELETE_DATA_GLOBAL); - } - @Override protected void doActionPerformed(ActionEvent event, U ui) { ContentReferentialUIModel<D, R> model = ui.getModel(); - R selectedBeanReference = model.getStates().getSelectedBeanReference(); - boolean canDelete = askToDelete(ui, selectedBeanReference); - if (canDelete) { - doDelete(ui, selectedBeanReference, replaceReference); - afterDelete(ui, selectedBeanReference); + List<R> selection = model.getStates().getSelection(); + Set<R> deleted = new LinkedHashSet<>(selection.size()); + Class<D> beanType = ui.getModel().getScope().getMainType(); + Class<R> referenceType = model.getScope().getMainReferenceType(); + ReferentialService referentialService = getServicesProvider().getReferentialService(); + UsageService usageService = getServicesProvider().getUsageService(); + for (R selectedBeanReference : selection) { + boolean canDelete = askToDelete(ui, model, beanType, referenceType, usageService, selectedBeanReference); + if (canDelete) { + doDelete(beanType, referentialService, selectedBeanReference, replaceReference); + deleted.add(selectedBeanReference); + } } + afterDelete(ui, deleted); } - private boolean askToDelete(U ui, R bean) { - - ContentReferentialUIModel<D, R> model = ui.getModel(); + private boolean askToDelete(U ui, ContentReferentialUIModel<D, R> model, Class<D> beanType, Class<R> referenceType, UsageService usageService, R bean) { // recherche des utilisation du bean dans la base - UsageService usageService = getServicesProvider().getUsageService(); ToolkitIdDtoBean request = model.getStates().toUsageRequest(bean.getId()); UsageCount usages = usageService.countReferential(request); replaceReference = null; - Class<D> beanType = model.getScope().getMainType(); - Class<R> referenceType = model.getScope().getMainReferenceType(); if (!usages.isEmpty()) { // some usages were found @@ -126,42 +130,46 @@ public final class DeleteReferential<D extends ReferentialDto, R extends Referen return DeleteEdit.confirmForEntityDelete(ui, bean); } - private void doDelete(U ui, ReferentialDtoReference bean, ToolkitIdLabel replaceReference) { + private void doDelete(Class<D> beanType, ReferentialService referentialService, ReferentialDtoReference bean, ToolkitIdLabel replaceReference) { String id = bean.getId(); - Class<D> beanType = ui.getModel().getScope().getMainType(); - ReferentialService referentialService = getServicesProvider().getReferentialService(); if (replaceReference != null) { String replaceId = replaceReference.getId(); log.info(String.format("Do replace reference before delete (%s → %s)", id, replaceId)); referentialService.replaceReference(beanType, id, replaceId); } referentialService.delete(beanType, id); - } - private void afterDelete(U ui, ReferentialDtoReference bean) { + private void afterDelete(U ui, Set<R> deleted) { + ui.getModel().getStates().setSelection(null); ui.stopEdit(); DataSourceEditor dataSourceEditor = getDataSourceEditor(); NavigationTree tree = dataSourceEditor.getNavigationUI().getTree(); - updateNavigationTreeStructure(tree, bean.getId()); + boolean needUpdateNavigationResult = isNeedUpdateNavigationResult(tree.getRootNode(), deleted); + if (needUpdateNavigationResult) { + // update navigation result + tree.getModel().updateNavigationResult(); + } NavigationNode selectedNode = tree.getSelectedNode(); selectedNode.reloadNodeData(); tree.reSelectSafeNodeThen(selectedNode, () -> dataSourceEditor.getModel().resetFromPreviousUi(ui)); } - private void updateNavigationTreeStructure(NavigationTree tree, String id) { - NavigationTreeModel model = tree.getModel(); - RootNavigationNode rootNode = tree.getRootNode(); + private boolean isNeedUpdateNavigationResult(RootNavigationNode rootNode, Set<R> deleted) { + boolean needUpdateNavigationResult = false; if (rootNode.getInitializer().getRequest().isLoadData()) { - NavigationNode groupByNode = rootNode.findChildById(id); - if (groupByNode != null) { - // remove node from tree - rootNode.remove(groupByNode); - // update navigation result - model.updateNavigationResult(); + for (R r : deleted) { + String id = r.getId(); + NavigationNode groupByNode = rootNode.findChildById(id); + if (groupByNode != null) { + // remove node from tree + rootNode.remove(groupByNode); + needUpdateNavigationResult = true; + } } } + return needUpdateNavigationResult; } } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/actions/ReferentialResetAdapter.java ===================================== @@ -28,6 +28,8 @@ import fr.ird.observe.client.datasource.editor.api.content.referential.ContentRe import fr.ird.observe.dto.reference.ReferentialDtoReference; import fr.ird.observe.dto.referential.ReferentialDto; +import java.util.List; + /** * Created on 19/10/2020. * @@ -52,7 +54,7 @@ public class ReferentialResetAdapter<D extends ReferentialDto, R extends Referen model.getStates().setResetEdit(true); try { ui.getList().setSelectedValue(selectedBean, false); - model.getStates().setSelectedBeanReference(selectedBean); + model.getStates().setSelection(List.of(selectedBean)); ui.getModify().doClick(); } finally { model.getStates().setResetEdit(false); ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/actions/SaveContentReferentialUIAdapter.java ===================================== @@ -34,6 +34,8 @@ import fr.ird.observe.dto.reference.ReferentialDtoReference; import fr.ird.observe.dto.referential.ReferentialDto; import fr.ird.observe.navigation.tree.io.request.ToolkitTreeFlatModelRootRequest; +import java.util.List; + /** * Created on 19/10/2020. * @@ -53,7 +55,7 @@ public class SaveContentReferentialUIAdapter<D extends ReferentialDto, R extends ContentReferentialUIModelStates<D, R> states = ui.getModel().getStates(); R reference = states.toReference(bean, dataSourceEditor.getConfig().getReferentialLocale()); - states.setSelectedBeanReference(reference); + states.setSelection(List.of(reference)); updateNavigationTreeStructure(notPersisted, bean, tree, states); tree.reSelectSafeNodeThen(selectedNode, () -> dataSourceEditor.getModel().resetFromPreviousUi(ui)); View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/b3b3c6142d7e6fc908e386ef5... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/b3b3c6142d7e6fc908e386ef5... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT (@tchemit)