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 e2a832381a8 kie-issues#894: Decision Services & multiple DRDs: Adding 
Decisions to a DRD (#2185)
e2a832381a8 is described below

commit e2a832381a8ebb4cb56c3d9745212cb93841fb8e
Author: Tiago Bento <[email protected]>
AuthorDate: Thu Feb 29 14:22:18 2024 -0500

    kie-issues#894: Decision Services & multiple DRDs: Adding Decisions to a 
DRD (#2185)
---
 packages/dmn-editor/src/diagram/Diagram.tsx        | 35 ------------------
 packages/dmn-editor/src/diagram/DrgNodesPanel.tsx  | 41 ++++++++++++++++------
 .../mutations/addExistingDecisionServiceToDrd.ts   | 15 ++++----
 packages/dmn-editor/src/mutations/deleteNode.ts    | 25 +++++++------
 ...iningDecisionServiceHrefsByDecisionHrefs.ts.ts} |  2 +-
 5 files changed, 54 insertions(+), 64 deletions(-)

diff --git a/packages/dmn-editor/src/diagram/Diagram.tsx 
b/packages/dmn-editor/src/diagram/Diagram.tsx
index 0703dad042c..e1fa6d29dfc 100644
--- a/packages/dmn-editor/src/diagram/Diagram.tsx
+++ b/packages/dmn-editor/src/diagram/Diagram.tsx
@@ -387,23 +387,6 @@ export const Diagram = React.forwardRef<DiagramRef, { 
container: React.RefObject
                 thisDmnsIndexedDrd: state.computed(state).indexedDrd(),
                 thisDmnsNamespace: state.dmn.model.definitions["@_namespace"],
               });
