This is an automated email from the ASF dual-hosted git repository.

tiagobento pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools.git


The following commit(s) were added to refs/heads/main by this push:
     new 66a789ec3e5 kie-issues#889: DMN Editor: Moving or resizing a Decision 
contained by a Decision Service (#3157)
66a789ec3e5 is described below

commit 66a789ec3e534ad633b78d47119361e22f9169cb
Author: Aswathi <[email protected]>
AuthorDate: Thu May 29 19:28:25 2025 +0530

    kie-issues#889: DMN Editor: Moving or resizing a Decision contained by a 
Decision Service (#3157)
    
    Co-authored-by: Aswathi T V <[email protected]>
---
 packages/dmn-editor/src/diagram/Diagram.tsx        |  52 +++++++++++++
 packages/dmn-editor/src/diagram/nodes/Nodes.tsx    |   3 +-
 .../Google-Chrome/drds/repositioned-decision.png   | Bin 0 -> 30344 bytes
 .../Google-Chrome/drds/resized-decision.png        | Bin 0 -> 30341 bytes
 .../chromium/drds/repositioned-decision.png        | Bin 0 -> 30865 bytes
 .../chromium/drds/resized-decision.png             | Bin 0 -> 30920 bytes
 .../webkit/drds/repositioned-decision.png          | Bin 0 -> 32242 bytes
 .../webkit/drds/resized-decision.png               | Bin 0 -> 32184 bytes
 .../drds/modelDecisionServicesInDrds.spec.ts       |  86 +++++++++++++++++++++
 9 files changed, 140 insertions(+), 1 deletion(-)

diff --git a/packages/dmn-editor/src/diagram/Diagram.tsx 
b/packages/dmn-editor/src/diagram/Diagram.tsx
index 8724cf519e9..b815a229bf3 100644
--- a/packages/dmn-editor/src/diagram/Diagram.tsx
+++ b/packages/dmn-editor/src/diagram/Diagram.tsx
@@ -131,6 +131,7 @@ import { useSettings } from 
"../settings/DmnEditorSettingsContext";
 import { EvaluationHighlightsBadge } from 
"../evaluationHighlights/EvaluationHighlightsBadge";
 import { Flex } from "@patternfly/react-core/dist/js/layouts/Flex";
 import { Text } from "@patternfly/react-core/dist/js/components/Text";
+import { computeIndexedDrd } from "../store/computed/computeIndexes";
 
 const isFirefox = typeof (window as any).InstallTrigger !== "undefined"; // 
See 
https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browsers
 
@@ -787,6 +788,31 @@ export const Diagram = React.forwardRef<DiagramRef, { 
container: React.RefObject
                         },
                       },
                     });
+                    if (node.type === NODE_TYPES.decision && 
node.data.parentRfNode) {
+                      const dsContainingDecision = node.data.parentRfNode;
+                      const drds = 
state.dmn.model.definitions["dmndi:DMNDI"]?.["dmndi:DMNDiagram"] ?? [];
+                      for (let i = 0; i < drds.length; i++) {
+                        if (i === state.computed(state).getDrdIndex()) {
+                          continue;
+                        }
+                        const _indexedDrd = computeIndexedDrd(
+                          state.dmn.model.definitions["@_namespace"],
+                          state.dmn.model.definitions,
+                          i
+                        );
+                        const dsShapeContainingDecision = 
_indexedDrd.dmnShapesByHref.get(dsContainingDecision.id);
+                        const dsShape = 
_indexedDrd.dmnShapesByHref.get(node.id);
+                        if (
+                          dsShapeContainingDecision &&
+                          dsShape &&
+                          dsShape["dc:Bounds"] &&
+                          !dsShapeContainingDecision["@_isCollapsed"]
+                        ) {
+                          dsShape["dc:Bounds"]["@_width"] = 
change.dimensions?.width ?? 0;
+                          dsShape["dc:Bounds"]["@_height"] = 
change.dimensions?.height ?? 0;
+                        }
+                      }
+                    }
                   }
                 }
                 break;
