@prefecthq/graphs 2.0.5 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/runGraph.worker-57858a3b.js.map +1 -0
- package/dist/graphs.mjs +31693 -5
- package/dist/graphs.mjs.map +1 -1
- package/dist/graphs.umd.js +693 -1093
- package/dist/graphs.umd.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types/demo/{sections/components/FlowRunTimelineDemo.vue.d.ts → components/AppComponentNavigationItems.vue.d.ts} +5 -0
- package/dist/types/demo/components/{HashLink.vue.d.ts → AppNavigationBar.vue.d.ts} +5 -3
- package/dist/types/demo/main.d.ts +1 -1
- package/dist/types/src/components/RunGraph.vue.d.ts +39 -0
- package/dist/types/src/components/index.d.ts +1 -0
- package/dist/types/src/consts.d.ts +16 -0
- package/dist/types/src/factories/animation.d.ts +4 -0
- package/dist/types/src/factories/arrow.d.ts +15 -0
- package/dist/types/src/factories/bar.d.ts +13 -0
- package/dist/types/src/factories/border.d.ts +12 -0
- package/dist/types/src/factories/cap.d.ts +12 -0
- package/dist/types/src/factories/data.d.ts +7 -0
- package/dist/types/src/factories/edge.d.ts +8 -0
- package/dist/types/src/factories/events.d.ts +13 -0
- package/dist/types/src/factories/guide.d.ts +7 -0
- package/dist/types/src/factories/guides.d.ts +5 -0
- package/dist/types/src/factories/label.d.ts +5 -0
- package/dist/types/src/factories/node.d.ts +10 -0
- package/dist/types/src/factories/nodeArrowButton.d.ts +11 -0
- package/dist/types/src/factories/nodeBar.d.ts +6 -0
- package/dist/types/src/factories/nodeFlowRun.d.ts +9 -0
- package/dist/types/src/factories/nodeTaskRun.d.ts +9 -0
- package/dist/types/src/factories/nodes.d.ts +11 -0
- package/dist/types/src/factories/offsets.d.ts +24 -0
- package/dist/types/src/factories/position.d.ts +12 -0
- package/dist/types/src/factories/rectangle.d.ts +2 -0
- package/dist/types/src/factories/settings.d.ts +3 -0
- package/dist/types/src/index.d.ts +1 -2
- package/dist/types/src/models/RunGraph.d.ts +74 -0
- package/dist/types/src/models/boundsContainer.d.ts +15 -0
- package/dist/types/src/models/guides.d.ts +6 -0
- package/dist/types/src/models/index.d.ts +3 -1
- package/dist/types/src/models/layout.d.ts +35 -0
- package/dist/types/src/models/nonTemporalLayoutError.d.ts +3 -0
- package/dist/types/src/models/selection.d.ts +5 -0
- package/dist/types/src/models/states.d.ts +2 -0
- package/dist/types/src/models/viewport.d.ts +1 -0
- package/dist/types/src/objects/application.d.ts +5 -0
- package/dist/types/src/objects/config.d.ts +4 -0
- package/dist/types/src/objects/culling.d.ts +6 -0
- package/dist/types/src/objects/edgeCulling.d.ts +4 -0
- package/dist/types/src/objects/events.d.ts +48 -0
- package/dist/types/src/objects/fonts.d.ts +9 -0
- package/dist/types/src/objects/guides.d.ts +2 -0
- package/dist/types/src/objects/index.d.ts +10 -0
- package/dist/types/src/objects/labelCulling.d.ts +4 -0
- package/dist/types/src/objects/nodes.d.ts +4 -0
- package/dist/types/src/objects/scale.d.ts +4 -0
- package/dist/types/src/objects/scope.d.ts +4 -0
- package/dist/types/src/objects/selection.d.ts +6 -0
- package/dist/types/src/objects/settings.d.ts +26 -0
- package/dist/types/src/objects/stage.d.ts +4 -0
- package/dist/types/src/objects/viewport.d.ts +17 -0
- package/dist/types/src/services/visibilityCull.d.ts +12 -0
- package/dist/types/src/textures/cap.d.ts +6 -0
- package/dist/types/src/textures/corner.d.ts +7 -0
- package/dist/types/src/textures/pixel.d.ts +2 -0
- package/dist/types/src/utilities/columns.d.ts +14 -0
- package/dist/types/src/utilities/effectScopeFactory.d.ts +6 -0
- package/dist/types/src/utilities/exhaustive.d.ts +1 -0
- package/dist/types/src/utilities/getEdgesCount.d.ts +2 -0
- package/dist/types/src/utilities/getInitialHorizontalScaleMultiplier.d.ts +2 -0
- package/dist/types/src/utilities/keyboard.d.ts +1 -0
- package/dist/types/src/utilities/repeat.d.ts +1 -0
- package/dist/types/src/utilities/timeIncrements.d.ts +21 -0
- package/dist/types/src/workers/layouts/horizontal.d.ts +6 -0
- package/dist/types/src/workers/layouts/nearestParentVertical.d.ts +4 -0
- package/dist/types/src/workers/layouts/vertical.d.ts +4 -0
- package/dist/types/src/workers/runGraph.d.ts +21 -0
- package/dist/types/vite.config.d.ts +1 -1
- package/package.json +23 -19
- package/dist/assets/nodeLayout.worker-ba54e168.js.map +0 -1
- package/dist/index-cd319f80.mjs +0 -19948
- package/dist/index-cd319f80.mjs.map +0 -1
- package/dist/types/demo/components/ComponentPage.vue.d.ts +0 -30
- package/dist/types/demo/components/ResizableSection.vue.d.ts +0 -9
- package/dist/types/demo/components/contextAccordionChildItem.d.ts +0 -5
- package/dist/types/demo/components/router.d.ts +0 -3
- package/dist/types/demo/sections/components/TimescaleTable.vue.d.ts +0 -30
- package/dist/types/demo/utilities/randomColor.d.ts +0 -5
- package/dist/types/demo/utilities/randomDate.d.ts +0 -7
- package/dist/types/demo/utilities/randomStarName.d.ts +0 -4
- package/dist/types/demo/utilities/starnames/index.d.ts +0 -3
- package/dist/types/demo/utilities/starnames/names.d.ts +0 -2
- package/dist/types/demo/utilities/starnames/prefixes.d.ts +0 -2
- package/dist/types/demo/utilities/starnames/suffixes.d.ts +0 -2
- package/dist/types/demo/utilities/timescaleData.d.ts +0 -14
- package/dist/types/src/FlowRunTimeline.vue.d.ts +0 -52
- package/dist/types/src/containers/guide.d.ts +0 -29
- package/dist/types/src/containers/guides.d.ts +0 -26
- package/dist/types/src/models/FlowRunTimeline.d.ts +0 -191
- package/dist/types/src/pixiFunctions/bitmapFonts.d.ts +0 -4
- package/dist/types/src/pixiFunctions/deselectLayer.d.ts +0 -12
- package/dist/types/src/pixiFunctions/index.d.ts +0 -13
- package/dist/types/src/pixiFunctions/initPixiApp.d.ts +0 -2
- package/dist/types/src/pixiFunctions/initViewport.d.ts +0 -3
- package/dist/types/src/pixiFunctions/loadingIndicator.d.ts +0 -19
- package/dist/types/src/pixiFunctions/nodeSprites.d.ts +0 -34
- package/dist/types/src/pixiFunctions/roundedBorderRect.d.ts +0 -39
- package/dist/types/src/pixiFunctions/subNodesToggle.d.ts +0 -41
- package/dist/types/src/pixiFunctions/timeScale.d.ts +0 -2
- package/dist/types/src/pixiFunctions/timelineEdge.d.ts +0 -49
- package/dist/types/src/pixiFunctions/timelineNode.d.ts +0 -112
- package/dist/types/src/pixiFunctions/timelineNodes.d.ts +0 -54
- package/dist/types/src/pixiFunctions/timelinePlayhead.d.ts +0 -14
- package/dist/types/src/pixiFunctions/viewport.d.ts +0 -1
- package/dist/types/src/types/index.d.ts +0 -1
- package/dist/types/src/types/timeline.d.ts +0 -11
- package/dist/types/src/utilities/index.d.ts +0 -5
- package/dist/types/src/utilities/map.d.ts +0 -1
- package/dist/types/src/utilities/math.d.ts +0 -13
- package/dist/types/src/utilities/style.d.ts +0 -4
- package/dist/types/src/utilities/time.d.ts +0 -42
- package/dist/types/src/utilities/viewport.d.ts +0 -3
- package/dist/types/src/utilities/zIndex.d.ts +0 -5
- package/dist/types/src/workers/layouts/nearestNeighbor.d.ts +0 -10
- package/dist/types/src/workers/layouts/waterfall.d.ts +0 -3
- package/dist/viewport.es-3ce16114.mjs +0 -2237
- package/dist/viewport.es-3ce16114.mjs.map +0 -1
- /package/dist/types/demo/{components/ContextSidebar.vue.d.ts → sections/WelcomePage.vue.d.ts} +0 -0
- /package/dist/types/demo/sections/{Data.vue.d.ts → components/RunGraphDemo.vue.d.ts} +0 -0
- /package/dist/types/{demo/sections/Home.vue.d.ts → src/components/RunGraphSettings.vue.d.ts} +0 -0
- /package/dist/types/src/workers/{nodeLayout.worker.d.ts → runGraph.worker.d.ts} +0 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { HorizontalMode, LayoutSettings, VerticalMode } from '../models/layout';
|
|
2
|
+
export declare function startSettings(): Promise<void>;
|
|
3
|
+
export declare function stopSettings(): void;
|
|
4
|
+
export declare const layout: {
|
|
5
|
+
horizontal: HorizontalMode;
|
|
6
|
+
vertical: VerticalMode;
|
|
7
|
+
horizontalScaleMultiplierDefault: number;
|
|
8
|
+
horizontalScaleMultiplier: number;
|
|
9
|
+
disableEdges: boolean;
|
|
10
|
+
disableAnimations: boolean;
|
|
11
|
+
disableGuides: boolean;
|
|
12
|
+
isTemporal: () => boolean;
|
|
13
|
+
isDependency: () => boolean;
|
|
14
|
+
isWaterfall: () => boolean;
|
|
15
|
+
isNearestParent: () => boolean;
|
|
16
|
+
};
|
|
17
|
+
export declare function waitForSettings(): Promise<LayoutSettings>;
|
|
18
|
+
export declare function getHorizontalColumnSize(): number;
|
|
19
|
+
export declare function getHorizontalRange(): [number, number];
|
|
20
|
+
export declare function getHorizontalDomain(startTime: Date): [Date, Date] | [number, number];
|
|
21
|
+
export declare function setHorizontalScaleMultiplier(value: number, isDefaultValue?: boolean): void;
|
|
22
|
+
export declare function resetHorizontalScaleMultiplier(): void;
|
|
23
|
+
export declare function setLayoutMode({ horizontal, vertical }: LayoutSettings): void;
|
|
24
|
+
export declare function setHorizontalMode(mode: HorizontalMode): void;
|
|
25
|
+
export declare function setVerticalMode(mode: VerticalMode): void;
|
|
26
|
+
export declare function setDisabledEdges(value: boolean): void;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Viewport } from 'pixi-viewport';
|
|
2
|
+
import { ViewportDateRange } from '../models/viewport';
|
|
3
|
+
export declare function startViewport(): Promise<void>;
|
|
4
|
+
export declare function stopViewport(): void;
|
|
5
|
+
type CenterViewportParameters = {
|
|
6
|
+
animate?: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare function centerViewport({ animate }?: CenterViewportParameters): Promise<void>;
|
|
9
|
+
export declare function waitForViewport(): Promise<Viewport>;
|
|
10
|
+
export declare function setViewportDateRange(value: ViewportDateRange): void;
|
|
11
|
+
type MoveViewportCenterOptions = {
|
|
12
|
+
xOffset: number;
|
|
13
|
+
yOffset: number;
|
|
14
|
+
};
|
|
15
|
+
export declare function moveViewportCenter({ xOffset, yOffset }: MoveViewportCenterOptions): void;
|
|
16
|
+
export declare function updateViewportFromDateRange(value: ViewportDateRange | undefined): Promise<void>;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { DisplayObject } from 'pixi.js';
|
|
2
|
+
export declare class VisibilityCull {
|
|
3
|
+
private status;
|
|
4
|
+
private readonly labels;
|
|
5
|
+
private get visible();
|
|
6
|
+
private get hidden();
|
|
7
|
+
show(): void;
|
|
8
|
+
hide(): void;
|
|
9
|
+
toggle(visible: boolean): void;
|
|
10
|
+
add(label: DisplayObject): void;
|
|
11
|
+
clear(): void;
|
|
12
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { RunGraphData } from '../models/RunGraph';
|
|
2
|
+
/**
|
|
3
|
+
* A `Map` object that maps each node ID to its column.
|
|
4
|
+
*/
|
|
5
|
+
export type NodeColumns = Map<string, number>;
|
|
6
|
+
/**
|
|
7
|
+
* Calculates the column for each node in the run graph using a faster or slower algorithm.
|
|
8
|
+
*
|
|
9
|
+
* This function first tries to calculate the columns using the faster `getColumnsFaster` function. If an error occurs during the calculation, it falls back to the slower `getColumnsSlower` function. The function takes in a `RunGraphData` object containing the root node IDs and nodes in the run graph.
|
|
10
|
+
*
|
|
11
|
+
* @param runGraphData - A `RunGraphData` object containing the root node IDs and nodes in the run graph.
|
|
12
|
+
* @returns A `Map` object that maps each node ID to its column.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getColumns({ root_node_ids, nodes }: RunGraphData): NodeColumns;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function exhaustive(value: never): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function eventTargetIsInput(eventTarget: EventTarget | null): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function repeat<T>(length: number, method: (index: number) => T): T[];
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { FormatDateFns } from '../models/guides';
|
|
2
|
+
export declare const formatDateFns: FormatDateFns;
|
|
3
|
+
export declare const labelFormats: {
|
|
4
|
+
seconds: string;
|
|
5
|
+
minutes: string;
|
|
6
|
+
date: string;
|
|
7
|
+
};
|
|
8
|
+
export declare const timeLengths: {
|
|
9
|
+
second: number;
|
|
10
|
+
minute: number;
|
|
11
|
+
hour: number;
|
|
12
|
+
day: number;
|
|
13
|
+
week: number;
|
|
14
|
+
};
|
|
15
|
+
export type TimeIncrement = {
|
|
16
|
+
ceiling: number;
|
|
17
|
+
increment: number;
|
|
18
|
+
labelFormat: string;
|
|
19
|
+
getAnchor?: (date: Date) => number;
|
|
20
|
+
};
|
|
21
|
+
export declare const timeIncrements: TimeIncrement[];
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { HorizontalLayout } from '../../workers/layouts/horizontal';
|
|
2
|
+
import { VerticalLayout } from '../../workers/layouts/vertical';
|
|
3
|
+
import { ClientLayoutMessage } from '../../workers/runGraph';
|
|
4
|
+
export declare function getVerticalNearestParentLayout(message: ClientLayoutMessage, horizontal: HorizontalLayout): Promise<VerticalLayout>;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { HorizontalLayout } from '../../workers/layouts/horizontal';
|
|
2
|
+
import { ClientLayoutMessage } from '../../workers/runGraph';
|
|
3
|
+
export type VerticalLayout = Map<string, number>;
|
|
4
|
+
export declare function getVerticalLayout(message: ClientLayoutMessage, horizontal: HorizontalLayout): Promise<VerticalLayout>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { HorizontalPositionSettings, VerticalPositionSettings } from '../factories/position';
|
|
2
|
+
import { NodesLayoutResponse, NodeWidths } from '../models/layout';
|
|
3
|
+
import { RunGraphData } from '../models/RunGraph';
|
|
4
|
+
export type ClientMessage = ClientLayoutMessage;
|
|
5
|
+
export type WorkerMessage = WorkerLayoutMessage;
|
|
6
|
+
export type ClientLayoutMessage = {
|
|
7
|
+
type: 'layout';
|
|
8
|
+
data: RunGraphData;
|
|
9
|
+
widths: NodeWidths;
|
|
10
|
+
horizontalSettings: HorizontalPositionSettings;
|
|
11
|
+
verticalSettings: VerticalPositionSettings;
|
|
12
|
+
};
|
|
13
|
+
export type WorkerLayoutMessage = {
|
|
14
|
+
type: 'layout';
|
|
15
|
+
layout: NodesLayoutResponse;
|
|
16
|
+
};
|
|
17
|
+
export interface IRunGraphWorker extends Omit<Worker, 'postMessage' | 'onmessage'> {
|
|
18
|
+
postMessage: (command: ClientMessage, transfer?: Transferable[]) => void;
|
|
19
|
+
onmessage: ((this: Worker, event: MessageEvent<WorkerMessage>) => void) | null;
|
|
20
|
+
}
|
|
21
|
+
export declare function layoutWorkerFactory(onmessage: IRunGraphWorker['onmessage']): IRunGraphWorker;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const _default: import("vite").
|
|
1
|
+
declare const _default: import("vite").UserConfigFnObject;
|
|
2
2
|
export default _default;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prefecthq/graphs",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.1.1",
|
|
5
5
|
"description": "Large scale graphs designed for Prefect",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"serve": "vite --host --mode=demo",
|
|
@@ -37,22 +37,23 @@
|
|
|
37
37
|
},
|
|
38
38
|
"homepage": "https://github.com/PrefectHQ/graphs#readme",
|
|
39
39
|
"devDependencies": {
|
|
40
|
-
"@
|
|
41
|
-
"@
|
|
42
|
-
"@
|
|
43
|
-
"@types/
|
|
40
|
+
"@prefecthq/eslint-config": "1.0.31",
|
|
41
|
+
"@types/d3": "7.4.2",
|
|
42
|
+
"@types/fontfaceobserver": "^2.1.2",
|
|
43
|
+
"@types/lodash.isequal": "4.5.7",
|
|
44
|
+
"@types/lodash.merge": "4.6.8",
|
|
44
45
|
"@types/node": "^20.1.7",
|
|
45
|
-
"@vitejs/plugin-vue": "4.
|
|
46
|
+
"@vitejs/plugin-vue": "4.4.0",
|
|
46
47
|
"auto-changelog": "^2.4.0",
|
|
47
|
-
"autoprefixer": "10.4.
|
|
48
|
-
"eslint": "8.
|
|
49
|
-
"postcss": "8.4.
|
|
50
|
-
"tailwindcss": "3.
|
|
51
|
-
"tsc-alias": "1.8.
|
|
52
|
-
"typescript": "5.
|
|
53
|
-
"vite": "4.
|
|
54
|
-
"vite-svg-loader": "^
|
|
55
|
-
"vue-tsc": "1.
|
|
48
|
+
"autoprefixer": "10.4.16",
|
|
49
|
+
"eslint": "8.52.0",
|
|
50
|
+
"postcss": "8.4.31",
|
|
51
|
+
"tailwindcss": "3.3.5",
|
|
52
|
+
"tsc-alias": "1.8.8",
|
|
53
|
+
"typescript": "5.2.2",
|
|
54
|
+
"vite": "4.5.0",
|
|
55
|
+
"vite-svg-loader": "^4.0.0",
|
|
56
|
+
"vue-tsc": "1.8.22"
|
|
56
57
|
},
|
|
57
58
|
"peerDependencies": {
|
|
58
59
|
"@prefecthq/prefect-design": "^2.0.1",
|
|
@@ -61,11 +62,14 @@
|
|
|
61
62
|
"vue-router": "^4.0.12"
|
|
62
63
|
},
|
|
63
64
|
"dependencies": {
|
|
64
|
-
"@pixi-essentials/cull": "
|
|
65
|
+
"@pixi-essentials/cull": "2.0.0",
|
|
66
|
+
"d3": "7.8.5",
|
|
65
67
|
"date-fns": "2.30.0",
|
|
66
68
|
"fontfaceobserver": "^2.3.0",
|
|
67
|
-
"gsap": "^3.
|
|
68
|
-
"
|
|
69
|
-
"
|
|
69
|
+
"gsap": "^3.12.2",
|
|
70
|
+
"lodash.isequal": "4.5.0",
|
|
71
|
+
"lodash.merge": "4.6.2",
|
|
72
|
+
"pixi-viewport": "5.0.2",
|
|
73
|
+
"pixi.js": "7.3.2"
|
|
70
74
|
}
|
|
71
75
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"nodeLayout.worker-ba54e168.js","sources":["../src/pixiFunctions/timeScale.ts","../src/workers/layouts/nearestNeighbor.ts","../src/workers/layouts/waterfall.ts","../src/workers/nodeLayout.worker.ts"],"sourcesContent":["import {\n DateToX,\n XToDate,\n TimeScale,\n TimeScaleArgs\n} from '@/models'\n\nexport const createTimeScale = ({\n minimumStartTime,\n graphXDomain,\n initialOverallTimeSpan,\n}: TimeScaleArgs): TimeScale => {\n return {\n dateToX: createDateToXScale(\n minimumStartTime,\n graphXDomain,\n initialOverallTimeSpan,\n ),\n xToDate: createXToDateScale(\n minimumStartTime,\n graphXDomain,\n initialOverallTimeSpan,\n ),\n }\n}\n\nfunction createDateToXScale(minStartTime: number, overallWidth: number, overallTimeSpan: number): DateToX {\n return function(date: Date): number {\n return Math.ceil((date.getTime() - minStartTime) * (overallWidth / overallTimeSpan))\n }\n}\n\nfunction createXToDateScale(minStartTime: number, overallWidth: number, overallTimeSpan: number): XToDate {\n return function(xPosition: number): Date {\n return new Date(Math.ceil(minStartTime + xPosition * (overallTimeSpan / overallWidth)))\n }\n}\n","import { NodeLayoutItem, NodeShoveDirection, NodesLayout, TimeScale } from '@/models'\nimport { TimelineData, TimelineItem } from '@/types/timeline'\n\nconst DEFAULT_POSITION = 0\n\ntype FactoryArgs = {\n data: TimelineData,\n timeScale: TimeScale,\n currentApxCharacterWidth: number,\n minimumNodeEdgeGap: number,\n}\n\ntype ShoveProps = {\n direction: NodeShoveDirection,\n nodeStartX: number,\n desiredPosition: number,\n}\n\ntype IsNodesOverlappingProps = {\n firstNodeEndX: number,\n firstNodePosition: number,\n lastNodeStartX: number,\n lastNodePosition: number,\n}\n\ntype ArgueWithCompetingUpstreamPlacementProps = {\n desiredPosition: number,\n nodeStartX: number,\n upstreamPositions: number[],\n competingLayoutItemId: string,\n}\n\nexport async function generateNearestParentLayout({\n data,\n timeScale,\n currentApxCharacterWidth,\n minimumNodeEdgeGap,\n}: FactoryArgs): Promise<NodesLayout> {\n const layout: NodesLayout = {}\n\n async function generate(): Promise<void> {\n for await (const [, item] of data) {\n if (!item.start) {\n continue\n }\n\n const endAsPx = timeScale.dateToX(item.end ?? new Date())\n // Accommodate the label width so they don't overlap\n const apxLabelWidth = item.label.length * currentApxCharacterWidth\n const endX = endAsPx + apxLabelWidth\n\n const startX = timeScale.dateToX(new Date(item.start))\n\n const row = await getNearestParentRow(item, startX)\n\n layout[item.id] = {\n row,\n startX,\n endX,\n }\n }\n }\n\n async function getNearestParentRow(nodeData: TimelineItem, nodeStartX: number): Promise<number> {\n // if one dependency\n if (nodeData.upstream.length === 1) {\n if (nodeData.upstream[0] in layout) {\n const parent = layout[nodeData.upstream[0]]\n return await placeNearUpstreamNode(parent, nodeStartX)\n }\n\n console.warn('timelineNodes layout worker: Parent node not found in layout', nodeData.upstream[0])\n return DEFAULT_POSITION\n }\n\n // if more than one dependency – add to the middle of upstream dependencies\n if (nodeData.upstream.length > 0) {\n const upstreamLayoutItems = nodeData.upstream\n .map(id => layout[id])\n .filter((layoutItem: NodeLayoutItem | undefined): layoutItem is NodeLayoutItem => !!layoutItem)\n const upstreamPositions = upstreamLayoutItems.map(layoutItem => layoutItem.row)\n const upstreamPositionSum = upstreamPositions.reduce((sum, position) => sum + position, 0)\n const upstreamPositionAverage = upstreamPositionSum / upstreamPositions.length\n\n const position = Math.round(upstreamPositionAverage)\n\n if (isPositionTaken(nodeStartX, position)) {\n const overlappingLayoutIds = getOverlappingLayoutIds(\n nodeStartX,\n position,\n )!\n\n const upstreamDependenciesOverlapping = overlappingLayoutIds.filter(layoutId => {\n return nodeData.upstream.includes(layoutId)\n })\n\n if (upstreamDependenciesOverlapping.length > 0 || overlappingLayoutIds.length > 1) {\n // upstream nodeData dependencies always win, or if there are more than one node in the way\n const [upstreamLayoutItemId] = upstreamDependenciesOverlapping.length > 0\n ? upstreamDependenciesOverlapping\n : overlappingLayoutIds\n const upstreamLayoutItem = layout[upstreamLayoutItemId]\n\n upstreamLayoutItem.nextDependencyShove = getShoveDirectionWeightedByDependencies(\n upstreamPositions,\n position,\n upstreamLayoutItem.nextDependencyShove,\n )\n\n return await placeNearUpstreamNode(upstreamLayoutItem, nodeStartX)\n }\n\n return await argueWithCompetingUpstreamPlacement({\n competingLayoutItemId: overlappingLayoutIds[0],\n upstreamPositions,\n nodeStartX,\n desiredPosition: position,\n })\n }\n }\n\n // if zero dependencies\n return placeRootNode(nodeStartX, DEFAULT_POSITION)\n }\n\n function placeRootNode(nodeStartX: number, DEFAULT_POSITION: number): number {\n if (isPositionTaken(nodeStartX, DEFAULT_POSITION)) {\n return placeRootNode(nodeStartX, DEFAULT_POSITION + 1)\n }\n\n return DEFAULT_POSITION\n }\n\n async function placeNearUpstreamNode(upstreamLayoutItem: NodeLayoutItem, nodeStartX: number): Promise<number> {\n // See this diagram for how shove logic works in this scenario\n // https://www.figma.com/file/1u1oXkiYRxgtqWSRG9Yely/DAG-Design?node-id=385%3A2782&t=yRLIggko0TzbMaIG-4\n if (upstreamLayoutItem.nextDependencyShove !== 1 && upstreamLayoutItem.nextDependencyShove !== -1) {\n upstreamLayoutItem.nextDependencyShove = 1\n }\n\n const {\n row: upstreamNodePosition,\n nextDependencyShove,\n } = upstreamLayoutItem\n if (isPositionTaken(nodeStartX, upstreamNodePosition)) {\n if (nextDependencyShove === 1 && !isPositionTaken(nodeStartX, upstreamNodePosition + 1)) {\n upstreamLayoutItem.nextDependencyShove = -1\n return upstreamNodePosition + 1\n } else if (!isPositionTaken(nodeStartX, upstreamNodePosition - 1)) {\n upstreamLayoutItem.nextDependencyShove = 1\n return upstreamNodePosition - 1\n }\n await shove({\n direction: nextDependencyShove,\n nodeStartX,\n desiredPosition: upstreamNodePosition + nextDependencyShove,\n })\n upstreamLayoutItem.nextDependencyShove = nextDependencyShove === 1 ? -1 : 1\n return upstreamNodePosition + nextDependencyShove\n }\n return upstreamNodePosition\n }\n\n function isPositionTaken(nodeStartX: number, position: number): boolean {\n const layoutKeys = Object.keys(layout)\n return layoutKeys.length > 0 && layoutKeys.some((nodeId) => {\n const layoutItem = layout[nodeId]\n return isNodesOverlapping({\n firstNodeEndX: layoutItem.endX,\n firstNodePosition: layoutItem.row,\n lastNodeStartX: nodeStartX,\n lastNodePosition: position,\n })\n })\n }\n\n async function shove({ direction, nodeStartX, desiredPosition }: ShoveProps): Promise<void> {\n const overlappingLayoutIds = getOverlappingLayoutIds(nodeStartX, desiredPosition)\n\n if (!overlappingLayoutIds) {\n return\n }\n\n for await (const overlapId of overlappingLayoutIds) {\n // push nodes and recursively shove as needed\n const layoutItem = layout[overlapId]\n const newPosition = layoutItem.row + direction\n await shove({\n direction,\n nodeStartX: layoutItem.startX,\n desiredPosition: newPosition,\n })\n layoutItem.row = newPosition\n }\n }\n\n function isNodesOverlapping({\n firstNodeEndX,\n firstNodePosition,\n lastNodeStartX,\n lastNodePosition,\n }: IsNodesOverlappingProps): boolean {\n return firstNodePosition === lastNodePosition\n && firstNodeEndX + minimumNodeEdgeGap >= lastNodeStartX\n }\n\n function getOverlappingLayoutIds(nodeStartX: number, position: number): string[] | undefined {\n const overlappingLayoutItems: string[] = []\n\n Object.keys(layout).forEach(itemId => {\n const layoutItem = layout[itemId]\n\n const isItemOverlapping = isNodesOverlapping({\n firstNodeEndX: layoutItem.endX,\n firstNodePosition: layoutItem.row,\n lastNodeStartX: nodeStartX,\n lastNodePosition: position,\n })\n\n if (isItemOverlapping) {\n overlappingLayoutItems.push(itemId)\n }\n })\n\n if (overlappingLayoutItems.length === 0) {\n return\n }\n\n // sort last to first\n overlappingLayoutItems.sort((itemAId, itemBId) => {\n const itemA = layout[itemAId]\n const itemB = layout[itemBId]\n if (itemA.endX < itemB.endX) {\n return 1\n }\n if (itemA.endX > itemB.endX) {\n return -1\n }\n return 0\n })\n\n return overlappingLayoutItems\n }\n\n function getShoveDirectionWeightedByDependencies(\n upstreamPositions: number[],\n position: number,\n defaultGravity?: NodeShoveDirection,\n ): NodeShoveDirection {\n // check if nodeData has more connections above or below, prefer placement in that direction\n const upwardConnections = upstreamPositions.filter((upstreamPosition) => upstreamPosition < position).length\n const downwardConnections = upstreamPositions.filter((upstreamPosition) => upstreamPosition > position).length\n\n if (upwardConnections > downwardConnections) {\n return -1\n }\n\n return defaultGravity ?? 1\n }\n async function argueWithCompetingUpstreamPlacement({\n desiredPosition,\n nodeStartX,\n upstreamPositions,\n competingLayoutItemId,\n }: ArgueWithCompetingUpstreamPlacementProps): Promise<number> {\n const competitor = layout[competingLayoutItemId]\n const [\n competitorAboveConnections,\n competitorBelowConnections,\n ] = getLayoutItemUpAndDownwardConnections(competingLayoutItemId)\n const nodeAboveConnections = upstreamPositions.filter((upstreamPosition) => upstreamPosition < desiredPosition).length\n const nodeBelowConnections = upstreamPositions.filter((upstreamPosition) => upstreamPosition > desiredPosition).length\n\n if (nodeAboveConnections > nodeBelowConnections) {\n // node has more above\n if (\n competitorAboveConnections > competitorBelowConnections && competitorAboveConnections > nodeAboveConnections\n ) {\n // competitor has more above than below, and more above than node\n // node wins, shove competitor up\n await shove({\n direction: -1,\n nodeStartX,\n desiredPosition,\n })\n return desiredPosition\n }\n if (competitorBelowConnections > competitorAboveConnections) {\n // competitor has more below than above\n // node wins, shove competitor down\n await shove({\n direction: 1,\n nodeStartX,\n desiredPosition,\n })\n return desiredPosition\n }\n\n // competitor has equal above and below, or node has more above\n // place node above competitor\n competitor.nextDependencyShove = -1\n }\n\n if (nodeBelowConnections > nodeAboveConnections) {\n // node has more below\n if (\n competitorBelowConnections > competitorAboveConnections && competitorBelowConnections > nodeBelowConnections\n ) {\n // competitor has more below than above, and more below than node\n // node wins, shove competitor down\n await shove({\n direction: 1,\n nodeStartX,\n desiredPosition,\n })\n return desiredPosition\n }\n\n if (competitorAboveConnections > competitorBelowConnections) {\n // competitor has more above than below\n // node wins, shove competitor up\n await shove({\n direction: -1,\n nodeStartX,\n desiredPosition,\n })\n return desiredPosition\n }\n\n // competitor has equal above and below, or node has more below\n // place node below competitor\n competitor.nextDependencyShove = 1\n }\n\n return await placeNearUpstreamNode(competitor, nodeStartX)\n }\n\n function getLayoutItemUpAndDownwardConnections(id: string): [number, number] {\n const connections = data.get(id)!\n const layoutItem = layout[id]\n\n return connections.upstream.reduce((counts, dependencyId) => {\n if (id in layout) {\n const dependencyLayoutItem = layout[dependencyId]\n\n if (dependencyLayoutItem.row < layoutItem.row) {\n counts[0] += 1\n }\n\n if (dependencyLayoutItem.row > layoutItem.row) {\n counts[1] += 1\n }\n\n return counts\n }\n\n console.warn('nodeLayout.worker.ts: Parent node not found on layout data', id)\n return counts\n }, [0, 0])\n }\n\n await generate()\n\n return layout\n\n}\n","import { NodesLayout } from '@/models'\nimport { TimelineData } from '@/types/timeline'\n\nexport function generateWaterfallLayout(data: TimelineData): NodesLayout {\n const layout: NodesLayout = {}\n let index = 0\n\n data.forEach((item, id) => {\n layout[id] = {\n row: index,\n startX: 0,\n endX: 0,\n }\n\n index++\n })\n\n return layout\n}","import {\n TimelineNodesLayoutOptions,\n NodeLayoutWorkerArgs,\n NodesLayout,\n TimeScale,\n NodeLayoutWorkerResponseData\n} from '@/models'\nimport { createTimeScale } from '@/pixiFunctions/timeScale'\nimport { TimelineData } from '@/types/timeline'\nimport { generateNearestParentLayout } from '@/workers/layouts/nearestNeighbor'\nimport { generateWaterfallLayout } from '@/workers/layouts/waterfall'\n\nlet timeScale: TimeScale | undefined\n\nlet currentApxCharacterWidth = 14\nlet minimumNodeEdgeGap = 0\nlet currentLayoutSetting: TimelineNodesLayoutOptions | undefined\nlet graphDataStore: TimelineData = new Map()\n\nlet layout: NodesLayout = {}\n\nonmessage = async ({\n data: {\n layoutSetting,\n data,\n apxCharacterWidth,\n spacingMinimumNodeEdgeGap,\n timeScaleArgs,\n centerViewportAfter,\n },\n}: { data: NodeLayoutWorkerArgs }) => {\n if (spacingMinimumNodeEdgeGap) {\n minimumNodeEdgeGap = spacingMinimumNodeEdgeGap\n }\n\n if (layoutSetting) {\n currentLayoutSetting = layoutSetting\n }\n\n if (apxCharacterWidth) {\n currentApxCharacterWidth = apxCharacterWidth\n }\n\n if (timeScaleArgs) {\n const {\n minimumStartTime,\n graphXDomain,\n initialOverallTimeSpan,\n } = timeScaleArgs\n timeScale = createTimeScale({\n minimumStartTime,\n graphXDomain,\n initialOverallTimeSpan,\n })\n }\n if (data && timeScale && currentLayoutSetting) {\n graphDataStore = data\n await calculateNodeLayout()\n const response: NodeLayoutWorkerResponseData = {\n layout,\n centerViewportAfter,\n }\n\n postMessage(response)\n }\n}\n\nasync function calculateNodeLayout(): Promise<void> {\n if (currentLayoutSetting === 'waterfall') {\n layout = generateWaterfallLayout(graphDataStore)\n }\n\n if (currentLayoutSetting === 'nearestParent') {\n layout = await generateNearestParentLayout({\n data: graphDataStore,\n timeScale: timeScale!,\n currentApxCharacterWidth,\n minimumNodeEdgeGap,\n })\n }\n\n purgeNegativePositions()\n}\n\nfunction purgeNegativePositions(): void {\n const lowestPosition = Object.values(layout).reduce((lowest, layoutItem) => {\n if (layoutItem.row < lowest) {\n return layoutItem.row\n }\n return lowest\n }, 0)\n\n if (lowestPosition < 0) {\n Object.values(layout).forEach(layoutItem => {\n layoutItem.row += Math.abs(lowestPosition)\n })\n }\n}"],"names":["createTimeScale","minimumStartTime","graphXDomain","initialOverallTimeSpan","createDateToXScale","createXToDateScale","minStartTime","overallWidth","overallTimeSpan","date","xPosition","DEFAULT_POSITION","generateNearestParentLayout","data","timeScale","currentApxCharacterWidth","minimumNodeEdgeGap","layout","generate","item","endAsPx","apxLabelWidth","endX","startX","row","getNearestParentRow","nodeData","nodeStartX","parent","placeNearUpstreamNode","upstreamPositions","id","layoutItem","upstreamPositionAverage","sum","position","isPositionTaken","overlappingLayoutIds","getOverlappingLayoutIds","upstreamDependenciesOverlapping","layoutId","upstreamLayoutItemId","upstreamLayoutItem","getShoveDirectionWeightedByDependencies","argueWithCompetingUpstreamPlacement","placeRootNode","upstreamNodePosition","nextDependencyShove","shove","layoutKeys","nodeId","isNodesOverlapping","direction","desiredPosition","overlapId","newPosition","firstNodeEndX","firstNodePosition","lastNodeStartX","lastNodePosition","overlappingLayoutItems","itemId","itemAId","itemBId","itemA","itemB","defaultGravity","upwardConnections","upstreamPosition","downwardConnections","competingLayoutItemId","competitor","competitorAboveConnections","competitorBelowConnections","getLayoutItemUpAndDownwardConnections","nodeAboveConnections","nodeBelowConnections","connections","counts","dependencyId","dependencyLayoutItem","generateWaterfallLayout","index","currentLayoutSetting","graphDataStore","layoutSetting","apxCharacterWidth","spacingMinimumNodeEdgeGap","timeScaleArgs","centerViewportAfter","calculateNodeLayout","purgeNegativePositions","lowestPosition","lowest"],"mappings":"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"}
|