@gooddata/sdk-ui-catalog 11.22.0 → 11.23.0-alpha.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/esm/catalogDetail/CatalogDetailContent.d.ts.map +1 -1
- package/esm/catalogDetail/CatalogDetailContent.js +33 -6
- package/esm/catalogDetail/CatalogDetailContent.js.map +1 -1
- package/esm/catalogDetail/CatalogDetailTabCertification.d.ts +9 -0
- package/esm/catalogDetail/CatalogDetailTabCertification.d.ts.map +1 -0
- package/esm/catalogDetail/CatalogDetailTabCertification.js +73 -0
- package/esm/catalogDetail/CatalogDetailTabCertification.js.map +1 -0
- package/esm/catalogDetail/CatalogDetailTabLineage.d.ts +7 -0
- package/esm/catalogDetail/CatalogDetailTabLineage.d.ts.map +1 -0
- package/esm/catalogDetail/CatalogDetailTabLineage.js +8 -0
- package/esm/catalogDetail/CatalogDetailTabLineage.js.map +1 -0
- package/esm/catalogDetail/hooks/useCatalogItemUpdate.d.ts +1 -0
- package/esm/catalogDetail/hooks/useCatalogItemUpdate.d.ts.map +1 -1
- package/esm/catalogDetail/hooks/useCatalogItemUpdate.js +34 -1
- package/esm/catalogDetail/hooks/useCatalogItemUpdate.js.map +1 -1
- package/esm/catalogItem/converter.d.ts.map +1 -1
- package/esm/catalogItem/converter.js +4 -1
- package/esm/catalogItem/converter.js.map +1 -1
- package/esm/catalogItem/query.d.ts +1 -0
- package/esm/catalogItem/query.d.ts.map +1 -1
- package/esm/catalogItem/query.js +14 -0
- package/esm/catalogItem/query.js.map +1 -1
- package/esm/catalogItem/types.d.ts +2 -1
- package/esm/catalogItem/types.d.ts.map +1 -1
- package/esm/catalogItem/types.js +1 -1
- package/esm/catalogItem/types.js.map +1 -1
- package/esm/certification/CertificationIcon.d.ts +10 -0
- package/esm/certification/CertificationIcon.d.ts.map +1 -0
- package/esm/certification/CertificationIcon.js +20 -0
- package/esm/certification/CertificationIcon.js.map +1 -0
- package/esm/certification/gate.d.ts +10 -0
- package/esm/certification/gate.d.ts.map +1 -0
- package/esm/certification/gate.js +20 -0
- package/esm/certification/gate.js.map +1 -0
- package/esm/lineage/Lineage.d.ts +9 -0
- package/esm/lineage/Lineage.d.ts.map +1 -0
- package/esm/lineage/Lineage.js +66 -0
- package/esm/lineage/Lineage.js.map +1 -0
- package/esm/lineage/const.d.ts +4 -0
- package/esm/lineage/const.d.ts.map +1 -0
- package/esm/lineage/const.js +25 -0
- package/esm/lineage/const.js.map +1 -0
- package/esm/lineage/gate.d.ts +5 -0
- package/esm/lineage/gate.d.ts.map +1 -0
- package/esm/lineage/gate.js +9 -0
- package/esm/lineage/gate.js.map +1 -0
- package/esm/lineage/graph/applyLayout.d.ts +3 -0
- package/esm/lineage/graph/applyLayout.d.ts.map +1 -0
- package/esm/lineage/graph/applyLayout.js +9 -0
- package/esm/lineage/graph/applyLayout.js.map +1 -0
- package/esm/lineage/graph/createEdge.d.ts +4 -0
- package/esm/lineage/graph/createEdge.d.ts.map +1 -0
- package/esm/lineage/graph/createEdge.js +29 -0
- package/esm/lineage/graph/createEdge.js.map +1 -0
- package/esm/lineage/graph/createGraph.d.ts +3 -0
- package/esm/lineage/graph/createGraph.d.ts.map +1 -0
- package/esm/lineage/graph/createGraph.js +6 -0
- package/esm/lineage/graph/createGraph.js.map +1 -0
- package/esm/lineage/graph/createIcon.d.ts +10 -0
- package/esm/lineage/graph/createIcon.d.ts.map +1 -0
- package/esm/lineage/graph/createIcon.js +48 -0
- package/esm/lineage/graph/createIcon.js.map +1 -0
- package/esm/lineage/graph/createNode.d.ts +5 -0
- package/esm/lineage/graph/createNode.d.ts.map +1 -0
- package/esm/lineage/graph/createNode.js +124 -0
- package/esm/lineage/graph/createNode.js.map +1 -0
- package/esm/lineage/graph/createPaper.d.ts +6 -0
- package/esm/lineage/graph/createPaper.d.ts.map +1 -0
- package/esm/lineage/graph/createPaper.js +27 -0
- package/esm/lineage/graph/createPaper.js.map +1 -0
- package/esm/lineage/graph/createScroller.d.ts +33 -0
- package/esm/lineage/graph/createScroller.d.ts.map +1 -0
- package/esm/lineage/graph/createScroller.js +149 -0
- package/esm/lineage/graph/createScroller.js.map +1 -0
- package/esm/lineage/useLineageGraph.d.ts +22 -0
- package/esm/lineage/useLineageGraph.d.ts.map +1 -0
- package/esm/lineage/useLineageGraph.js +85 -0
- package/esm/lineage/useLineageGraph.js.map +1 -0
- package/esm/lineage/utils.d.ts +13 -0
- package/esm/lineage/utils.d.ts.map +1 -0
- package/esm/lineage/utils.js +86 -0
- package/esm/lineage/utils.js.map +1 -0
- package/esm/localization/bundles/en-US.localization-bundle.d.ts +40 -0
- package/esm/localization/bundles/en-US.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/en-US.localization-bundle.js +40 -0
- package/esm/localization/bundles/en-US.localization-bundle.js.map +1 -1
- package/esm/sdk-ui-catalog.d.ts +2 -0
- package/esm/table/columns/TitleColumn.d.ts.map +1 -1
- package/esm/table/columns/TitleColumn.js +2 -1
- package/esm/table/columns/TitleColumn.js.map +1 -1
- package/package.json +15 -13
- package/styles/css/detail.css +79 -3
- package/styles/css/detail.css.map +1 -1
- package/styles/css/main.css +104 -3
- package/styles/css/main.css.map +1 -1
- package/styles/css/objectType.css +3 -3
- package/styles/scss/detail.scss +88 -0
- package/styles/scss/main.scss +29 -0
- package/styles/scss/objectType.scss +3 -3
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// (C) 2026 GoodData Corporation
|
|
3
|
+
import { memo } from "react";
|
|
4
|
+
import { UiIcon, UiTooltip } from "@gooddata/sdk-ui-kit";
|
|
5
|
+
import { useIsCatalogCertificationEnabled } from "./gate.js";
|
|
6
|
+
import {} from "../catalogItem/types.js";
|
|
7
|
+
export const CertificationIconMemo = memo(function CertificationIcon(props) {
|
|
8
|
+
const { certification, intl, ...htmlProps } = props;
|
|
9
|
+
const isCertificationEnabled = useIsCatalogCertificationEnabled();
|
|
10
|
+
if (!isCertificationEnabled || certification?.status !== "CERTIFIED") {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
return (_jsx("div", { ...htmlProps, children: _jsx(UiTooltip, { arrowPlacement: "top", optimalPlacement: true, triggerBy: ["hover", "focus"], variant: "none", showArrow: false, width: 200, offset: -6, anchor: _jsx(UiIcon, { type: "certification", size: 14, backgroundSize: 26, color: "success", layout: "block" }), content: _jsxs("div", { className: "gd-analytics-catalog__certification-tooltip", children: [
|
|
14
|
+
_jsxs("div", { className: "gd-analytics-catalog__certification-tooltip__header", children: [
|
|
15
|
+
_jsx(UiIcon, { type: "certification", size: 14, color: "success", layout: "block" }), _jsx("span", { className: "gd-analytics-catalog__certification-tooltip__title", children: intl.formatMessage({
|
|
16
|
+
id: "analyticsCatalog.certification.tooltip.title",
|
|
17
|
+
}) })
|
|
18
|
+
] }), certification.message ? (_jsx("div", { className: "gd-analytics-catalog__certification-tooltip__message", children: certification.message })) : null] }) }) }));
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=CertificationIcon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CertificationIcon.js","sourceRoot":"","sources":["../../src/certification/CertificationIcon.tsx"],"names":[],"mappings":";AAAA,gCAAgC;AAEhC,OAAO,EAAuB,IAAI,EAAE,MAAM,OAAO,CAAC;AAIlD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,gCAAgC,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAqB,MAAM,yBAAyB,CAAC;AAO5D,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC,SAAS,iBAAiB,CAAC,KAA6B,EAAE;IAChG,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,SAAS,EAAE,GAAG,KAAK,CAAC;IACpD,MAAM,sBAAsB,GAAG,gCAAgC,EAAE,CAAC;IAElE,IAAI,CAAC,sBAAsB,IAAI,aAAa,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;QACnE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,CACH,iBAAS,SAAS,YACd,KAAC,SAAS,IACN,cAAc,EAAC,KAAK,EACpB,gBAAgB,QAChB,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAC,MAAM,EACd,SAAS,EAAE,KAAK,EAChB,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,CAAC,CAAC,EACV,MAAM,EACF,KAAC,MAAM,IACH,IAAI,EAAC,eAAe,EACpB,IAAI,EAAE,EAAE,EACR,cAAc,EAAE,EAAE,EAClB,KAAK,EAAC,SAAS,EACf,MAAM,EAAC,OAAO,GAChB,EAEN,OAAO,EACH,eAAK,SAAS,EAAC,6CAA6C;oBACxD,eAAK,SAAS,EAAC,qDAAqD;4BAChE,KAAC,MAAM,IAAC,IAAI,EAAC,eAAe,EAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAC,SAAS,EAAC,MAAM,EAAC,OAAO,GAAG,EACxE,eAAM,SAAS,EAAC,oDAAoD,YAC/D,IAAI,CAAC,aAAa,CAAC;oCAChB,EAAE,EAAE,8CAA8C;iCACrD,CAAC,GACC;4BACL,EACL,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CACrB,cAAK,SAAS,EAAC,sDAAsD,YAChE,aAAa,CAAC,OAAO,GACpB,CACT,CAAC,CAAC,CAAC,IAAI,IACN,GAEZ,GACA,CACT,CAAC;AAAA,CACL,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ObjectType } from "../objectType/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Catalog certification feature gate.
|
|
4
|
+
*/
|
|
5
|
+
export declare function useIsCatalogCertificationEnabled(): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Catalog certification is supported only for selected object types.
|
|
8
|
+
*/
|
|
9
|
+
export declare function useIsCertificationAllowed(objectType?: ObjectType): boolean;
|
|
10
|
+
//# sourceMappingURL=gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/certification/gate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAKzD;;GAEG;AACH,wBAAgB,gCAAgC,IAAI,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAM1E"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// (C) 2026 GoodData Corporation
|
|
2
|
+
import { useFeatureFlag } from "../permission/PermissionsContext.js";
|
|
3
|
+
const SUPPORTED_CERTIFICATION_TYPES = ["analyticalDashboard", "insight", "measure"];
|
|
4
|
+
/**
|
|
5
|
+
* Catalog certification feature gate.
|
|
6
|
+
*/
|
|
7
|
+
export function useIsCatalogCertificationEnabled() {
|
|
8
|
+
return useFeatureFlag("enableCertification");
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Catalog certification is supported only for selected object types.
|
|
12
|
+
*/
|
|
13
|
+
export function useIsCertificationAllowed(objectType) {
|
|
14
|
+
const isCertificationEnabled = useIsCatalogCertificationEnabled();
|
|
15
|
+
if (!isCertificationEnabled || !objectType) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
return SUPPORTED_CERTIFICATION_TYPES.includes(objectType);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/certification/gate.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAGhC,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAErE,MAAM,6BAA6B,GAAiB,CAAC,qBAAqB,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAElG;;GAEG;AACH,MAAM,UAAU,gCAAgC,GAAY;IACxD,OAAO,cAAc,CAAC,qBAAqB,CAAC,CAAC;AAAA,CAChD;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,UAAuB,EAAW;IACxE,MAAM,sBAAsB,GAAG,gCAAgC,EAAE,CAAC;IAClE,IAAI,CAAC,sBAAsB,IAAI,CAAC,UAAU,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,6BAA6B,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAAA,CAC7D"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type MouseEvent } from "react";
|
|
2
|
+
import { type ICatalogItem, type ICatalogItemRef } from "../catalogItem/types.js";
|
|
3
|
+
type Props = {
|
|
4
|
+
item: ICatalogItem;
|
|
5
|
+
onItemClick?: (event: MouseEvent, ref: ICatalogItemRef) => void;
|
|
6
|
+
};
|
|
7
|
+
export declare function Lineage({ item, onItemClick }: Props): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=Lineage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Lineage.d.ts","sourceRoot":"","sources":["../../src/lineage/Lineage.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAqB,MAAM,OAAO,CAAC;AAuB3D,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAOlF,KAAK,KAAK,GAAG;IACT,IAAI,EAAE,YAAY,CAAC;IACnB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,eAAe,KAAK,IAAI,CAAC;CACnE,CAAC;AAEF,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,KAAK,2CAoHnD"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// (C) 2025-2026 GoodData Corporation
|
|
3
|
+
import { useMemo, useState } from "react";
|
|
4
|
+
import { defineMessages, useIntl } from "react-intl";
|
|
5
|
+
import {} from "@gooddata/sdk-backend-spi";
|
|
6
|
+
import { ErrorComponent, LoadingComponent, useBackendStrict, useCancelablePromise, useWorkspaceStrict, } from "@gooddata/sdk-ui";
|
|
7
|
+
import { UiButton, UiDropdown, UiIconButton, UiListbox, useElementSize, } from "@gooddata/sdk-ui-kit";
|
|
8
|
+
import { HIDDEN_ITEMS, LEAF_TYPES } from "./const.js";
|
|
9
|
+
import { useLineageGraph } from "./useLineageGraph.js";
|
|
10
|
+
import {} from "../catalogItem/types.js";
|
|
11
|
+
const messages = defineMessages({
|
|
12
|
+
up: { id: "analyticsCatalog.lineage.direction.up" },
|
|
13
|
+
down: { id: "analyticsCatalog.lineage.direction.down" },
|
|
14
|
+
});
|
|
15
|
+
export function Lineage({ item, onItemClick }) {
|
|
16
|
+
const backend = useBackendStrict();
|
|
17
|
+
const workspace = useWorkspaceStrict();
|
|
18
|
+
const intl = useIntl();
|
|
19
|
+
const [direction, setDirection] = useState("down");
|
|
20
|
+
const objRef = useMemo(() => ({ identifier: item.identifier, type: item.type }), [item]);
|
|
21
|
+
const { result, status, error } = useCancelablePromise({
|
|
22
|
+
promise: () => {
|
|
23
|
+
const refs = backend.workspace(workspace).references();
|
|
24
|
+
return refs.getReferences(objRef, {
|
|
25
|
+
direction,
|
|
26
|
+
});
|
|
27
|
+
},
|
|
28
|
+
}, [objRef, direction]);
|
|
29
|
+
const { ref, width, height } = useElementSize();
|
|
30
|
+
const { setContainer, zoomIn, zoomOut, reset, expand, zoomOutEnabled, zoomInEnabled } = useLineageGraph(result?.nodes, result?.edges, {
|
|
31
|
+
onItemClick,
|
|
32
|
+
typesToFilter: HIDDEN_ITEMS,
|
|
33
|
+
leafTypesToFilter: LEAF_TYPES,
|
|
34
|
+
direction,
|
|
35
|
+
});
|
|
36
|
+
const items = useMemo(() => {
|
|
37
|
+
return [
|
|
38
|
+
{
|
|
39
|
+
type: "interactive",
|
|
40
|
+
id: "up",
|
|
41
|
+
stringTitle: intl.formatMessage(messages["up"]),
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
type: "interactive",
|
|
45
|
+
id: "down",
|
|
46
|
+
stringTitle: intl.formatMessage(messages["down"]),
|
|
47
|
+
},
|
|
48
|
+
];
|
|
49
|
+
}, [intl]);
|
|
50
|
+
const isLoading = status === "loading" || status === "pending";
|
|
51
|
+
const isLoadingOrSuccess = isLoading || status === "success";
|
|
52
|
+
return (_jsxs("div", { className: "lineage-container", ref: ref, children: [isLoadingOrSuccess ? (_jsxs(_Fragment, { children: [
|
|
53
|
+
_jsx("div", { className: "lineage-direction", children: _jsx(UiDropdown, { closeOnEscape: true, autofocusOnOpen: true, closeOnOutsideClick: true, renderButton: (props) => (_jsx(UiButton, { size: "medium", isDisabled: isLoading, label: intl.formatMessage(messages[direction]), iconAfter: props.isOpen ? "chevronUp" : "chevronDown", iconAfterSize: 11, onClick: props.toggleDropdown })), renderBody: (props) => (_jsx(UiListbox, { width: 200, items: items, ariaAttributes: {
|
|
54
|
+
id: props.ariaAttributes.id,
|
|
55
|
+
}, selectedItemId: direction, onSelect: (item) => {
|
|
56
|
+
setDirection(item.id);
|
|
57
|
+
props.closeDropdown();
|
|
58
|
+
} })) }) }), _jsxs("div", { className: "lineage-toolbar", children: [
|
|
59
|
+
_jsx(UiIconButton, { icon: "minimize", onClick: reset, isDisabled: isLoading }), _jsx(UiIconButton, { icon: "expand", onClick: expand, isDisabled: isLoading }), _jsx("div", { className: "lineage-toolbar-spacer" }), _jsx(UiIconButton, { icon: "minusCircle", onClick: zoomOut, isDisabled: !zoomOutEnabled || isLoading }), _jsx(UiIconButton, { icon: "plusCircle", onClick: zoomIn, isDisabled: !zoomInEnabled || isLoading })
|
|
60
|
+
] })
|
|
61
|
+
] })) : null, isLoading ? _jsx(LoadingComponent, {}) : null, status === "success" ? (_jsx("div", { className: "lineage-container-graph", ref: setContainer, style: {
|
|
62
|
+
width,
|
|
63
|
+
height,
|
|
64
|
+
} })) : null, status === "error" && error ? _jsx(ErrorComponent, { message: error.message, width: "100%" }) : null] }));
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=Lineage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Lineage.js","sourceRoot":"","sources":["../../src/lineage/Lineage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"const.d.ts","sourceRoot":"","sources":["../../src/lineage/const.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,eAAO,MAAM,YAAY,EAAE,UAAU,EAoBpC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,UAAU,EAAgB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// (C) 2025-2026 GoodData Corporation
|
|
2
|
+
import {} from "@gooddata/sdk-model";
|
|
3
|
+
export const HIDDEN_ITEMS = [
|
|
4
|
+
"filterContext",
|
|
5
|
+
"filterView",
|
|
6
|
+
"tag",
|
|
7
|
+
"user",
|
|
8
|
+
"workspaceDataFilter",
|
|
9
|
+
"attribute",
|
|
10
|
+
"attributeHierarchy",
|
|
11
|
+
"automation",
|
|
12
|
+
"colorPalette",
|
|
13
|
+
"dashboardPlugin",
|
|
14
|
+
"dateAttributeHierarchy",
|
|
15
|
+
"dateHierarchyTemplate",
|
|
16
|
+
"exportDefinition",
|
|
17
|
+
"memoryItem",
|
|
18
|
+
"notificationChannel",
|
|
19
|
+
"theme",
|
|
20
|
+
"userGroup",
|
|
21
|
+
"variable",
|
|
22
|
+
"workspaceDataFilterSetting",
|
|
23
|
+
];
|
|
24
|
+
export const LEAF_TYPES = ["dataSet"];
|
|
25
|
+
//# sourceMappingURL=const.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../src/lineage/const.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,OAAO,EAAmB,MAAM,qBAAqB,CAAC;AAEtD,MAAM,CAAC,MAAM,YAAY,GAAiB;IACtC,eAAe;IACf,YAAY;IACZ,KAAK;IACL,MAAM;IACN,qBAAqB;IACrB,WAAW;IACX,oBAAoB;IACpB,YAAY;IACZ,cAAc;IACd,iBAAiB;IACjB,wBAAwB;IACxB,uBAAuB;IACvB,kBAAkB;IAClB,YAAY;IACZ,qBAAqB;IACrB,OAAO;IACP,WAAW;IACX,UAAU;IACV,4BAA4B;CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAiB,CAAC,SAAS,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/lineage/gate.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// (C) 2026 GoodData Corporation
|
|
2
|
+
import { useFeatureFlag } from "../permission/PermissionsContext.js";
|
|
3
|
+
/**
|
|
4
|
+
* Checks whether lineage is enabled.
|
|
5
|
+
*/
|
|
6
|
+
export function useIsLineageEnabled() {
|
|
7
|
+
return useFeatureFlag("enableCatalogLineage");
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/lineage/gate.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAErE;;GAEG;AACH,MAAM,UAAU,mBAAmB,GAAY;IAC3C,OAAO,cAAc,CAAC,sBAAsB,CAAC,CAAC;AAAA,CACjD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applyLayout.d.ts","sourceRoot":"","sources":["../../../src/lineage/graph/applyLayout.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,aAAa,CAAC;AAG1C,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,GAAE,IAAI,GAAG,MAAe,QAKpF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// (C) 2025-2026 GoodData Corporation
|
|
2
|
+
import { DirectedGraph } from "@joint/layout-directed-graph";
|
|
3
|
+
export function applyLayout(graph, direction = "down") {
|
|
4
|
+
// Layout
|
|
5
|
+
DirectedGraph.layout(graph, {
|
|
6
|
+
rankDir: direction === "down" ? "LR" : "RL",
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=applyLayout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applyLayout.js","sourceRoot":"","sources":["../../../src/lineage/graph/applyLayout.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAGrC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,MAAM,UAAU,WAAW,CAAC,KAAsB,EAAE,SAAS,GAAkB,MAAM,EAAE;IACnF,SAAS;IACT,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE;QACxB,OAAO,EAAE,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;KAC9C,CAAC,CAAC;AAAA,CACN"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createEdge.d.ts","sourceRoot":"","sources":["../../../src/lineage/graph/createEdge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAInE,wBAAgB,UAAU,CAAC,IAAI,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,8BAyBlE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// (C) 2025-2026 GoodData Corporation
|
|
2
|
+
import * as joint from "@joint/core";
|
|
3
|
+
import {} from "@gooddata/sdk-backend-spi";
|
|
4
|
+
import { objRefToId } from "../utils.js";
|
|
5
|
+
export function createEdge(edge) {
|
|
6
|
+
return new joint.shapes.standard.Link({
|
|
7
|
+
source: {
|
|
8
|
+
id: objRefToId(edge.from),
|
|
9
|
+
},
|
|
10
|
+
target: {
|
|
11
|
+
id: objRefToId(edge.to),
|
|
12
|
+
},
|
|
13
|
+
connector: {
|
|
14
|
+
name: "rounded", // optional: smoother corners
|
|
15
|
+
args: { radius: 8 },
|
|
16
|
+
},
|
|
17
|
+
attrs: {
|
|
18
|
+
line: {
|
|
19
|
+
class: "edge-connector",
|
|
20
|
+
stroke: "transparent",
|
|
21
|
+
strokeWidth: 1.5,
|
|
22
|
+
targetMarker: {
|
|
23
|
+
type: "none", // tree style, no arrows
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=createEdge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createEdge.js","sourceRoot":"","sources":["../../../src/lineage/graph/createEdge.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,OAAO,KAAK,KAAK,MAAM,aAAa,CAAC;AAErC,OAAO,EAA0B,MAAM,2BAA2B,CAAC;AAEnE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,UAAU,CAAC,IAAwC,EAAE;IACjE,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAClC,MAAM,EAAE;YACJ,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;SAC5B;QACD,MAAM,EAAE;YACJ,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;SAC1B;QAED,SAAS,EAAE;YACP,IAAI,EAAE,SAAS,EAAE,6BAA6B;YAC9C,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE;SACtB;QAED,KAAK,EAAE;YACH,IAAI,EAAE;gBACF,KAAK,EAAE,gBAAgB;gBACvB,MAAM,EAAE,aAAa;gBACrB,WAAW,EAAE,GAAG;gBAChB,YAAY,EAAE;oBACV,IAAI,EAAE,MAAM,EAAE,wBAAwB;iBACzC;aACJ;SACJ;KACJ,CAAC,CAAC;AAAA,CACN"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createGraph.d.ts","sourceRoot":"","sources":["../../../src/lineage/graph/createGraph.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,aAAa,CAAC;AAErC,wBAAgB,WAAW,2EAE1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createGraph.js","sourceRoot":"","sources":["../../../src/lineage/graph/createGraph.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,OAAO,KAAK,KAAK,MAAM,aAAa,CAAC;AAErC,MAAM,UAAU,WAAW,GAAG;IAC1B,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;AAAA,CAChC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createIcon.d.ts","sourceRoot":"","sources":["../../../src/lineage/graph/createIcon.ts"],"names":[],"mappings":"AAMA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,cAevC;AAED,UAAU,UAAU;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,EAAE,MAAM,EAAE,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// (C) 2025-2026 GoodData Corporation
|
|
2
|
+
import { isValidElement } from "react";
|
|
3
|
+
import { iconPaths } from "@gooddata/sdk-ui-kit";
|
|
4
|
+
export function getIconData(type) {
|
|
5
|
+
const iconMap = {
|
|
6
|
+
dataSet: "date",
|
|
7
|
+
insight: "visualization",
|
|
8
|
+
analyticalDashboard: "dashboard",
|
|
9
|
+
measure: "metric",
|
|
10
|
+
fact: "fact",
|
|
11
|
+
attribute: "ldmAttribute",
|
|
12
|
+
displayForm: "ldmAttribute",
|
|
13
|
+
};
|
|
14
|
+
const iconType = iconMap[type] || "box";
|
|
15
|
+
const paths = iconPaths[iconType];
|
|
16
|
+
return processElement(paths);
|
|
17
|
+
}
|
|
18
|
+
function processElement(element, state = {
|
|
19
|
+
stroke: "none",
|
|
20
|
+
d: [],
|
|
21
|
+
viewBox: "0 0 20 20",
|
|
22
|
+
}) {
|
|
23
|
+
if (isValidElement(element)) {
|
|
24
|
+
const props = element.props ?? {};
|
|
25
|
+
if (props["d"]) {
|
|
26
|
+
state.d.push(props["d"]);
|
|
27
|
+
}
|
|
28
|
+
if (props["stroke"] && props["stroke"] !== "none") {
|
|
29
|
+
state.stroke = props["stroke"];
|
|
30
|
+
}
|
|
31
|
+
if (props["clipRule"]) {
|
|
32
|
+
state.clipRule = props["clipRule"];
|
|
33
|
+
}
|
|
34
|
+
if (props["fillRule"]) {
|
|
35
|
+
state.fillRule = props["fillRule"];
|
|
36
|
+
}
|
|
37
|
+
if (props["children"]) {
|
|
38
|
+
if (Array.isArray(props["children"])) {
|
|
39
|
+
props["children"].forEach((c) => processElement(c, state));
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
processElement(props["children"]);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return state;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=createIcon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createIcon.js","sourceRoot":"","sources":["../../../src/lineage/graph/createIcon.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,OAAO,EAAkB,cAAc,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,EAAiB,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEhE,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE;IACtC,MAAM,OAAO,GAA6B;QACtC,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,eAAe;QACxB,mBAAmB,EAAE,WAAW;QAChC,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,cAAc;QACzB,WAAW,EAAE,cAAc;KAC9B,CAAC;IAEF,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;IACxC,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAElC,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;AAAA,CAChC;AAUD,SAAS,cAAc,CACnB,OAAkB,EAClB,KAAK,GAAe;IAChB,MAAM,EAAE,MAAM;IACd,CAAC,EAAE,EAAE;IACL,OAAO,EAAE,WAAW;CACvB,EACH;IACE,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAA4B,OAAO,CAAC,KAAgC,IAAI,EAAE,CAAC;QACtF,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACb,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,MAAM,EAAE,CAAC;YAChD,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;gBACnC,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACJ,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YACtC,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AAAA,CAChB"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import * as joint from "@joint/core";
|
|
2
|
+
import { type IReferencesResult } from "@gooddata/sdk-backend-spi";
|
|
3
|
+
export declare function createNode(node: IReferencesResult["nodes"][number]): joint.shapes.standard.Rectangle;
|
|
4
|
+
export declare function cleanupMeasurementElements(): void;
|
|
5
|
+
//# sourceMappingURL=createNode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createNode.d.ts","sourceRoot":"","sources":["../../../src/lineage/graph/createNode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAUnE,wBAAgB,UAAU,CAAC,IAAI,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,mCA+BlE;AAED,wBAAgB,0BAA0B,SAMzC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// (C) 2025-2026 GoodData Corporation
|
|
2
|
+
import * as joint from "@joint/core";
|
|
3
|
+
import {} from "@gooddata/sdk-backend-spi";
|
|
4
|
+
import { objRefToId, objRefToType } from "../utils.js";
|
|
5
|
+
import { getIconData } from "./createIcon.js";
|
|
6
|
+
const BASE_HEIGHT = 24;
|
|
7
|
+
const BASE_ICON_SIZE = 16;
|
|
8
|
+
const PADDING = 8;
|
|
9
|
+
const GAP = 8;
|
|
10
|
+
export function createNode(node) {
|
|
11
|
+
const title = node.title;
|
|
12
|
+
const labelWidth = calculateTextWidth(title, 12);
|
|
13
|
+
const nodeWidth = PADDING + BASE_ICON_SIZE + GAP + labelWidth + PADDING;
|
|
14
|
+
const shape = new joint.shapes.standard.Rectangle({
|
|
15
|
+
id: objRefToId(node),
|
|
16
|
+
root: node.isRoot,
|
|
17
|
+
size: { width: nodeWidth, height: BASE_HEIGHT },
|
|
18
|
+
});
|
|
19
|
+
shape.attr(node.isRoot ? rootStyles(title) : nodeStyles(title));
|
|
20
|
+
shape.attr("icon", iconStyles(node));
|
|
21
|
+
// We need to define the icon markup for it to be rendered
|
|
22
|
+
shape.markup = [
|
|
23
|
+
{
|
|
24
|
+
tagName: "rect",
|
|
25
|
+
selector: "body",
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
tagName: "text",
|
|
29
|
+
selector: "label",
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
tagName: "path",
|
|
33
|
+
selector: "icon",
|
|
34
|
+
},
|
|
35
|
+
];
|
|
36
|
+
return shape;
|
|
37
|
+
}
|
|
38
|
+
export function cleanupMeasurementElements() {
|
|
39
|
+
if (measurementSvg) {
|
|
40
|
+
document.body.removeChild(measurementSvg);
|
|
41
|
+
measurementSvg = null;
|
|
42
|
+
measurementText = null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function calculateTextWidth(text, fontSize) {
|
|
46
|
+
const [_, textNode] = getMeasurementElements();
|
|
47
|
+
textNode.setAttribute("font-size", fontSize.toString());
|
|
48
|
+
textNode.textContent = text;
|
|
49
|
+
return textNode.getComputedTextLength();
|
|
50
|
+
}
|
|
51
|
+
function rootStyles(title) {
|
|
52
|
+
return {
|
|
53
|
+
body: {
|
|
54
|
+
fill: "transparent",
|
|
55
|
+
stroke: "#8f8f8f",
|
|
56
|
+
strokeWidth: 2,
|
|
57
|
+
rx: BASE_HEIGHT / 2,
|
|
58
|
+
ry: BASE_HEIGHT / 2,
|
|
59
|
+
},
|
|
60
|
+
label: {
|
|
61
|
+
text: title,
|
|
62
|
+
fill: "#333",
|
|
63
|
+
fontSize: 12,
|
|
64
|
+
textAnchor: "middle",
|
|
65
|
+
textVerticalAnchor: "middle",
|
|
66
|
+
refX: GAP,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function nodeStyles(title) {
|
|
71
|
+
return {
|
|
72
|
+
body: {
|
|
73
|
+
fill: "transparent",
|
|
74
|
+
stroke: "transparent",
|
|
75
|
+
strokeWidth: 2,
|
|
76
|
+
rx: 0,
|
|
77
|
+
ry: 0,
|
|
78
|
+
},
|
|
79
|
+
label: {
|
|
80
|
+
text: title,
|
|
81
|
+
fill: "#333",
|
|
82
|
+
fontSize: 12,
|
|
83
|
+
textAnchor: "middle",
|
|
84
|
+
textVerticalAnchor: "middle",
|
|
85
|
+
refX: GAP,
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function iconStyles(node) {
|
|
90
|
+
// Add icon based on type
|
|
91
|
+
const type = objRefToType(node);
|
|
92
|
+
const iconData = getIconData(type);
|
|
93
|
+
const viewBox = iconData.viewBox.split(" ").map(Number);
|
|
94
|
+
const scaleX = BASE_ICON_SIZE / viewBox[2];
|
|
95
|
+
const scaleY = BASE_ICON_SIZE / viewBox[3];
|
|
96
|
+
return {
|
|
97
|
+
d: iconData.d.join(" "),
|
|
98
|
+
stroke: iconData.stroke ?? "none",
|
|
99
|
+
clipRule: iconData.clipRule,
|
|
100
|
+
fillRule: iconData.fillRule,
|
|
101
|
+
class: type,
|
|
102
|
+
refX: PADDING,
|
|
103
|
+
refY: "50%",
|
|
104
|
+
yAlignment: "middle",
|
|
105
|
+
transform: `translate(${-viewBox[0] * scaleX}, ${-viewBox[1] * scaleY}) scale(${scaleX}, ${scaleY})`,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//measure
|
|
109
|
+
let measurementSvg = null;
|
|
110
|
+
let measurementText = null;
|
|
111
|
+
function getMeasurementElements() {
|
|
112
|
+
if (!measurementSvg || !measurementText) {
|
|
113
|
+
measurementSvg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
114
|
+
measurementSvg.style.visibility = "hidden";
|
|
115
|
+
measurementSvg.style.position = "absolute";
|
|
116
|
+
measurementSvg.style.top = "-1000px";
|
|
117
|
+
measurementSvg.style.left = "-1000px";
|
|
118
|
+
measurementText = document.createElementNS("http://www.w3.org/2000/svg", "text");
|
|
119
|
+
measurementSvg.appendChild(measurementText);
|
|
120
|
+
document.body.appendChild(measurementSvg);
|
|
121
|
+
}
|
|
122
|
+
return [measurementSvg, measurementText];
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=createNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createNode.js","sourceRoot":"","sources":["../../../src/lineage/graph/createNode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as joint from "@joint/core";
|
|
2
|
+
export interface IPaperInteractionCallback {
|
|
3
|
+
onClick?: (element: joint.dia.ElementView, event: joint.dia.Event, id: string) => void;
|
|
4
|
+
}
|
|
5
|
+
export declare function createPaper(graph: joint.dia.Graph, int: IPaperInteractionCallback): joint.dia.Paper;
|
|
6
|
+
//# sourceMappingURL=createPaper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createPaper.d.ts","sourceRoot":"","sources":["../../../src/lineage/graph/createPaper.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,aAAa,CAAC;AAKrC,MAAM,WAAW,yBAAyB;IACtC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1F;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,yBAAyB,mBAuBjF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// (C) 2025-2026 GoodData Corporation
|
|
2
|
+
import * as joint from "@joint/core";
|
|
3
|
+
const BASE_WIDTH = 1000;
|
|
4
|
+
const BASE_HEIGHT = 1000;
|
|
5
|
+
export function createPaper(graph, int) {
|
|
6
|
+
//PAPER
|
|
7
|
+
const paper = new joint.dia.Paper({
|
|
8
|
+
model: graph,
|
|
9
|
+
width: BASE_WIDTH,
|
|
10
|
+
height: BASE_HEIGHT,
|
|
11
|
+
drawGrid: false,
|
|
12
|
+
async: true,
|
|
13
|
+
background: {
|
|
14
|
+
color: "transparent",
|
|
15
|
+
},
|
|
16
|
+
interactive: {
|
|
17
|
+
elementMove: false,
|
|
18
|
+
linkMove: false,
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
paper.on("element:pointerclick", (cellView, event) => {
|
|
22
|
+
const nodeId = cellView.model.id;
|
|
23
|
+
int.onClick?.(cellView, event, nodeId);
|
|
24
|
+
});
|
|
25
|
+
return paper;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=createPaper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createPaper.js","sourceRoot":"","sources":["../../../src/lineage/graph/createPaper.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,OAAO,KAAK,KAAK,MAAM,aAAa,CAAC;AAErC,MAAM,UAAU,GAAG,IAAI,CAAC;AACxB,MAAM,WAAW,GAAG,IAAI,CAAC;AAMzB,MAAM,UAAU,WAAW,CAAC,KAAsB,EAAE,GAA8B,EAAE;IAChF,OAAO;IACP,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;QAC9B,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,WAAW;QACnB,QAAQ,EAAE,KAAK;QACf,KAAK,EAAE,IAAI;QACX,UAAU,EAAE;YACR,KAAK,EAAE,aAAa;SACvB;QACD,WAAW,EAAE;YACT,WAAW,EAAE,KAAK;YAClB,QAAQ,EAAE,KAAK;SAClB;KACJ,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,CAAC,sBAAsB,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAY,CAAC;QAC3C,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAAA,CAC1C,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AAAA,CAChB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type * as joint from "@joint/core";
|
|
2
|
+
declare class PaperScroller {
|
|
3
|
+
el: HTMLDivElement;
|
|
4
|
+
private onZoom;
|
|
5
|
+
private paper;
|
|
6
|
+
private isPanning;
|
|
7
|
+
private lastPointerPosition;
|
|
8
|
+
private resizeObserver;
|
|
9
|
+
private currentZoom;
|
|
10
|
+
private mouseMoveHandler;
|
|
11
|
+
private mouseUpHandler;
|
|
12
|
+
constructor(paper: joint.dia.Paper, opts?: {
|
|
13
|
+
onZoom?: (zoom: number) => void;
|
|
14
|
+
});
|
|
15
|
+
private setupResize;
|
|
16
|
+
private handleResize;
|
|
17
|
+
private setupPanning;
|
|
18
|
+
private onMouseMove;
|
|
19
|
+
private onMouseUp;
|
|
20
|
+
private setupZooming;
|
|
21
|
+
private zoom;
|
|
22
|
+
isZoomInEnable(): boolean;
|
|
23
|
+
zoomIn(): void;
|
|
24
|
+
isZoomOutEnable(): boolean;
|
|
25
|
+
zoomOut(): void;
|
|
26
|
+
reset(): void;
|
|
27
|
+
expand(): void;
|
|
28
|
+
center(x: number, y: number): void;
|
|
29
|
+
dispose(): void;
|
|
30
|
+
}
|
|
31
|
+
export declare function createScroller(paper: joint.dia.Paper, onZoom: (zoom: number) => void): PaperScroller;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=createScroller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createScroller.d.ts","sourceRoot":"","sources":["../../../src/lineage/graph/createScroller.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,aAAa,CAAC;AAM1C,cAAM,aAAa;IACR,EAAE,EAAE,cAAc,CAAC;IAE1B,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,mBAAmB,CAAyC;IACpE,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,WAAW,CAAa;IAEhC,OAAO,CAAC,gBAAgB,CAA8C;IACtE,OAAO,CAAC,cAAc,CAA0B;IAEhD,YACI,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EACtB,IAAI,GAAE;QACF,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;KAC9B,EAgBT;IAED,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,IAAI;IAYL,cAAc,YAEpB;IAEM,MAAM,SAEZ;IAEM,eAAe,YAErB;IAEM,OAAO,SAEb;IAEM,KAAK,SAiBX;IAEM,MAAM,SA4BZ;IAEM,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,QAUjC;IAEM,OAAO,SAMb;CACJ;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,iBAIpF"}
|