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]