Skip to content

Commit 7d52218

Browse files
committed
Fix: section zoom accuracy
1 parent 47903ad commit 7d52218

File tree

5 files changed

+29
-22
lines changed

5 files changed

+29
-22
lines changed

src/components/workspace/elements/polyline.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { forwardRef, useMemo } from "react";
22
import { twMerge } from "tailwind-merge";
33
import { dataAttributes, selectors } from "@/constants";
44
import { IPolyline, ISTKProps, ISeatCategory, ISection } from "@/types";
5-
import { d3Extended, getRelativeWorkspaceClickCoords } from "@/utils";
5+
import { d3Extended, getRelativeWorkspaceClickCoords, getScaleFactorAccountingForViewBoxWidth } from "@/utils";
66
import { panAndZoomToArea } from "../zoom";
77

88
export interface IPolylineProps extends IPolyline {
@@ -57,7 +57,11 @@ const Polyline: React.FC<IPolylineProps> = forwardRef(
5757
if (visibilityOffset > 0) {
5858
const coords = getRelativeWorkspaceClickCoords(e);
5959
panAndZoomToArea({
60-
k: visibilityOffset,
60+
k:
61+
getScaleFactorAccountingForViewBoxWidth(
62+
visibilityOffset,
63+
consumer.data?.workspace?.initialViewBoxScaleForWidth
64+
) * 1.1,
6165
x: coords.x,
6266
y: coords.y
6367
});

src/components/workspace/zoom.tsx

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@ import { twMerge } from "tailwind-merge";
66
import { dataAttributes, ids, selectors } from "@/constants";
77
import { useSkipFirstRender } from "@/hooks";
88
import type { ISTKProps } from "@/types";
9-
import { d3Extended } from "@/utils";
9+
import { d3Extended, getScaleFactorAccountingForViewBoxWidth } from "@/utils";
1010
import { Tool } from "../toolbar/data";
1111
import { showPostOffsetElements, showPreOffsetElements } from "./elements";
1212

1313
const handleElementVisibility = debounce((workspace, k) => {
1414
const visibilityOffset = +workspace.attr(dataAttributes.visibilityOffset) || 0;
15-
if (k * 1.1 < visibilityOffset) {
15+
const initialViewBoxScaleForWidth = +workspace.attr(dataAttributes.initialViewBoxScaleForWidth) || 1;
16+
if (k * 1.1 < getScaleFactorAccountingForViewBoxWidth(visibilityOffset, initialViewBoxScaleForWidth)) {
1617
showPreOffsetElements();
1718
} else {
1819
showPostOffsetElements();
@@ -64,17 +65,7 @@ export const panAndZoom = ({ k, x, y }) => {
6465
};
6566

6667
export const panAndZoomToArea = ({ k, x, y }) => {
67-
const transform = d3Extended.zoomTransform(document.querySelector(selectors.workspaceGroup));
68-
const { height: workspaceheight, width: workspaceWidth } = d3Extended.selectionBounds(
69-
d3Extended.selectById(ids.workspace)
70-
);
71-
const newX = x * (x > workspaceWidth / 2 ? -1 : 1) * transform.k * 0.75;
72-
const newY = (workspaceheight - y) * (y > workspaceheight / 2 ? -1 : 1);
73-
d3Extended
74-
.selectById(ids.workspace)
75-
.transition()
76-
.duration(1000)
77-
.call(zoom.transform, d3Extended.zoomIdentity.translate(newX, newY).scale(k));
68+
d3Extended.selectById(ids.workspace).transition().duration(1000).call(zoom.scaleTo, k, [x, y]);
7869
};
7970

8071
const panHandleClasses =

src/constants/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export const dataAttributes = {
3131
section: "data-section",
3232
sectionFreeSeating: "data-section-free-seating",
3333
visibilityOffset: "data-seat-visibility-offset",
34+
initialViewBoxScaleForWidth: "data-initial-view-box-scale-for-width",
3435
embraceOffset: "data-embrace-offset"
3536
};
3637

src/hooks/events/workspace-load.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { dataAttributes, ids, selectors } from "@/constants";
55
import { store } from "@/store";
66
import { initializeElements, initializeWorkspace, resetWorkspace, sync } from "@/store/reducers/editor";
77
import { ISTKProps } from "@/types";
8-
import { d3Extended } from "@/utils";
8+
import { d3Extended, getScaleFactorAccountingForViewBoxWidth } from "@/utils";
99

1010
const useWorkspaceLoad = (props: ISTKProps) => {
1111
const dataSynced = useSelector((state: any) => state.editor.dataSynced);
@@ -36,12 +36,14 @@ const useWorkspaceLoad = (props: ISTKProps) => {
3636
} = d3Extended.selectionBounds(workspaceGroup);
3737
let scaleFactor = 1;
3838
if (props.data?.workspace?.initialViewBoxScale) {
39-
scaleFactor = props.data?.workspace?.initialViewBoxScale;
40-
if (props.data?.workspace?.initialViewBoxScaleForWidth) {
41-
const currentWidth = document.documentElement.clientWidth;
42-
const ratio = currentWidth / props.data?.workspace?.initialViewBoxScaleForWidth;
43-
scaleFactor *= ratio >= 1 ? ratio : ratio * 1.25;
44-
}
39+
workspaceGroup.attr(
40+
dataAttributes.initialViewBoxScaleForWidth,
41+
props.data?.workspace.initialViewBoxScaleForWidth
42+
);
43+
scaleFactor = getScaleFactorAccountingForViewBoxWidth(
44+
props.data?.workspace?.initialViewBoxScale,
45+
props.data?.workspace?.initialViewBoxScaleForWidth
46+
);
4547
}
4648
if (props.data?.workspace?.visibilityOffset) {
4749
workspaceGroup.attr(dataAttributes.visibilityOffset, props.data?.workspace.visibilityOffset);

src/utils/workspace.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,12 @@ export const getWorkspaceCenterY = () => {
2121
if (typeof window === "undefined") return 0;
2222
return window.innerHeight / 2 - (workspaceContainer?.offsetTop ?? 0);
2323
};
24+
25+
export const getScaleFactorAccountingForViewBoxWidth = (scaleFactor: number, initialViewBoxScaleForWidth?: number) => {
26+
if (initialViewBoxScaleForWidth) {
27+
const currentWidth = document.documentElement.clientWidth;
28+
const ratio = currentWidth / initialViewBoxScaleForWidth;
29+
scaleFactor *= ratio >= 1 ? ratio : ratio * 1.25;
30+
}
31+
return scaleFactor;
32+
};

0 commit comments

Comments
 (0)