@@ -867,6 +893,32 @@ export const Diagram = React.forwardRef<DiagramRef, { 
container: React.RefObject
                       });
                     }
                   }
+                  if (node.type === NODE_TYPES.decision && 
node.data.parentRfNode) {
+                    const parentDecisionService = node.data.parentRfNode;
+                    const drds = 
state.dmn.model.definitions["dmndi:DMNDI"]?.["dmndi:DMNDiagram"] ?? [];
+                    for (let i = 0; i < drds.length; i++) {
+                      if (i === state.computed(state).getDrdIndex()) {
+                        continue;
+                      }
+                      const _indexedDrd = computeIndexedDrd(
+                        state.dmn.model.definitions["@_namespace"],
+                        state.dmn.model.definitions,
+                        i
+                      );
+                      const parentShape = 
_indexedDrd.dmnShapesByHref.get(parentDecisionService.id);
+                      const dsShape = _indexedDrd.dmnShapesByHref.get(node.id);
+                      const relativePosinCurrentDS = {
+                        x: (change.position?.x ?? 0) - 
(parentDecisionService?.data?.shape["dc:Bounds"]?.["@_x"] ?? 0),
+                        y: (change.position?.y ?? 0) - 
(parentDecisionService.data.shape["dc:Bounds"]?.["@_y"] ?? 0),
+                      };
+                      if (parentShape && dsShape && dsShape["dc:Bounds"] && 
!parentShape["@_isCollapsed"]) {
+                        dsShape["dc:Bounds"]["@_x"] =
+                          (parentShape["dc:Bounds"]?.["@_x"] ?? 0) + 
relativePosinCurrentDS.x;
+                        dsShape["dc:Bounds"]["@_y"] =
+                          (parentShape["dc:Bounds"]?.["@_y"] ?? 0) + 
relativePosinCurrentDS.y;
+                      }
+                    }
+                  }
                 }
                 break;
               case "remove":
diff --git a/packages/dmn-editor/src/diagram/nodes/Nodes.tsx 
b/packages/dmn-editor/src/diagram/nodes/Nodes.tsx
index 8888f179a5c..e0a21079623 100644
--- a/packages/dmn-editor/src/diagram/nodes/Nodes.tsx
+++ b/packages/dmn-editor/src/diagram/nodes/Nodes.tsx
@@ -1005,7 +1005,8 @@ export const DecisionServiceNode = React.memo(
                     "@_y":
                       dropPoint.y +
                       (decisionShapeOnOtherDrd["dc:Bounds"]!["@_y"] - 
dsShapeOnOtherDrd["dc:Bounds"]!["@_y"]),
-                    ...minNodeSize,
+                    "@_width": 
decisionShapeOnOtherDrd["dc:Bounds"]!["@_width"],
+                    "@_height": 
decisionShapeOnOtherDrd["dc:Bounds"]!["@_height"],
                   },
                 },
               });
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drds/repositioned-decision.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drds/repositioned-decision.png
new file mode 100644
index 00000000000..f7a14634237
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drds/repositioned-decision.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drds/resized-decision.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drds/resized-decision.png
new file mode 100644
index 00000000000..3aee047f52f
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drds/resized-decision.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drds/repositioned-decision.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drds/repositioned-decision.png
new file mode 100644
index 00000000000..b010a44933b
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drds/repositioned-decision.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drds/resized-decision.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drds/resized-decision.png
new file mode 100644
index 00000000000..b4af92bc664
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drds/resized-decision.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drds/repositioned-decision.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drds/repositioned-decision.png
new file mode 100644
index 00000000000..60bfd9a7ed2
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drds/repositioned-decision.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drds/resized-decision.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drds/resized-decision.png
new file mode 100644
index 00000000000..4acce6a8504
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drds/resized-decision.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/drds/modelDecisionServicesInDrds.spec.ts 
b/packages/dmn-editor/tests-e2e/drds/modelDecisionServicesInDrds.spec.ts
index 80140760552..ac8c7a83641 100644
--- a/packages/dmn-editor/tests-e2e/drds/modelDecisionServicesInDrds.spec.ts
+++ b/packages/dmn-editor/tests-e2e/drds/modelDecisionServicesInDrds.spec.ts
@@ -235,6 +235,92 @@ test.describe("Model Decision Services - DRD", () => {
     await 
expect(diagram.get()).toHaveScreenshot("decision-service-from-other-drd.png");
   });
 
