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]