Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 2a76de06 by Tony Chemit at 2022-09-11T17:53:48+02:00 Client - (on delete - reset) Bien gérer le repositionnement dans l'arbre de navigation d'une marée suite à une sauvegarde si le critère a été modifié (See #2225) - - - - - bd51e3a9 by Tony Chemit at 2022-09-11T18:11:06+02:00 Client - decorate missing groupBy node dto - See #2225 - - - - - e0df1a24 by Tony Chemit at 2022-09-11T18:17:39+02:00 Client - (on update) Bien gérer le repositionnement dans l'arbre de navigation d'une marée suite à une sauvegarde si le critère a été modifié (See #2225) - - - - - d685e4aa by Tony Chemit at 2022-09-11T18:17:48+02:00 Merge branch 'feature/features/navigation_tree_review_limit_cases' into develop Close #2225 - - - - - 5 changed files: - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/delete/DeleteRootTreeAdapter.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/reset/DefaultResetAdapter.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/ropen/ContentRootOpenableUINavigationInitializer.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/ropen/actions/SaveContentRootOpenableUIAdapter.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/root/RootNavigationNode.java Changes: ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/delete/DeleteRootTreeAdapter.java ===================================== @@ -45,10 +45,14 @@ public abstract class DeleteRootTreeAdapter<OldParent extends NavigationNode> ex @Override public void removeChildren(NavigationUI navigationUI, OldParent parentNode, Set<String> ids) { super.removeChildren(navigationUI, parentNode, ids); - RootNavigationInitializer initializer = (RootNavigationInitializer) parentNode.getRoot().getInitializer(); + NavigationNode rootNode = parentNode.getRoot(); + RootNavigationInitializer initializer = (RootNavigationInitializer) rootNode.getInitializer(); boolean removeGroupBy = parentNode.getChildCount() == 0 && !initializer.getRequest().isLoadEmptyGroupBy(); if (removeGroupBy) { parentNode.removeFromParent(); + if (rootNode.isNotLeaf()) { + navigationUI.getTree().selectFirstNode(); + } } NavigationUIHandler.updateStatistics(navigationUI, removeGroupBy ? -1 : 0, -ids.size()); } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/reset/DefaultResetAdapter.java ===================================== @@ -25,9 +25,11 @@ package fr.ird.observe.client.datasource.editor.api.content.actions.reset; import fr.ird.observe.client.datasource.editor.api.content.ContentUI; import fr.ird.observe.client.datasource.editor.api.content.ContentUIHandler; import fr.ird.observe.client.datasource.editor.api.content.ContentUIModel; +import fr.ird.observe.client.datasource.editor.api.content.data.rlist.ContentRootListUINavigationNode; import fr.ird.observe.client.datasource.editor.api.content.data.table.ContentTableUI; import fr.ird.observe.client.datasource.editor.api.navigation.NavigationTree; import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; +import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavigationInitializer; /** * Created on 19/10/2020. @@ -45,6 +47,18 @@ public class DefaultResetAdapter<U extends ContentUI> implements ResetAdapter<U> NavigationTree tree = handler.getNavigationTree(); NavigationNode parentNode = tree.getSelectedNode().getParent(); tree.getSelectedNode().removeFromParent(); + if (parentNode instanceof ContentRootListUINavigationNode) { + NavigationNode rootNode = parentNode.getRoot(); + RootNavigationInitializer initializer = (RootNavigationInitializer) rootNode.getInitializer(); + boolean removeGroupBy = parentNode.getChildCount() == 0 && !initializer.getRequest().isLoadEmptyGroupBy(); + if (removeGroupBy) { + parentNode.removeFromParent(); + if (rootNode.isNotLeaf()) { + tree.selectFirstNode(); + } + return; + } + } tree.reloadAndSelectSafeNode(parentNode); } } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/ropen/ContentRootOpenableUINavigationInitializer.java ===================================== @@ -40,7 +40,7 @@ import java.util.function.Supplier; */ public final class ContentRootOpenableUINavigationInitializer extends NavigationInitializer<ContentRootOpenableUINavigationContext> { - private final Supplier<? extends DataGroupByDto<?>> parentReference; + private Supplier<? extends DataGroupByDto<?>> parentReference; private DataDtoReference reference; private Decorator decorator; @@ -104,6 +104,10 @@ public final class ContentRootOpenableUINavigationInitializer extends Navigation return getSelectId() == null; } + public void setParentReference(Supplier<? extends DataGroupByDto<?>> parentReference) { + this.parentReference = Objects.requireNonNull(parentReference); + } + public void setReference(DataDtoReference reference) { this.reference = Objects.requireNonNull(reference); } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/ropen/actions/SaveContentRootOpenableUIAdapter.java ===================================== @@ -24,6 +24,7 @@ package fr.ird.observe.client.datasource.editor.api.content.data.ropen.actions; import fr.ird.observe.client.datasource.editor.api.DataSourceEditor; import fr.ird.observe.client.datasource.editor.api.content.actions.save.SaveUIAdapter; +import fr.ird.observe.client.datasource.editor.api.content.data.rlist.ContentRootListUINavigationNode; import fr.ird.observe.client.datasource.editor.api.content.data.ropen.ContentRootOpenableUI; import fr.ird.observe.client.datasource.editor.api.content.data.ropen.ContentRootOpenableUIModel; import fr.ird.observe.client.datasource.editor.api.content.data.ropen.ContentRootOpenableUINavigationNode; @@ -31,11 +32,15 @@ import fr.ird.observe.client.datasource.editor.api.navigation.NavigationTree; import fr.ird.observe.client.datasource.editor.api.navigation.NavigationUIHandler; import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; import fr.ird.observe.client.datasource.editor.api.navigation.tree.capability.ReferenceContainerCapability; +import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavigationNode; +import fr.ird.observe.dto.data.DataGroupByDto; import fr.ird.observe.dto.data.RootOpenableDto; import fr.ird.observe.dto.reference.DataDtoReference; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.util.Objects; + /** * Created on 16/10/2020. * @@ -53,9 +58,17 @@ public class SaveContentRootOpenableUIAdapter<D extends RootOpenableDto, U exten ui.stopEdit(); ContentRootOpenableUINavigationNode node = model.getSource(); + + // get old groupBy dto + @SuppressWarnings("unchecked") DataGroupByDto<D> oldGroupByDto = (DataGroupByDto<D>) node.getParentReference(); + + // new groupBy value + String newGroupByValue = oldGroupByDto.definition().toGroupByValue(bean, ((RootNavigationNode) node.getRoot()).getInitializer().getRequest().getGroupByFlavor()); + // is groupBy has changed? + boolean groupByChanged = !Objects.equals(oldGroupByDto.getFilterValue(), newGroupByValue); // We need to inject ot node the new reference (it could does not know the id if not persisted) // As I prefer to use a unique code (for persisted or not, keep it like this) - updateReference(node, bean.getId()); + updateReference(node, bean.getId(), oldGroupByDto, groupByChanged ? newGroupByValue : null); NavigationTree tree = dataSourceEditor.getNavigationUI().getTree(); tree.reSelectSafeNodeThen(node, () -> { @@ -67,11 +80,32 @@ public class SaveContentRootOpenableUIAdapter<D extends RootOpenableDto, U exten }); } - - public void updateReference(ContentRootOpenableUINavigationNode node, String id) { + public void updateReference(ContentRootOpenableUINavigationNode node, + String id, + DataGroupByDto<D> oldGroupByDto, + String newGroupByValue) { boolean notPersisted = node.getInitializer().isNotPersisted(); NavigationNode parent = node.getParent(); - int oldPosition = parent.getIndex(node); + boolean groupByChanged = newGroupByValue != null; + if (groupByChanged) { + // groupBy has changed (remove node from parent) + RootNavigationNode rootNode = (RootNavigationNode) node.getRoot(); + node.removeFromParent(); + // remove old parent node if navigation tree config requires it + boolean removeGroupBy = parent.getChildCount() == 0 && !rootNode.getInitializer().getRequest().isLoadEmptyGroupBy(); + if (removeGroupBy) { + parent.removeFromParent(); + } else { + // update old parent to root + parent.reloadNodeDataToRoot(); + } + // find new parent + parent = rootNode.findChildById(newGroupByValue, true); + // update parent reference in node + DataGroupByDto<?> parentReference = ((ContentRootListUINavigationNode) parent).getInitializer().getParentReference(); + node.getInitializer().setParentReference(() -> parentReference); + } + DataDtoReference reference = node.getInitializer().updateReference(node.getContext(), id); if (notPersisted) { node.getInitializer().updateEditNodeId(id); @@ -86,12 +120,24 @@ public class SaveContentRootOpenableUIAdapter<D extends RootOpenableDto, U exten } ReferenceContainerCapability<?> capability = (ReferenceContainerCapability<?>) parent.getCapability(); - int newPosition = capability.getNodePosition(reference); - if (oldPosition != newPosition) { - log.info(String.format("Move node from: %d to %d", oldPosition, newPosition)); - parent.moveNode(node, newPosition); + if (groupByChanged) { + if (parent.isNotLoaded()) { + // will load all children even the updated one + parent.populateChildrenIfNotLoaded(); + } else { + // need to add updated node + int newPosition = capability.getNodePosition(reference); + log.info(String.format("Change groupBy node from: %s to %s (position: %d)", oldGroupByDto.getFilterValue(), newGroupByValue, newPosition)); + parent.insert(node, newPosition); + } + } else { + int oldPosition = parent.getIndex(node); + int newPosition = capability.getNodePosition(reference); + if (oldPosition != newPosition) { + log.info(String.format("Move node from: %d to %d", oldPosition, newPosition)); + parent.moveNode(node, newPosition); + } } - // repaint selected node and his children node.nodeChangedDeep(); ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/root/RootNavigationNode.java ===================================== @@ -130,16 +130,13 @@ public class RootNavigationNode extends NavigationNode { return result; } - public <N extends NavigationNode> N findChildByTypeWithNoCreate(Class<N> childType, String id) { - return super.findChildByType(childType, id); - } - protected NavigationNode createMissingNode(String id) { // limit case : node does not exist (was empty previously), need to create it DataGroupByDto<?> reference = getInitializer().getNavigationResult().getGroupBy(id); if (reference == null) { ToolkitTreeFlatModelRootRequest request = getInitializer().getRequest(); reference = getDataSourcesManager().getMainDataSource().getRootOpenableService().getGroupByDtoValue(getInitializer().getNavigationResult().getData().getType(), new DataGroupByParameter(request.getGroupByName(), request.getGroupByFlavor(), id)); + getDecoratorService().installDecorator(reference); } NavigationNode result = getCapability().createChildNode(reference); int position = getCapability().getNodePosition(reference); View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/96aca2d40d67ed5079dfdaaac... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/96aca2d40d67ed5079dfdaaac... You're receiving this email because of your account on gitlab.com.