@neo4j-ndl/react-graph 2.1.23 → 2.2.5
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/lib/cjs/_generated/style-rules/color-utils.js.map +1 -1
- package/lib/cjs/_generated/style-rules/date-utils.js +1 -1
- package/lib/cjs/_generated/style-rules/date-utils.js.map +1 -1
- package/lib/cjs/_generated/style-rules/index.js +1 -1
- package/lib/cjs/_generated/style-rules/index.js.map +1 -1
- package/lib/cjs/_generated/style-rules/literal-schemas.js +1 -1
- package/lib/cjs/_generated/style-rules/literal-schemas.js.map +1 -1
- package/lib/cjs/_generated/style-rules/numeric-utils.js.map +1 -1
- package/lib/cjs/_generated/style-rules/range-utils.js +1 -1
- package/lib/cjs/_generated/style-rules/range-utils.js.map +1 -1
- package/lib/cjs/graph-visualization-buttons.js +1 -1
- package/lib/cjs/graph-visualization-buttons.js.map +1 -1
- package/lib/cjs/graph-visualization-context.js +1 -1
- package/lib/cjs/graph-visualization-context.js.map +1 -1
- package/lib/cjs/graph-visualization-sidepanel.js +1 -1
- package/lib/cjs/graph-visualization-sidepanel.js.map +1 -1
- package/lib/cjs/graph-visualization.js +1 -1
- package/lib/cjs/graph-visualization.js.map +1 -1
- package/lib/cjs/index.js +1 -1
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/sidepanel-components/button-group.js +1 -1
- package/lib/cjs/sidepanel-components/button-group.js.map +1 -1
- package/lib/cjs/sidepanel-components/clickable-urls.js +1 -1
- package/lib/cjs/sidepanel-components/clickable-urls.js.map +1 -1
- package/lib/cjs/sidepanel-components/details-panel.js +1 -1
- package/lib/cjs/sidepanel-components/details-panel.js.map +1 -1
- package/lib/cjs/sidepanel-components/graph-label-wrapper.js +1 -1
- package/lib/cjs/sidepanel-components/graph-label-wrapper.js.map +1 -1
- package/lib/cjs/sidepanel-components/overview-panel.js +1 -1
- package/lib/cjs/sidepanel-components/overview-panel.js.map +1 -1
- package/lib/cjs/sidepanel-components/properties-table.js +1 -1
- package/lib/cjs/sidepanel-components/properties-table.js.map +1 -1
- package/lib/cjs/sidepanel-components/show-all.js +1 -1
- package/lib/cjs/sidepanel-components/show-all.js.map +1 -1
- package/lib/cjs/sidepanel-components/single-selection-sidepanel-contents.js +1 -1
- package/lib/cjs/sidepanel-components/single-selection-sidepanel-contents.js.map +1 -1
- package/lib/cjs/styling/compile-graph-styles.js +134 -61
- package/lib/cjs/styling/compile-graph-styles.js.map +1 -1
- package/lib/cjs/styling/create-vis-data-structures.js +16 -9
- package/lib/cjs/styling/create-vis-data-structures.js.map +1 -1
- package/lib/cjs/styling/parse-style-rules.js +1 -1
- package/lib/cjs/styling/parse-style-rules.js.map +1 -1
- package/lib/cjs/styling/style-types.js +30 -30
- package/lib/cjs/styling/style-types.js.map +1 -1
- package/lib/cjs/styling/use-graph-data.js +1 -1
- package/lib/cjs/styling/use-graph-data.js.map +1 -1
- package/lib/cjs/use-managed-node-state.js +1 -1
- package/lib/cjs/use-managed-node-state.js.map +1 -1
- package/lib/cjs/use-semi-controlled-state.js +1 -1
- package/lib/cjs/use-semi-controlled-state.js.map +1 -1
- package/lib/cjs/utils.js +1 -1
- package/lib/cjs/utils.js.map +1 -1
- package/lib/esm/_generated/style-rules/color-utils.js.map +1 -1
- package/lib/esm/_generated/style-rules/date-utils.js +1 -1
- package/lib/esm/_generated/style-rules/date-utils.js.map +1 -1
- package/lib/esm/_generated/style-rules/index.js +1 -1
- package/lib/esm/_generated/style-rules/index.js.map +1 -1
- package/lib/esm/_generated/style-rules/literal-schemas.js +1 -1
- package/lib/esm/_generated/style-rules/literal-schemas.js.map +1 -1
- package/lib/esm/_generated/style-rules/numeric-utils.js.map +1 -1
- package/lib/esm/_generated/style-rules/range-utils.js +1 -1
- package/lib/esm/_generated/style-rules/range-utils.js.map +1 -1
- package/lib/esm/graph-visualization-buttons.js +1 -1
- package/lib/esm/graph-visualization-buttons.js.map +1 -1
- package/lib/esm/graph-visualization-context.js +1 -1
- package/lib/esm/graph-visualization-context.js.map +1 -1
- package/lib/esm/graph-visualization-sidepanel.js +1 -1
- package/lib/esm/graph-visualization-sidepanel.js.map +1 -1
- package/lib/esm/graph-visualization.js +1 -1
- package/lib/esm/graph-visualization.js.map +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/sidepanel-components/button-group.js +1 -1
- package/lib/esm/sidepanel-components/button-group.js.map +1 -1
- package/lib/esm/sidepanel-components/clickable-urls.js +1 -1
- package/lib/esm/sidepanel-components/clickable-urls.js.map +1 -1
- package/lib/esm/sidepanel-components/details-panel.js +1 -1
- package/lib/esm/sidepanel-components/details-panel.js.map +1 -1
- package/lib/esm/sidepanel-components/graph-label-wrapper.js +1 -1
- package/lib/esm/sidepanel-components/graph-label-wrapper.js.map +1 -1
- package/lib/esm/sidepanel-components/overview-panel.js +1 -1
- package/lib/esm/sidepanel-components/overview-panel.js.map +1 -1
- package/lib/esm/sidepanel-components/properties-table.js +1 -1
- package/lib/esm/sidepanel-components/properties-table.js.map +1 -1
- package/lib/esm/sidepanel-components/show-all.js +1 -1
- package/lib/esm/sidepanel-components/show-all.js.map +1 -1
- package/lib/esm/sidepanel-components/single-selection-sidepanel-contents.js +1 -1
- package/lib/esm/sidepanel-components/single-selection-sidepanel-contents.js.map +1 -1
- package/lib/esm/styling/compile-graph-styles.js +132 -61
- package/lib/esm/styling/compile-graph-styles.js.map +1 -1
- package/lib/esm/styling/create-vis-data-structures.js +16 -9
- package/lib/esm/styling/create-vis-data-structures.js.map +1 -1
- package/lib/esm/styling/parse-style-rules.js +1 -1
- package/lib/esm/styling/parse-style-rules.js.map +1 -1
- package/lib/esm/styling/style-types.js +30 -30
- package/lib/esm/styling/style-types.js.map +1 -1
- package/lib/esm/styling/use-graph-data.js +1 -1
- package/lib/esm/styling/use-graph-data.js.map +1 -1
- package/lib/esm/use-managed-node-state.js +1 -1
- package/lib/esm/use-managed-node-state.js.map +1 -1
- package/lib/esm/use-semi-controlled-state.js +1 -1
- package/lib/esm/use-semi-controlled-state.js.map +1 -1
- package/lib/esm/utils.js +1 -1
- package/lib/esm/utils.js.map +1 -1
- package/lib/types/_generated/style-rules/color-utils.d.ts +1 -1
- package/lib/types/_generated/style-rules/index.d.ts +1 -1
- package/lib/types/_generated/style-rules/literal-schemas.d.ts +1 -1
- package/lib/types/_generated/style-rules/numeric-utils.d.ts +1 -1
- package/lib/types/graph-visualization-buttons.d.ts +1 -1
- package/lib/types/graph-visualization-context.d.ts +1 -1
- package/lib/types/graph-visualization-sidepanel.d.ts +1 -1
- package/lib/types/graph-visualization.d.ts +1 -1
- package/lib/types/index.d.ts +1 -1
- package/lib/types/sidepanel-components/button-group.d.ts +1 -1
- package/lib/types/sidepanel-components/clickable-urls.d.ts +1 -1
- package/lib/types/sidepanel-components/details-panel.d.ts +1 -1
- package/lib/types/sidepanel-components/graph-label-wrapper.d.ts +1 -1
- package/lib/types/sidepanel-components/overview-panel.d.ts +1 -1
- package/lib/types/sidepanel-components/properties-table.d.ts +1 -1
- package/lib/types/sidepanel-components/show-all.d.ts +1 -1
- package/lib/types/sidepanel-components/single-selection-sidepanel-contents.d.ts +1 -1
- package/lib/types/styling/compile-graph-styles.d.ts +29 -2
- package/lib/types/styling/compile-graph-styles.d.ts.map +1 -1
- package/lib/types/styling/create-vis-data-structures.d.ts +2 -2
- package/lib/types/styling/create-vis-data-structures.d.ts.map +1 -1
- package/lib/types/styling/parse-style-rules.d.ts +1 -1
- package/lib/types/styling/style-types.d.ts +121 -121
- package/lib/types/styling/use-graph-data.d.ts +1 -1
- package/lib/types/use-managed-node-state.d.ts +1 -1
- package/lib/types/use-semi-controlled-state.d.ts +1 -1
- package/lib/types/utils.d.ts +1 -1
- package/package.json +3 -3
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
/*!
|
|
2
2
|
*
|
|
3
3
|
* Copyright (c) "Neo4j"
|
|
4
4
|
* Neo4j Sweden AB [http://neo4j.com]
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
20
20
|
*/
|
|
21
21
|
import { sortAlphabetically } from '../utils';
|
|
22
|
+
import { DEFAULT_REL_COLOR, getDefaultNodeCaptions, getDefaultNodeColor, } from './compile-graph-styles';
|
|
22
23
|
import { pickConsumerNodeStyles, pickConsumerRelationshipStyles, } from './style-types';
|
|
23
24
|
export const NO_LABEL = '(no label)';
|
|
24
25
|
function buildColorDistribution(colorCounts) {
|
|
@@ -33,7 +34,7 @@ export function createVisualizationDataStructures(rawNodes, rawRels, compiledSty
|
|
|
33
34
|
const labelTotalCounts = {};
|
|
34
35
|
// Single pass: extract data, apply styles, count colors
|
|
35
36
|
const styledNodes = rawNodes.map((rawNode) => {
|
|
36
|
-
var _a, _b, _c;
|
|
37
|
+
var _a, _b, _c, _d, _e;
|
|
37
38
|
const data = {
|
|
38
39
|
id: rawNode.id,
|
|
39
40
|
labelsSorted: [...rawNode.labels].sort(sortAlphabetically),
|
|
@@ -42,14 +43,17 @@ export function createVisualizationDataStructures(rawNodes, rawRels, compiledSty
|
|
|
42
43
|
nodeData[rawNode.id] = data;
|
|
43
44
|
const appliedStyle = compiledStyleRules.byLabelSet(data);
|
|
44
45
|
const styledNode = Object.assign(Object.assign(Object.assign(Object.assign({}, rawNode), { labels: undefined, properties: undefined }), appliedStyle), pickConsumerNodeStyles(rawNode));
|
|
46
|
+
// Fill in the engine's defaults only where neither a rule nor the consumer supplied a value.
|
|
47
|
+
(_a = styledNode.color) !== null && _a !== void 0 ? _a : (styledNode.color = getDefaultNodeColor(data));
|
|
48
|
+
(_b = styledNode.captions) !== null && _b !== void 0 ? _b : (styledNode.captions = getDefaultNodeCaptions(data));
|
|
45
49
|
// Accumulate color distribution
|
|
46
50
|
const labels = data.labelsSorted.length > 0 ? data.labelsSorted : [NO_LABEL];
|
|
47
51
|
const color = styledNode.color;
|
|
48
52
|
for (const label of labels) {
|
|
49
|
-
labelTotalCounts[label] = ((
|
|
53
|
+
labelTotalCounts[label] = ((_c = labelTotalCounts[label]) !== null && _c !== void 0 ? _c : 0) + 1;
|
|
50
54
|
if (color !== undefined) {
|
|
51
|
-
const counts = (
|
|
52
|
-
counts[color] = ((
|
|
55
|
+
const counts = (_d = labelColorCounts[label]) !== null && _d !== void 0 ? _d : {};
|
|
56
|
+
counts[color] = ((_e = counts[color]) !== null && _e !== void 0 ? _e : 0) + 1;
|
|
53
57
|
labelColorCounts[label] = counts;
|
|
54
58
|
}
|
|
55
59
|
}
|
|
@@ -73,7 +77,7 @@ export function createVisualizationDataStructures(rawNodes, rawRels, compiledSty
|
|
|
73
77
|
const relColorCounts = {};
|
|
74
78
|
// Single pass: extract data, apply styles, count colors
|
|
75
79
|
const styledRels = rawRels.map((rawRel) => {
|
|
76
|
-
var _a, _b, _c;
|
|
80
|
+
var _a, _b, _c, _d, _e;
|
|
77
81
|
const data = {
|
|
78
82
|
id: rawRel.id,
|
|
79
83
|
properties: rawRel.properties,
|
|
@@ -82,12 +86,15 @@ export function createVisualizationDataStructures(rawNodes, rawRels, compiledSty
|
|
|
82
86
|
relData[rawRel.id] = data;
|
|
83
87
|
const appliedStyle = compiledStyleRules.byType(data.type)(data);
|
|
84
88
|
const styledRel = Object.assign(Object.assign(Object.assign(Object.assign({}, rawRel), { properties: undefined, type: undefined }), appliedStyle), pickConsumerRelationshipStyles(rawRel));
|
|
89
|
+
// Fill in the engine's defaults only where neither a rule nor the consumer supplied a value.
|
|
90
|
+
(_a = styledRel.color) !== null && _a !== void 0 ? _a : (styledRel.color = DEFAULT_REL_COLOR);
|
|
91
|
+
(_b = styledRel.captions) !== null && _b !== void 0 ? _b : (styledRel.captions = [{ value: data.type }]);
|
|
85
92
|
// Accumulate color distribution and type counts
|
|
86
|
-
relTypeCounts[data.type] = ((
|
|
93
|
+
relTypeCounts[data.type] = ((_c = relTypeCounts[data.type]) !== null && _c !== void 0 ? _c : 0) + 1;
|
|
87
94
|
const color = styledRel.color;
|
|
88
95
|
if (color !== undefined) {
|
|
89
|
-
const counts = (
|
|
90
|
-
counts[color] = ((
|
|
96
|
+
const counts = (_d = relColorCounts[data.type]) !== null && _d !== void 0 ? _d : {};
|
|
97
|
+
counts[color] = ((_e = counts[color]) !== null && _e !== void 0 ? _e : 0) + 1;
|
|
91
98
|
relColorCounts[data.type] = counts;
|
|
92
99
|
}
|
|
93
100
|
return styledRel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-vis-data-structures.js","sourceRoot":"","sources":["../../../src/styling/create-vis-data-structures.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport type {\n ColorCount,\n GraphItemMetaData,\n MetadataLookupTable,\n NeoNode,\n NeoRel,\n NodeData,\n NvlGraph,\n RelData,\n} from '../graph-visualization-context';\nimport { sortAlphabetically } from '../utils';\nimport type { CompiledGraphStyleRules } from './compile-graph-styles';\nimport {\n pickConsumerNodeStyles,\n pickConsumerRelationshipStyles,\n} from './style-types';\n\nexport const NO_LABEL = '(no label)';\n\nfunction buildColorDistribution(\n colorCounts: Record<string, number>,\n): ColorCount[] {\n return Object.entries(colorCounts)\n .map(([color, count]) => ({ color, count }))\n .sort((firstEntry, secondEntry) => secondEntry.count - firstEntry.count);\n}\n\nexport function createVisualizationDataStructures(\n rawNodes: NeoNode[],\n rawRels: NeoRel[],\n compiledStyleRules: CompiledGraphStyleRules,\n): {\n styledGraph: NvlGraph;\n metadataLookup: MetadataLookupTable;\n} {\n const nodeData: Record<string, NodeData> = {};\n const labelColorCounts: Record<string, Record<string, number>> = {};\n const labelTotalCounts: Record<string, number> = {};\n\n // Single pass: extract data, apply styles, count colors\n const styledNodes = rawNodes.map((rawNode) => {\n const data: NodeData = {\n id: rawNode.id,\n labelsSorted: [...rawNode.labels].sort(sortAlphabetically),\n properties: rawNode.properties,\n };\n nodeData[rawNode.id] = data;\n\n const appliedStyle = compiledStyleRules.byLabelSet(data);\n\n const styledNode = {\n ...rawNode,\n labels: undefined,\n properties: undefined,\n ...appliedStyle,\n // Consumer-set style properties on NeoNode take precedence over style rules\n ...pickConsumerNodeStyles(rawNode),\n };\n\n // Accumulate color distribution\n const labels =\n data.labelsSorted.length > 0 ? data.labelsSorted : [NO_LABEL];\n const color = styledNode.color;\n\n for (const label of labels) {\n labelTotalCounts[label] = (labelTotalCounts[label] ?? 0) + 1;\n\n if (color !== undefined) {\n const counts = labelColorCounts[label] ?? {};\n counts[color] = (counts[color] ?? 0) + 1;\n labelColorCounts[label] = counts;\n }\n }\n\n return styledNode;\n });\n\n const labels = Object.keys(labelTotalCounts).sort(sortAlphabetically);\n const labelMetaData: Record<string, GraphItemMetaData> = {};\n let hasMultipleColors = false;\n for (const label of labels) {\n const colorDistribution = buildColorDistribution(\n labelColorCounts[label] ?? {},\n );\n if (colorDistribution.length > 1) {\n hasMultipleColors = true;\n }\n labelMetaData[label] = {\n totalCount: labelTotalCounts[label]!,\n colorDistribution,\n };\n }\n\n const relData: Record<string, RelData> = {};\n const relTypeCounts: Record<string, number> = {};\n const relColorCounts: Record<string, Record<string, number>> = {};\n\n // Single pass: extract data, apply styles, count colors\n const styledRels = rawRels.map((rawRel) => {\n const data: RelData = {\n id: rawRel.id,\n properties: rawRel.properties,\n type: rawRel.type,\n };\n relData[rawRel.id] = data;\n\n const appliedStyle = compiledStyleRules.byType(data.type)(data);\n\n const styledRel = {\n ...rawRel,\n properties: undefined,\n type: undefined,\n ...appliedStyle,\n // Consumer-set style properties on NeoRel take precedence over style rules\n ...pickConsumerRelationshipStyles(rawRel),\n };\n\n // Accumulate color distribution and type counts\n relTypeCounts[data.type] = (relTypeCounts[data.type] ?? 0) + 1;\n const color = styledRel.color;\n if (color !== undefined) {\n const counts = relColorCounts[data.type] ?? {};\n counts[color] = (counts[color] ?? 0) + 1;\n relColorCounts[data.type] = counts;\n }\n\n return styledRel;\n });\n\n const reltypes = Object.keys(relTypeCounts).sort(sortAlphabetically);\n const reltypeMetaData: Record<string, GraphItemMetaData> = {};\n for (const type of reltypes) {\n const colorDistribution = buildColorDistribution(\n relColorCounts[type] ?? {},\n );\n if (colorDistribution.length > 1) {\n hasMultipleColors = true;\n }\n reltypeMetaData[type] = {\n totalCount: relTypeCounts[type]!,\n colorDistribution,\n };\n }\n\n return {\n metadataLookup: {\n hasMultipleColors,\n labelMetaData,\n labels,\n reltypeMetaData,\n reltypes,\n },\n styledGraph: {\n nodeData,\n nodes: styledNodes,\n relData,\n rels: styledRels,\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"create-vis-data-structures.js","sourceRoot":"","sources":["../../../src/styling/create-vis-data-structures.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport type {\n ColorCount,\n GraphItemMetaData,\n MetadataLookupTable,\n NeoNode,\n NeoRel,\n NodeData,\n NvlGraph,\n RelData,\n} from '../graph-visualization-context';\nimport { sortAlphabetically } from '../utils';\nimport {\n type CompiledGraphStyleRules,\n DEFAULT_REL_COLOR,\n getDefaultNodeCaptions,\n getDefaultNodeColor,\n} from './compile-graph-styles';\nimport {\n pickConsumerNodeStyles,\n pickConsumerRelationshipStyles,\n} from './style-types';\n\nexport const NO_LABEL = '(no label)';\n\nfunction buildColorDistribution(\n colorCounts: Record<string, number>,\n): ColorCount[] {\n return Object.entries(colorCounts)\n .map(([color, count]) => ({ color, count }))\n .sort((firstEntry, secondEntry) => secondEntry.count - firstEntry.count);\n}\n\nexport function createVisualizationDataStructures(\n rawNodes: NeoNode[],\n rawRels: NeoRel[],\n compiledStyleRules: CompiledGraphStyleRules,\n): {\n styledGraph: NvlGraph;\n metadataLookup: MetadataLookupTable;\n} {\n const nodeData: Record<string, NodeData> = {};\n const labelColorCounts: Record<string, Record<string, number>> = {};\n const labelTotalCounts: Record<string, number> = {};\n\n // Single pass: extract data, apply styles, count colors\n const styledNodes = rawNodes.map((rawNode) => {\n const data: NodeData = {\n id: rawNode.id,\n labelsSorted: [...rawNode.labels].sort(sortAlphabetically),\n properties: rawNode.properties,\n };\n nodeData[rawNode.id] = data;\n\n const appliedStyle = compiledStyleRules.byLabelSet(data);\n\n const styledNode = {\n ...rawNode,\n labels: undefined,\n properties: undefined,\n ...appliedStyle,\n // Consumer-set style properties on NeoNode take precedence over style rules\n ...pickConsumerNodeStyles(rawNode),\n };\n\n // Fill in the engine's defaults only where neither a rule nor the consumer supplied a value.\n styledNode.color ??= getDefaultNodeColor(data);\n styledNode.captions ??= getDefaultNodeCaptions(data);\n\n // Accumulate color distribution\n const labels =\n data.labelsSorted.length > 0 ? data.labelsSorted : [NO_LABEL];\n const color = styledNode.color;\n\n for (const label of labels) {\n labelTotalCounts[label] = (labelTotalCounts[label] ?? 0) + 1;\n\n if (color !== undefined) {\n const counts = labelColorCounts[label] ?? {};\n counts[color] = (counts[color] ?? 0) + 1;\n labelColorCounts[label] = counts;\n }\n }\n\n return styledNode;\n });\n\n const labels = Object.keys(labelTotalCounts).sort(sortAlphabetically);\n const labelMetaData: Record<string, GraphItemMetaData> = {};\n let hasMultipleColors = false;\n for (const label of labels) {\n const colorDistribution = buildColorDistribution(\n labelColorCounts[label] ?? {},\n );\n if (colorDistribution.length > 1) {\n hasMultipleColors = true;\n }\n labelMetaData[label] = {\n totalCount: labelTotalCounts[label]!,\n colorDistribution,\n };\n }\n\n const relData: Record<string, RelData> = {};\n const relTypeCounts: Record<string, number> = {};\n const relColorCounts: Record<string, Record<string, number>> = {};\n\n // Single pass: extract data, apply styles, count colors\n const styledRels = rawRels.map((rawRel) => {\n const data: RelData = {\n id: rawRel.id,\n properties: rawRel.properties,\n type: rawRel.type,\n };\n relData[rawRel.id] = data;\n\n const appliedStyle = compiledStyleRules.byType(data.type)(data);\n\n const styledRel = {\n ...rawRel,\n properties: undefined,\n type: undefined,\n ...appliedStyle,\n // Consumer-set style properties on NeoRel take precedence over style rules\n ...pickConsumerRelationshipStyles(rawRel),\n };\n\n // Fill in the engine's defaults only where neither a rule nor the consumer supplied a value.\n styledRel.color ??= DEFAULT_REL_COLOR;\n styledRel.captions ??= [{ value: data.type }];\n\n // Accumulate color distribution and type counts\n relTypeCounts[data.type] = (relTypeCounts[data.type] ?? 0) + 1;\n const color = styledRel.color;\n if (color !== undefined) {\n const counts = relColorCounts[data.type] ?? {};\n counts[color] = (counts[color] ?? 0) + 1;\n relColorCounts[data.type] = counts;\n }\n\n return styledRel;\n });\n\n const reltypes = Object.keys(relTypeCounts).sort(sortAlphabetically);\n const reltypeMetaData: Record<string, GraphItemMetaData> = {};\n for (const type of reltypes) {\n const colorDistribution = buildColorDistribution(\n relColorCounts[type] ?? {},\n );\n if (colorDistribution.length > 1) {\n hasMultipleColors = true;\n }\n reltypeMetaData[type] = {\n totalCount: relTypeCounts[type]!,\n colorDistribution,\n };\n }\n\n return {\n metadataLookup: {\n hasMultipleColors,\n labelMetaData,\n labels,\n reltypeMetaData,\n reltypes,\n },\n styledGraph: {\n nodeData,\n nodes: styledNodes,\n relData,\n rels: styledRels,\n },\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-style-rules.js","sourceRoot":"","sources":["../../../src/styling/parse-style-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAuB,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1E,MAAM,qBAAqB,GAAG,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;AAE9D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,eAAe,CAC7B,UAAkB;IAOlB,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAAC,WAAM,CAAC;QACP,OAAO;YACL,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC;gBACtB;oBACE,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,qBAAqB;oBAC9B,IAAI,EAAE,EAAE;oBACR,MAAM,EAAE,MAAM;iBACf;aACF,CAAC;YACF,OAAO,EAAE,KAAK;SACf,CAAC;IACJ,CAAC;IAED,OAAO,qBAAqB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AACjD,CAAC","sourcesContent":["
|
|
1
|
+
{"version":3,"file":"parse-style-rules.js","sourceRoot":"","sources":["../../../src/styling/parse-style-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAuB,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1E,MAAM,qBAAqB,GAAG,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;AAE9D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,eAAe,CAC7B,UAAkB;IAOlB,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAAC,WAAM,CAAC;QACP,OAAO;YACL,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC;gBACtB;oBACE,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,qBAAqB;oBAC9B,IAAI,EAAE,EAAE;oBACR,MAAM,EAAE,MAAM;iBACf;aACF,CAAC;YACF,OAAO,EAAE,KAAK;SACf,CAAC;IACJ,CAAC;IAED,OAAO,qBAAqB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AACjD,CAAC","sourcesContent":["/*!\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport zod from 'zod';\n\nimport { type GraphStyleRule, GraphStyleRuleSchema } from './style-types';\nconst StyleRulesArraySchema = zod.array(GraphStyleRuleSchema);\n\n/**\n * Parse and validate a JSON string as an array of GraphStyleRules.\n *\n * Useful for importing style rules from JSON. Uses Zod for runtime validation and returns\n * a discriminated result:\n *\n * - On success: `{ success: true, data: GraphStyleRule[] }`\n * - On failure: `{ success: false, error: ZodError }`\n *\n * @example\n * ```ts\n * const result = parseStyleRules('[{\"match\": {\"label\": \"Person\"}, \"apply\": {\"color\": \"red\"}}]');\n * if (result.success) {\n * console.log(result.data); // GraphStyleRule[]\n * } else {\n * console.error(result.error.issues);\n * }\n * ```\n */\nexport function parseStyleRules(\n jsonString: string,\n): // TODO v5: fix boolean naming convention\n // eslint-disable-next-line @typescript-eslint/naming-convention\n | { data: GraphStyleRule[]; success: true }\n // TODO v5: fix boolean naming convention\n // eslint-disable-next-line @typescript-eslint/naming-convention\n | { error: zod.ZodError; success: false } {\n let parsed: unknown;\n try {\n parsed = JSON.parse(jsonString);\n } catch {\n return {\n error: new zod.ZodError([\n {\n code: 'invalid_format',\n message: 'Invalid JSON string',\n path: [],\n format: 'json',\n },\n ]),\n success: false,\n };\n }\n\n return StyleRulesArraySchema.safeParse(parsed);\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
/*!
|
|
2
2
|
*
|
|
3
3
|
* Copyright (c) "Neo4j"
|
|
4
4
|
* Neo4j Sweden AB [http://neo4j.com]
|
|
@@ -93,25 +93,25 @@ export const CaptionValueSchema = z.union([
|
|
|
93
93
|
]);
|
|
94
94
|
export const CaptionVariationSchema = z.enum(['bold', 'italic', 'underline']);
|
|
95
95
|
export const NvlCaptionSchema = z.object({
|
|
96
|
+
key: z.string().optional(),
|
|
96
97
|
styles: z.array(z.string()).optional(),
|
|
97
98
|
value: CaptionValueSchema.optional(),
|
|
98
|
-
key: z.string().optional(),
|
|
99
99
|
});
|
|
100
100
|
const CaptionsSchema = z.object({
|
|
101
|
-
text: z.array(NvlCaptionSchema).optional(),
|
|
102
101
|
align: z.enum(['top', 'bottom', 'center']).optional(),
|
|
103
|
-
size: z.number().optional(),
|
|
104
102
|
isDisabled: z.boolean().optional(),
|
|
103
|
+
size: z.number().optional(),
|
|
104
|
+
text: z.array(NvlCaptionSchema).optional(),
|
|
105
105
|
});
|
|
106
106
|
/**
|
|
107
107
|
* OverlayIcon from NVL - icon displayed on top of a graph element.
|
|
108
108
|
* @see `@neo4j-nvl/base` Node.overlayIcon.
|
|
109
109
|
*/
|
|
110
110
|
const NvlOverlayIconSchema = z.object({
|
|
111
|
-
|
|
111
|
+
isDisabled: z.boolean().optional(),
|
|
112
112
|
position: z.array(z.number()).optional(),
|
|
113
113
|
size: z.number().optional(),
|
|
114
|
-
|
|
114
|
+
url: z.string(),
|
|
115
115
|
});
|
|
116
116
|
/**
|
|
117
117
|
* Gradient coloring based on a continuous orderable property value. Range
|
|
@@ -121,14 +121,14 @@ const NvlOverlayIconSchema = z.object({
|
|
|
121
121
|
* colorRange is silently ignored — other style properties still apply.
|
|
122
122
|
*/
|
|
123
123
|
export const ColorRangeSchema = z.object({
|
|
124
|
-
|
|
125
|
-
minValue: GraphRangeLiteralSchema,
|
|
126
|
-
minColor: z.string(),
|
|
127
|
-
maxValue: GraphRangeLiteralSchema,
|
|
124
|
+
isDisabled: z.boolean().optional(),
|
|
128
125
|
maxColor: z.string(),
|
|
129
|
-
|
|
126
|
+
maxValue: GraphRangeLiteralSchema,
|
|
130
127
|
midColor: z.string().optional(),
|
|
131
|
-
|
|
128
|
+
midValue: GraphRangeLiteralSchema.optional(),
|
|
129
|
+
minColor: z.string(),
|
|
130
|
+
minValue: GraphRangeLiteralSchema,
|
|
131
|
+
onProperty: z.string(),
|
|
132
132
|
});
|
|
133
133
|
/**
|
|
134
134
|
* Size interpolation for nodes based on a continuous orderable property value.
|
|
@@ -138,12 +138,12 @@ export const ColorRangeSchema = z.object({
|
|
|
138
138
|
* other style properties still apply.
|
|
139
139
|
*/
|
|
140
140
|
export const SizeRangeSchema = z.object({
|
|
141
|
-
|
|
142
|
-
|
|
141
|
+
isDisabled: z.boolean().optional(),
|
|
142
|
+
maxSize: z.number(),
|
|
143
143
|
maxValue: GraphRangeLiteralSchema,
|
|
144
144
|
minSize: z.number(),
|
|
145
|
-
|
|
146
|
-
|
|
145
|
+
minValue: GraphRangeLiteralSchema,
|
|
146
|
+
onProperty: z.string(),
|
|
147
147
|
});
|
|
148
148
|
/**
|
|
149
149
|
* Width interpolation for relationships based on a continuous orderable
|
|
@@ -153,12 +153,12 @@ export const SizeRangeSchema = z.object({
|
|
|
153
153
|
* other style properties still apply.
|
|
154
154
|
*/
|
|
155
155
|
export const WidthRangeSchema = z.object({
|
|
156
|
-
|
|
157
|
-
minValue: GraphRangeLiteralSchema,
|
|
156
|
+
isDisabled: z.boolean().optional(),
|
|
158
157
|
maxValue: GraphRangeLiteralSchema,
|
|
159
|
-
minWidth: z.number(),
|
|
160
158
|
maxWidth: z.number(),
|
|
161
|
-
|
|
159
|
+
minValue: GraphRangeLiteralSchema,
|
|
160
|
+
minWidth: z.number(),
|
|
161
|
+
onProperty: z.string(),
|
|
162
162
|
});
|
|
163
163
|
/**
|
|
164
164
|
* Assigns a unique color per distinct value of a property.
|
|
@@ -167,36 +167,36 @@ export const WidthRangeSchema = z.object({
|
|
|
167
167
|
* other style properties still apply.
|
|
168
168
|
*/
|
|
169
169
|
export const UniqueColorsSchema = z.object({
|
|
170
|
-
onProperty: z.string(),
|
|
171
170
|
isDisabled: z.boolean().optional(),
|
|
171
|
+
onProperty: z.string(),
|
|
172
172
|
});
|
|
173
173
|
const ColorSchema = z.object({
|
|
174
|
-
value: z.string(),
|
|
175
174
|
isDisabled: z.boolean().optional(),
|
|
175
|
+
value: z.string(),
|
|
176
176
|
});
|
|
177
177
|
const IconSchema = z.object({
|
|
178
|
-
value: z.string(),
|
|
179
178
|
isDisabled: z.boolean().optional(),
|
|
179
|
+
value: z.string(),
|
|
180
180
|
});
|
|
181
181
|
const SizeSchema = z.object({
|
|
182
|
-
value: z.number(),
|
|
183
182
|
isDisabled: z.boolean().optional(),
|
|
183
|
+
value: z.number(),
|
|
184
184
|
});
|
|
185
185
|
const WidthSchema = z.object({
|
|
186
|
-
value: z.number(),
|
|
187
186
|
isDisabled: z.boolean().optional(),
|
|
187
|
+
value: z.number(),
|
|
188
188
|
});
|
|
189
189
|
export const StyleSchema = z.object({
|
|
190
190
|
captions: CaptionsSchema.optional(),
|
|
191
191
|
color: ColorSchema.optional(),
|
|
192
192
|
colorRange: ColorRangeSchema.optional(),
|
|
193
193
|
icon: IconSchema.optional(),
|
|
194
|
-
sizeRange: SizeRangeSchema.optional(),
|
|
195
194
|
overlayIcon: NvlOverlayIconSchema.optional(),
|
|
196
|
-
widthRange: WidthRangeSchema.optional(),
|
|
197
195
|
size: SizeSchema.optional(),
|
|
196
|
+
sizeRange: SizeRangeSchema.optional(),
|
|
198
197
|
uniqueColors: UniqueColorsSchema.optional(),
|
|
199
198
|
width: WidthSchema.optional(),
|
|
199
|
+
widthRange: WidthRangeSchema.optional(),
|
|
200
200
|
});
|
|
201
201
|
/**
|
|
202
202
|
* metaData is an free-form object that can be used to store additional information about a style rule.
|
|
@@ -204,12 +204,12 @@ export const StyleSchema = z.object({
|
|
|
204
204
|
*/
|
|
205
205
|
const metaDataSchema = z.record(z.string(), z.unknown());
|
|
206
206
|
export const GraphStyleRuleSchema = z.object({
|
|
207
|
-
match: MatchSchema,
|
|
208
|
-
where: WhereSchema.optional(),
|
|
209
207
|
apply: StyleSchema,
|
|
210
208
|
isDisabled: z.boolean().optional(),
|
|
211
|
-
|
|
209
|
+
match: MatchSchema,
|
|
212
210
|
metaData: metaDataSchema.optional(),
|
|
211
|
+
priority: z.number().nonnegative().optional(),
|
|
212
|
+
where: WhereSchema.optional(),
|
|
213
213
|
});
|
|
214
214
|
/**
|
|
215
215
|
* Runtime type guard for {@link GraphStyleRule}, backed by the internal Zod
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style-types.js","sourceRoot":"","sources":["../../../src/styling/style-types.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { type Node, type Relationship } from '@neo4j-nvl/base';\nimport { z } from 'zod';\n\nimport {\n type BigintLiteral,\n BigintLiteralSchema,\n type DatetimeLiteral,\n DatetimeLiteralSchema,\n type LocalDatetimeLiteral,\n LocalDatetimeLiteralSchema,\n type NumericLiteral,\n NumericLiteralSchema,\n type RangeLiteral,\n RangeLiteralSchema,\n type TimeLiteral,\n TimeLiteralSchema,\n} from '../_generated/style-rules';\n\n/*\n * Style types defined in Zod, so that we can use the schemas to generate JSON Schema.\n * This is useful for generating documentation, importing and for future integration into editors.\n *\n * Some simple examples of rules:\n * - Match all nodes with label \"Person\" and apply red color\n * { match: { label: \"Person\" }, apply: { color: \"red\" } }\n *\n * - Match all relationships with type \"KNOWS\" which have the property \"name\" equal to \"John\" and apply width 10\n * { match: { reltype: \"KNOWS\" }, where: { equal: [{ property: \"name\" }, \"John\"] }, apply: { width: 10 } }\n */\n\n// Selector schemas. This is what can go under the `match` key.\nconst LabelSelectorSchema = z.object({\n label: z.string().nullable(),\n});\n\nconst ReltypeSelectorSchema = z.object({\n reltype: z.string().nullable(),\n});\n\nconst PropertySelectorSchema = z.object({\n property: z.string(),\n});\n\nexport const SelectorSchema = z.union([\n LabelSelectorSchema,\n ReltypeSelectorSchema,\n PropertySelectorSchema,\n]);\ntype Selector = z.infer<typeof SelectorSchema>;\n\nexport const MatchSchema = z.union([\n LabelSelectorSchema,\n ReltypeSelectorSchema,\n PropertySelectorSchema,\n]);\n\n// Schemas for the values that can go under the `where` key. Starts with defining the literal values.\nexport const CypherValueSchema = z.union([\n z.string(),\n NumericLiteralSchema,\n z.boolean(),\n z.null(),\n DatetimeLiteralSchema,\n LocalDatetimeLiteralSchema,\n TimeLiteralSchema,\n]);\nexport type CypherValue = z.infer<typeof CypherValueSchema>;\n/** A JSON-safe bigint literal represented by a signed decimal string. */\nexport const GraphBigintLiteralSchema = BigintLiteralSchema;\n/** A number, native bigint, or JSON-safe bigint literal. */\nexport const GraphNumericLiteralSchema = NumericLiteralSchema;\n/** A numeric, datetime, localdatetime, or time literal used as a range boundary. */\nexport const GraphRangeLiteralSchema = RangeLiteralSchema;\nexport type GraphBigintLiteral = BigintLiteral;\nexport type GraphNumericLiteral = NumericLiteral;\nexport type GraphRangeLiteral = RangeLiteral;\n\nexport const ValueSchema = z\n .union([SelectorSchema, CypherValueSchema])\n .describe(\n 'Either a property/label/reltype selector (e.g., {property: \"name\"}), a literal value (string, number, bigint, {bigint: \"42\"}, boolean, null), or a datetime/time literal (e.g., {datetime: \"2024-01-01T00:00:00Z\"}, {time: \"14:30:00\"}).',\n );\nexport type Value = z.infer<typeof ValueSchema>;\n\nexport type { DatetimeLiteral, LocalDatetimeLiteral, TimeLiteral };\n\n/**\n * Where clause - recursive type for conditional expressions\n * The type is manually defined for the export, since zod doesn't support exporting inferred recursive types.\n */\nexport type Where =\n // Selector is useful for finding nodes with multiple labels.\n // for example: {match: {label: \"Person\"}, where: {label: \"Actor\"}}\n // matches nodes with label Person AND Actor\n | Selector\n | { not: Where }\n | { and: Where[] }\n | { or: Where[] }\n | { equal: [Value, Value] }\n | { lessThan: [Value, Value] }\n | { lessThanOrEqual: [Value, Value] }\n | { greaterThan: [Value, Value] }\n | { greaterThanOrEqual: [Value, Value] }\n | { contains: [Value, Value] }\n | { startsWith: [Value, Value] }\n | { endsWith: [Value, Value] }\n\n // Null check matching Cypher's IS NULL\n // Returns true/false (not null), making it safe for null checking\n // Use { not: { isNull: ... } } for IS NOT NULL\n // @see https://neo4j.com/docs/cypher-manual/current/values-and-types/working-with-null/\n | { isNull: Value };\n\nexport const WhereSchema: z.ZodType<Where> = z.lazy(() =>\n z.union([\n SelectorSchema,\n z.object({ not: WhereSchema }),\n z.object({ and: z.array(WhereSchema) }),\n z.object({ or: z.array(WhereSchema) }),\n z.object({ equal: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ lessThan: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ lessThanOrEqual: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ greaterThan: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ greaterThanOrEqual: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ contains: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ startsWith: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ endsWith: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ isNull: ValueSchema }),\n ]),\n);\n\n// Schemas that go under the `apply` key.\nexport const CaptionValueSchema = z.union([\n z.string(),\n z.object({ property: z.string() }),\n z.object({ useType: z.literal(true) }),\n]);\nexport type CaptionValue = z.infer<typeof CaptionValueSchema>;\n\nexport const CaptionVariationSchema = z.enum(['bold', 'italic', 'underline']);\nexport type CaptionVariation = z.infer<typeof CaptionVariationSchema>;\n\nexport const NvlCaptionSchema = z.object({\n styles: z.array(z.string()).optional(),\n value: CaptionValueSchema.optional(),\n key: z.string().optional(),\n});\nexport type Caption = z.infer<typeof NvlCaptionSchema>;\n\nconst CaptionsSchema = z.object({\n text: z.array(NvlCaptionSchema).optional(),\n align: z.enum(['top', 'bottom', 'center']).optional(),\n size: z.number().optional(),\n isDisabled: z.boolean().optional(),\n});\n\n/**\n * OverlayIcon from NVL - icon displayed on top of a graph element.\n * @see `@neo4j-nvl/base` Node.overlayIcon.\n */\nconst NvlOverlayIconSchema = z.object({\n url: z.string(),\n position: z.array(z.number()).optional(),\n size: z.number().optional(),\n isDisabled: z.boolean().optional(),\n});\n\n/**\n * Gradient coloring based on a continuous orderable property value. Range\n * boundaries accept numeric and temporal literals.\n * Colors must be a standard hex string (#rrggbb).\n * If the property is missing, non-orderable, or any color is invalid, the\n * colorRange is silently ignored — other style properties still apply.\n */\nexport const ColorRangeSchema = z.object({\n onProperty: z.string(),\n minValue: GraphRangeLiteralSchema,\n minColor: z.string(),\n maxValue: GraphRangeLiteralSchema,\n maxColor: z.string(),\n midValue: GraphRangeLiteralSchema.optional(),\n midColor: z.string().optional(),\n isDisabled: z.boolean().optional(),\n});\nexport type ColorRange = z.infer<typeof ColorRangeSchema>;\n\n/**\n * Size interpolation for nodes based on a continuous orderable property value.\n * Range boundaries accept numeric and temporal literals.\n * Maps a property value in [minValue, maxValue] to a size in [minSize, maxSize].\n * If the property is missing or non-orderable, sizeRange is silently ignored —\n * other style properties still apply.\n */\nexport const SizeRangeSchema = z.object({\n onProperty: z.string(),\n minValue: GraphRangeLiteralSchema,\n maxValue: GraphRangeLiteralSchema,\n minSize: z.number(),\n maxSize: z.number(),\n isDisabled: z.boolean().optional(),\n});\nexport type SizeRange = z.infer<typeof SizeRangeSchema>;\n\n/**\n * Width interpolation for relationships based on a continuous orderable\n * property value. Range boundaries accept numeric and temporal literals.\n * Maps a property value in [minValue, maxValue] to a width in [minWidth, maxWidth].\n * If the property is missing or non-orderable, widthRange is silently ignored —\n * other style properties still apply.\n */\nexport const WidthRangeSchema = z.object({\n onProperty: z.string(),\n minValue: GraphRangeLiteralSchema,\n maxValue: GraphRangeLiteralSchema,\n minWidth: z.number(),\n maxWidth: z.number(),\n isDisabled: z.boolean().optional(),\n});\nexport type WidthRange = z.infer<typeof WidthRangeSchema>;\n\n/**\n * Assigns a unique color per distinct value of a property.\n * Colors are assigned in first-come, first-served order from a categorical palette.\n * If the property is missing or null, uniqueColors is silently ignored —\n * other style properties still apply.\n */\nexport const UniqueColorsSchema = z.object({\n onProperty: z.string(),\n isDisabled: z.boolean().optional(),\n});\nexport type UniqueColors = z.infer<typeof UniqueColorsSchema>;\n\nconst ColorSchema = z.object({\n value: z.string(),\n isDisabled: z.boolean().optional(),\n});\n\nconst IconSchema = z.object({\n value: z.string(),\n isDisabled: z.boolean().optional(),\n});\n\nconst SizeSchema = z.object({\n value: z.number(),\n isDisabled: z.boolean().optional(),\n});\n\nconst WidthSchema = z.object({\n value: z.number(),\n isDisabled: z.boolean().optional(),\n});\n\nexport const StyleSchema = z.object({\n captions: CaptionsSchema.optional(),\n color: ColorSchema.optional(),\n colorRange: ColorRangeSchema.optional(),\n icon: IconSchema.optional(),\n sizeRange: SizeRangeSchema.optional(),\n overlayIcon: NvlOverlayIconSchema.optional(),\n widthRange: WidthRangeSchema.optional(),\n size: SizeSchema.optional(),\n uniqueColors: UniqueColorsSchema.optional(),\n width: WidthSchema.optional(),\n});\nexport type Style = z.infer<typeof StyleSchema>;\n\n/**\n * metaData is an free-form object that can be used to store additional information about a style rule.\n * The data is not taken into account when evaluationg the rule.\n */\nconst metaDataSchema = z.record(z.string(), z.unknown());\n\nexport const GraphStyleRuleSchema = z.object({\n match: MatchSchema,\n where: WhereSchema.optional(),\n apply: StyleSchema,\n isDisabled: z.boolean().optional(),\n priority: z.number().nonnegative().optional(),\n metaData: metaDataSchema.optional(),\n});\n// exporting this type with the graph prefix for clarity when used in the same context as other rules (grid, chart)\nexport type GraphStyleRule = z.infer<typeof GraphStyleRuleSchema>;\n\n/**\n * Runtime type guard for {@link GraphStyleRule}, backed by the internal Zod\n * schema. Narrows an `unknown` value to `GraphStyleRule` when it is a valid\n * style rule.\n *\n * This lets consumers validate values without taking a dependency on Zod or on\n * our schema export. For example, it can be passed to another validation\n * library's custom check:\n *\n * @example\n * ```ts\n * import { z } from 'zod';\n * import { isGraphStyleRule, type GraphStyleRule } from '@neo4j-ndl/react-graph';\n *\n * const formSchema = z.object({\n * rule: z.custom<GraphStyleRule>(isGraphStyleRule),\n * notes: z.string(),\n * });\n * ```\n */\nexport const isGraphStyleRule = (value: unknown): value is GraphStyleRule =>\n GraphStyleRuleSchema.safeParse(value).success;\n\nexport type NonStaticStyles =\n | 'captions'\n | 'colorRange'\n | 'sizeRange'\n | 'widthRange'\n | 'uniqueColors';\n\ntype NodeStyleKey =\n | 'icon'\n | 'overlayIcon'\n | 'color'\n | 'size'\n | 'captions'\n | 'captionSize'\n | 'captionAlign';\n\ntype RelStyleKey =\n | 'width'\n | 'color'\n | 'captions'\n | 'captionSize'\n | 'captionAlign'\n | 'overlayIcon';\n\nexport type EvaluatedNvlNodeStyle = Pick<Node, NodeStyleKey>;\nexport type EvaluatedNvlRelationshipStyle = Pick<Relationship, RelStyleKey>;\n\nconst NODE_STYLE_KEYS: readonly NodeStyleKey[] = [\n 'color',\n 'size',\n 'icon',\n 'overlayIcon',\n 'captions',\n 'captionSize',\n 'captionAlign',\n];\n\nconst REL_STYLE_KEYS: readonly RelStyleKey[] = [\n 'color',\n 'width',\n 'captions',\n 'captionSize',\n 'captionAlign',\n 'overlayIcon',\n];\n\n/**\n * Extract consumer-set style properties from a node.\n * Only includes properties that are explicitly defined (not undefined),\n * so they can be spread over rule-derived styles to take precedence.\n */\nexport function pickConsumerNodeStyles(\n node: Partial<EvaluatedNvlNodeStyle>,\n): Partial<EvaluatedNvlNodeStyle> {\n const result: Record<string, unknown> = {};\n for (const key of NODE_STYLE_KEYS) {\n if (node[key] !== undefined) {\n result[key] = node[key];\n }\n }\n return result as Partial<EvaluatedNvlNodeStyle>;\n}\n\n/**\n * Extract consumer-set style properties from a relationship.\n * Only includes properties that are explicitly defined (not undefined),\n * so they can be spread over rule-derived styles to take precedence.\n */\nexport function pickConsumerRelationshipStyles(\n rel: Partial<EvaluatedNvlRelationshipStyle>,\n): Partial<EvaluatedNvlRelationshipStyle> {\n const result: Record<string, unknown> = {};\n for (const key of REL_STYLE_KEYS) {\n if (rel[key] !== undefined) {\n result[key] = rel[key];\n }\n }\n return result as Partial<EvaluatedNvlRelationshipStyle>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"style-types.js","sourceRoot":"","sources":["../../../src/styling/style-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAEL,mBAAmB,EAEnB,qBAAqB,EAErB,0BAA0B,EAE1B,oBAAoB,EAEpB,kBAAkB,EAElB,iBAAiB,GAClB,MAAM,2BAA2B,CAAC;AAEnC;;;;;;;;;;GAUG;AAEH,+DAA+D;AAC/D,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAC;AAEH,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC;IACpC,mBAAmB;IACnB,qBAAqB;IACrB,sBAAsB;CACvB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC;IACjC,mBAAmB;IACnB,qBAAqB;IACrB,sBAAsB;CACvB,CAAC,CAAC;AAEH,qGAAqG;AACrG,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC;IACvC,CAAC,CAAC,MAAM,EAAE;IACV,oBAAoB;IACpB,CAAC,CAAC,OAAO,EAAE;IACX,CAAC,CAAC,IAAI,EAAE;IACR,qBAAqB;IACrB,0BAA0B;IAC1B,iBAAiB;CAClB,CAAC,CAAC;AAEH,yEAAyE;AACzE,MAAM,CAAC,MAAM,wBAAwB,GAAG,mBAAmB,CAAC;AAC5D,4DAA4D;AAC5D,MAAM,CAAC,MAAM,yBAAyB,GAAG,oBAAoB,CAAC;AAC9D,oFAAoF;AACpF,MAAM,CAAC,MAAM,uBAAuB,GAAG,kBAAkB,CAAC;AAK1D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC;KACzB,KAAK,CAAC,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;KAC1C,QAAQ,CACP,0OAA0O,CAC3O,CAAC;AAgCJ,MAAM,CAAC,MAAM,WAAW,GAAqB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CACvD,CAAC,CAAC,KAAK,CAAC;IACN,cAAc;IACd,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;IAC9B,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;IACvC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;IACtC,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;IACxD,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;IAC3D,CAAC,CAAC,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;IAClE,CAAC,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;IAC9D,CAAC,CAAC,MAAM,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;IACrE,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;IAC3D,CAAC,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;IAC7D,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;IAC3D,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;CAClC,CAAC,CACH,CAAC;AAEF,yCAAyC;AACzC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC;IACxC,CAAC,CAAC,MAAM,EAAE;IACV,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IAClC,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;CACvC,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;AAG9E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACtC,KAAK,EAAE,kBAAkB,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAGH,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrD,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAClC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE;CAC3C,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAClC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAClC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,QAAQ,EAAE,uBAAuB;IACjC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,QAAQ,EAAE,uBAAuB,CAAC,QAAQ,EAAE;IAC5C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,QAAQ,EAAE,uBAAuB;IACjC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC;AAGH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAClC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,QAAQ,EAAE,uBAAuB;IACjC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,QAAQ,EAAE,uBAAuB;IACjC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC;AAGH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAClC,QAAQ,EAAE,uBAAuB;IACjC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,QAAQ,EAAE,uBAAuB;IACjC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC;AAGH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAClC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC;AAGH,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAClC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAClC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAClC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAClC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE;IACnC,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE;IAC7B,UAAU,EAAE,gBAAgB,CAAC,QAAQ,EAAE;IACvC,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE;IAC3B,WAAW,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IAC5C,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE;IAC3B,SAAS,EAAE,eAAe,CAAC,QAAQ,EAAE;IACrC,YAAY,EAAE,kBAAkB,CAAC,QAAQ,EAAE;IAC3C,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE;IAC7B,UAAU,EAAE,gBAAgB,CAAC,QAAQ,EAAE;CACxC,CAAC,CAAC;AAGH;;;GAGG;AACH,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAEzD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,KAAK,EAAE,WAAW;IAClB,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAClC,KAAK,EAAE,WAAW;IAClB,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE;IACnC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IAC7C,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE;CAC9B,CAAC,CAAC;AAIH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAA2B,EAAE,CAC1E,oBAAoB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;AA6BhD,MAAM,eAAe,GAA4B;IAC/C,OAAO;IACP,MAAM;IACN,MAAM;IACN,aAAa;IACb,UAAU;IACV,aAAa;IACb,cAAc;CACf,CAAC;AAEF,MAAM,cAAc,GAA2B;IAC7C,OAAO;IACP,OAAO;IACP,UAAU;IACV,aAAa;IACb,cAAc;IACd,aAAa;CACd,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAoC;IAEpC,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,MAAwC,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,8BAA8B,CAC5C,GAA2C;IAE3C,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,MAAgD,CAAC;AAC1D,CAAC","sourcesContent":["/*!\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { type Node, type Relationship } from '@neo4j-nvl/base';\nimport { z } from 'zod';\n\nimport {\n type BigintLiteral,\n BigintLiteralSchema,\n type DatetimeLiteral,\n DatetimeLiteralSchema,\n type LocalDatetimeLiteral,\n LocalDatetimeLiteralSchema,\n type NumericLiteral,\n NumericLiteralSchema,\n type RangeLiteral,\n RangeLiteralSchema,\n type TimeLiteral,\n TimeLiteralSchema,\n} from '../_generated/style-rules';\n\n/*\n * Style types defined in Zod, so that we can use the schemas to generate JSON Schema.\n * This is useful for generating documentation, importing and for future integration into editors.\n *\n * Some simple examples of rules:\n * - Match all nodes with label \"Person\" and apply red color\n * { match: { label: \"Person\" }, apply: { color: \"red\" } }\n *\n * - Match all relationships with type \"KNOWS\" which have the property \"name\" equal to \"John\" and apply width 10\n * { match: { reltype: \"KNOWS\" }, where: { equal: [{ property: \"name\" }, \"John\"] }, apply: { width: 10 } }\n */\n\n// Selector schemas. This is what can go under the `match` key.\nconst LabelSelectorSchema = z.object({\n label: z.string().nullable(),\n});\n\nconst ReltypeSelectorSchema = z.object({\n reltype: z.string().nullable(),\n});\n\nconst PropertySelectorSchema = z.object({\n property: z.string(),\n});\n\nexport const SelectorSchema = z.union([\n LabelSelectorSchema,\n ReltypeSelectorSchema,\n PropertySelectorSchema,\n]);\ntype Selector = z.infer<typeof SelectorSchema>;\n\nexport const MatchSchema = z.union([\n LabelSelectorSchema,\n ReltypeSelectorSchema,\n PropertySelectorSchema,\n]);\n\n// Schemas for the values that can go under the `where` key. Starts with defining the literal values.\nexport const CypherValueSchema = z.union([\n z.string(),\n NumericLiteralSchema,\n z.boolean(),\n z.null(),\n DatetimeLiteralSchema,\n LocalDatetimeLiteralSchema,\n TimeLiteralSchema,\n]);\nexport type CypherValue = z.infer<typeof CypherValueSchema>;\n/** A JSON-safe bigint literal represented by a signed decimal string. */\nexport const GraphBigintLiteralSchema = BigintLiteralSchema;\n/** A number, native bigint, or JSON-safe bigint literal. */\nexport const GraphNumericLiteralSchema = NumericLiteralSchema;\n/** A numeric, datetime, localdatetime, or time literal used as a range boundary. */\nexport const GraphRangeLiteralSchema = RangeLiteralSchema;\nexport type GraphBigintLiteral = BigintLiteral;\nexport type GraphNumericLiteral = NumericLiteral;\nexport type GraphRangeLiteral = RangeLiteral;\n\nexport const ValueSchema = z\n .union([SelectorSchema, CypherValueSchema])\n .describe(\n 'Either a property/label/reltype selector (e.g., {property: \"name\"}), a literal value (string, number, bigint, {bigint: \"42\"}, boolean, null), or a datetime/time literal (e.g., {datetime: \"2024-01-01T00:00:00Z\"}, {time: \"14:30:00\"}).',\n );\nexport type Value = z.infer<typeof ValueSchema>;\n\nexport type { DatetimeLiteral, LocalDatetimeLiteral, TimeLiteral };\n\n/**\n * Where clause - recursive type for conditional expressions\n * The type is manually defined for the export, since zod doesn't support exporting inferred recursive types.\n */\nexport type Where =\n // Selector is useful for finding nodes with multiple labels.\n // for example: {match: {label: \"Person\"}, where: {label: \"Actor\"}}\n // matches nodes with label Person AND Actor\n | Selector\n | { not: Where }\n | { and: Where[] }\n | { or: Where[] }\n | { equal: [Value, Value] }\n | { lessThan: [Value, Value] }\n | { lessThanOrEqual: [Value, Value] }\n | { greaterThan: [Value, Value] }\n | { greaterThanOrEqual: [Value, Value] }\n | { contains: [Value, Value] }\n | { startsWith: [Value, Value] }\n | { endsWith: [Value, Value] }\n\n // Null check matching Cypher's IS NULL\n // Returns true/false (not null), making it safe for null checking\n // Use { not: { isNull: ... } } for IS NOT NULL\n // @see https://neo4j.com/docs/cypher-manual/current/values-and-types/working-with-null/\n | { isNull: Value };\n\nexport const WhereSchema: z.ZodType<Where> = z.lazy(() =>\n z.union([\n SelectorSchema,\n z.object({ not: WhereSchema }),\n z.object({ and: z.array(WhereSchema) }),\n z.object({ or: z.array(WhereSchema) }),\n z.object({ equal: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ lessThan: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ lessThanOrEqual: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ greaterThan: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ greaterThanOrEqual: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ contains: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ startsWith: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ endsWith: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ isNull: ValueSchema }),\n ]),\n);\n\n// Schemas that go under the `apply` key.\nexport const CaptionValueSchema = z.union([\n z.string(),\n z.object({ property: z.string() }),\n z.object({ useType: z.literal(true) }),\n]);\nexport type CaptionValue = z.infer<typeof CaptionValueSchema>;\n\nexport const CaptionVariationSchema = z.enum(['bold', 'italic', 'underline']);\nexport type CaptionVariation = z.infer<typeof CaptionVariationSchema>;\n\nexport const NvlCaptionSchema = z.object({\n key: z.string().optional(),\n styles: z.array(z.string()).optional(),\n value: CaptionValueSchema.optional(),\n});\nexport type Caption = z.infer<typeof NvlCaptionSchema>;\n\nconst CaptionsSchema = z.object({\n align: z.enum(['top', 'bottom', 'center']).optional(),\n isDisabled: z.boolean().optional(),\n size: z.number().optional(),\n text: z.array(NvlCaptionSchema).optional(),\n});\n\n/**\n * OverlayIcon from NVL - icon displayed on top of a graph element.\n * @see `@neo4j-nvl/base` Node.overlayIcon.\n */\nconst NvlOverlayIconSchema = z.object({\n isDisabled: z.boolean().optional(),\n position: z.array(z.number()).optional(),\n size: z.number().optional(),\n url: z.string(),\n});\n\n/**\n * Gradient coloring based on a continuous orderable property value. Range\n * boundaries accept numeric and temporal literals.\n * Colors must be a standard hex string (#rrggbb).\n * If the property is missing, non-orderable, or any color is invalid, the\n * colorRange is silently ignored — other style properties still apply.\n */\nexport const ColorRangeSchema = z.object({\n isDisabled: z.boolean().optional(),\n maxColor: z.string(),\n maxValue: GraphRangeLiteralSchema,\n midColor: z.string().optional(),\n midValue: GraphRangeLiteralSchema.optional(),\n minColor: z.string(),\n minValue: GraphRangeLiteralSchema,\n onProperty: z.string(),\n});\nexport type ColorRange = z.infer<typeof ColorRangeSchema>;\n\n/**\n * Size interpolation for nodes based on a continuous orderable property value.\n * Range boundaries accept numeric and temporal literals.\n * Maps a property value in [minValue, maxValue] to a size in [minSize, maxSize].\n * If the property is missing or non-orderable, sizeRange is silently ignored —\n * other style properties still apply.\n */\nexport const SizeRangeSchema = z.object({\n isDisabled: z.boolean().optional(),\n maxSize: z.number(),\n maxValue: GraphRangeLiteralSchema,\n minSize: z.number(),\n minValue: GraphRangeLiteralSchema,\n onProperty: z.string(),\n});\nexport type SizeRange = z.infer<typeof SizeRangeSchema>;\n\n/**\n * Width interpolation for relationships based on a continuous orderable\n * property value. Range boundaries accept numeric and temporal literals.\n * Maps a property value in [minValue, maxValue] to a width in [minWidth, maxWidth].\n * If the property is missing or non-orderable, widthRange is silently ignored —\n * other style properties still apply.\n */\nexport const WidthRangeSchema = z.object({\n isDisabled: z.boolean().optional(),\n maxValue: GraphRangeLiteralSchema,\n maxWidth: z.number(),\n minValue: GraphRangeLiteralSchema,\n minWidth: z.number(),\n onProperty: z.string(),\n});\nexport type WidthRange = z.infer<typeof WidthRangeSchema>;\n\n/**\n * Assigns a unique color per distinct value of a property.\n * Colors are assigned in first-come, first-served order from a categorical palette.\n * If the property is missing or null, uniqueColors is silently ignored —\n * other style properties still apply.\n */\nexport const UniqueColorsSchema = z.object({\n isDisabled: z.boolean().optional(),\n onProperty: z.string(),\n});\nexport type UniqueColors = z.infer<typeof UniqueColorsSchema>;\n\nconst ColorSchema = z.object({\n isDisabled: z.boolean().optional(),\n value: z.string(),\n});\n\nconst IconSchema = z.object({\n isDisabled: z.boolean().optional(),\n value: z.string(),\n});\n\nconst SizeSchema = z.object({\n isDisabled: z.boolean().optional(),\n value: z.number(),\n});\n\nconst WidthSchema = z.object({\n isDisabled: z.boolean().optional(),\n value: z.number(),\n});\n\nexport const StyleSchema = z.object({\n captions: CaptionsSchema.optional(),\n color: ColorSchema.optional(),\n colorRange: ColorRangeSchema.optional(),\n icon: IconSchema.optional(),\n overlayIcon: NvlOverlayIconSchema.optional(),\n size: SizeSchema.optional(),\n sizeRange: SizeRangeSchema.optional(),\n uniqueColors: UniqueColorsSchema.optional(),\n width: WidthSchema.optional(),\n widthRange: WidthRangeSchema.optional(),\n});\nexport type Style = z.infer<typeof StyleSchema>;\n\n/**\n * metaData is an free-form object that can be used to store additional information about a style rule.\n * The data is not taken into account when evaluationg the rule.\n */\nconst metaDataSchema = z.record(z.string(), z.unknown());\n\nexport const GraphStyleRuleSchema = z.object({\n apply: StyleSchema,\n isDisabled: z.boolean().optional(),\n match: MatchSchema,\n metaData: metaDataSchema.optional(),\n priority: z.number().nonnegative().optional(),\n where: WhereSchema.optional(),\n});\n// exporting this type with the graph prefix for clarity when used in the same context as other rules (grid, chart)\nexport type GraphStyleRule = z.infer<typeof GraphStyleRuleSchema>;\n\n/**\n * Runtime type guard for {@link GraphStyleRule}, backed by the internal Zod\n * schema. Narrows an `unknown` value to `GraphStyleRule` when it is a valid\n * style rule.\n *\n * This lets consumers validate values without taking a dependency on Zod or on\n * our schema export. For example, it can be passed to another validation\n * library's custom check:\n *\n * @example\n * ```ts\n * import { z } from 'zod';\n * import { isGraphStyleRule, type GraphStyleRule } from '@neo4j-ndl/react-graph';\n *\n * const formSchema = z.object({\n * rule: z.custom<GraphStyleRule>(isGraphStyleRule),\n * notes: z.string(),\n * });\n * ```\n */\nexport const isGraphStyleRule = (value: unknown): value is GraphStyleRule =>\n GraphStyleRuleSchema.safeParse(value).success;\n\nexport type NonStaticStyles =\n | 'captions'\n | 'colorRange'\n | 'sizeRange'\n | 'widthRange'\n | 'uniqueColors';\n\ntype NodeStyleKey =\n | 'icon'\n | 'overlayIcon'\n | 'color'\n | 'size'\n | 'captions'\n | 'captionSize'\n | 'captionAlign';\n\ntype RelStyleKey =\n | 'width'\n | 'color'\n | 'captions'\n | 'captionSize'\n | 'captionAlign'\n | 'overlayIcon';\n\nexport type EvaluatedNvlNodeStyle = Pick<Node, NodeStyleKey>;\nexport type EvaluatedNvlRelationshipStyle = Pick<Relationship, RelStyleKey>;\n\nconst NODE_STYLE_KEYS: readonly NodeStyleKey[] = [\n 'color',\n 'size',\n 'icon',\n 'overlayIcon',\n 'captions',\n 'captionSize',\n 'captionAlign',\n];\n\nconst REL_STYLE_KEYS: readonly RelStyleKey[] = [\n 'color',\n 'width',\n 'captions',\n 'captionSize',\n 'captionAlign',\n 'overlayIcon',\n];\n\n/**\n * Extract consumer-set style properties from a node.\n * Only includes properties that are explicitly defined (not undefined),\n * so they can be spread over rule-derived styles to take precedence.\n */\nexport function pickConsumerNodeStyles(\n node: Partial<EvaluatedNvlNodeStyle>,\n): Partial<EvaluatedNvlNodeStyle> {\n const result: Record<string, unknown> = {};\n for (const key of NODE_STYLE_KEYS) {\n if (node[key] !== undefined) {\n result[key] = node[key];\n }\n }\n return result as Partial<EvaluatedNvlNodeStyle>;\n}\n\n/**\n * Extract consumer-set style properties from a relationship.\n * Only includes properties that are explicitly defined (not undefined),\n * so they can be spread over rule-derived styles to take precedence.\n */\nexport function pickConsumerRelationshipStyles(\n rel: Partial<EvaluatedNvlRelationshipStyle>,\n): Partial<EvaluatedNvlRelationshipStyle> {\n const result: Record<string, unknown> = {};\n for (const key of REL_STYLE_KEYS) {\n if (rel[key] !== undefined) {\n result[key] = rel[key];\n }\n }\n return result as Partial<EvaluatedNvlRelationshipStyle>;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-graph-data.js","sourceRoot":"","sources":["../../../src/styling/use-graph-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAGhC,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,iCAAiC,EAAE,MAAM,8BAA8B,CAAC;AAGjF,MAAM,UAAU,YAAY,CAC1B,QAAmB,EACnB,OAAiB,EACjB,UAA6B;IAE7B,8DAA8D;IAC9D,oEAAoE;IACpE,MAAM,kBAAkB,GAAG,OAAO,CAChC,GAAG,EAAE,CAAC,sBAAsB,CAAC,UAAU,CAAC,EACxC,CAAC,UAAU,CAAC,CACb,CAAC;IAEF,+DAA+D;IAC/D,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,OAAO,CAC7C,GAAG,EAAE,CACH,iCAAiC,CAAC,QAAQ,EAAE,OAAO,EAAE,kBAAkB,CAAC,EAC1E,CAAC,QAAQ,EAAE,OAAO,EAAE,kBAAkB,CAAC,CACxC,CAAC;IAEF,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;AAC7D,CAAC","sourcesContent":["
|
|
1
|
+
{"version":3,"file":"use-graph-data.js","sourceRoot":"","sources":["../../../src/styling/use-graph-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAGhC,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,iCAAiC,EAAE,MAAM,8BAA8B,CAAC;AAGjF,MAAM,UAAU,YAAY,CAC1B,QAAmB,EACnB,OAAiB,EACjB,UAA6B;IAE7B,8DAA8D;IAC9D,oEAAoE;IACpE,MAAM,kBAAkB,GAAG,OAAO,CAChC,GAAG,EAAE,CAAC,sBAAsB,CAAC,UAAU,CAAC,EACxC,CAAC,UAAU,CAAC,CACb,CAAC;IAEF,+DAA+D;IAC/D,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,OAAO,CAC7C,GAAG,EAAE,CACH,iCAAiC,CAAC,QAAQ,EAAE,OAAO,EAAE,kBAAkB,CAAC,EAC1E,CAAC,QAAQ,EAAE,OAAO,EAAE,kBAAkB,CAAC,CACxC,CAAC;IAEF,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;AAC7D,CAAC","sourcesContent":["/*!\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { useMemo } from 'react';\n\nimport type { NeoNode, NeoRel } from '../graph-visualization-context';\nimport { compileGraphStyleRules } from './compile-graph-styles';\nimport { createVisualizationDataStructures } from './create-vis-data-structures';\nimport type { GraphStyleRule } from './style-types';\n\nexport function useGraphData(\n rawNodes: NeoNode[],\n rawRels: NeoRel[],\n styleRules?: GraphStyleRule[],\n) {\n // Compile style rules — only re-runs when styleRules changes.\n // Per-type relationship functions are built lazily on first access.\n const compiledStyleRules = useMemo(\n () => compileGraphStyleRules(styleRules),\n [styleRules],\n );\n\n // Apply styles and build metadata — runs on every data change.\n const { styledGraph, metadataLookup } = useMemo(\n () =>\n createVisualizationDataStructures(rawNodes, rawRels, compiledStyleRules),\n [rawNodes, rawRels, compiledStyleRules],\n );\n\n return { styledGraph, metadataLookup, compiledStyleRules };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-managed-node-state.js","sourceRoot":"","sources":["../../src/use-managed-node-state.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { type HitTargets, type Node, type Relationship } from '@neo4j-nvl/base';\nimport { type MouseEventCallbacks } from '@neo4j-nvl/react';\nimport { useCallback, useEffect, useMemo } from 'react';\n\nimport {\n type Gesture,\n type GraphSelection,\n type InteractionMode,\n} from './graph-visualization-context';\nimport { isMac } from './utils';\n\nconst isMultiSelectKeyPressed = (evt: MouseEvent): boolean =>\n (!isMac && evt.ctrlKey) || (isMac && evt.metaKey);\n\nconst isClickingOnTextInput = (event: MouseEvent): boolean => {\n if (!(event.target instanceof HTMLElement)) {\n return false;\n }\n return (\n event.target.isContentEditable ||\n ['INPUT', 'TEXTAREA'].includes(event.target.tagName)\n );\n};\n\nexport type ManagedNodeStateArgs = {\n selected: GraphSelection;\n setSelected: (newSelection: GraphSelection) => void;\n gesture: Gesture;\n interactionMode: InteractionMode;\n setInteractionMode: (newInteractionMode: InteractionMode) => void;\n mouseEventCallbacks: MouseEventCallbacks;\n nvlGraph: {\n nodes: Node[];\n rels: Relationship[];\n };\n highlightedNodeIds?: string[];\n highlightedRelationshipIds?: string[];\n};\n\nexport function useManagedNodeState({\n selected,\n setSelected,\n gesture,\n interactionMode,\n setInteractionMode,\n mouseEventCallbacks,\n nvlGraph,\n highlightedNodeIds,\n highlightedRelationshipIds,\n}: ManagedNodeStateArgs) {\n const panOnSpace = useCallback(\n (evt: KeyboardEvent) => {\n // We could check the gesture here\n // but it doesn't really matter if we switch to panning mode even in single select\n if (interactionMode === 'select' && evt.key === ' ') {\n setInteractionMode('pan');\n }\n },\n [interactionMode, setInteractionMode],\n );\n\n const stopPanningReleaseSpace = useCallback(\n (evt: KeyboardEvent) => {\n if (interactionMode === 'pan' && evt.key === ' ') {\n setInteractionMode('select');\n }\n },\n [interactionMode, setInteractionMode],\n );\n\n useEffect(() => {\n document.addEventListener('keydown', panOnSpace);\n document.addEventListener('keyup', stopPanningReleaseSpace);\n return () => {\n document.removeEventListener('keydown', panOnSpace);\n document.removeEventListener('keyup', stopPanningReleaseSpace);\n };\n }, [panOnSpace, stopPanningReleaseSpace]);\n\n const {\n onBoxSelect: originalBoxSelect,\n onLassoSelect: originalOnLassoSelect,\n onLassoStarted,\n onBoxStarted,\n onPan = true,\n onHover,\n onHoverNodeMargin,\n onNodeClick: originalOnNodeClick,\n onRelationshipClick: originalOnRelationshipClick,\n onDragStart: originalOnDragStart,\n onDragEnd: originalOnDragEnd,\n onDrawEnded: originalOnDrawEnded,\n onDrawStarted: originalOnDrawStarted,\n onCanvasClick: originalOnCanvasClick,\n onNodeDoubleClick: originalOnNodeDoubleClick,\n onRelationshipDoubleClick: originalOnRelationshipDoubleClick,\n\n onZoom: originalOnZoom,\n onZoomAndPan: originalOnZoomAndPan,\n } = mouseEventCallbacks;\n\n const onCanvasClick = useCallback(\n (evt: MouseEvent) => {\n if (isClickingOnTextInput(evt)) {\n return;\n }\n\n // Clear selection\n setSelected({ nodeIds: [], relationshipIds: [] });\n\n if (typeof originalOnCanvasClick === 'function') {\n originalOnCanvasClick(evt);\n }\n },\n [originalOnCanvasClick, setSelected],\n );\n\n const onDragStart = useCallback(\n (draggedNodes: Node[], evt: MouseEvent) => {\n setInteractionMode('drag');\n\n // Update Selection\n const draggedNodeIds = draggedNodes.map((node) => node.id);\n if (selected.nodeIds.length === 0 || isMultiSelectKeyPressed(evt)) {\n setSelected({\n nodeIds: draggedNodeIds,\n relationshipIds: selected.relationshipIds,\n });\n return;\n }\n setSelected({\n nodeIds: draggedNodeIds,\n relationshipIds: selected.relationshipIds,\n });\n\n if (typeof originalOnDragStart === 'function') {\n originalOnDragStart(draggedNodes, evt);\n }\n },\n [setSelected, originalOnDragStart, selected, setInteractionMode],\n );\n\n const onDragEnd = useCallback(\n (draggedNodes: Node[], evt: MouseEvent) => {\n if (typeof originalOnDragEnd === 'function') {\n originalOnDragEnd(draggedNodes, evt);\n }\n setInteractionMode('select');\n },\n [originalOnDragEnd, setInteractionMode],\n );\n\n // wrapping so that there's a function passed, even if the original function is undefined\n const onDrawStarted = useCallback(\n (evt: MouseEvent) => {\n if (typeof originalOnDrawStarted === 'function') {\n originalOnDrawStarted(evt);\n }\n },\n [originalOnDrawStarted],\n );\n\n const onDrawEnded = useCallback(\n (\n newRelationshipToAdd: Relationship | null,\n newTargetNodeToAdd: Node | null,\n event: MouseEvent,\n ) => {\n if (typeof originalOnDrawEnded === 'function') {\n originalOnDrawEnded(newRelationshipToAdd, newTargetNodeToAdd, event);\n }\n },\n [originalOnDrawEnded],\n );\n\n const onNodeClick = useCallback(\n (node: Node, hitElements: HitTargets, evt: MouseEvent) => {\n if (isClickingOnTextInput(evt)) {\n return;\n }\n\n if (isMultiSelectKeyPressed(evt)) {\n // if not selected, add to selection, otherwise deselect\n const isNodeSelected = selected.nodeIds.includes(node.id);\n if (isNodeSelected) {\n const newSelectedNodeIds = selected.nodeIds.filter(\n (id) => id !== node.id,\n );\n setSelected({\n nodeIds: newSelectedNodeIds,\n relationshipIds: selected.relationshipIds,\n });\n } else {\n const newSelectedNodeIds = [...selected.nodeIds, node.id];\n setSelected({\n nodeIds: newSelectedNodeIds,\n relationshipIds: selected.relationshipIds,\n });\n }\n } else {\n setSelected({ nodeIds: [node.id], relationshipIds: [] });\n }\n if (typeof originalOnNodeClick === 'function') {\n originalOnNodeClick(node, hitElements, evt);\n }\n },\n [setSelected, selected, originalOnNodeClick],\n );\n\n const onRelationshipClick = useCallback(\n (relationship: Relationship, hitElements: HitTargets, evt: MouseEvent) => {\n if (isClickingOnTextInput(evt)) {\n return;\n }\n\n if (isMultiSelectKeyPressed(evt)) {\n // if not selected, add to selection, otherwise deselect\n const isRelationshipSelected = selected.relationshipIds.includes(\n relationship.id,\n );\n if (isRelationshipSelected) {\n const newSelectedRelIds = selected.relationshipIds.filter(\n (id) => id !== relationship.id,\n );\n setSelected({\n nodeIds: selected.nodeIds,\n relationshipIds: newSelectedRelIds,\n });\n } else {\n const newSelectedRelIds = [\n ...selected.relationshipIds,\n relationship.id,\n ];\n setSelected({\n nodeIds: selected.nodeIds,\n relationshipIds: newSelectedRelIds,\n });\n }\n } else {\n setSelected({ nodeIds: [], relationshipIds: [relationship.id] });\n }\n if (typeof originalOnRelationshipClick === 'function') {\n originalOnRelationshipClick(relationship, hitElements, evt);\n }\n },\n [setSelected, selected, originalOnRelationshipClick],\n );\n\n const onNodeDoubleClick = useCallback(\n (node: Node, hitElements: HitTargets, evt: MouseEvent) => {\n if (isClickingOnTextInput(evt)) {\n return;\n }\n if (typeof originalOnNodeDoubleClick === 'function') {\n originalOnNodeDoubleClick(node, hitElements, evt);\n }\n },\n [originalOnNodeDoubleClick],\n );\n\n const onRelationshipDoubleClick = useCallback(\n (relationship: Relationship, hitElements: HitTargets, evt: MouseEvent) => {\n if (isClickingOnTextInput(evt)) {\n return;\n }\n if (typeof originalOnRelationshipDoubleClick === 'function') {\n originalOnRelationshipDoubleClick(relationship, hitElements, evt);\n }\n },\n [originalOnRelationshipDoubleClick],\n );\n\n const onMultiSelect = useCallback(\n (nodes: Node[], rels: Relationship[], evt: MouseEvent) => {\n const nodeIds = nodes.map((node) => node.id);\n const relationshipIds = rels.map((relationship) => relationship.id);\n if (isMultiSelectKeyPressed(evt)) {\n const currentlySelectedNodeIds = selected.nodeIds;\n const currentlySelectedRelIds = selected.relationshipIds;\n\n // Toggle selection: items that are already selected should be removed from selection,\n // those that are not should be added\n const xor = (firstIds: string[], secondIds: string[]) => [\n ...new Set(\n [...firstIds, ...secondIds].filter(\n (id) => !firstIds.includes(id) || !secondIds.includes(id),\n ),\n ),\n ];\n\n const newSelectedNodeIds = xor(currentlySelectedNodeIds, nodeIds);\n const newSelectedRelIds = xor(currentlySelectedRelIds, relationshipIds);\n\n setSelected({\n nodeIds: newSelectedNodeIds,\n relationshipIds: newSelectedRelIds,\n });\n } else {\n // REPLACE selection\n setSelected({ nodeIds: nodeIds, relationshipIds: relationshipIds });\n }\n },\n [setSelected, selected],\n );\n\n const onLassoSelect = useCallback(\n (\n { nodes, rels }: { nodes: Node[]; rels: Relationship[] },\n evt: MouseEvent,\n ) => {\n onMultiSelect(nodes, rels, evt);\n if (typeof originalOnLassoSelect === 'function') {\n originalOnLassoSelect({ nodes, rels }, evt);\n }\n },\n [onMultiSelect, originalOnLassoSelect],\n );\n\n const onBoxSelect = useCallback(\n (\n { nodes, rels }: { nodes: Node[]; rels: Relationship[] },\n evt: MouseEvent,\n ) => {\n onMultiSelect(nodes, rels, evt);\n if (typeof originalBoxSelect === 'function') {\n originalBoxSelect({ nodes, rels }, evt);\n }\n },\n [onMultiSelect, originalBoxSelect],\n );\n\n const isDrawMode = interactionMode === 'draw';\n\n const isSelectMode = interactionMode === 'select';\n const shouldEnableBox = isSelectMode && gesture === 'box';\n const shouldEnableLasso = isSelectMode && gesture === 'lasso';\n\n const shouldEnablePan =\n interactionMode === 'pan' || (isSelectMode && gesture === 'single');\n\n const canDrag = interactionMode === 'drag' || interactionMode === 'select';\n\n const hasCustomZoomCallback =\n originalOnZoom !== undefined || originalOnZoomAndPan !== undefined;\n\n const wrappedMouseEventCallbacks = useMemo(\n () => ({\n ...mouseEventCallbacks,\n onBoxSelect: shouldEnableBox ? onBoxSelect : false,\n onBoxStarted: shouldEnableBox ? onBoxStarted : false,\n onCanvasClick: isSelectMode ? onCanvasClick : false,\n onDragEnd: canDrag ? onDragEnd : false,\n onDragStart: canDrag ? onDragStart : false,\n onDrawEnded: isDrawMode ? onDrawEnded : false,\n onDrawStarted: isDrawMode ? onDrawStarted : false,\n onHover: isSelectMode ? onHover : false,\n onHoverNodeMargin: isDrawMode ? onHoverNodeMargin : false,\n onLassoSelect: shouldEnableLasso ? onLassoSelect : false,\n onLassoStarted: shouldEnableLasso ? onLassoStarted : false,\n onNodeClick: isSelectMode ? onNodeClick : false,\n onNodeDoubleClick: isSelectMode ? onNodeDoubleClick : false,\n onPan: shouldEnablePan ? onPan : false,\n onRelationshipClick: isSelectMode ? onRelationshipClick : false,\n onRelationshipDoubleClick: isSelectMode\n ? onRelationshipDoubleClick\n : false,\n onZoomAndPan: hasCustomZoomCallback ? originalOnZoomAndPan : true,\n }),\n [\n canDrag,\n shouldEnableBox,\n shouldEnableLasso,\n shouldEnablePan,\n isDrawMode,\n isSelectMode,\n mouseEventCallbacks,\n onBoxSelect,\n onBoxStarted,\n onCanvasClick,\n onDragEnd,\n onDragStart,\n onDrawEnded,\n onDrawStarted,\n onHover,\n onHoverNodeMargin,\n onLassoSelect,\n onLassoStarted,\n onNodeClick,\n onNodeDoubleClick,\n onPan,\n onRelationshipClick,\n onRelationshipDoubleClick,\n hasCustomZoomCallback,\n originalOnZoomAndPan,\n ],\n );\n\n const selectionSet = useMemo(\n () => ({\n nodeIds: new Set(selected.nodeIds),\n relIds: new Set(selected.relationshipIds),\n }),\n [selected],\n );\n\n const highlightedNodeSet = useMemo(\n () =>\n highlightedNodeIds !== undefined ? new Set(highlightedNodeIds) : null,\n [highlightedNodeIds],\n );\n const highlightedRelSet = useMemo(\n () =>\n highlightedRelationshipIds !== undefined\n ? new Set(highlightedRelationshipIds)\n : null,\n [highlightedRelationshipIds],\n );\n\n const nodesWithState = useMemo(\n () =>\n nvlGraph.nodes.map((node) => ({\n ...node,\n disabled: highlightedNodeSet ? !highlightedNodeSet.has(node.id) : false,\n selected: selectionSet.nodeIds.has(node.id),\n })),\n [nvlGraph.nodes, selectionSet, highlightedNodeSet],\n );\n\n const relsWithState = useMemo(\n () =>\n nvlGraph.rels.map((relationship) => ({\n ...relationship,\n disabled: highlightedRelSet\n ? !highlightedRelSet.has(relationship.id)\n : false,\n selected: selectionSet.relIds.has(relationship.id),\n })),\n [nvlGraph.rels, selectionSet, highlightedRelSet],\n );\n\n return { nodesWithState, relsWithState, wrappedMouseEventCallbacks };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"use-managed-node-state.js","sourceRoot":"","sources":["../../src/use-managed-node-state.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { type HitTargets, type Node, type Relationship } from '@neo4j-nvl/base';\nimport { type MouseEventCallbacks } from '@neo4j-nvl/react';\nimport { useCallback, useEffect, useMemo } from 'react';\n\nimport {\n type Gesture,\n type GraphSelection,\n type InteractionMode,\n} from './graph-visualization-context';\nimport { isMac } from './utils';\n\nconst isMultiSelectKeyPressed = (evt: MouseEvent): boolean =>\n (!isMac && evt.ctrlKey) || (isMac && evt.metaKey);\n\nconst isClickingOnTextInput = (event: MouseEvent): boolean => {\n if (!(event.target instanceof HTMLElement)) {\n return false;\n }\n return (\n event.target.isContentEditable ||\n ['INPUT', 'TEXTAREA'].includes(event.target.tagName)\n );\n};\n\nexport type ManagedNodeStateArgs = {\n selected: GraphSelection;\n setSelected: (newSelection: GraphSelection) => void;\n gesture: Gesture;\n interactionMode: InteractionMode;\n setInteractionMode: (newInteractionMode: InteractionMode) => void;\n mouseEventCallbacks: MouseEventCallbacks;\n nvlGraph: {\n nodes: Node[];\n rels: Relationship[];\n };\n highlightedNodeIds?: string[];\n highlightedRelationshipIds?: string[];\n};\n\nexport function useManagedNodeState({\n selected,\n setSelected,\n gesture,\n interactionMode,\n setInteractionMode,\n mouseEventCallbacks,\n nvlGraph,\n highlightedNodeIds,\n highlightedRelationshipIds,\n}: ManagedNodeStateArgs) {\n const panOnSpace = useCallback(\n (evt: KeyboardEvent) => {\n // We could check the gesture here\n // but it doesn't really matter if we switch to panning mode even in single select\n if (interactionMode === 'select' && evt.key === ' ') {\n setInteractionMode('pan');\n }\n },\n [interactionMode, setInteractionMode],\n );\n\n const stopPanningReleaseSpace = useCallback(\n (evt: KeyboardEvent) => {\n if (interactionMode === 'pan' && evt.key === ' ') {\n setInteractionMode('select');\n }\n },\n [interactionMode, setInteractionMode],\n );\n\n useEffect(() => {\n document.addEventListener('keydown', panOnSpace);\n document.addEventListener('keyup', stopPanningReleaseSpace);\n return () => {\n document.removeEventListener('keydown', panOnSpace);\n document.removeEventListener('keyup', stopPanningReleaseSpace);\n };\n }, [panOnSpace, stopPanningReleaseSpace]);\n\n const {\n onBoxSelect: originalBoxSelect,\n onLassoSelect: originalOnLassoSelect,\n onLassoStarted,\n onBoxStarted,\n onPan = true,\n onHover,\n onHoverNodeMargin,\n onNodeClick: originalOnNodeClick,\n onRelationshipClick: originalOnRelationshipClick,\n onDragStart: originalOnDragStart,\n onDragEnd: originalOnDragEnd,\n onDrawEnded: originalOnDrawEnded,\n onDrawStarted: originalOnDrawStarted,\n onCanvasClick: originalOnCanvasClick,\n onNodeDoubleClick: originalOnNodeDoubleClick,\n onRelationshipDoubleClick: originalOnRelationshipDoubleClick,\n\n onZoom: originalOnZoom,\n onZoomAndPan: originalOnZoomAndPan,\n } = mouseEventCallbacks;\n\n const onCanvasClick = useCallback(\n (evt: MouseEvent) => {\n if (isClickingOnTextInput(evt)) {\n return;\n }\n\n // Clear selection\n setSelected({ nodeIds: [], relationshipIds: [] });\n\n if (typeof originalOnCanvasClick === 'function') {\n originalOnCanvasClick(evt);\n }\n },\n [originalOnCanvasClick, setSelected],\n );\n\n const onDragStart = useCallback(\n (draggedNodes: Node[], evt: MouseEvent) => {\n setInteractionMode('drag');\n\n // Update Selection\n const draggedNodeIds = draggedNodes.map((node) => node.id);\n if (selected.nodeIds.length === 0 || isMultiSelectKeyPressed(evt)) {\n setSelected({\n nodeIds: draggedNodeIds,\n relationshipIds: selected.relationshipIds,\n });\n return;\n }\n setSelected({\n nodeIds: draggedNodeIds,\n relationshipIds: selected.relationshipIds,\n });\n\n if (typeof originalOnDragStart === 'function') {\n originalOnDragStart(draggedNodes, evt);\n }\n },\n [setSelected, originalOnDragStart, selected, setInteractionMode],\n );\n\n const onDragEnd = useCallback(\n (draggedNodes: Node[], evt: MouseEvent) => {\n if (typeof originalOnDragEnd === 'function') {\n originalOnDragEnd(draggedNodes, evt);\n }\n setInteractionMode('select');\n },\n [originalOnDragEnd, setInteractionMode],\n );\n\n // wrapping so that there's a function passed, even if the original function is undefined\n const onDrawStarted = useCallback(\n (evt: MouseEvent) => {\n if (typeof originalOnDrawStarted === 'function') {\n originalOnDrawStarted(evt);\n }\n },\n [originalOnDrawStarted],\n );\n\n const onDrawEnded = useCallback(\n (\n newRelationshipToAdd: Relationship | null,\n newTargetNodeToAdd: Node | null,\n event: MouseEvent,\n ) => {\n if (typeof originalOnDrawEnded === 'function') {\n originalOnDrawEnded(newRelationshipToAdd, newTargetNodeToAdd, event);\n }\n },\n [originalOnDrawEnded],\n );\n\n const onNodeClick = useCallback(\n (node: Node, hitElements: HitTargets, evt: MouseEvent) => {\n if (isClickingOnTextInput(evt)) {\n return;\n }\n\n if (isMultiSelectKeyPressed(evt)) {\n // if not selected, add to selection, otherwise deselect\n const isNodeSelected = selected.nodeIds.includes(node.id);\n if (isNodeSelected) {\n const newSelectedNodeIds = selected.nodeIds.filter(\n (id) => id !== node.id,\n );\n setSelected({\n nodeIds: newSelectedNodeIds,\n relationshipIds: selected.relationshipIds,\n });\n } else {\n const newSelectedNodeIds = [...selected.nodeIds, node.id];\n setSelected({\n nodeIds: newSelectedNodeIds,\n relationshipIds: selected.relationshipIds,\n });\n }\n } else {\n setSelected({ nodeIds: [node.id], relationshipIds: [] });\n }\n if (typeof originalOnNodeClick === 'function') {\n originalOnNodeClick(node, hitElements, evt);\n }\n },\n [setSelected, selected, originalOnNodeClick],\n );\n\n const onRelationshipClick = useCallback(\n (relationship: Relationship, hitElements: HitTargets, evt: MouseEvent) => {\n if (isClickingOnTextInput(evt)) {\n return;\n }\n\n if (isMultiSelectKeyPressed(evt)) {\n // if not selected, add to selection, otherwise deselect\n const isRelationshipSelected = selected.relationshipIds.includes(\n relationship.id,\n );\n if (isRelationshipSelected) {\n const newSelectedRelIds = selected.relationshipIds.filter(\n (id) => id !== relationship.id,\n );\n setSelected({\n nodeIds: selected.nodeIds,\n relationshipIds: newSelectedRelIds,\n });\n } else {\n const newSelectedRelIds = [\n ...selected.relationshipIds,\n relationship.id,\n ];\n setSelected({\n nodeIds: selected.nodeIds,\n relationshipIds: newSelectedRelIds,\n });\n }\n } else {\n setSelected({ nodeIds: [], relationshipIds: [relationship.id] });\n }\n if (typeof originalOnRelationshipClick === 'function') {\n originalOnRelationshipClick(relationship, hitElements, evt);\n }\n },\n [setSelected, selected, originalOnRelationshipClick],\n );\n\n const onNodeDoubleClick = useCallback(\n (node: Node, hitElements: HitTargets, evt: MouseEvent) => {\n if (isClickingOnTextInput(evt)) {\n return;\n }\n if (typeof originalOnNodeDoubleClick === 'function') {\n originalOnNodeDoubleClick(node, hitElements, evt);\n }\n },\n [originalOnNodeDoubleClick],\n );\n\n const onRelationshipDoubleClick = useCallback(\n (relationship: Relationship, hitElements: HitTargets, evt: MouseEvent) => {\n if (isClickingOnTextInput(evt)) {\n return;\n }\n if (typeof originalOnRelationshipDoubleClick === 'function') {\n originalOnRelationshipDoubleClick(relationship, hitElements, evt);\n }\n },\n [originalOnRelationshipDoubleClick],\n );\n\n const onMultiSelect = useCallback(\n (nodes: Node[], rels: Relationship[], evt: MouseEvent) => {\n const nodeIds = nodes.map((node) => node.id);\n const relationshipIds = rels.map((relationship) => relationship.id);\n if (isMultiSelectKeyPressed(evt)) {\n const currentlySelectedNodeIds = selected.nodeIds;\n const currentlySelectedRelIds = selected.relationshipIds;\n\n // Toggle selection: items that are already selected should be removed from selection,\n // those that are not should be added\n const xor = (firstIds: string[], secondIds: string[]) => [\n ...new Set(\n [...firstIds, ...secondIds].filter(\n (id) => !firstIds.includes(id) || !secondIds.includes(id),\n ),\n ),\n ];\n\n const newSelectedNodeIds = xor(currentlySelectedNodeIds, nodeIds);\n const newSelectedRelIds = xor(currentlySelectedRelIds, relationshipIds);\n\n setSelected({\n nodeIds: newSelectedNodeIds,\n relationshipIds: newSelectedRelIds,\n });\n } else {\n // REPLACE selection\n setSelected({ nodeIds: nodeIds, relationshipIds: relationshipIds });\n }\n },\n [setSelected, selected],\n );\n\n const onLassoSelect = useCallback(\n (\n { nodes, rels }: { nodes: Node[]; rels: Relationship[] },\n evt: MouseEvent,\n ) => {\n onMultiSelect(nodes, rels, evt);\n if (typeof originalOnLassoSelect === 'function') {\n originalOnLassoSelect({ nodes, rels }, evt);\n }\n },\n [onMultiSelect, originalOnLassoSelect],\n );\n\n const onBoxSelect = useCallback(\n (\n { nodes, rels }: { nodes: Node[]; rels: Relationship[] },\n evt: MouseEvent,\n ) => {\n onMultiSelect(nodes, rels, evt);\n if (typeof originalBoxSelect === 'function') {\n originalBoxSelect({ nodes, rels }, evt);\n }\n },\n [onMultiSelect, originalBoxSelect],\n );\n\n const isDrawMode = interactionMode === 'draw';\n\n const isSelectMode = interactionMode === 'select';\n const shouldEnableBox = isSelectMode && gesture === 'box';\n const shouldEnableLasso = isSelectMode && gesture === 'lasso';\n\n const shouldEnablePan =\n interactionMode === 'pan' || (isSelectMode && gesture === 'single');\n\n const canDrag = interactionMode === 'drag' || interactionMode === 'select';\n\n const hasCustomZoomCallback =\n originalOnZoom !== undefined || originalOnZoomAndPan !== undefined;\n\n const wrappedMouseEventCallbacks = useMemo(\n () => ({\n ...mouseEventCallbacks,\n onBoxSelect: shouldEnableBox ? onBoxSelect : false,\n onBoxStarted: shouldEnableBox ? onBoxStarted : false,\n onCanvasClick: isSelectMode ? onCanvasClick : false,\n onDragEnd: canDrag ? onDragEnd : false,\n onDragStart: canDrag ? onDragStart : false,\n onDrawEnded: isDrawMode ? onDrawEnded : false,\n onDrawStarted: isDrawMode ? onDrawStarted : false,\n onHover: isSelectMode ? onHover : false,\n onHoverNodeMargin: isDrawMode ? onHoverNodeMargin : false,\n onLassoSelect: shouldEnableLasso ? onLassoSelect : false,\n onLassoStarted: shouldEnableLasso ? onLassoStarted : false,\n onNodeClick: isSelectMode ? onNodeClick : false,\n onNodeDoubleClick: isSelectMode ? onNodeDoubleClick : false,\n onPan: shouldEnablePan ? onPan : false,\n onRelationshipClick: isSelectMode ? onRelationshipClick : false,\n onRelationshipDoubleClick: isSelectMode\n ? onRelationshipDoubleClick\n : false,\n onZoomAndPan: hasCustomZoomCallback ? originalOnZoomAndPan : true,\n }),\n [\n canDrag,\n shouldEnableBox,\n shouldEnableLasso,\n shouldEnablePan,\n isDrawMode,\n isSelectMode,\n mouseEventCallbacks,\n onBoxSelect,\n onBoxStarted,\n onCanvasClick,\n onDragEnd,\n onDragStart,\n onDrawEnded,\n onDrawStarted,\n onHover,\n onHoverNodeMargin,\n onLassoSelect,\n onLassoStarted,\n onNodeClick,\n onNodeDoubleClick,\n onPan,\n onRelationshipClick,\n onRelationshipDoubleClick,\n hasCustomZoomCallback,\n originalOnZoomAndPan,\n ],\n );\n\n const selectionSet = useMemo(\n () => ({\n nodeIds: new Set(selected.nodeIds),\n relIds: new Set(selected.relationshipIds),\n }),\n [selected],\n );\n\n const highlightedNodeSet = useMemo(\n () =>\n highlightedNodeIds !== undefined ? new Set(highlightedNodeIds) : null,\n [highlightedNodeIds],\n );\n const highlightedRelSet = useMemo(\n () =>\n highlightedRelationshipIds !== undefined\n ? new Set(highlightedRelationshipIds)\n : null,\n [highlightedRelationshipIds],\n );\n\n const nodesWithState = useMemo(\n () =>\n nvlGraph.nodes.map((node) => ({\n ...node,\n disabled: highlightedNodeSet ? !highlightedNodeSet.has(node.id) : false,\n selected: selectionSet.nodeIds.has(node.id),\n })),\n [nvlGraph.nodes, selectionSet, highlightedNodeSet],\n );\n\n const relsWithState = useMemo(\n () =>\n nvlGraph.rels.map((relationship) => ({\n ...relationship,\n disabled: highlightedRelSet\n ? !highlightedRelSet.has(relationship.id)\n : false,\n selected: selectionSet.relIds.has(relationship.id),\n })),\n [nvlGraph.rels, selectionSet, highlightedRelSet],\n );\n\n return { nodesWithState, relsWithState, wrappedMouseEventCallbacks };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-semi-controlled-state.js","sourceRoot":"","sources":["../../src/use-semi-controlled-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAUvD,MAAM,UAAU,sBAAsB,CAAI,EACxC,KAAK,EACL,QAAQ,EACR,YAAY,GACmB;IAC/B,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAI,KAAK,CAAC,CAAC;IAEnD,iCAAiC;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE;QAC3B,OAAO,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IAClD,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEpC,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,IAAuB,EAAE,EAAE;QAC1B,MAAM,QAAQ,GACZ,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAE,IAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAExE,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,WAAW,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;QACD,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,QAAQ,CAAC,CAAC;IACvB,CAAC,EACD,CAAC,YAAY,EAAE,OAAO,EAAE,QAAQ,CAAC,CAClC,CAAC;IAEF,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC","sourcesContent":["
|
|
1
|
+
{"version":3,"file":"use-semi-controlled-state.js","sourceRoot":"","sources":["../../src/use-semi-controlled-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAUvD,MAAM,UAAU,sBAAsB,CAAI,EACxC,KAAK,EACL,QAAQ,EACR,YAAY,GACmB;IAC/B,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAI,KAAK,CAAC,CAAC;IAEnD,iCAAiC;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE;QAC3B,OAAO,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IAClD,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEpC,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,IAAuB,EAAE,EAAE;QAC1B,MAAM,QAAQ,GACZ,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAE,IAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAExE,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,WAAW,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;QACD,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,QAAQ,CAAC,CAAC;IACvB,CAAC,EACD,CAAC,YAAY,EAAE,OAAO,EAAE,QAAQ,CAAC,CAClC,CAAC;IAEF,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC","sourcesContent":["/*!\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\n\ntype SetStateAction<T> = T | ((prev: T) => T);\n\ntype UseSemiControlledStateProps<T> = {\n state: T;\n onChange?: (next: T) => void;\n isControlled?: boolean;\n};\n\nexport function useSemicontrolledState<T>({\n state,\n onChange,\n isControlled,\n}: UseSemiControlledStateProps<T>): [T, (setState: SetStateAction<T>) => void] {\n const [internal, setInternal] = useState<T>(state);\n\n // Decide which state is \"active\"\n const current = useMemo(() => {\n return isControlled === true ? state : internal;\n }, [isControlled, state, internal]);\n\n const setState = useCallback(\n (next: SetStateAction<T>) => {\n const resolved =\n typeof next === 'function' ? (next as (prev: T) => T)(current) : next;\n\n if (isControlled !== true) {\n setInternal(resolved);\n }\n onChange?.(resolved);\n },\n [isControlled, current, onChange],\n );\n\n return [current, setState];\n}\n"]}
|
package/lib/esm/utils.js
CHANGED