+  test("Resizing decision contained by decision service should resize it in 
all DRDs", async ({
+    drds,
+    drgNodes,
+    palette,
+    nodes,
+    diagram,
+  }) => {
+    test.info().annotations.push({
+      type: TestAnnotations.REGRESSION,
+      description: "https://github.com/apache/incubator-kie-issues/issues/889";,
+    });
+    await drds.toggle();
+    await drds.create({ name: "First DRD" });
+    await drgNodes.toggle();
+
+    await palette.dragNewNode({
+      type: NodeType.DECISION_SERVICE,
+      targetPosition: { x: 400, y: 200 },
+      thenRenameTo: "DS1",
+    });
+    await expect(nodes.get({ name: "DS1" })).toBeAttached();
+
+    await palette.dragNewNode({
+      type: NodeType.DECISION,
+      targetPosition: { x: 200, y: 200 },
+      thenRenameTo: "D1",
+    });
+    await expect(nodes.get({ name: "D1" })).toBeAttached();
+
+    await nodes.move({ name: "D1", targetPosition: { x: 500, y: 300 } });
+    await expect(nodes.get({ name: "D1" })).toBeAttached();
+    await drds.toggle();
+    await drds.create({ name: "Second DRD" });
+    await drgNodes.dragNode({ name: "DS1", targetPosition: { x: 400, y: 200 } 
});
+
+    await drgNodes.toggle();
+    await nodes.resize({ nodeName: "D1", xOffset: 50, yOffset: 0 });
+    await drds.toggle();
+    await drds.navigateTo({ name: "First DRD" });
+    await drds.toggle();
+    await expect(diagram.get()).toHaveScreenshot("resized-decision.png");
+  });
+
+  test("Moving decision contained by decision service should move it in all 
DRDs", async ({
+    drds,
+    drgNodes,
+    palette,
+    nodes,
+    diagram,
+  }) => {
+    test.info().annotations.push({
+      type: TestAnnotations.REGRESSION,
+      description: "https://github.com/apache/incubator-kie-issues/issues/889";,
+    });
+    await drds.toggle();
+    await drds.create({ name: "First DRD" });
+    await drgNodes.toggle();
+
+    await palette.dragNewNode({
+      type: NodeType.DECISION_SERVICE,
+      targetPosition: { x: 400, y: 200 },
+      thenRenameTo: "DS1",
+    });
+    await expect(nodes.get({ name: "DS1" })).toBeAttached();
+
+    await palette.dragNewNode({
+      type: NodeType.DECISION,
+      targetPosition: { x: 200, y: 200 },
+      thenRenameTo: "D1",
+    });
+    await expect(nodes.get({ name: "D1" })).toBeAttached();
+
+    await nodes.move({ name: "D1", targetPosition: { x: 500, y: 300 } });
+    await expect(nodes.get({ name: "D1" })).toBeAttached();
+    await drds.toggle();
+    await drds.create({ name: "Second DRD" });
+    await drgNodes.dragNode({ name: "DS1", targetPosition: { x: 400, y: 200 } 
});
+
+    await drgNodes.toggle();
+    await nodes.move({ name: "D1", targetPosition: { x: 600, y: 300 } });
+    await drds.toggle();
+    await drds.navigateTo({ name: "First DRD" });
+    await drds.toggle();
+    await expect(diagram.get()).toHaveScreenshot("repositioned-decision.png");
+  });
+
   test("892 expand - allow only if no other DS is collpased in the DRD", async 
({ drds }) => {
     test.skip(true, 
"https://github.com/apache/incubator-kie-issues/issues/892";);
     test.info().annotations.push({


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to