Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe
Commits:
-
3d3fda15
by Tony Chemit at 2021-02-11T19:04:53+01:00
-
20b77f77
by Tony Chemit at 2021-02-11T19:06:32+01:00
5 changed files:
- client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/MoveExecutor.java
- client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/tree/DefaultMultipleMoveTreeAdapter.java
- client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/tree/DefaultSingleMoveTreeAdapter.java
- client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/tree/MoveTreeAdapter.java
- client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/list/ContentListUINavigationNode.java
Changes:
| ... | ... | @@ -27,7 +27,6 @@ import fr.ird.observe.client.datasource.editor.api.DataSourceEditor; |
| 27 | 27 |
import fr.ird.observe.client.datasource.editor.api.content.actions.mode.ChangeMode;
|
| 28 | 28 |
import fr.ird.observe.client.datasource.editor.api.content.actions.move.tree.MoveTreeAdapter;
|
| 29 | 29 |
import fr.ird.observe.client.datasource.editor.api.navigation.NavigationTree;
|
| 30 |
-import fr.ird.observe.dto.data.TripAware;
|
|
| 31 | 30 |
import fr.ird.observe.toolkit.dto.navigation.edit.EditNode;
|
| 32 | 31 |
import fr.ird.observe.toolkit.dto.navigation.edit.close.CloseEditNodeVetoException;
|
| 33 | 32 |
import org.apache.logging.log4j.LogManager;
|
| ... | ... | @@ -103,13 +102,7 @@ public class MoveExecutor { |
| 103 | 102 |
}
|
| 104 | 103 |
|
| 105 | 104 |
protected boolean close(MoveRequest request, EditNode<?> editNode, DataSourceEditor dataSourceEditor) {
|
| 106 |
- if (TripAware.class.isAssignableFrom(request.getReferenceType())) {
|
|
| 107 |
- // while moving trip, we do not close them
|
|
| 108 |
- //FIXME Maybe this should be driven by request (with doClose parameter)
|
|
| 109 |
- return true;
|
|
| 110 |
- }
|
|
| 111 |
- String id = request.getIds().iterator().next();
|
|
| 112 |
- if (editNode != null && Objects.equals(id, editNode.getId())) {
|
|
| 105 |
+ if (editNode != null && request.getIds().contains(editNode.getId())) {
|
|
| 113 | 106 |
try {
|
| 114 | 107 |
ChangeMode.closeData(dataSourceEditor, editNode);
|
| 115 | 108 |
} catch (CloseEditNodeVetoException e) {
|
| ... | ... | @@ -27,8 +27,6 @@ import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveRequ |
| 27 | 27 |
import fr.ird.observe.client.datasource.editor.api.content.data.list.ContentListUINavigationNode;
|
| 28 | 28 |
import fr.ird.observe.client.datasource.editor.api.navigation.NavigationTree;
|
| 29 | 29 |
import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode;
|
| 30 |
-import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavigationNode;
|
|
| 31 |
-import fr.ird.observe.dto.referential.common.ProgramReference;
|
|
| 32 | 30 |
|
| 33 | 31 |
/**
|
| 34 | 32 |
* Created on 15/10/2020.
|
| ... | ... | @@ -41,69 +39,24 @@ public class DefaultMultipleMoveTreeAdapter implements MoveTreeAdapter { |
| 41 | 39 |
@Override
|
| 42 | 40 |
public void adaptTree(MoveRequest request, NavigationTree tree) {
|
| 43 | 41 |
ImmutableSet<String> ids = request.getIds();
|
| 42 |
+ |
|
| 44 | 43 |
// get old parent node
|
| 45 | 44 |
ContentListUINavigationNode oldParentNode = (ContentListUINavigationNode) tree.getSelectedNode().upToReferenceContainerNode(request.getReferenceType());
|
| 46 | 45 |
|
| 47 |
- // get shared ancestor of tow parents
|
|
| 46 |
+ // get shared ancestor of two parents
|
|
| 48 | 47 |
NavigationNode parentContainerNode = oldParentNode.upToReferenceContainerNode(request.getParentReferenceType());
|
| 49 | 48 |
|
| 50 | 49 |
// get new parent node
|
| 51 |
- ContentListUINavigationNode newParentNode = getNewParentNode(request, parentContainerNode);
|
|
| 50 |
+ ContentListUINavigationNode newParentNode = MoveTreeAdapter.getNewParentNode(request, parentContainerNode);
|
|
| 52 | 51 |
|
| 53 | 52 |
// update it
|
| 54 | 53 |
newParentNode.addChildren(ids);
|
| 55 | 54 |
|
| 56 | 55 |
// clean old paren node
|
| 57 |
- cleanOldParentNode(tree, ids, oldParentNode);
|
|
| 58 |
- |
|
| 59 |
- if (request.isSelectTarget()) {
|
|
| 60 |
- // select new parent node
|
|
| 61 |
- tree.selectSafeNode(newParentNode);
|
|
| 62 |
- } else {
|
|
| 63 |
- if (oldParentNode.getParent() == null) {
|
|
| 64 |
- // limit case: select first node in tree (previous old parent node was removed)
|
|
| 65 |
- tree.selectFirstNode();
|
|
| 66 |
- }
|
|
| 67 |
- }
|
|
| 68 |
- }
|
|
| 56 |
+ MoveTreeAdapter.cleanOldParentNode(tree, ids, oldParentNode);
|
|
| 69 | 57 |
|
| 70 |
- protected void cleanOldParentNode(NavigationTree tree, ImmutableSet<String> ids, ContentListUINavigationNode oldParentNode) {
|
|
| 71 |
- if (oldParentNode.getChildCount() == ids.size() && oldParentNode.getParent().isRoot()) {
|
|
| 72 |
- RootNavigationNode root = (RootNavigationNode) oldParentNode.getParent();
|
|
| 73 |
- if (!root.getInitializer().getConfig().isLoadEmptyProgram()) {
|
|
| 74 |
- // limit case : node will be empty, must remove it
|
|
| 75 |
- root.remove(oldParentNode);
|
|
| 76 |
- return;
|
|
| 77 |
- }
|
|
| 78 |
- }
|
|
| 79 |
- // clean it
|
|
| 80 |
- oldParentNode.removeChildren(ids);
|
|
| 81 |
- |
|
| 82 |
- // reload node
|
|
| 83 |
- oldParentNode.reloadNodeData();
|
|
| 84 |
- |
|
| 85 |
- // re-select the node (to update associated form)
|
|
| 86 |
- tree.reSelectSafeNode(oldParentNode);
|
|
| 58 |
+ MoveTreeAdapter.doFinalSelect(request, tree, oldParentNode, newParentNode);
|
|
| 87 | 59 |
}
|
| 88 | 60 |
|
| 89 |
- protected ContentListUINavigationNode getNewParentNode(MoveRequest request, NavigationNode oldParentContainerNode) {
|
|
| 90 |
- String newParentId = request.getNewParentId();
|
|
| 91 |
- if (oldParentContainerNode.isRoot()) {
|
|
| 92 |
- RootNavigationNode root = (RootNavigationNode) oldParentContainerNode;
|
|
| 93 |
- boolean loadEmptyProgram = root.getInitializer().getConfig().isLoadEmptyProgram();
|
|
| 94 |
- if (!loadEmptyProgram) {
|
|
| 95 |
- NavigationNode result = root.findChildById(newParentId);
|
|
| 96 |
- if (result == null) {
|
|
| 97 |
- // limit case : node does not exist (was empty previously), need to create it
|
|
| 98 |
- ProgramReference reference = root.getInitializer().getNavigationResult().getProgram(newParentId);
|
|
| 99 |
- result = root.getCapability().createChildNode(reference);
|
|
| 100 |
- int position = root.getCapability().getNodePosition(reference);
|
|
| 101 |
- root.insert(result, position);
|
|
| 102 |
- }
|
|
| 103 |
- return (ContentListUINavigationNode) result;
|
|
| 104 |
- }
|
|
| 105 |
- }
|
|
| 106 |
- return (ContentListUINavigationNode) oldParentContainerNode.downToReferenceNode(request.getParentTargetReferenceType(), newParentId);
|
|
| 107 |
- }
|
|
| 108 | 61 |
|
| 109 | 62 |
}
|
| \ No newline at end of file |
| ... | ... | @@ -23,6 +23,7 @@ package fr.ird.observe.client.datasource.editor.api.content.actions.move.tree; |
| 23 | 23 |
*/
|
| 24 | 24 |
|
| 25 | 25 |
import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveRequest;
|
| 26 |
+import fr.ird.observe.client.datasource.editor.api.content.data.list.ContentListUINavigationNode;
|
|
| 26 | 27 |
import fr.ird.observe.client.datasource.editor.api.navigation.NavigationTree;
|
| 27 | 28 |
import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode;
|
| 28 | 29 |
import fr.ird.observe.dto.reference.DtoReference;
|
| ... | ... | @@ -37,47 +38,32 @@ public class DefaultSingleMoveTreeAdapter implements MoveTreeAdapter { |
| 37 | 38 |
|
| 38 | 39 |
@Override
|
| 39 | 40 |
public void adaptTree(MoveRequest request, NavigationTree tree) {
|
| 41 |
+ String id = request.getId();
|
|
| 40 | 42 |
|
| 41 | 43 |
Class<? extends DtoReference> parentReferenceType = request.getParentTargetReferenceType();
|
| 42 | 44 |
|
| 43 |
- // selected node
|
|
| 44 |
- NavigationNode node = tree.getSelectedNode();
|
|
| 45 |
+ Class<? extends DtoReference> referenceType = request.getReferenceType();
|
|
| 45 | 46 |
|
| 46 |
- Class<? extends DtoReference> referenceType = node.getScope().getMainReferenceType();
|
|
| 47 |
+ // get old parent node
|
|
| 48 |
+ ContentListUINavigationNode oldParentNode = (ContentListUINavigationNode) tree.getSelectedNode().upToReferenceContainerNode(referenceType);
|
|
| 47 | 49 |
|
| 48 |
- // up to old container reference node
|
|
| 49 |
- NavigationNode oldChildContainerNode = node.upToReferenceContainerNode(referenceType);
|
|
| 50 |
- |
|
| 51 |
- // remove node from old child container node
|
|
| 52 |
- node.removeFromParent();
|
|
| 53 |
- |
|
| 54 |
- // reload old child container node
|
|
| 55 |
- oldChildContainerNode.nodeChanged();
|
|
| 56 |
- |
|
| 57 |
- // up to old parent container node
|
|
| 58 |
- NavigationNode oldParentContainerNode = oldChildContainerNode.upToReferenceContainerNode(parentReferenceType);
|
|
| 50 |
+ // get shared ancestor of two parents
|
|
| 51 |
+ NavigationNode parentContainerNode = oldParentNode.upToReferenceContainerNode(parentReferenceType);
|
|
| 59 | 52 |
|
| 60 | 53 |
// dow to new parent node
|
| 61 |
- NavigationNode newParentNode = oldParentContainerNode.downToReferenceNode(parentReferenceType, request.getNewParentId());
|
|
| 54 |
+ ContentListUINavigationNode newParentNode = MoveTreeAdapter.getNewParentNode(request, parentContainerNode);
|
|
| 62 | 55 |
|
| 63 | 56 |
// down to new child container node
|
| 64 |
- NavigationNode newChildContainerNode = newParentNode.downToReferenceContainerNode(referenceType);
|
|
| 65 |
- |
|
| 66 |
- // insert node into new child container node
|
|
| 67 |
- newChildContainerNode.add(node);
|
|
| 57 |
+ ContentListUINavigationNode newChildContainerNode = (ContentListUINavigationNode) newParentNode.downToReferenceContainerNode(referenceType);
|
|
| 68 | 58 |
|
| 69 |
- // reload new child container node
|
|
| 70 |
- newChildContainerNode.nodeChanged();
|
|
| 59 |
+ // update it
|
|
| 60 |
+ NavigationNode node = newChildContainerNode.addChildren(id);
|
|
| 71 | 61 |
|
| 72 |
- // select final node parent (need to do this, otherwise next command has no effect (node stays the same)
|
|
| 73 |
- tree.selectSafeNode(newChildContainerNode);
|
|
| 74 |
- |
|
| 75 |
- // get back brand new node (otherwise tree model is broken)
|
|
| 76 |
- node = newChildContainerNode.downToReferenceNode(referenceType, request.getId());
|
|
| 77 |
- |
|
| 78 |
- // select final node
|
|
| 79 |
- tree.selectSafeNode(node);
|
|
| 62 |
+ // clean old paren node
|
|
| 63 |
+ MoveTreeAdapter.cleanOldParentNode(tree, request.getIds(), oldParentNode);
|
|
| 80 | 64 |
|
| 81 | 65 |
node.getParent().refreshToRoot();
|
| 66 |
+ |
|
| 67 |
+ MoveTreeAdapter.doFinalSelect(request, tree, oldParentNode, node);
|
|
| 82 | 68 |
}
|
| 83 | 69 |
}
|
| ... | ... | @@ -22,8 +22,13 @@ package fr.ird.observe.client.datasource.editor.api.content.actions.move.tree; |
| 22 | 22 |
* #L%
|
| 23 | 23 |
*/
|
| 24 | 24 |
|
| 25 |
+import com.google.common.collect.ImmutableSet;
|
|
| 25 | 26 |
import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveRequest;
|
| 27 |
+import fr.ird.observe.client.datasource.editor.api.content.data.list.ContentListUINavigationNode;
|
|
| 26 | 28 |
import fr.ird.observe.client.datasource.editor.api.navigation.NavigationTree;
|
| 29 |
+import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode;
|
|
| 30 |
+import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavigationNode;
|
|
| 31 |
+import fr.ird.observe.dto.referential.common.ProgramReference;
|
|
| 27 | 32 |
|
| 28 | 33 |
/**
|
| 29 | 34 |
* To adapt navigation tree after the move operation.
|
| ... | ... | @@ -37,4 +42,54 @@ public interface MoveTreeAdapter { |
| 37 | 42 |
|
| 38 | 43 |
void adaptTree(MoveRequest request, NavigationTree tree);
|
| 39 | 44 |
|
| 45 |
+ static void cleanOldParentNode(NavigationTree tree, ImmutableSet<String> ids, ContentListUINavigationNode oldParentNode) {
|
|
| 46 |
+ if (oldParentNode.getChildCount() == ids.size() && oldParentNode.getParent().isRoot()) {
|
|
| 47 |
+ RootNavigationNode root = (RootNavigationNode) oldParentNode.getParent();
|
|
| 48 |
+ if (!root.getInitializer().getConfig().isLoadEmptyProgram()) {
|
|
| 49 |
+ // limit case : node will be empty, must remove it
|
|
| 50 |
+ root.remove(oldParentNode);
|
|
| 51 |
+ return;
|
|
| 52 |
+ }
|
|
| 53 |
+ }
|
|
| 54 |
+ // clean it
|
|
| 55 |
+ oldParentNode.removeChildren(ids);
|
|
| 56 |
+ |
|
| 57 |
+ // reload node
|
|
| 58 |
+ oldParentNode.reloadNodeData();
|
|
| 59 |
+ |
|
| 60 |
+ // re-select the node (to update associated form)
|
|
| 61 |
+ tree.reSelectSafeNode(oldParentNode);
|
|
| 62 |
+ }
|
|
| 63 |
+ |
|
| 64 |
+ static ContentListUINavigationNode getNewParentNode(MoveRequest request, NavigationNode oldParentContainerNode) {
|
|
| 65 |
+ String newParentId = request.getNewParentId();
|
|
| 66 |
+ if (oldParentContainerNode.isRoot()) {
|
|
| 67 |
+ RootNavigationNode root = (RootNavigationNode) oldParentContainerNode;
|
|
| 68 |
+ boolean loadEmptyProgram = root.getInitializer().getConfig().isLoadEmptyProgram();
|
|
| 69 |
+ if (!loadEmptyProgram) {
|
|
| 70 |
+ NavigationNode result = root.findChildById(newParentId);
|
|
| 71 |
+ if (result == null) {
|
|
| 72 |
+ // limit case : node does not exist (was empty previously), need to create it
|
|
| 73 |
+ ProgramReference reference = root.getInitializer().getNavigationResult().getProgram(newParentId);
|
|
| 74 |
+ result = root.getCapability().createChildNode(reference);
|
|
| 75 |
+ int position = root.getCapability().getNodePosition(reference);
|
|
| 76 |
+ root.insert(result, position);
|
|
| 77 |
+ }
|
|
| 78 |
+ return (ContentListUINavigationNode) result;
|
|
| 79 |
+ }
|
|
| 80 |
+ }
|
|
| 81 |
+ return (ContentListUINavigationNode) oldParentContainerNode.downToReferenceNode(request.getParentTargetReferenceType(), newParentId);
|
|
| 82 |
+ }
|
|
| 83 |
+ |
|
| 84 |
+ static void doFinalSelect(MoveRequest request, NavigationTree tree,NavigationNode oldParentNode, NavigationNode newParentNode ) {
|
|
| 85 |
+ if (request.isSelectTarget()) {
|
|
| 86 |
+ // select new parent node
|
|
| 87 |
+ tree.selectSafeNode(newParentNode);
|
|
| 88 |
+ } else {
|
|
| 89 |
+ if (oldParentNode.getParent() == null) {
|
|
| 90 |
+ // limit case: select first node in tree (previous old parent node was removed)
|
|
| 91 |
+ tree.selectFirstNode();
|
|
| 92 |
+ }
|
|
| 93 |
+ }
|
|
| 94 |
+ }
|
|
| 40 | 95 |
}
|
| ... | ... | @@ -102,4 +102,25 @@ public abstract class ContentListUINavigationNode extends NavigationNode { |
| 102 | 102 |
}
|
| 103 | 103 |
}
|
| 104 | 104 |
}
|
| 105 |
+ public NavigationNode addChildren(String id) {
|
|
| 106 |
+ NavigationNode result=null;
|
|
| 107 |
+ ContentListUINavigationInitializer initializer = getInitializer();
|
|
| 108 |
+ boolean notLoaded = isNotLoaded();
|
|
| 109 |
+ reloadNodeData();
|
|
| 110 |
+ List<? extends DataDtoReference> references = initializer.getReferences();
|
|
| 111 |
+ ContentListUINavigationCapability<?> capability = getCapability();
|
|
| 112 |
+ for (DataDtoReference reference : references) {
|
|
| 113 |
+ boolean idEquals = id.equals(reference.getId());
|
|
| 114 |
+ if (notLoaded || idEquals) {
|
|
| 115 |
+ |
|
| 116 |
+ NavigationNode childNode = capability.createChildNode(reference);
|
|
| 117 |
+ int nodePosition = capability.getNodePosition(reference);
|
|
| 118 |
+ insert(childNode, nodePosition);
|
|
| 119 |
+ if (idEquals) {
|
|
| 120 |
+ result = childNode;
|
|
| 121 |
+ }
|
|
| 122 |
+ }
|
|
| 123 |
+ }
|
|
| 124 |
+ return result;
|
|
| 125 |
+ }
|
|
| 105 | 126 |
}
|