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 a1a0b908891 kie-issues#892: DMN Editor: Collapsing and expanding 
Decision Services (#3046)
a1a0b908891 is described below

commit a1a0b908891c6117a2029ecdba3e2f8c7d00f995
Author: Aswathi <[email protected]>
AuthorDate: Sat May 24 02:15:31 2025 +0530

    kie-issues#892: DMN Editor: Collapsing and expanding Decision Services 
(#3046)
    
    Co-authored-by: Aswathi T V <[email protected]>
    Co-authored-by: Aswathi T V <[email protected]>
---
 packages/dmn-editor/src/DmnEditor.css              |  22 ++
 packages/dmn-editor/src/diagram/Diagram.tsx        |   2 +
 packages/dmn-editor/src/diagram/nodes/Nodes.tsx    | 247 ++++++++++++++++++++-
 .../mutations/addExistingDecisionServiceToDrd.ts   |  21 +-
 .../src/mutations/setDecisionServiceVisiblity.ts   |  54 +++++
 packages/dmn-editor/src/store/Store.ts             |  10 +
 .../computed/computeConflictedDecisionServices.ts  |  64 ++++++
 packages/dmn-editor/src/store/computed/initial.ts  |   4 +
 .../dmn-editor/tests-e2e/__fixtures__/nodes.ts     |  10 +
 .../drds/add-conflicting-decision-service.png      | Bin 0 -> 34118 bytes
 .../drds/collapse-decision-service.png             | Bin 0 -> 42856 bytes
 .../drds/decision-service-from-other-drd.png       | Bin 0 -> 29602 bytes
 .../drgElements/reset-decision-service-font.png    | Bin 11396 -> 10514 bytes
 .../resize-non-empty-decision-service.png          | Bin 44163 -> 44273 bytes
 .../drds/add-conflicting-decision-service.png      | Bin 0 -> 34118 bytes
 .../chromium/drds/collapse-decision-service.png    | Bin 0 -> 42639 bytes
 .../drds/decision-service-from-other-drd.png       | Bin 0 -> 29586 bytes
 .../drgElements/change-decision-service-font.png   | Bin 45511 -> 45704 bytes
 .../change-decision-service-position.png           | Bin 45524 -> 41153 bytes
 .../drgElements/reset-decision-service-font.png    | Bin 11414 -> 10500 bytes
 .../resize-non-empty-decision-service.png          | Bin 43928 -> 44257 bytes
 .../drds/add-conflicting-decision-service.png      | Bin 0 -> 36225 bytes
 .../webkit/drds/collapse-decision-service.png      | Bin 0 -> 42624 bytes
 .../drds/decision-service-from-other-drd.png       | Bin 0 -> 42847 bytes
 .../drgElements/change-decision-service-font.png   | Bin 47046 -> 47155 bytes
 .../change-decision-service-position.png           | Bin 40803 -> 40911 bytes
 .../drgElements/reset-decision-service-font.png    | Bin 9281 -> 9403 bytes
 .../resize-non-empty-decision-service.png          | Bin 43423 -> 43552 bytes
 .../drds/modelDecisionServicesInDrds.spec.ts       | 129 ++++++++++-
 29 files changed, 544 insertions(+), 19 deletions(-)

diff --git a/packages/dmn-editor/src/DmnEditor.css 
b/packages/dmn-editor/src/DmnEditor.css
index bc04a031873..ae591ee17dc 100644
--- a/packages/dmn-editor/src/DmnEditor.css
+++ b/packages/dmn-editor/src/DmnEditor.css
@@ -214,6 +214,28 @@
   text-align: center;
   bottom: 4px;
   line-height: 21px;
+  pointer-events: all;
+}
+.kie-dmn-editor--decision-service-node .button-inactive {
+  pointer-events: none !important;
+  opacity: 0.4;
+}
+.react-flow__node-node_decisionService.selected 
.kie-dmn-editor--decision-service-expanded-button {
+  border-color: #006ba4 !important;
+}
+.kie-dmn-editor--decision-service-node 
.kie-dmn-editor--decision-service-expanded-button {
+  border: 3px;
+  border-style: solid;
+  border-color: black;
+  font-weight: bold;
+  position: absolute;
+  width: 24px;
+  height: 25px;
+  font-size: 24px;
+  text-align: center;
+  bottom: 4px;
+  line-height: 21px;
+  pointer-events: all;
 }
 .react-flow__node-node_decisionService .kie-dmn-editor--node-shape 
.kie-dmn-editor--decision-service-label {
   font-family: system-ui;
diff --git a/packages/dmn-editor/src/diagram/Diagram.tsx 
b/packages/dmn-editor/src/diagram/Diagram.tsx
index cfa68e65248..8724cf519e9 100644
--- a/packages/dmn-editor/src/diagram/Diagram.tsx
+++ b/packages/dmn-editor/src/diagram/Diagram.tsx
@@ -410,6 +410,7 @@ export const Diagram = React.forwardRef<DiagramRef, { 
container: React.RefObject
                 __readonly_drdIndex: drdIndex,
                 __readonly_dropPoint: dropPoint,
                 __readonly_decisionServiceHrefRelativeToThisDmn: 
decisionServiceHrefRelativeToThisDmn,
+                __readonly_snapGrid: dereferencedState.diagram.snapGrid,
               });
             } else if (strategyForAddingDecisionServiceToDrd === 
StrategyForAddingDecisionServiceToDrd.AUTO_GENERATE) {
               await addAutoGeneratedDecisionServiceToDrd({
@@ -509,6 +510,7 @@ export const Diagram = React.forwardRef<DiagramRef, { 
container: React.RefObject
                 __readonly_drdIndex: drdIndex,
                 __readonly_dropPoint: dropPoint,
                 __readonly_decisionServiceHrefRelativeToThisDmn: 
decisionServiceHrefRelativeToThisDmn,
+                __readonly_snapGrid: dereferencedState.diagram.snapGrid,
               });
             } else if (strategyForAddingDecisionServiceToDrd === 
StrategyForAddingDecisionServiceToDrd.AUTO_GENERATE) {
               await addAutoGeneratedDecisionServiceToDrd({
diff --git a/packages/dmn-editor/src/diagram/nodes/Nodes.tsx 
b/packages/dmn-editor/src/diagram/nodes/Nodes.tsx
index b0ba66b7547..8888f179a5c 100644
--- a/packages/dmn-editor/src/diagram/nodes/Nodes.tsx
+++ b/packages/dmn-editor/src/diagram/nodes/Nodes.tsx
@@ -40,7 +40,7 @@ import { OnCreateDataType, OnTypeRefChange } from 
"../../dataTypes/TypeRefSelect
 import { addTopLevelItemDefinition } from 
"../../mutations/addTopLevelItemDefinition";
 import { renameGroupNode, updateTextAnnotation } from 
"../../mutations/renameNode";
 import { updateDecisionServiceDividerLine } from 
"../../mutations/updateDecisionServiceDividerLine";
-import { DmnEditorTab, SnapGrid, State } from "../../store/Store";
+import { Computed, DmnEditorTab, SnapGrid, State } from "../../store/Store";
 import { useDmnEditorStore, useDmnEditorStoreApi } from 
"../../store/StoreContext";
 import { Unpacked } from "../../tsExt/tsExt";
 import { snapShapeDimensions } from "../SnapGrid";
@@ -51,7 +51,7 @@ import { DmnDiagramEdgeData } from "../edges/Edges";
 import { getContainmentRelationship, getDecisionServiceDividerLineLocalY } 
from "../maths/DmnMaths";
 import { useIsHovered } from "../useIsHovered";
 import { DataTypeNodePanel } from "./DataTypeNodePanel";
-import { DECISION_SERVICE_COLLAPSED_DIMENSIONS, MIN_NODE_SIZES } from 
"./DefaultSizes";
+import { DECISION_SERVICE_COLLAPSED_DIMENSIONS, DEFAULT_NODE_SIZES, 
MIN_NODE_SIZES } from "./DefaultSizes";
 import { EditExpressionNodePanel } from "./EditExpressionNodePanel";
 import { EditableNodeLabel, OnEditableNodeLabelChange, useEditableNodeLabel } 
from "./EditableNodeLabel";
 import { InfoNodePanel } from "./InfoNodePanel";
@@ -75,6 +75,17 @@ import { NODE_LAYERS } from 
"../../store/computed/computeDiagramData";
 import { useSettings } from "../../settings/DmnEditorSettingsContext";
 import { useDmnEditor } from "../../DmnEditorContext";
 import { useRefactor } from "../../refactor/RefactorConfirmationDialog";
+import { setDecisionServiceVisiblity } from 
"../../mutations/setDecisionServiceVisiblity";
+import {
+  addAutoGeneratedDecisionServiceToDrd,
+  getStrategyToAddExistingDecisionServiceToDrd,
+} from "../../mutations/addExistingDecisionServiceToDrd";
+import { addShape } from "../../mutations/addShape";
+import { xmlHrefToQName } from "@kie-tools/dmn-marshaller/dist/xml";
+import { deleteNode, NodeDeletionMode } from "../../mutations/deleteNode";
+import { nodeNatures } from "../../mutations/NodeNature";
+import { computeIndexedDrd } from "../../store/computed/computeIndexes";
+import { addOrGetDrd } from "../../mutations/addOrGetDrd";
 
 export type ElementFilter<E extends { __$$element: string }, Filter extends 
string> = E extends any
   ? E["__$$element"] extends Filter
@@ -843,13 +854,54 @@ export const DecisionServiceNode = React.memo(
       (s) => (isHovered || isResizing) && s.diagram.draggingNodes.length === 0
     );
     const isDropTarget = useDmnEditorStore((s) => s.diagram.dropTargetNode?.id 
=== id);
+    const dmnEditorStoreApi = useDmnEditorStoreApi();
+
+    const dropPoint = useMemo(
+      () => ({
+        x: shape["dc:Bounds"]?.["@_x"] ?? 0,
+        y: shape["dc:Bounds"]?.["@_y"] ?? 0,
+      }),
+      [shape]
+    );
 
     const { isEditingLabel, setEditingLabel, triggerEditing, 
triggerEditingIfEnter } = useEditableNodeLabel(id);
     useHoveredNodeAlwaysOnTop(ref, zIndex, shouldActLikeHovered, dragging, 
selected, isEditingLabel);
 
-    const dmnEditorStoreApi = useDmnEditorStoreApi();
+    const { decisionsMap, conflictedDecisionIds } = useDmnEditorStore((s) =>
+      s.computed(s).getConflictedDecisionServices(externalModelsByNamespace)
+    );
+
+    const expandButtonClassname = useMemo(() => {
+      let className = "kie-dmn-editor--decision-service-collapsed-button";
+
+      conflictedDecisionIds.forEach((key) => {
+        const values = decisionsMap.get(key) ?? [];
+        if (values.length > 1) {
+          const exists = values.some((item) => item.id === id);
+
+          values.forEach((node) => {
+            const isOtherNode = node.id !== id;
+            const isCollapsedMismatch = shape["@_isCollapsed"] && 
node.data.shape["@_isCollapsed"] === false;
+
+            if (exists && isOtherNode && isCollapsedMismatch) {
+              className += " button-inactive";
+            }
+          });
+        }
+      });
+      return className;
+    }, [conflictedDecisionIds, decisionsMap, id, shape]);
+
     const settings = useSettings();
 
+    const decisionsInCurrentDecisionService = useMemo(
+      () => [
+        ...(decisionService.outputDecision ?? []).map((od) => od["@_href"]),
+        ...(decisionService.encapsulatedDecision ?? []).map((ed) => 
ed["@_href"]),
+      ],
+      [decisionService.outputDecision, decisionService.encapsulatedDecision]
+    );
+
     const { isTargeted, isValidConnectionTarget } = 
useConnectionTargetStatus(id, shouldActLikeHovered);
     const className = useNodeClassName(isValidConnectionTarget, id);
 
@@ -883,6 +935,176 @@ export const DecisionServiceNode = React.memo(
       };
     }, [decisionService.encapsulatedDecision, decisionService.outputDecision, 
dmnEditorStoreApi, id]);
 
+    const { computed, ...state } = dmnEditorStoreApi.getState();
+
+    const { defaultSizeNode, indexedDrdContainingDecisionServiceDepiction } = 
useMemo(() => {
+      const defaultSizeNode = DEFAULT_NODE_SIZES[NODE_TYPES.decisionService]({
+        snapGrid: snapGrid,
+      });
+
+      const dereferencedState: State = { computed, 
...JSON.parse(JSON.stringify(state)) };
+      const drdIndex = 
dereferencedState.computed(dereferencedState).getDrdIndex();
+
+      const drds = 
dereferencedState.dmn.model.definitions["dmndi:DMNDI"]?.["dmndi:DMNDiagram"] ?? 
[];
+      let indexedDrdContainingDecisionServiceDepiction: 
ReturnType<Computed["indexedDrd"]> | undefined;
+      for (let i = 0; i < drds.length; i++) {
+        if (
+          dereferencedState.dmn.model.definitions["@_namespace"] ===
+            dereferencedState.dmn.model.definitions["@_namespace"] &&
+          i === drdIndex
+        ) {
+          continue;
+        }
+
+        const _indexedDrd = computeIndexedDrd(
+          dereferencedState.dmn.model.definitions["@_namespace"],
+          dereferencedState.dmn.model.definitions,
+          i
+        );
+        const dsShape = _indexedDrd.dmnShapesByHref.get(id);
+        const hasCompleteExpandedDepictionOfDecisionService =
+          dsShape &&
+          !(dsShape["@_isCollapsed"] ?? false) &&
+          decisionsInCurrentDecisionService.every((dHref) => 
_indexedDrd.dmnShapesByHref.has(dHref));
+        if (hasCompleteExpandedDepictionOfDecisionService) {
+          indexedDrdContainingDecisionServiceDepiction = _indexedDrd;
+          break;
+        }
+      }
+      return { defaultSizeNode, indexedDrdContainingDecisionServiceDepiction };
+    }, [snapGrid, computed, state, id, decisionsInCurrentDecisionService]);
+
+    const onExpand = useCallback(async () => {
+      const dsShapeOnOtherDrd = 
indexedDrdContainingDecisionServiceDepiction?.dmnShapesByHref.get(id);
+      if (indexedDrdContainingDecisionServiceDepiction !== undefined) {
+        for (const decisionHref of decisionsInCurrentDecisionService) {
+          const decisionShapeOnOtherDrd =
+            
indexedDrdContainingDecisionServiceDepiction?.dmnShapesByHref.get(decisionHref);
+
+          if (
+            dsShapeOnOtherDrd &&
+            dsShapeOnOtherDrd["dc:Bounds"] &&
+            decisionShapeOnOtherDrd &&
+            decisionShapeOnOtherDrd["dc:Bounds"]
+          ) {
+            const minNodeSize = MIN_NODE_SIZES[NODE_TYPES.decision]({
+              snapGrid: snapGrid,
+            });
+            dmnEditorStoreApi.setState((state) => {
+              addShape({
+                definitions: state.dmn.model.definitions,
+                drdIndex: state.computed(state).getDrdIndex(),
+                nodeType: NODE_TYPES.decision,
+                shape: {
+                  "@_id": generateUuid(),
+                  "@_dmnElementRef": xmlHrefToQName(decisionHref, 
state.dmn.model.definitions),
+                  "dc:Bounds": {
+                    "@_x":
+                      dropPoint.x +
+                      (decisionShapeOnOtherDrd["dc:Bounds"]!["@_x"] - 
dsShapeOnOtherDrd["dc:Bounds"]!["@_x"]),
+                    "@_y":
+                      dropPoint.y +
+                      (decisionShapeOnOtherDrd["dc:Bounds"]!["@_y"] - 
dsShapeOnOtherDrd["dc:Bounds"]!["@_y"]),
+                    ...minNodeSize,
+                  },
+                },
+              });
+            });
+          }
+        }
+
+        dmnEditorStoreApi.setState((state) => {
+          setDecisionServiceVisiblity({
+            definitions: state.dmn.model.definitions,
+            __readonly_drdIndex: state.computed(state).getDrdIndex(),
+            __readonly_collapse: false,
+            __readonly_shapeIndex: shape.index,
+            __readonly_width: dsShapeOnOtherDrd?.["dc:Bounds"]?.["@_width"] ?? 
defaultSizeNode["@_width"],
+            __readonly_height: dsShapeOnOtherDrd?.["dc:Bounds"]?.["@_height"] 
?? defaultSizeNode["@_height"],
+            __readonly_autoLayout: 
indexedDrdContainingDecisionServiceDepiction ? false : true,
+          });
+        });
+      } else {
+        dmnEditorStoreApi.setState((state) => {
+          const { diagramElements } = addOrGetDrd({
+            definitions: state.dmn.model.definitions,
+            drdIndex: state.computed(state).getDrdIndex(),
+          });
+          const dmnShapeIndex = (diagramElements ?? []).findIndex(
+            (d) => d["@_dmnElementRef"] === dmnObjectQName.localPart
+          );
+          diagramElements?.splice(dmnShapeIndex, 1);
+        });
+        const { computed, ...state } = dmnEditorStoreApi.getState();
+        const dereferencedState: State = { computed, 
...JSON.parse(JSON.stringify(state)) };
+
+        await addAutoGeneratedDecisionServiceToDrd({
+          state: dereferencedState,
+          __readonly_decisionServiceNamespace: 
dereferencedState.dmn.model.definitions["@_namespace"],
+          __readonly_drdIndex: 
dereferencedState.computed(dereferencedState).getDrdIndex(),
+          __readonly_externalDmnsIndex: dereferencedState
+            .computed(dereferencedState)
+            
.getDirectlyIncludedExternalModelsByNamespace(externalModelsByNamespace).dmns,
+          __readonly_containedDecisionHrefsRelativeToThisDmn: 
decisionsInCurrentDecisionService,
+          __readonly_decisionServiceHrefRelativeToThisDmn: id,
+          __readonly_snapGrid: dereferencedState.diagram.snapGrid,
+          __readonly_dropPoint: dropPoint,
+          __readonly_externalModelsByNamespace: externalModelsByNamespace,
+          __readonly_isAlternativeInputDataShape: dereferencedState
+            .computed(dereferencedState)
+            .isAlternativeInputDataShape(),
+        });
+
+        dmnEditorStoreApi.setState((state) => {
+          state.dmn.model = 
JSON.parse(JSON.stringify(dereferencedState.dmn.model));
+        });
+      }
+    }, [
+      indexedDrdContainingDecisionServiceDepiction,
+      id,
+      dmnEditorStoreApi,
+      decisionsInCurrentDecisionService,
+      snapGrid,
+      dropPoint,
+      shape.index,
+      defaultSizeNode,
+      externalModelsByNamespace,
+      dmnObjectQName.localPart,
+    ]);
+
+    const onCollapse = useCallback(() => {
+      dmnEditorStoreApi.setState((state) => {
+        setDecisionServiceVisiblity({
+          definitions: state.dmn.model.definitions,
+          __readonly_drdIndex: state.computed(state).getDrdIndex(),
+          __readonly_collapse: true,
+          __readonly_shapeIndex: shape.index,
+          __readonly_width: defaultSizeNode["@_width"],
+          __readonly_height: defaultSizeNode["@_height"],
+          __readonly_autoLayout: indexedDrdContainingDecisionServiceDepiction 
? false : true,
+        });
+        const { diagramElements } = addOrGetDrd({
+          definitions: state.dmn.model.definitions,
+          drdIndex: state.computed(state).getDrdIndex(),
+        });
+
+        for (const decisionHref of decisionsInCurrentDecisionService) {
+          const node = 
state.computed(state).getDiagramData(externalModelsByNamespace).nodesById.get(decisionHref)!;
+          const dmnShapeIndex = (diagramElements ?? []).findIndex(
+            (d) => d["@_dmnElementRef"] === node?.data.dmnObjectQName.localPart
+          );
+          diagramElements?.splice(dmnShapeIndex, 1);
+        }
+      });
+    }, [
+      dmnEditorStoreApi,
+      shape.index,
+      defaultSizeNode,
+      indexedDrdContainingDecisionServiceDepiction,
+      decisionsInCurrentDecisionService,
+      externalModelsByNamespace,
+    ]);
+
     const onTypeRefChange = useCallback<OnTypeRefChange>(
       (newTypeRef) => {
         dmnEditorStoreApi.setState((state) => {
@@ -980,6 +1202,15 @@ export const DecisionServiceNode = React.memo(
           data-nodelabel={decisionService["@_name"]}
         >
           <InfoNodePanel isVisible={!isTargeted && selected && !dragging} />
+          {!isCollapsed && !isTargeted && selected && !dragging && (
+            <div
+              className={"kie-dmn-editor--decision-service-expanded-button"}
+              onClick={onCollapse}
+              
data-testid={`kie-tools--dmn-editor--${decisionService["@_label"] ?? 
decisionService["@_name"] ?? ""}-expanded-button`}
+            >
+              -
+            </div>
+          )}
           <OutgoingStuffNodePanel
             nodeHref={id}
             isVisible={!settings.isReadOnly && !isTargeted && selected && 
!dragging}
@@ -1008,7 +1239,15 @@ export const DecisionServiceNode = React.memo(
               nodeShapeIndex={shape.index}
             />
           )}
-          {isCollapsed && <div 
className={"kie-dmn-editor--decision-service-collapsed-button"}>+</div>}
+          {isCollapsed && (
+            <div
+              className={expandButtonClassname}
+              onClick={onExpand}
+              
data-testid={`kie-tools--dmn-editor--${decisionService["@_label"] ?? 
decisionService["@_name"] ?? ""}-collapsed-button`}
+            >
+              +
+            </div>
+          )}
           <DataTypeNodePanel
             isVisible={!isTargeted && selected && !dragging}
             isReadOnly={settings.isReadOnly}
diff --git 
a/packages/dmn-editor/src/mutations/addExistingDecisionServiceToDrd.ts 
b/packages/dmn-editor/src/mutations/addExistingDecisionServiceToDrd.ts
index 743facddf49..dcf66a5e3ed 100644
--- a/packages/dmn-editor/src/mutations/addExistingDecisionServiceToDrd.ts
+++ b/packages/dmn-editor/src/mutations/addExistingDecisionServiceToDrd.ts
@@ -26,7 +26,11 @@ import { Normalized } from 
"@kie-tools/dmn-marshaller/dist/normalization/normali
 import { buildXmlHref, parseXmlHref, xmlHrefToQName } from 
"@kie-tools/dmn-marshaller/dist/xml";
 import { ExternalModelsIndex } from "../DmnEditor";
 import { getAutoLayoutedInfo } from "../autolayout/autoLayoutInfo";
-import { DECISION_SERVICE_COLLAPSED_DIMENSIONS, MIN_NODE_SIZES } from 
"../diagram/nodes/DefaultSizes";
+import {
+  DECISION_SERVICE_COLLAPSED_DIMENSIONS,
+  DEFAULT_NODE_SIZES,
+  MIN_NODE_SIZES,
+} from "../diagram/nodes/DefaultSizes";
 import { NODE_TYPES } from "../diagram/nodes/NodeTypes";
 import { Computed, SnapGrid, State } from "../store/Store";
 import { computeContainingDecisionServiceHrefsByDecisionHrefs } from 
"../store/computed/computeContainingDecisionServiceHrefsByDecisionHrefs.ts";
@@ -160,12 +164,17 @@ export function addConflictingDecisionServiceToDrd({
   __readonly_drdIndex,
   __readonly_dropPoint,
   __readonly_decisionServiceHrefRelativeToThisDmn,
+  __readonly_snapGrid,
 }: {
   definitions: Normalized<DMN15__tDefinitions>;
   __readonly_drdIndex: number;
   __readonly_dropPoint: { x: number; y: number };
   __readonly_decisionServiceHrefRelativeToThisDmn: string;
+  __readonly_snapGrid: SnapGrid;
 }) {
+  const minNodeSize = MIN_NODE_SIZES[NODE_TYPES.decisionService]({
+    snapGrid: __readonly_snapGrid,
+  });
   addShape({
     definitions: definitions,
     drdIndex: __readonly_drdIndex,
@@ -177,8 +186,12 @@ export function addConflictingDecisionServiceToDrd({
       "dc:Bounds": {
         "@_x": __readonly_dropPoint.x,
         "@_y": __readonly_dropPoint.y,
-        "@_width": DECISION_SERVICE_COLLAPSED_DIMENSIONS.width,
-        "@_height": DECISION_SERVICE_COLLAPSED_DIMENSIONS.height,
+        "@_width": DEFAULT_NODE_SIZES[NODE_TYPES.decisionService]({
+          snapGrid: __readonly_snapGrid,
+        })["@_width"],
+        "@_height": DEFAULT_NODE_SIZES[NODE_TYPES.decisionService]({
+          snapGrid: __readonly_snapGrid,
+        })["@_height"],
       },
     },
   });
@@ -228,6 +241,7 @@ export async function addAutoGeneratedDecisionServiceToDrd({
     shape: {
       "@_id": generateUuid(),
       "@_dmnElementRef": 
xmlHrefToQName(__readonly_decisionServiceHrefRelativeToThisDmn, 
state.dmn.model.definitions),
+      "@_isCollapsed": false,
       "dc:Bounds": {
         "@_x": 0, // Auto-layout will be applied;
         "@_y": 0, // Auto-layout will be applied;
@@ -445,6 +459,7 @@ export function addExistingDecisionServiceToDrd({
     shape: {
       "@_id": generateUuid(),
       "@_dmnElementRef": 
xmlHrefToQName(__readonly_decisionServiceHrefRelativeToThisDmn, definitions),
+      "@_isCollapsed": false,
       "dc:Bounds": {
         "@_x": __readonly_dropPoint.x,
         "@_y": __readonly_dropPoint.y,
diff --git a/packages/dmn-editor/src/mutations/setDecisionServiceVisiblity.ts 
b/packages/dmn-editor/src/mutations/setDecisionServiceVisiblity.ts
new file mode 100644
index 00000000000..e976a687716
--- /dev/null
+++ b/packages/dmn-editor/src/mutations/setDecisionServiceVisiblity.ts
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { DMN15__tDefinitions, DMNDI15__DMNShape } from 
"@kie-tools/dmn-marshaller/dist/schemas/dmn-1_5/ts-gen/types";
+import { Normalized } from 
"@kie-tools/dmn-marshaller/dist/normalization/normalize";
+import { addOrGetDrd, addOrGetDrd as getDefaultDiagram } from "./addOrGetDrd";
+
+export function setDecisionServiceVisiblity({
+  definitions,
+  __readonly_drdIndex,
+  __readonly_collapse,
+  __readonly_shapeIndex,
+  __readonly_width,
+  __readonly_height,
+  __readonly_autoLayout,
+}: {
+  definitions: Normalized<DMN15__tDefinitions>;
+  __readonly_drdIndex: number;
+  __readonly_collapse: boolean;
+  __readonly_shapeIndex: number;
+  __readonly_width: number;
+  __readonly_height: number;
+  __readonly_autoLayout: boolean;
+}) {
+  const { diagramElements } = addOrGetDrd({
+    definitions: definitions,
+    drdIndex: __readonly_drdIndex,
+  });
+  const shape = diagramElements?.[__readonly_shapeIndex] as 
Normalized<DMNDI15__DMNShape> | undefined;
+
+  if (shape !== undefined && shape !== null) {
+    shape["@_isCollapsed"] = __readonly_collapse;
+    if (__readonly_collapse === false && shape["dc:Bounds"] && 
!__readonly_autoLayout) {
+      shape["dc:Bounds"]["@_width"] = __readonly_width;
+      shape["dc:Bounds"]["@_height"] = __readonly_height;
+    }
+  }
+}
diff --git a/packages/dmn-editor/src/store/Store.ts 
b/packages/dmn-editor/src/store/Store.ts
index b1016548e49..d05acdc24a0 100644
--- a/packages/dmn-editor/src/store/Store.ts
+++ b/packages/dmn-editor/src/store/Store.ts
@@ -36,6 +36,7 @@ import { computeIndexedDrd } from "./computed/computeIndexes";
 import { computeIsDropTargetNodeValidForSelection } from 
"./computed/computeIsDropTargetNodeValidForSelection";
 import { DEFAULT_VIEWPORT } from "../diagram/Diagram";
 import { computeExternalDmnModelsByNamespaceMap } from 
"./computed/computeExternalDmnModelsByNamespaceMap";
+import { computeConflictedDecisionServices } from 
"./computed/computeConflictedDecisionServices";
 
 enableMapSet(); // Necessary because `Computed` has a lot of Maps and Sets.
 
@@ -160,6 +161,10 @@ export type Computed = {
   getDataTypes(e: ExternalModelsIndex | undefined): ReturnType<typeof 
computeDataTypes>;
 
   getAllFeelVariableUniqueNames(): ReturnType<typeof 
computeAllFeelVariableUniqueNames>;
+
+  getConflictedDecisionServices(
+    e: ExternalModelsIndex | undefined
+  ): ReturnType<typeof computeConflictedDecisionServices>;
 };
 
 export type Dispatch = {
@@ -436,6 +441,11 @@ export function createDmnEditorStore(model: 
DmnLatestModel, computedCache: Compu
             computedCache.cached("getExternalDmnModelsByNamespaceMap", 
computeExternalDmnModelsByNamespaceMap, [
               
s.computed(s).getDirectlyIncludedExternalModelsByNamespace(externalModelsByNamespace).dmns,
             ]),
+          getConflictedDecisionServices: (externalModelsByNamespace: 
ExternalModelsIndex | undefined) =>
+            computedCache.cached("getConflictedDecisionServices", 
computeConflictedDecisionServices, [
+              s.dmn.model.definitions,
+              s.computed(s).getDiagramData(externalModelsByNamespace),
+            ]),
         };
       },
     }))
diff --git 
a/packages/dmn-editor/src/store/computed/computeConflictedDecisionServices.ts 
b/packages/dmn-editor/src/store/computed/computeConflictedDecisionServices.ts
new file mode 100644
index 00000000000..dc772d60425
--- /dev/null
+++ 
b/packages/dmn-editor/src/store/computed/computeConflictedDecisionServices.ts
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { DmnDiagramNodeData } from "../../diagram/nodes/Nodes";
+import { getDecisionServicePropertiesRelativeToThisDmn } from 
"../../mutations/addExistingDecisionServiceToDrd";
+import { Computed, State } from "../Store";
+import * as RF from "reactflow";
+
+export function computeConflictedDecisionServices(
+  definitions: State["dmn"]["model"]["definitions"],
+  diagramData: ReturnType<Computed["getDiagramData"]>
+) {
+  const decisionsMap = new Map<string, Array<RF.Node<DmnDiagramNodeData>>>();
+  for (const node of diagramData.nodes) {
+    if (node.data.dmnObject?.__$$element === "decisionService") {
+      const { containedDecisionHrefsRelativeToThisDmn } = 
getDecisionServicePropertiesRelativeToThisDmn({
+        thisDmnsNamespace: definitions["@_namespace"],
+        decisionServiceNamespace: node.data.dmnObjectNamespace ?? 
definitions["@_namespace"],
+        decisionService: node.data.dmnObject,
+      });
+      for (let i = 0; i < containedDecisionHrefsRelativeToThisDmn.length; i++) 
{
+        if (decisionsMap.has(containedDecisionHrefsRelativeToThisDmn[i])) {
+          const currentArray = 
decisionsMap.get(containedDecisionHrefsRelativeToThisDmn[i]);
+          currentArray?.push(node);
+          if (currentArray) 
decisionsMap.set(containedDecisionHrefsRelativeToThisDmn[i], [...currentArray]);
+        } else {
+          decisionsMap.set(containedDecisionHrefsRelativeToThisDmn[i], [node]);
+        }
+      }
+    }
+  }
+
+  const containedDecisionNodes: string[] = [];
+  for (const node of diagramData.nodes) {
+    if (node.data?.dmnObject?.__$$element === "decisionService") {
+      containedDecisionNodes.push(
+        ...(node.data.dmnObject?.outputDecision ?? []).map((od) => 
od["@_href"]),
+        ...(node.data.dmnObject?.encapsulatedDecision ?? []).map((od) => 
od["@_href"])
+      );
+    }
+  }
+
+  const conflictedDecisionIds = containedDecisionNodes.filter(
+    (item, index) => containedDecisionNodes.indexOf(item) !== index
+  );
+
+  return { decisionsMap, conflictedDecisionIds };
+}
diff --git a/packages/dmn-editor/src/store/computed/initial.ts 
b/packages/dmn-editor/src/store/computed/initial.ts
index 2240605679c..5f7b1633f6e 100644
--- a/packages/dmn-editor/src/store/computed/initial.ts
+++ b/packages/dmn-editor/src/store/computed/initial.ts
@@ -65,4 +65,8 @@ export const INITIAL_COMPUTED_CACHE: Cache<Computed> = {
     value: undefined,
     dependencies: [],
   },
+  getConflictedDecisionServices: {
+    value: undefined,
+    dependencies: [],
+  },
 };
diff --git a/packages/dmn-editor/tests-e2e/__fixtures__/nodes.ts 
b/packages/dmn-editor/tests-e2e/__fixtures__/nodes.ts
index bdaa359a059..ef5cef7fd8c 100644
--- a/packages/dmn-editor/tests-e2e/__fixtures__/nodes.ts
+++ b/packages/dmn-editor/tests-e2e/__fixtures__/nodes.ts
@@ -284,4 +284,14 @@ export class Nodes {
         return "Add Knowledge Requirement edge";
     }
   }
+
+  public async selectAndCollapseDecisionService(args: { name: string }) {
+    await this.select({ name: args.name, position: NodePosition.TOP });
+    await 
this.page.getByTestId(`kie-tools--dmn-editor--${args.name}-expanded-button`).click();
+  }
+
+  public async selectAndExpandDecisionService(args: { name: string }) {
+    await this.select({ name: args.name, position: NodePosition.TOP });
+    await 
this.page.getByTestId(`kie-tools--dmn-editor--${args.name}-collapsed-button`).click();
+  }
 }
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drds/add-conflicting-decision-service.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drds/add-conflicting-decision-service.png
new file mode 100644
index 00000000000..1770b3bef80
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drds/add-conflicting-decision-service.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drds/collapse-decision-service.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drds/collapse-decision-service.png
new file mode 100644
index 00000000000..e91ebde5f6f
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drds/collapse-decision-service.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drds/decision-service-from-other-drd.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drds/decision-service-from-other-drd.png
new file mode 100644
index 00000000000..477bd55dd61
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drds/decision-service-from-other-drd.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drgElements/reset-decision-service-font.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drgElements/reset-decision-service-font.png
index f43f4671954..f2a4d4dbbc8 100644
Binary files 
a/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drgElements/reset-decision-service-font.png
 and 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drgElements/reset-decision-service-font.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drgElements/resize-non-empty-decision-service.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drgElements/resize-non-empty-decision-service.png
index e821183b920..3d1c2d5e83b 100644
Binary files 
a/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drgElements/resize-non-empty-decision-service.png
 and 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/drgElements/resize-non-empty-decision-service.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drds/add-conflicting-decision-service.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drds/add-conflicting-decision-service.png
new file mode 100644
index 00000000000..9c795488393
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drds/add-conflicting-decision-service.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drds/collapse-decision-service.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drds/collapse-decision-service.png
new file mode 100644
index 00000000000..845b9ec5192
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drds/collapse-decision-service.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drds/decision-service-from-other-drd.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drds/decision-service-from-other-drd.png
new file mode 100644
index 00000000000..7c035d7023a
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drds/decision-service-from-other-drd.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drgElements/change-decision-service-font.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drgElements/change-decision-service-font.png
index 91b15f846b8..bf2be6d23fb 100644
Binary files 
a/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drgElements/change-decision-service-font.png
 and 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drgElements/change-decision-service-font.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drgElements/change-decision-service-position.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drgElements/change-decision-service-position.png
index de55cb6b4cd..6ae5c9c8cd6 100644
Binary files 
a/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drgElements/change-decision-service-position.png
 and 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drgElements/change-decision-service-position.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drgElements/reset-decision-service-font.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drgElements/reset-decision-service-font.png
index 451cb9ef09d..7a8ad010c61 100644
Binary files 
a/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drgElements/reset-decision-service-font.png
 and 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drgElements/reset-decision-service-font.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drgElements/resize-non-empty-decision-service.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drgElements/resize-non-empty-decision-service.png
index 0436fbb3862..0ee440b0b2d 100644
Binary files 
a/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drgElements/resize-non-empty-decision-service.png
 and 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/drgElements/resize-non-empty-decision-service.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drds/add-conflicting-decision-service.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drds/add-conflicting-decision-service.png
new file mode 100644
index 00000000000..c415b3be33c
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drds/add-conflicting-decision-service.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drds/collapse-decision-service.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drds/collapse-decision-service.png
new file mode 100644
index 00000000000..9c7314ca9ab
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drds/collapse-decision-service.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drds/decision-service-from-other-drd.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drds/decision-service-from-other-drd.png
new file mode 100644
index 00000000000..e5ae53057f8
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drds/decision-service-from-other-drd.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drgElements/change-decision-service-font.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drgElements/change-decision-service-font.png
index 73320478c56..e86f74a64ef 100644
Binary files 
a/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drgElements/change-decision-service-font.png
 and 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drgElements/change-decision-service-font.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drgElements/change-decision-service-position.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drgElements/change-decision-service-position.png
index 4a5354b40b6..606df1b4462 100644
Binary files 
a/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drgElements/change-decision-service-position.png
 and 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drgElements/change-decision-service-position.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drgElements/reset-decision-service-font.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drgElements/reset-decision-service-font.png
index a158c2474cb..0390c863331 100644
Binary files 
a/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drgElements/reset-decision-service-font.png
 and 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drgElements/reset-decision-service-font.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drgElements/resize-non-empty-decision-service.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drgElements/resize-non-empty-decision-service.png
index db6fa34f1f4..034098c46fb 100644
Binary files 
a/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drgElements/resize-non-empty-decision-service.png
 and 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/drgElements/resize-non-empty-decision-service.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 adc4287a179..80140760552 100644
--- a/packages/dmn-editor/tests-e2e/drds/modelDecisionServicesInDrds.spec.ts
+++ b/packages/dmn-editor/tests-e2e/drds/modelDecisionServicesInDrds.spec.ts
@@ -18,7 +18,8 @@
  */
 
 import { TestAnnotations } from "@kie-tools/playwright-base/annotations";
-import { test } from "../__fixtures__/base";
+import { expect, test } from "../__fixtures__/base";
+import { DefaultNodeName, NodePosition, NodeType } from 
"../__fixtures__/nodes";
 
 test.beforeEach(async ({ editor }) => {
   await editor.open();
@@ -48,15 +49,62 @@ test.describe("Model Decision Services - DRD", () => {
     // its content should be automatically layout-ed
   });
 
-  test("888 add to DRD, mix of collapsed and expanded", async ({ drds }) => {
-    test.skip(true, 
"https://github.com/apache/incubator-kie-issues/issues/888";);
+  test("A Decision Service with conflicting contained Decisions should be 
added to the DRD in a collapsed state", async ({
+    drds,
+    palette,
+    nodes,
+    diagram,
+    drgNodes,
+  }) => {
     test.info().annotations.push({
       type: TestAnnotations.REGRESSION,
       description: "https://github.com/apache/incubator-kie-issues/issues/888";,
     });
-    // However, if one of its contained Decisions it also contained by other 
Decision Services
-    // present on that DRD, and one of them is in expanded form,
-    // the Decision Service is added as collapsed, and no Decisions are added 
or moved.
+    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.toggle();
+
+    await palette.dragNewNode({
+      type: NodeType.DECISION_SERVICE,
+      targetPosition: { x: 400, y: 200 },
+      thenRenameTo: "DS2",
+    });
+    await expect(nodes.get({ name: "DS2" })).toBeAttached();
+
+    await drgNodes.toggle();
+    await drgNodes.dragNode({ name: "D1", targetPosition: { x: 200, y: 200 } 
});
+    await drgNodes.toggle();
+    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.navigateTo({ name: "First DRD" });
+    await drgNodes.toggle();
+    await drgNodes.dragNode({ name: "DS2", targetPosition: { x: 100, y: 100 } 
});
+    await drgNodes.toggle();
+    await 
expect(diagram.get()).toHaveScreenshot("add-conflicting-decision-service.png");
   });
 
   test("888 add to DRD, collapsed", async ({ drds }) => {
@@ -103,13 +151,32 @@ test.describe("Model Decision Services - DRD", () => {
     // TODO, question, not understand
   });
 
-  test("892 collapse - remove its content", async ({ drds }) => {
-    test.skip(true, 
"https://github.com/apache/incubator-kie-issues/issues/892";);
+  test("Collapsing a Decision Service hides all of its contained Decisions 
from the DRD", async ({
+    palette,
+    nodes,
+    diagram,
+  }) => {
     test.info().annotations.push({
       type: TestAnnotations.REGRESSION,
       description: "https://github.com/apache/incubator-kie-issues/issues/892";,
     });
-    // TODO
+    await palette.dragNewNode({ type: NodeType.DECISION_SERVICE, 
targetPosition: { x: 400, y: 200 } });
+    await expect(nodes.get({ name: DefaultNodeName.DECISION_SERVICE 
})).toBeAttached();
+
+    await palette.dragNewNode({
+      type: NodeType.DECISION,
+      targetPosition: { x: 200, y: 200 },
+      thenRenameTo: "User Decision",
+    });
+    await expect(nodes.get({ name: "User Decision" })).toBeAttached();
+
+    await nodes.move({ name: "User Decision", targetPosition: { x: 500, y: 300 
} });
+    await expect(nodes.get({ name: "User Decision" })).toBeAttached();
+
+    await nodes.selectAndCollapseDecisionService({ name: 
DefaultNodeName.DECISION_SERVICE });
+
+    await expect(nodes.get({ name: "User Decision" })).not.toBeAttached();
+    await 
expect(diagram.get()).toHaveScreenshot("collapse-decision-service.png");
   });
 
   test("892 collapse - allow only if no other DS is expanded in the DRD", 
async ({ drds }) => {
@@ -121,13 +188,51 @@ test.describe("Model Decision Services - DRD", () => {
     // TODO
   });
 
-  test("892 expand - same depiction as other DRDs", async ({ drds }) => {
-    test.skip(true, 
"https://github.com/apache/incubator-kie-issues/issues/892";);
+  test("Expanding a Decision Service shows the same depiction as in other 
DRD", async ({
+    drds,
+    drgNodes,
+    palette,
+    nodes,
+    diagram,
+  }) => {
     test.info().annotations.push({
       type: TestAnnotations.REGRESSION,
       description: "https://github.com/apache/incubator-kie-issues/issues/892";,
     });
-    // TODO
+    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 nodes.selectAndCollapseDecisionService({ name: "DS1" });
+
+    await drds.toggle();
+    await drds.create({ name: "Second DRD" });
+    await drgNodes.dragNode({ name: "DS1", targetPosition: { x: 400, y: 200 } 
});
+    await drgNodes.toggle();
+
+    await drds.toggle();
+    await drds.navigateTo({ name: "First DRD" });
+    await drds.toggle();
+
+    await nodes.selectAndExpandDecisionService({ name: "DS1" });
+    await expect(nodes.get({ name: "D1" })).toBeAttached();
+    await 
expect(diagram.get()).toHaveScreenshot("decision-service-from-other-drd.png");
   });
 
   test("892 expand - allow only if no other DS is collpased in the DRD", async 
({ drds }) => {


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


Reply via email to