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 64b62d51b12 kie-issues #882: On the DMN Editor, going back to the 
diagram after editing a Boxed Expression should render the diagram at the 
position it was before entering the BEE. (#2494)
64b62d51b12 is described below

commit 64b62d51b126d88d77ee359d77f573626dc808d9
Author: Daniel José dos Santos <[email protected]>
AuthorDate: Tue Jul 30 16:58:31 2024 -0300

    kie-issues #882: On the DMN Editor, going back to the diagram after editing 
a Boxed Expression should render the diagram at the position it was before 
entering the BEE. (#2494)
    
    Co-authored-by: Thiago Lugli <[email protected]>
    Co-authored-by: Tiago Bento <[email protected]>
---
 packages/dmn-editor/src/diagram/Diagram.tsx        |  40 ++++++++---
 packages/dmn-editor/src/store/Store.ts             |  10 ++-
 .../dmn-editor/tests-e2e/__fixtures__/diagram.ts   |  19 ++++++
 .../Google-Chrome/fit-to-view-diagram.png          | Bin 0 -> 47748 bytes
 .../keep-view-settings-after-swap-tabs.png         | Bin 0 -> 50131 bytes
 .../Google-Chrome/zoom-in-diagram.png              | Bin 0 -> 32272 bytes
 .../Google-Chrome/zoom-out-diagram.png             | Bin 0 -> 37454 bytes
 .../chromium/fit-to-view-diagram.png               | Bin 0 -> 46110 bytes
 .../keep-view-settings-after-swap-tabs.png         | Bin 0 -> 61173 bytes
 .../__screenshots__/chromium/zoom-in-diagram.png   | Bin 0 -> 32270 bytes
 .../__screenshots__/chromium/zoom-out-diagram.png  | Bin 0 -> 37456 bytes
 .../__screenshots__/webkit/fit-to-view-diagram.png | Bin 0 -> 34283 bytes
 .../webkit/keep-view-settings-after-swap-tabs.png  | Bin 0 -> 62519 bytes
 .../__screenshots__/webkit/zoom-in-diagram.png     | Bin 0 -> 35755 bytes
 .../__screenshots__/webkit/zoom-out-diagram.png    | Bin 0 -> 43165 bytes
 packages/dmn-editor/tests-e2e/zoomDiagram.spec.ts  |  75 +++++++++++++++++++++
 16 files changed, 132 insertions(+), 12 deletions(-)

diff --git a/packages/dmn-editor/src/diagram/Diagram.tsx 
b/packages/dmn-editor/src/diagram/Diagram.tsx
index 2081dbb94bd..5a132532d71 100644
--- a/packages/dmn-editor/src/diagram/Diagram.tsx
+++ b/packages/dmn-editor/src/diagram/Diagram.tsx
@@ -18,15 +18,15 @@
  */
 
 import * as RF from "reactflow";
+import { useOnViewportChange, Viewport } from "reactflow";
 import * as React from "react";
 import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } 
from "react";
-import { DmnBuiltInDataType, generateUuid } from 
"@kie-tools/boxed-expression-component/dist/api";
+import { generateUuid } from "@kie-tools/boxed-expression-component/dist/api";
 import {
   DC__Bounds,
   DC__Dimension,
   DMN15__tDecisionService,
   DMN15__tDefinitions,
-  DMNDI15__DMNDiagram,
 } from "@kie-tools/dmn-marshaller/dist/schemas/dmn-1_5/ts-gen/types";
 import { buildXmlQName } from "@kie-tools/xml-parser-ts/dist/qNames";
 import { Button, ButtonVariant } from 
"@patternfly/react-core/dist/js/components/Button";
@@ -62,8 +62,8 @@ import { addEdge } from "../mutations/addEdge";
 import { addShape } from "../mutations/addShape";
 import { addStandaloneNode } from "../mutations/addStandaloneNode";
 import { deleteDecisionFromDecisionService } from 
"../mutations/deleteDecisionFromDecisionService";
-import { EdgeDeletionMode, deleteEdge } from "../mutations/deleteEdge";
-import { NodeDeletionMode, deleteNode } from "../mutations/deleteNode";
+import { deleteEdge, EdgeDeletionMode } from "../mutations/deleteEdge";
+import { deleteNode, NodeDeletionMode } from "../mutations/deleteNode";
 import { repositionNode } from "../mutations/repositionNode";
 import { resizeNode } from "../mutations/resizeNode";
 import { updateExpression } from "../mutations/updateExpression";
@@ -72,14 +72,13 @@ import { DiagramLhsPanel, SnapGrid, State } from 
"../store/Store";
 import { useDmnEditorStore, useDmnEditorStoreApi } from 
"../store/StoreContext";
 import { Unpacked } from "../tsExt/tsExt";
 import { buildXmlHref, parseXmlHref } from "../xml/xmlHrefs";
-import { getXmlNamespaceDeclarationName } from 
"../xml/xmlNamespaceDeclarations";
 import { DiagramContainerContextProvider } from "./DiagramContainerContext";
 import { MIME_TYPE_FOR_DMN_EDITOR_DRG_NODE } from "./DrgNodesPanel";
 import { MIME_TYPE_FOR_DMN_EDITOR_NEW_NODE_FROM_PALETTE, Palette } from 
"./Palette";
 import { offsetShapePosition, snapShapeDimensions, snapShapePosition } from 
"./SnapGrid";
 import { ConnectionLine } from "./connections/ConnectionLine";
 import { PositionalNodeHandleId } from "./connections/PositionalNodeHandles";
-import { EdgeType, NodeType, containment, getDefaultEdgeTypeBetween } from 
"./connections/graphStructure";
+import { containment, EdgeType, getDefaultEdgeTypeBetween, NodeType } from 
"./connections/graphStructure";
 import { checkIsValidConnection } from "./connections/isValidConnection";
 import { EdgeMarkers } from "./edges/EdgeMarkers";
 import { EDGE_TYPES } from "./edges/EdgeTypes";
@@ -92,8 +91,8 @@ import {
 } from "./edges/Edges";
 import { buildHierarchy } from "./graph/graph";
 import {
-  getDmnBoundsCenterPoint,
   getContainmentRelationship,
+  getDmnBoundsCenterPoint,
   getHandlePosition,
   getNodeTypeFromDmnObject,
 } from "./maths/DmnMaths";
@@ -115,16 +114,16 @@ import { xmlHrefToQName } from "../xml/xmlHrefToQName";
 import {
   addAutoGeneratedDecisionServiceToDrd,
   addConflictingDecisionServiceToDrd,
-  StrategyForAddingDecisionServiceToDrd,
   addExistingDecisionServiceToDrd,
-  getStrategyToAddExistingDecisionServiceToDrd,
   getDecisionServicePropertiesRelativeToThisDmn,
+  getStrategyToAddExistingDecisionServiceToDrd,
+  StrategyForAddingDecisionServiceToDrd,
 } from "../mutations/addExistingDecisionServiceToDrd";
 import { updateExpressionWidths } from "../mutations/updateExpressionWidths";
 import { DiagramCommands } from "./DiagramCommands";
 import { getAutoLayoutedInfo } from "../autolayout/autoLayoutInfo";
 import { autoGenerateDrd } from "../normalization/autoGenerateDrd";
-import { Normalized, normalize } from "../normalization/normalize";
+import { normalize, Normalized } from "../normalization/normalize";
 import OptimizeIcon from "@patternfly/react-icons/dist/js/icons/optimize-icon";
 import { applyAutoLayoutToDrd } from "../mutations/applyAutoLayoutToDrd";
 
@@ -178,6 +177,8 @@ export const Diagram = React.forwardRef<DiagramRef, { 
container: React.RefObject
       RF.ReactFlowInstance<DmnDiagramNodeData, DmnDiagramEdgeData> | undefined
     >(undefined);
 
+    const viewport = useDmnEditorStore((s) => s.diagram.viewport);
+
     // Refs
     React.useImperativeHandle(
       ref,
@@ -1296,7 +1297,7 @@ export const Diagram = React.forwardRef<DiagramRef, { 
container: React.RefObject
             edgeTypes={edgeTypes}
             snapToGrid={true}
             snapGrid={rfSnapGrid}
-            defaultViewport={DEFAULT_VIEWPORT}
+            defaultViewport={viewport}
             fitView={false}
             fitViewOptions={FIT_VIEW_OPTIONS}
             attributionPosition={"bottom-right"}
@@ -1315,6 +1316,7 @@ export const Diagram = React.forwardRef<DiagramRef, { 
container: React.RefObject
             {!isFirefox && <RF.Background />}
             <RF.Controls fitViewOptions={FIT_VIEW_OPTIONS} 
position={"bottom-right"} />
             <SetConnectionToReactFlowStore />
+            <ViewportWatcher />
           </RF.ReactFlow>
         </DiagramContainerContextProvider>
       </>
@@ -1610,6 +1612,22 @@ function DmnDiagramEmptyState({
   );
 }
 
+export function ViewportWatcher() {
+  const dmnEditorStoreApi = useDmnEditorStoreApi();
+  useOnViewportChange({
+    onChange: (viewport: Viewport) => {
+      dmnEditorStoreApi.setState((state) => {
+        state.diagram.viewport = {
+          x: viewport.x,
+          y: viewport.y,
+          zoom: viewport.zoom,
+        };
+      });
+    },
+  });
+  return <></>;
+}
+
 export function SetConnectionToReactFlowStore(props: {}) {
   const ongoingConnection = useDmnEditorStore((s) => 
s.diagram.ongoingConnection);
   const rfStoreApi = RF.useStoreApi();
diff --git a/packages/dmn-editor/src/store/Store.ts 
b/packages/dmn-editor/src/store/Store.ts
index 21f04b3bf74..4b89906cc84 100644
--- a/packages/dmn-editor/src/store/Store.ts
+++ b/packages/dmn-editor/src/store/Store.ts
@@ -25,7 +25,7 @@ import { create } from "zustand";
 import { immer } from "zustand/middleware/immer";
 import { ExternalModelsIndex } from "../DmnEditor";
 import { DmnDiagramNodeData } from "../diagram/nodes/Nodes";
-import { Normalized, normalize } from "../normalization/normalize";
+import { normalize, Normalized } from "../normalization/normalize";
 import { ComputedStateCache } from "./ComputedStateCache";
 import { computeAllFeelVariableUniqueNames } from 
"./computed/computeAllFeelVariableUniqueNames";
 import { computeDataTypes } from "./computed/computeDataTypes";
@@ -34,6 +34,7 @@ import { computeExternalModelsByType } from 
"./computed/computeExternalModelsByT
 import { computeImportsByNamespace } from 
"./computed/computeImportsByNamespace";
 import { computeIndexedDrd } from "./computed/computeIndexes";
 import { computeIsDropTargetNodeValidForSelection } from 
"./computed/computeIsDropTargetNodeValidForSelection";
+import { DEFAULT_VIEWPORT } from "../diagram/Diagram";
 
 enableMapSet(); // Necessary because `Computed` has a lot of Maps and Sets.
 
@@ -42,6 +43,7 @@ export interface DmnEditorDiagramNodeStatus {
   dragging: boolean;
   resizing: boolean;
 }
+
 export interface DmnEditorDiagramEdgeStatus {
   selected: boolean;
   draggingWaypoint: boolean;
@@ -117,6 +119,11 @@ export interface State {
     draggingWaypoints: Array<string>;
     movingDividerLines: Array<string>;
     isEditingStyle: boolean;
+    viewport: {
+      x: number;
+      y: number;
+      zoom: number;
+    };
   };
 }
 
@@ -223,6 +230,7 @@ export const defaultStaticState = (): Omit<State, "dmn" | 
"dispatch" | "computed
     draggingWaypoints: [],
     movingDividerLines: [],
     isEditingStyle: false,
+    viewport: DEFAULT_VIEWPORT,
   },
 });
 
diff --git a/packages/dmn-editor/tests-e2e/__fixtures__/diagram.ts 
b/packages/dmn-editor/tests-e2e/__fixtures__/diagram.ts
index 7d633f6795c..1a807f4ac5a 100644
--- a/packages/dmn-editor/tests-e2e/__fixtures__/diagram.ts
+++ b/packages/dmn-editor/tests-e2e/__fixtures__/diagram.ts
@@ -51,4 +51,23 @@ export class Diagram {
     await this.page.getByLabel("Tweak the shape of the input data 
node").getByText("Alternative").click();
     await this.get().getByTitle("Select or edit DRD").click();
   }
+
+  public async zoomIn(args: { clicks: number }) {
+    await this.get().getByTitle("zoom in").click({ clickCount: args.clicks });
+  }
+
+  public async zoomOut(args: { clicks: number }) {
+    await this.get().getByLabel("zoom out").click({ clickCount: args.clicks });
+  }
+
+  public async fitView() {
+    await this.get().getByLabel("fit view").click();
+  }
+
+  public async pan(args: { startPosition: { x: number; y: number }; 
endPosition: { x: number; y: number } }) {
+    await this.page.mouse.move(args.startPosition.x, args.startPosition.y);
+    await this.page.mouse.down({ button: "middle" });
+    await this.page.mouse.move(args.endPosition.x, args.endPosition.y);
+    await this.page.mouse.up({ button: "middle" });
+  }
 }
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/fit-to-view-diagram.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/fit-to-view-diagram.png
new file mode 100644
index 00000000000..5357bb6c6e9
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/fit-to-view-diagram.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/keep-view-settings-after-swap-tabs.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/keep-view-settings-after-swap-tabs.png
new file mode 100644
index 00000000000..258f807277d
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/keep-view-settings-after-swap-tabs.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/zoom-in-diagram.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/zoom-in-diagram.png
new file mode 100644
index 00000000000..029e5a6af05
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/zoom-in-diagram.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/zoom-out-diagram.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/zoom-out-diagram.png
new file mode 100644
index 00000000000..d1f4a2afd89
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/Google-Chrome/zoom-out-diagram.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/chromium/fit-to-view-diagram.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/fit-to-view-diagram.png
new file mode 100644
index 00000000000..ec18ef6e1ce
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/fit-to-view-diagram.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/chromium/keep-view-settings-after-swap-tabs.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/keep-view-settings-after-swap-tabs.png
new file mode 100644
index 00000000000..9a42976a6ff
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/keep-view-settings-after-swap-tabs.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/chromium/zoom-in-diagram.png 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/zoom-in-diagram.png
new file mode 100644
index 00000000000..e6acdf3f168
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/zoom-in-diagram.png 
differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/chromium/zoom-out-diagram.png 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/zoom-out-diagram.png
new file mode 100644
index 00000000000..81e386c7279
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/chromium/zoom-out-diagram.png 
differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/webkit/fit-to-view-diagram.png 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/fit-to-view-diagram.png
new file mode 100644
index 00000000000..68c7dbb13b0
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/fit-to-view-diagram.png 
differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/webkit/keep-view-settings-after-swap-tabs.png
 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/keep-view-settings-after-swap-tabs.png
new file mode 100644
index 00000000000..338c83d31b3
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/keep-view-settings-after-swap-tabs.png
 differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/webkit/zoom-in-diagram.png 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/zoom-in-diagram.png
new file mode 100644
index 00000000000..5f0afda21b1
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/zoom-in-diagram.png 
differ
diff --git 
a/packages/dmn-editor/tests-e2e/__screenshots__/webkit/zoom-out-diagram.png 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/zoom-out-diagram.png
new file mode 100644
index 00000000000..30674e46d52
Binary files /dev/null and 
b/packages/dmn-editor/tests-e2e/__screenshots__/webkit/zoom-out-diagram.png 
differ
diff --git a/packages/dmn-editor/tests-e2e/zoomDiagram.spec.ts 
b/packages/dmn-editor/tests-e2e/zoomDiagram.spec.ts
new file mode 100644
index 00000000000..37fb5f01928
--- /dev/null
+++ b/packages/dmn-editor/tests-e2e/zoomDiagram.spec.ts
@@ -0,0 +1,75 @@
+/*
+ * 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 { expect, test } from "./__fixtures__/base";
+import { NodeType } from "./__fixtures__/nodes";
+import { TabName } from "./__fixtures__/editor";
+
+test.beforeEach(async ({ editor }) => {
+  await editor.open();
+});
+
+test.describe("Zoom and Panning Diagram", () => {
+  test("should zoom in diagram", async ({ nodes, palette, diagram, 
multipleNodesPropertiesPanel }) => {
+    await palette.dragNewNode({ type: NodeType.DECISION, targetPosition: { x: 
100, y: 10 } });
+    await diagram.resetFocus();
+    await palette.dragNewNode({ type: NodeType.DECISION, targetPosition: { x: 
100, y: 110 } });
+    await diagram.resetFocus();
+    await palette.dragNewNode({ type: NodeType.DECISION, targetPosition: { x: 
100, y: 210 } });
+    await diagram.zoomIn({ clicks: 1 });
+    await expect(diagram.get()).toHaveScreenshot("zoom-in-diagram.png");
+  });
+
+  test("should zoom out diagram", async ({ nodes, palette, diagram, 
multipleNodesPropertiesPanel }) => {
+    await palette.dragNewNode({ type: NodeType.DECISION, targetPosition: { x: 
100, y: 10 } });
+    await diagram.resetFocus();
+    await palette.dragNewNode({ type: NodeType.DECISION, targetPosition: { x: 
100, y: 110 } });
+    await diagram.resetFocus();
+    await palette.dragNewNode({ type: NodeType.DECISION, targetPosition: { x: 
100, y: 210 } });
+    await diagram.zoomOut({ clicks: 2 });
+    await expect(diagram.get()).toHaveScreenshot("zoom-out-diagram.png");
+  });
+
+  test("should fit to view diagram", async ({ nodes, palette, diagram, 
multipleNodesPropertiesPanel }) => {
+    await palette.dragNewNode({ type: NodeType.DECISION, targetPosition: { x: 
10, y: 10 } });
+    await diagram.resetFocus();
+    await palette.dragNewNode({ type: NodeType.DECISION, targetPosition: { x: 
400, y: 400 } });
+    await diagram.resetFocus();
+    await palette.dragNewNode({ type: NodeType.DECISION, targetPosition: { x: 
200, y: 200 } });
+    await diagram.zoomIn({ clicks: 2 });
+    await diagram.fitView();
+    await expect(diagram.get()).toHaveScreenshot("fit-to-view-diagram.png");
+  });
+
+  test("should keep view settings after swap tabs", async ({ palette, diagram, 
page, editor }) => {
+    await palette.dragNewNode({ type: NodeType.DECISION, targetPosition: { x: 
100, y: 100 } });
+    await diagram.resetFocus();
+    await palette.dragNewNode({ type: NodeType.DECISION, targetPosition: { x: 
200, y: 200 } });
+    await diagram.resetFocus();
+    await palette.dragNewNode({ type: NodeType.DECISION, targetPosition: { x: 
200, y: 300 } });
+    await diagram.zoomOut({ clicks: 3 });
+
+    await diagram.pan({ startPosition: { x: 500, y: 500 }, endPosition: { x: 
300, y: 300 } });
+
+    await editor.changeTab({ tab: TabName.DATA_TYPES });
+    await editor.changeTab({ tab: TabName.EDITOR });
+
+    await 
expect(diagram.get()).toHaveScreenshot("keep-view-settings-after-swap-tabs.png");
+  });
+});


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

Reply via email to