-            } else if (externalDrgElement.__$$element === "decision") {
-              // TODO: Tiago --> Add logic for Decision contained by DS.
-              const externalNodeType = 
getNodeTypeFromDmnObject(externalDrgElement)!;
-              addShape({
-                definitions: state.dmn.model.definitions,
-                drdIndex: state.diagram.drdIndex,
-                nodeType: externalNodeType,
-                shape: {
-                  "@_dmnElementRef": xmlHrefToQName(externalNodeHref, 
state.dmn.model.definitions),
-                  "dc:Bounds": {
-                    "@_x": dropPoint.x,
-                    "@_y": dropPoint.y,
-                    "@_width": defaultExternalNodeDimensions["@_width"],
-                    "@_height": defaultExternalNodeDimensions["@_height"],
-                  },
-                },
-              });
             } else {
               const externalNodeType = 
getNodeTypeFromDmnObject(externalDrgElement)!;
               addShape({
@@ -453,24 +436,6 @@ export const Diagram = React.forwardRef<DiagramRef, { 
container: React.RefObject
                 thisDmnsIndexedDrd: state.computed(state).indexedDrd(),
                 thisDmnsNamespace: state.dmn.model.definitions["@_namespace"],
               });
-            } else if (drgElement.__$$element === "decision") {
-              // TODO: Tiago --> Add logic for Decision contained by DS.
-              const nodeType = getNodeTypeFromDmnObject(drgElement)!;
-              addShape({
-                definitions: state.dmn.model.definitions,
-                drdIndex: state.diagram.drdIndex,
-                nodeType,
-                shape: {
-                  "@_dmnElementRef": buildXmlQName({ type: "xml-qname", 
localPart: drgElement["@_id"]! }),
-                  "@_isCollapsed": false,
-                  "dc:Bounds": {
-                    "@_x": dropPoint.x,
-                    "@_y": dropPoint.y,
-                    "@_width": defaultNodeDimensions["@_width"],
-                    "@_height": defaultNodeDimensions["@_height"],
-                  },
-                },
-              });
             } else {
               const nodeType = getNodeTypeFromDmnObject(drgElement)!;
               addShape({
diff --git a/packages/dmn-editor/src/diagram/DrgNodesPanel.tsx 
b/packages/dmn-editor/src/diagram/DrgNodesPanel.tsx
index 101bc8adbda..887b67992f4 100644
--- a/packages/dmn-editor/src/diagram/DrgNodesPanel.tsx
+++ b/packages/dmn-editor/src/diagram/DrgNodesPanel.tsx
@@ -24,43 +24,62 @@ import { Text, TextContent } from 
"@patternfly/react-core/dist/js/components/Tex
 import { Flex } from "@patternfly/react-core/dist/js/layouts/Flex";
 import { TimesIcon } from "@patternfly/react-icons/dist/js/icons/times-icon";
 import * as React from "react";
-import { useCallback, useState } from "react";
+import { useCallback, useMemo, useState } from "react";
 import { DmnObjectListItem } from "../externalNodes/DmnObjectListItem";
 import { DiagramLhsPanel } from "../store/Store";
 import { useDmnEditorStore, useDmnEditorStoreApi } from 
"../store/StoreContext";
 import { Unpacked } from "../tsExt/tsExt";
 import { buildXmlHref } from "../xml/xmlHrefs";
 import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
+import { computeContainingDecisionServiceHrefsByDecisionHrefs } from 
"../store/computed/computeContainingDecisionServiceHrefsByDecisionHrefs.ts";
 
 export const MIME_TYPE_FOR_DMN_EDITOR_DRG_NODE = "kie-dmn-editor--drg-node";
 
 export function DrgNodesPanel() {
-  const thisDmn = useDmnEditorStore((s) => s.dmn);
+  const thisDmnsDrgElements = useDmnEditorStore((s) => 
s.dmn.model.definitions.drgElement ?? []);
+  const thisDmnsNamespace = useDmnEditorStore((s) => 
s.dmn.model.definitions["@_namespace"]);
   const dmnShapesByHref = useDmnEditorStore((s) => 
s.computed(s).indexedDrd().dmnShapesByHref);
 
   const dmnEditorStoreApi = useDmnEditorStoreApi();
 
   const [filter, setFilter] = useState("");
 
-  const namespace = ""; // That's the default namespace.
+  const namespaceForHref = ""; // That's the default namespace.
 
   const onDragStart = useCallback((event: React.DragEvent, drgElement: 
Unpacked<DMN15__tDefinitions["drgElement"]>) => {
     event.dataTransfer.setData(MIME_TYPE_FOR_DMN_EDITOR_DRG_NODE, 
JSON.stringify(drgElement));
     event.dataTransfer.effectAllowed = "move";
   }, []);
 
-  const nodes = thisDmn.model.definitions.drgElement
-    ?.filter((drgElement) => 
drgElement["@_name"].toLowerCase().includes(filter.toLowerCase()))
+  const containingDecisionServiceHrefsByDecisionHrefsRelativeToThisDmn = 
useMemo(
+    () =>
+      computeContainingDecisionServiceHrefsByDecisionHrefs({
+        drgElements: thisDmnsDrgElements,
+        drgElementsNamespace: thisDmnsNamespace,
+        thisDmnsNamespace: thisDmnsNamespace,
+      }),
+    [thisDmnsDrgElements, thisDmnsNamespace]
+  );
+
+  const nodes = thisDmnsDrgElements
+    .filter((drgElement) => 
drgElement["@_name"].toLowerCase().includes(filter.toLowerCase()))
     .map((drgElement) => {
-      const dmnObjectHref = buildXmlHref({ namespace, id: drgElement["@_id"]! 
});
-      const isAlreadyIncluded = dmnShapesByHref.has(dmnObjectHref);
+      const dmnObjectHref = buildXmlHref({ namespace: namespaceForHref, id: 
drgElement["@_id"]! });
+      const canBeIncluded =
+        !dmnShapesByHref.has(dmnObjectHref) &&
+        
(containingDecisionServiceHrefsByDecisionHrefsRelativeToThisDmn.get(dmnObjectHref)
 ?? []).every(
+          (dsHref) => !dmnShapesByHref.has(dsHref)
+        );
 
       return (
         <div
           key={drgElement["@_id"]}
           className={"kie-dmn-editor--external-nodes-list-item"}
-          draggable={!isAlreadyIncluded}
-          style={{ opacity: isAlreadyIncluded ? "0.4" : undefined }}
+          draggable={canBeIncluded}
+          style={{
+            opacity: canBeIncluded ? undefined : 0.4,
+            userSelect: "none",
+          }}
           onDragStart={(event) => onDragStart(event, drgElement)}
         >
           <Flex
@@ -71,8 +90,8 @@ export function DrgNodesPanel() {
             <DmnObjectListItem
               dmnObjectHref={dmnObjectHref}
               dmnObject={drgElement}
-              namespace={namespace}
-              relativeToNamespace={namespace}
+              namespace={namespaceForHref}
+              relativeToNamespace={namespaceForHref}
             />
           </Flex>
         </div>
diff --git 
a/packages/dmn-editor/src/mutations/addExistingDecisionServiceToDrd.ts 
b/packages/dmn-editor/src/mutations/addExistingDecisionServiceToDrd.ts
index 9e6ae2f91a2..97e39f60a54 100644
--- a/packages/dmn-editor/src/mutations/addExistingDecisionServiceToDrd.ts
+++ b/packages/dmn-editor/src/mutations/addExistingDecisionServiceToDrd.ts
@@ -24,7 +24,7 @@ import {
 import { DECISION_SERVICE_COLLAPSED_DIMENSIONS } from 
"../diagram/nodes/DefaultSizes";
 import { NODE_TYPES } from "../diagram/nodes/NodeTypes";
 import { Computed } from "../store/Store";
-import { computeDecisionServiceHrefsByDecisionHrefs } from 
"../store/computed/computeDecisionServiceHrefsByDecisionHrefs";
+import { computeContainingDecisionServiceHrefsByDecisionHrefs } from 
"../store/computed/computeContainingDecisionServiceHrefsByDecisionHrefs.ts";
 import { computeIndexedDrd } from "../store/computed/computeIndexes";
 import { xmlHrefToQName } from "../xml/xmlHrefToQName";
 import { buildXmlHref, parseXmlHref } from "../xml/xmlHrefs";
@@ -73,14 +73,15 @@ export function addExistingDecisionServiceToDrd({
     id: decisionService["@_id"]!,
   });
 
-  const decisionServiceHrefsByDecisionHrefsRelativeToThisDmn = 
computeDecisionServiceHrefsByDecisionHrefs({
-    thisDmnsNamespace,
-    drgElementsNamespace: decisionServiceNamespace,
-    drgElements: decisionServiceDmnDefinitions.drgElement,
-  });
+  const containingDecisionServiceHrefsByDecisionHrefsRelativeToThisDmn =
+    computeContainingDecisionServiceHrefsByDecisionHrefs({
+      thisDmnsNamespace,
+      drgElementsNamespace: decisionServiceNamespace,
+      drgElements: decisionServiceDmnDefinitions.drgElement,
+    });
 
   const doesThisDrdHaveConflictingDecisionService = 
containedDecisionHrefsRelativeToThisDmn.some((decisionHref) =>
-    (decisionServiceHrefsByDecisionHrefsRelativeToThisDmn.get(decisionHref) ?? 
[]).some((d) =>
+    
(containingDecisionServiceHrefsByDecisionHrefsRelativeToThisDmn.get(decisionHref)
 ?? []).some((d) =>
       thisDmnsIndexedDrd.dmnShapesByHref.has(d)
     )
   );
diff --git a/packages/dmn-editor/src/mutations/deleteNode.ts 
b/packages/dmn-editor/src/mutations/deleteNode.ts
index 74ff8349827..a3f07d7819a 100644
--- a/packages/dmn-editor/src/mutations/deleteNode.ts
+++ b/packages/dmn-editor/src/mutations/deleteNode.ts
@@ -28,7 +28,7 @@ import { Unpacked } from "../tsExt/tsExt";
 import { DrgEdge } from "../diagram/graph/graph";
 import { EdgeDeletionMode, deleteEdge } from "./deleteEdge";
 import { Computed } from "../store/Store";
-import { computeDecisionServiceHrefsByDecisionHrefs } from 
"../store/computed/computeDecisionServiceHrefsByDecisionHrefs";
+import { computeContainingDecisionServiceHrefsByDecisionHrefs } from 
"../store/computed/computeContainingDecisionServiceHrefsByDecisionHrefs.ts";
 import { xmlHrefToQName } from "../xml/xmlHrefToQName";
 
 export enum NodeDeletionMode {
@@ -202,21 +202,26 @@ export function canRemoveNodeFromDrdOnly({
       ? definitions.drgElement ?? []
       : 
externalDmnsIndex.get(dmnObjectNamespace)?.model.definitions.drgElement ?? [];
 
-  const decisionServiceHrefsByDecisionHrefs = 
computeDecisionServiceHrefsByDecisionHrefs({
-    thisDmnsNamespace: definitions["@_namespace"],
-    drgElementsNamespace: dmnObjectNamespace,
-    drgElements,
-  });
+  const containingDecisionServiceHrefsByDecisionHrefsRelativeToThisDmn =
+    computeContainingDecisionServiceHrefsByDecisionHrefs({
+      thisDmnsNamespace: definitions["@_namespace"],
+      drgElementsNamespace: dmnObjectNamespace,
+      drgElements,
+    });
 
-  const containingDecisionServiceHrefs = 
decisionServiceHrefsByDecisionHrefs.get(dmnObjectHref) ?? [];
+  const containingDecisionServiceHrefs =
+    
containingDecisionServiceHrefsByDecisionHrefsRelativeToThisDmn.get(dmnObjectHref)
 ?? [];
 
   const isContainedByDecisionService = containingDecisionServiceHrefs.length > 
0;
 
-  const isContainingDecisionServicePresentInTheDrd = 
containingDecisionServiceHrefs.some((dsHref) =>
+  const isContainingDecisionServiceInExpandedFormPresentInTheDrd = 
containingDecisionServiceHrefs.some((dsHref) =>
     diagramElements.some(
-      (e) => e.__$$element === "dmndi:DMNShape" && e["@_dmnElementRef"] === 
xmlHrefToQName(dsHref, definitions)
+      (e) =>
+        e.__$$element === "dmndi:DMNShape" &&
+        e["@_dmnElementRef"] === xmlHrefToQName(dsHref, definitions) &&
+        !(e["@_isCollapsed"] ?? false)
     )
   );
 
-  return !isContainedByDecisionService || 
!isContainingDecisionServicePresentInTheDrd;
+  return !isContainedByDecisionService || 
!isContainingDecisionServiceInExpandedFormPresentInTheDrd;
 }
diff --git 
a/packages/dmn-editor/src/store/computed/computeDecisionServiceHrefsByDecisionHrefs.ts
 
b/packages/dmn-editor/src/store/computed/computeContainingDecisionServiceHrefsByDecisionHrefs.ts.ts
similarity index 97%
rename from 
packages/dmn-editor/src/store/computed/computeDecisionServiceHrefsByDecisionHrefs.ts
rename to 
packages/dmn-editor/src/store/computed/computeContainingDecisionServiceHrefsByDecisionHrefs.ts.ts
index 03bb1f530e7..1c579853d9f 100644
--- 
a/packages/dmn-editor/src/store/computed/computeDecisionServiceHrefsByDecisionHrefs.ts
+++ 
b/packages/dmn-editor/src/store/computed/computeContainingDecisionServiceHrefsByDecisionHrefs.ts.ts
@@ -21,7 +21,7 @@ import { getDecisionServicePropertiesRelativeToThisDmn } from 
"../../mutations/a
 import { buildXmlHref } from "../../xml/xmlHrefs";
 import { State } from "../Store";
 
-export function computeDecisionServiceHrefsByDecisionHrefs({
+export function computeContainingDecisionServiceHrefsByDecisionHrefs({
   thisDmnsNamespace,
   drgElementsNamespace,
   drgElements,


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

Reply via email to