@petrarca/sonnet-graph 0.5.0 → 0.7.0
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/README.md +89 -118
- package/dist/index.d.ts +51 -31
- package/dist/index.js +51 -27
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -1,35 +1,33 @@
|
|
|
1
1
|
# @petrarca/sonnet-graph
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
**
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
**
|
|
26
|
-
|
|
27
|
-
`
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
---
|
|
3
|
+
Property-graph visualization for the Petrarca Sonnet component library. The
|
|
4
|
+
state and the transformations are renderer-independent; Cytoscape and Reagraph
|
|
5
|
+
are two implementations of the drawing surface, switched at runtime
|
|
6
|
+
([ADR-0004](../../docs/adr/0004-graph-rendering-is-renderer-agnostic.md)).
|
|
7
|
+
|
|
8
|
+
## What it provides
|
|
9
|
+
|
|
10
|
+
**A viewer.** `GraphVisualizer` draws the graph through the active renderer,
|
|
11
|
+
with selection, focus mode, hide and show, and expansion.
|
|
12
|
+
`GraphRendererProvider` holds the choice and reports changes so a host can
|
|
13
|
+
persist it; `ActionPanel` shows the selected element and its actions.
|
|
14
|
+
|
|
15
|
+
**An accessible list.** Both renderers draw outside the DOM, so `GraphA11yList`
|
|
16
|
+
mirrors the selectable elements as buttons driving the same selection store,
|
|
17
|
+
`sr-only` by default and displayable as an outline panel.
|
|
18
|
+
|
|
19
|
+
**Stores and transforms.** `createGraphDataStore`, `createGraphFilterStore`,
|
|
20
|
+
`createGraphExplorationStore`, `createSelectionStore`, `createGraphFocusStore`
|
|
21
|
+
and `createActionPanelStore`, plus `enrichNodes`, `enrichEdges`,
|
|
22
|
+
`normalizeGraph` and the palette builders. The consumer creates the stores, so
|
|
23
|
+
two graph views in one application are isolated.
|
|
24
|
+
|
|
25
|
+
**Two editors.** `GraphModelEditor` authors the metamodel -- node types, edge
|
|
26
|
+
types, relations -- as a graph over a controlled `value`. The `graph-edit`
|
|
27
|
+
surface (`GraphEditToolbar`, `NodeFormSheet`, `EdgeFormSheet`,
|
|
28
|
+
`DeleteNodeDialog`) edits the instance data, writing through a
|
|
29
|
+
`GraphMutationPort` you implement and reading schemas from a
|
|
30
|
+
`GraphSchemaProvider` you supply. Nothing here does I/O of its own.
|
|
33
31
|
|
|
34
32
|
## Install
|
|
35
33
|
|
|
@@ -37,108 +35,81 @@ preparing raw graph data before passing it to stores.
|
|
|
37
35
|
pnpm add @petrarca/sonnet-graph
|
|
38
36
|
```
|
|
39
37
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
38
|
+
| Peer | Range | Needed for |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| `react`, `react-dom` | `>=19` | Everything |
|
|
41
|
+
| `lucide-react` | `>=0.300` | Toolbar and panel icons |
|
|
42
|
+
| `cytoscape` | `>=3` | The Cytoscape renderer |
|
|
43
|
+
| `cytoscape-cola`, `cytoscape-cise`, `cytoscape-cxtmenu`, `cytoscape-dagre`, `cytoscape-elk`, `cytoscape-fcose`, `cytoscape-klay` | `>=1` to `>=3` | Cytoscape layouts and the context menu |
|
|
44
|
+
| `reagraph` | `>=4` | The Reagraph renderer |
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
**The renderer peers are declared optional, and are not optional in practice.**
|
|
47
|
+
Both renderers and all seven Cytoscape plugins are statically imported at
|
|
48
|
+
module scope, so `peerDependenciesMeta.optional` only stops your package manager
|
|
49
|
+
warning at install time. Omit any one of the nine and importing
|
|
50
|
+
`GraphVisualizer` fails; there is no supported subset.
|
|
47
51
|
|
|
48
|
-
|
|
52
|
+
The plugin specifiers must also resolve from your own `node_modules`. If your
|
|
53
|
+
bundler resolves this package from anywhere else -- a linked checkout, a build
|
|
54
|
+
output outside the project, any alias pointing elsewhere -- resolution starts
|
|
55
|
+
from that location and there is nothing to find. Alias all seven plugin
|
|
56
|
+
specifiers to your own `node_modules`; a partial list fails on whichever one was
|
|
57
|
+
left out, when the renderer first mounts. The configuration is in
|
|
58
|
+
[getting started](docs/usage/getting-started.md).
|
|
49
59
|
|
|
50
|
-
|
|
51
|
-
pnpm add cytoscape # Cytoscape.js renderer
|
|
52
|
-
pnpm add reagraph # Reagraph (3D/WebGL) renderer
|
|
53
|
-
```
|
|
60
|
+
## Usage
|
|
54
61
|
|
|
55
|
-
|
|
56
|
-
both `cytoscape` and `reagraph` are required even if your app only uses one renderer.
|
|
57
|
-
|
|
58
|
-
### Cytoscape layout plugins (optional)
|
|
59
|
-
|
|
60
|
-
Install the layout algorithms you need. All are optional — the graph works
|
|
61
|
-
without them but with fewer layout options:
|
|
62
|
-
|
|
63
|
-
```bash
|
|
64
|
-
pnpm add cytoscape-fcose # Force-directed, compound graph
|
|
65
|
-
pnpm add cytoscape-cola # Constraint-based
|
|
66
|
-
pnpm add cytoscape-dagre # DAG / hierarchical
|
|
67
|
-
pnpm add cytoscape-elk # Eclipse Layout Kernel
|
|
68
|
-
pnpm add cytoscape-cise # Circular layout
|
|
69
|
-
pnpm add cytoscape-klay # KLay hierarchical
|
|
70
|
-
pnpm add cytoscape-cxtmenu # Context menu extension
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
### Local development with SONNET_UI_LOCAL=1
|
|
74
|
-
|
|
75
|
-
When resolving `@petrarca/sonnet-graph` from the local dist (via Vite aliases),
|
|
76
|
-
the Cytoscape plugins must also be aliased to the consumer's `node_modules` —
|
|
77
|
-
Vite cannot find them relative to the dist file. Add to your `sonnet-aliases.ts`:
|
|
78
|
-
|
|
79
|
-
```ts
|
|
80
|
-
const nm = path.resolve(baseDir, "node_modules");
|
|
81
|
-
// ...
|
|
82
|
-
"cytoscape-fcose": path.resolve(nm, "cytoscape-fcose"),
|
|
83
|
-
"cytoscape-cola": path.resolve(nm, "cytoscape-cola"),
|
|
84
|
-
"cytoscape-dagre": path.resolve(nm, "cytoscape-dagre"),
|
|
85
|
-
"cytoscape-elk": path.resolve(nm, "cytoscape-elk"),
|
|
86
|
-
"cytoscape-cise": path.resolve(nm, "cytoscape-cise"),
|
|
87
|
-
"cytoscape-klay": path.resolve(nm, "cytoscape-klay"),
|
|
88
|
-
"cytoscape-cxtmenu": path.resolve(nm, "cytoscape-cxtmenu"),
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
See `sonnet-ui-starter/sonnet-aliases.ts` for a complete reference implementation.
|
|
92
|
-
|
|
93
|
-
---
|
|
94
|
-
|
|
95
|
-
## Basic usage
|
|
62
|
+
Create the stores once, never in a render body, and give the container a height.
|
|
96
63
|
|
|
97
64
|
```tsx
|
|
98
65
|
import {
|
|
99
|
-
GraphVisualizer,
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
GraphStoresContext,
|
|
103
|
-
createGraphDataStore,
|
|
104
|
-
createGraphFilterStore,
|
|
105
|
-
createGraphExplorationStore,
|
|
106
|
-
createSelectionStore,
|
|
107
|
-
createGraphFocusStore,
|
|
108
|
-
enrichNodes,
|
|
109
|
-
enrichEdges,
|
|
110
|
-
buildColorPalette,
|
|
111
|
-
type RawGraphNode,
|
|
112
|
-
type RawGraphEdge,
|
|
113
|
-
type WorkspaceStores,
|
|
66
|
+
GraphRendererProvider, GraphStoresContext, GraphVisualizer,
|
|
67
|
+
createGraphDataStore, createGraphExplorationStore, createGraphFilterStore,
|
|
68
|
+
createGraphFocusStore, createSelectionStore, type WorkspaceStores,
|
|
114
69
|
} from "@petrarca/sonnet-graph";
|
|
115
70
|
|
|
116
|
-
|
|
71
|
+
const graphData = createGraphDataStore();
|
|
72
|
+
const graphFilter = createGraphFilterStore();
|
|
73
|
+
const selection = createSelectionStore();
|
|
74
|
+
|
|
75
|
+
// WorkspaceStores has exactly these four members. The focus store is a
|
|
76
|
+
// dependency of the exploration store, which requires its deps object.
|
|
117
77
|
const stores: WorkspaceStores = {
|
|
118
|
-
graphData
|
|
119
|
-
graphFilter
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
78
|
+
graphData,
|
|
79
|
+
graphFilter,
|
|
80
|
+
selection,
|
|
81
|
+
graphExploration: createGraphExplorationStore({
|
|
82
|
+
graphData,
|
|
83
|
+
selection,
|
|
84
|
+
graphFilter,
|
|
85
|
+
graphFocus: createGraphFocusStore(),
|
|
86
|
+
expandNode: async () => ({ nodes: [], edges: [], has_more: false }),
|
|
87
|
+
getNodes: async () => [],
|
|
88
|
+
}),
|
|
123
89
|
};
|
|
124
90
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
</GraphRendererProvider>
|
|
135
|
-
</GraphStoresContext.Provider>
|
|
136
|
-
);
|
|
137
|
-
}
|
|
91
|
+
const GraphView = () => (
|
|
92
|
+
<GraphStoresContext.Provider value={stores}>
|
|
93
|
+
<GraphRendererProvider defaultRenderer="cytoscape">
|
|
94
|
+
<div className="h-[600px] w-full">
|
|
95
|
+
<GraphVisualizer />
|
|
96
|
+
</div>
|
|
97
|
+
</GraphRendererProvider>
|
|
98
|
+
</GraphStoresContext.Provider>
|
|
99
|
+
);
|
|
138
100
|
```
|
|
139
101
|
|
|
140
|
-
|
|
102
|
+
## Documentation
|
|
103
|
+
|
|
104
|
+
- [Usage guides](docs/usage/index.md) -- getting started,
|
|
105
|
+
[stores and data](docs/usage/stores-and-data.md),
|
|
106
|
+
[exploration and selection](docs/usage/exploration-and-selection.md),
|
|
107
|
+
[accessibility](docs/usage/accessibility.md), and both editors:
|
|
108
|
+
[model](docs/usage/model-editing.md) and
|
|
109
|
+
[instance](docs/usage/instance-editing.md).
|
|
110
|
+
- [Design docs](docs/design/index.md) -- the renderer boundary and both editors.
|
|
111
|
+
- [Workspace documentation](../../docs/README.md) -- how the packages layer.
|
|
141
112
|
|
|
142
113
|
## License
|
|
143
114
|
|
|
144
|
-
See [LICENSE.md](../../LICENSE.md).
|
|
115
|
+
Apache 2.0. See [LICENSE.md](../../LICENSE.md).
|
package/dist/index.d.ts
CHANGED
|
@@ -419,7 +419,7 @@ declare function createGraphDataStore(): zustand.UseBoundStore<zustand.StoreApi<
|
|
|
419
419
|
/**
|
|
420
420
|
* GraphFilterStore - Node/edge label filtering and data-change tracking.
|
|
421
421
|
*
|
|
422
|
-
* Graph-generic filtering store. Separated from
|
|
422
|
+
* Graph-generic filtering store. Separated from query-language-specific
|
|
423
423
|
* query editing (QueryEditorStore stays in the consumer).
|
|
424
424
|
*/
|
|
425
425
|
interface GraphFilterStore {
|
|
@@ -679,19 +679,34 @@ type StoreFactory<T> = () => UseBoundStore<StoreApi<T>>;
|
|
|
679
679
|
* Bundle of graph-related workspace-scoped store instances.
|
|
680
680
|
* Each workspace gets its own isolated set of these stores.
|
|
681
681
|
*
|
|
682
|
-
* Note: QueryEditorStore stays in the consumer
|
|
683
|
-
*
|
|
682
|
+
* Note: QueryEditorStore stays in the consumer since it is
|
|
683
|
+
* query-language-specific, not part of generic graph visualization.
|
|
684
684
|
*/
|
|
685
685
|
interface WorkspaceStores {
|
|
686
686
|
graphFilter: UseBoundStore<StoreApi<GraphFilterStore>>;
|
|
687
687
|
graphData: UseBoundStore<StoreApi<GraphDataStore>>;
|
|
688
688
|
graphExploration: UseBoundStore<StoreApi<GraphExplorationStore>>;
|
|
689
689
|
selection: UseBoundStore<StoreApi<SelectionStore>>;
|
|
690
|
+
/**
|
|
691
|
+
* Focus is workspace-scoped, not global.
|
|
692
|
+
*
|
|
693
|
+
* It is a two-part protocol, and both parts belong to one graph surface:
|
|
694
|
+
* `focusAction` is the request, and `overrideElementIds` is what makes a
|
|
695
|
+
* filtered-out element visible so the request can be carried out --
|
|
696
|
+
* useLiveGraphData merges those ids back past every filter. Sharing the store
|
|
697
|
+
* across surfaces would let a focus in one punch a hole in another's data.
|
|
698
|
+
*
|
|
699
|
+
* GraphExploration already writes focus through an injected store; before
|
|
700
|
+
* this, the readers used the module singleton instead, so a host that created
|
|
701
|
+
* an isolated focus store (the model editor, the playground) had its requests
|
|
702
|
+
* land where nothing was listening.
|
|
703
|
+
*/
|
|
704
|
+
graphFocus: UseBoundStore<StoreApi<GraphFocusStore>>;
|
|
690
705
|
}
|
|
691
706
|
|
|
692
707
|
/**
|
|
693
708
|
* Context for providing graph stores to visualization components.
|
|
694
|
-
* Must be set by the host application
|
|
709
|
+
* Must be set by the host application.
|
|
695
710
|
*/
|
|
696
711
|
declare const GraphStoresContext: React.Context<WorkspaceStores | null>;
|
|
697
712
|
/** Get GraphFilter store from context. */
|
|
@@ -702,6 +717,14 @@ declare function useWorkspaceGraphData(): UseBoundStore<StoreApi<GraphDataStore>
|
|
|
702
717
|
declare function useWorkspaceGraphExploration(): UseBoundStore<StoreApi<GraphExplorationStore>>;
|
|
703
718
|
/** Get Selection store from context. */
|
|
704
719
|
declare function useWorkspaceSelection(): UseBoundStore<StoreApi<SelectionStore>>;
|
|
720
|
+
/**
|
|
721
|
+
* Get GraphFocus store from context.
|
|
722
|
+
*
|
|
723
|
+
* Read this rather than importing the module singleton: focus is scoped to a
|
|
724
|
+
* graph surface, so a host with more than one (an explorer plus a model editor)
|
|
725
|
+
* keeps them independent.
|
|
726
|
+
*/
|
|
727
|
+
declare function useWorkspaceGraphFocus(): UseBoundStore<StoreApi<GraphFocusStore>>;
|
|
705
728
|
|
|
706
729
|
declare function useStableRef<T extends (...args: never[]) => unknown>(fn: T): T;
|
|
707
730
|
declare function useStableRef<T extends (...args: never[]) => unknown>(fn: T | undefined): T | undefined;
|
|
@@ -906,7 +929,7 @@ declare function GraphA11yList({ visible, rowHeight, maxHeight, className, }: Gr
|
|
|
906
929
|
* A graph model is a list of type schemas, each a JSON Schema carrying an
|
|
907
930
|
* `x-graph` extension that declares whether it is a node or edge type, its
|
|
908
931
|
* graph label, and (for node types) the valid outbound relations. This mirrors
|
|
909
|
-
* the shape consumed by
|
|
932
|
+
* the shape consumed by the schema-to-graph backend, so a model authored here is a
|
|
910
933
|
* valid model there.
|
|
911
934
|
*
|
|
912
935
|
* The model is the source of truth. It is rendered as a graph of node-types and
|
|
@@ -998,7 +1021,7 @@ declare function typeLabel(schema: GraphTypeSchema): string;
|
|
|
998
1021
|
* and `GraphVisualizer`. The model JSON is the source of truth; there is no
|
|
999
1022
|
* reverse conversion.
|
|
1000
1023
|
*
|
|
1001
|
-
*
|
|
1024
|
+
* Converts JSON Schemas to a graph model with two deliberate
|
|
1002
1025
|
* differences:
|
|
1003
1026
|
* - Node/edge ids are derived deterministically from type/relation names so
|
|
1004
1027
|
* the same model always yields the same ids (required for visualizer merge,
|
|
@@ -1503,17 +1526,16 @@ declare function NodeTypeNameSheet({ open, onOpenChange, initial, existing, noun
|
|
|
1503
1526
|
*
|
|
1504
1527
|
* The write analog of the read-side injected dependencies
|
|
1505
1528
|
* (`GraphExplorationDeps` / `GraphDataHook`). The library's editing components
|
|
1506
|
-
* call only this port; they never see HTTP, auth,
|
|
1507
|
-
* consumer implements the port against its own backend
|
|
1508
|
-
* existing `graphService`; a new consumer wraps its own graph REST API).
|
|
1529
|
+
* call only this port; they never see HTTP, auth, a query language, or a cache.
|
|
1530
|
+
* Each consumer implements the port against its own backend.
|
|
1509
1531
|
*
|
|
1510
|
-
* Node/edge ids are numeric, matching `RawGraphNode.id_` / `RawGraphEdge.id_
|
|
1511
|
-
*
|
|
1512
|
-
*
|
|
1532
|
+
* Node/edge ids are numeric, matching `RawGraphNode.id_` / `RawGraphEdge.id_`.
|
|
1533
|
+
* (If a future consumer keys nodes by string, this would widen to
|
|
1534
|
+
* `number | string`.)
|
|
1513
1535
|
*
|
|
1514
1536
|
* The port is EVENT-FREE: it `await`s and returns the mutation result; it does
|
|
1515
1537
|
* not own a cache and emits no events. The consumer wraps the port to patch its
|
|
1516
|
-
* own cache
|
|
1538
|
+
* own cache.
|
|
1517
1539
|
*
|
|
1518
1540
|
* Relations stay ATOMIC: `createNodeWithRelations` / `updateNodeWithRelations`
|
|
1519
1541
|
* are single port methods, not decomposed into node + edge calls in the
|
|
@@ -1585,8 +1607,8 @@ interface UpdateNodeWithRelationsResult {
|
|
|
1585
1607
|
};
|
|
1586
1608
|
}
|
|
1587
1609
|
/**
|
|
1588
|
-
* The injected write interface. Shapes
|
|
1589
|
-
*
|
|
1610
|
+
* The injected write interface. Shapes are deliberately close to a typical
|
|
1611
|
+
* graph REST service, so a consumer's adapter can be a thin wrapper.
|
|
1590
1612
|
*/
|
|
1591
1613
|
interface GraphMutationPort {
|
|
1592
1614
|
createNode(input: CreateNodeInput): Promise<RawGraphNode>;
|
|
@@ -1606,8 +1628,7 @@ interface GraphMutationPort {
|
|
|
1606
1628
|
getPairEdges(a: number, b: number): Promise<RawGraphEdge[]>;
|
|
1607
1629
|
/**
|
|
1608
1630
|
* Fetch nodes by id -- used by the delete-node dialog to resolve the display
|
|
1609
|
-
* names of dependent (neighbour) nodes.
|
|
1610
|
-
* graphService.getNodes.
|
|
1631
|
+
* names of dependent (neighbour) nodes.
|
|
1611
1632
|
*/
|
|
1612
1633
|
getNodes(ids: number[]): Promise<RawGraphNode[]>;
|
|
1613
1634
|
}
|
|
@@ -1646,7 +1667,7 @@ interface RelationDef {
|
|
|
1646
1667
|
/**
|
|
1647
1668
|
* Whether this relation is surfaced as an editable form field. Only relations
|
|
1648
1669
|
* with `form_field === true` become `__rel_*` fields in the node form
|
|
1649
|
-
*
|
|
1670
|
+
* Defaults to not-a-field.
|
|
1650
1671
|
*/
|
|
1651
1672
|
form_field?: boolean;
|
|
1652
1673
|
/**
|
|
@@ -1658,8 +1679,8 @@ interface RelationDef {
|
|
|
1658
1679
|
title?: string;
|
|
1659
1680
|
/**
|
|
1660
1681
|
* Optional widget hint for the relation field (the `x-ui-widget` value).
|
|
1661
|
-
* Defaults to "entity-select".
|
|
1662
|
-
*
|
|
1682
|
+
* Defaults to "entity-select". A consumer can override it with a custom
|
|
1683
|
+
* widget name; the widget itself is supplied app-level via the registry.
|
|
1663
1684
|
*/
|
|
1664
1685
|
widget?: string;
|
|
1665
1686
|
}
|
|
@@ -1773,11 +1794,10 @@ declare function validateGraphCapabilities(input: unknown): GraphCapabilitiesVal
|
|
|
1773
1794
|
* convert between that flat form shape and the structured
|
|
1774
1795
|
* `{ properties, relations }` the mutation port expects.
|
|
1775
1796
|
*
|
|
1776
|
-
*
|
|
1777
|
-
*
|
|
1778
|
-
*
|
|
1779
|
-
*
|
|
1780
|
-
* hardcoded backend call.
|
|
1797
|
+
* Kept here so every consumer of the shared editor gets the same relation
|
|
1798
|
+
* handling. The functions are pure -- no I/O. Reads of a node's existing
|
|
1799
|
+
* relations go through the injected `GraphMutationPort` (getInboundEdges /
|
|
1800
|
+
* getOutboundEdges), not a hardcoded backend call.
|
|
1781
1801
|
*/
|
|
1782
1802
|
|
|
1783
1803
|
/** A per-field UI schema map, as JsonSchemaFormRenderer's `uiSchema` prop. */
|
|
@@ -1814,17 +1834,17 @@ declare function extractRelationFields(formData: Record<string, unknown>): {
|
|
|
1814
1834
|
/** Whether any form key is a relation field (decides the atomic save path). */
|
|
1815
1835
|
declare function hasRelationFields(formData: Record<string, unknown>): boolean;
|
|
1816
1836
|
/** Title-case a relation type for a default field title ("USES_TECHNOLOGY" ->
|
|
1817
|
-
* "Uses Technology").
|
|
1837
|
+
* "Uses Technology"). */
|
|
1818
1838
|
declare function relationTitle(relationType: string): string;
|
|
1819
1839
|
/** A relation is editable (becomes a form field) when form_field === true,
|
|
1820
|
-
*
|
|
1840
|
+
* for display. */
|
|
1821
1841
|
declare function editableRelations(relations: RelationDef[]): RelationDef[];
|
|
1822
1842
|
/** Whether a node/edge schema declares any properties (gates "Edit edge" the
|
|
1823
|
-
* same way the
|
|
1843
|
+
* same way the has-properties check does). */
|
|
1824
1844
|
declare function hasProperties(schema: JsonSchema | null | undefined): boolean;
|
|
1825
1845
|
/**
|
|
1826
1846
|
* Enrich a node schema with a `__rel_*` field per editable relation, returning
|
|
1827
|
-
* a new `{ schema, uiSchema }`.
|
|
1847
|
+
* a new `{ schema, uiSchema }`. Enrichment:
|
|
1828
1848
|
* - field type is `array of integer` (multi) for ONE_TO_MANY / unset
|
|
1829
1849
|
* cardinality, or `integer` (single) for ONE_TO_ONE;
|
|
1830
1850
|
* - the field title is the relation's title or a Title-Cased label;
|
|
@@ -1845,7 +1865,7 @@ declare function enrichSchemaWithRelations(baseSchema: JsonSchema, relations: Re
|
|
|
1845
1865
|
* Reads the current selection from the workspace selection store (the same
|
|
1846
1866
|
* store the viewer owns), gates each action behind the resolved
|
|
1847
1867
|
* `GraphCapabilities`, and owns the edit dialogs (node form, edge form, delete
|
|
1848
|
-
* confirm).
|
|
1868
|
+
* confirm). Library-native:
|
|
1849
1869
|
* it drives everything through the injected `GraphMutationPort` +
|
|
1850
1870
|
* `GraphSchemaProvider` and is slot-injectable via `ActionPanel actions={...}`.
|
|
1851
1871
|
*
|
|
@@ -1941,4 +1961,4 @@ interface DeleteNodeDialogProps {
|
|
|
1941
1961
|
}
|
|
1942
1962
|
declare function DeleteNodeDialog({ open, onOpenChange, node, port, onDeleted, }: DeleteNodeDialogProps): React__default.ReactElement;
|
|
1943
1963
|
|
|
1944
|
-
export { ActionPanel, type ActionPanelState, type ActionPanelStore, type CapabilitiesValidation, type Cardinality, type ColorPalette, type CreateEdgeInput, type CreateNodeInput, type CreateNodeWithRelationsInput, type CreateNodeWithRelationsResult, DeleteNodeDialog, type DeleteNodeDialogProps, EMPTY_NORMALIZED, EdgeFormSheet, type EdgeFormSheetProps, EdgeInfoCard, type EdgeTypeMode, type EdgeTypeView, type EdgeVisual, type EditMode$1 as EditMode, type EditableMode, type ExpandOptions, type ExpandResult, GraphA11yList, type GraphA11yListProps, type GraphCapabilities, type GraphCapabilitiesValidation, type GraphDataHook, type GraphDataStore, type GraphDisplayConfig, type EditMode as GraphEditMode, GraphEditToolbar, type GraphEditToolbarProps, type GraphExplorationDeps, type GraphExplorationStore, type GraphFilterStore, type GraphFocusAction, type GraphFocusStore, type GraphModel, type GraphModelCapabilities, type GraphModelDisplay, GraphModelEditor, type GraphModelEditorProps, type GraphModelProperty, type GraphMutationPort, type GraphProperties, type GraphProperty, type GraphRelation, type GraphRenderer, GraphRendererProvider, type GraphSchemaProvider, type GraphStatistics, type WorkspaceStores as GraphStoreBundle, GraphStoresContext, type GraphTypeSchema, GraphVisualizer, type GraphVisualizerProps, type LabelDisplayMap, type LiveGraphDataResult, ModelActionPanel, type ModelActionPanelProps, type ModelGraph, NodeFormSheet, type NodeFormSheetProps, NodeInfoCard, NodeTypeNameSheet, type NodeTypeNameSheetProps, type NodeTypeView, type NodeVisual, type NormalizedGraph, Overview, PropertyFormSheet, type PropertyFormSheetProps, type PropertyInput, type PropertyView, type RawGraphEdge, type RawGraphNode, type RelationCardinality, type RelationDef, type RelationDetailView, RelationFormSheet, type RelationFormSheetProps, type RelationInput, type RelationMap, type RelationView, type ResolvedCapabilities, type ResolvedGraphCapabilities, type SelectionStore, type StoreFactory, TypeDetailPanel, type TypeDetailPanelProps, type UpdateEdgeInput, type UpdateNodeInput, type UpdateNodeWithRelationsInput, type UpdateNodeWithRelationsResult, type VisualGraphEdge, type VisualGraphNode, type VisualGraphNormalized, type WorkspaceStores, type XGraph, addEdgeType, addNodeType, addRelation, buildColorPalette, buildColorPaletteFromNodes, capabilitiesSchema, cardinalityLabel, createActionPanelStore, createGraphDataStore, createGraphExplorationStore, createGraphFilterStore, createGraphFocusStore, createSelectionStore, deleteEdgeType, deleteEdgeTypeProperty, deleteNodeProperty, deleteNodeType, deleteRelation, deleteRelationProperty, edgeTypeView, editableRelations, enrichEdge, enrichEdges, enrichNode, enrichNodes, enrichSchemaWithRelations, extractDisplayLabel, extractRelationFields, findEdgeType, findType, graphCapabilitiesSchema, groupEdgesByRelation, hasProperties, hasRelationFields, initializeFormData, isEdgeType, isNodeType, isRawGraphNode, isRelationField, isVisualEdge, isVisualNode, modelToGraph, nodeTypeView, normalizeGraph, reconcileFilter, relationFieldName, relationTitle, relationTypeFromField, relationView, renameEdgeType, renameNodeType, resolveCapabilities, resolveGraphCapabilities, resolveRelationEdge, setEdgeTypeProperty, setNodeProperty, setRelationProperty, toCytoscapeEdge, toCytoscapeNode, toReagraphEdge, toReagraphNode, typeLabel, updateRelation, useActionPanelStore, useCytoscapeData, useGraphFocus, useGraphRenderer, useLiveGraphData, useReagraphData, useStableRef, useWorkspaceGraphData, useWorkspaceGraphExploration, useWorkspaceGraphFilter, useWorkspaceSelection, validateCapabilities, validateGraphCapabilities };
|
|
1964
|
+
export { ActionPanel, type ActionPanelState, type ActionPanelStore, type CapabilitiesValidation, type Cardinality, type ColorPalette, type CreateEdgeInput, type CreateNodeInput, type CreateNodeWithRelationsInput, type CreateNodeWithRelationsResult, DeleteNodeDialog, type DeleteNodeDialogProps, EMPTY_NORMALIZED, EdgeFormSheet, type EdgeFormSheetProps, EdgeInfoCard, type EdgeTypeMode, type EdgeTypeView, type EdgeVisual, type EditMode$1 as EditMode, type EditableMode, type ExpandOptions, type ExpandResult, GraphA11yList, type GraphA11yListProps, type GraphCapabilities, type GraphCapabilitiesValidation, type GraphDataHook, type GraphDataStore, type GraphDisplayConfig, type EditMode as GraphEditMode, GraphEditToolbar, type GraphEditToolbarProps, type GraphExplorationDeps, type GraphExplorationStore, type GraphFilterStore, type GraphFocusAction, type GraphFocusStore, type GraphModel, type GraphModelCapabilities, type GraphModelDisplay, GraphModelEditor, type GraphModelEditorProps, type GraphModelProperty, type GraphMutationPort, type GraphProperties, type GraphProperty, type GraphRelation, type GraphRenderer, GraphRendererProvider, type GraphSchemaProvider, type GraphStatistics, type WorkspaceStores as GraphStoreBundle, GraphStoresContext, type GraphTypeSchema, GraphVisualizer, type GraphVisualizerProps, type LabelDisplayMap, type LiveGraphDataResult, ModelActionPanel, type ModelActionPanelProps, type ModelGraph, NodeFormSheet, type NodeFormSheetProps, NodeInfoCard, NodeTypeNameSheet, type NodeTypeNameSheetProps, type NodeTypeView, type NodeVisual, type NormalizedGraph, Overview, PropertyFormSheet, type PropertyFormSheetProps, type PropertyInput, type PropertyView, type RawGraphEdge, type RawGraphNode, type RelationCardinality, type RelationDef, type RelationDetailView, RelationFormSheet, type RelationFormSheetProps, type RelationInput, type RelationMap, type RelationView, type ResolvedCapabilities, type ResolvedGraphCapabilities, type SelectionStore, type StoreFactory, TypeDetailPanel, type TypeDetailPanelProps, type UpdateEdgeInput, type UpdateNodeInput, type UpdateNodeWithRelationsInput, type UpdateNodeWithRelationsResult, type VisualGraphEdge, type VisualGraphNode, type VisualGraphNormalized, type WorkspaceStores, type XGraph, addEdgeType, addNodeType, addRelation, buildColorPalette, buildColorPaletteFromNodes, capabilitiesSchema, cardinalityLabel, createActionPanelStore, createGraphDataStore, createGraphExplorationStore, createGraphFilterStore, createGraphFocusStore, createSelectionStore, deleteEdgeType, deleteEdgeTypeProperty, deleteNodeProperty, deleteNodeType, deleteRelation, deleteRelationProperty, edgeTypeView, editableRelations, enrichEdge, enrichEdges, enrichNode, enrichNodes, enrichSchemaWithRelations, extractDisplayLabel, extractRelationFields, findEdgeType, findType, graphCapabilitiesSchema, groupEdgesByRelation, hasProperties, hasRelationFields, initializeFormData, isEdgeType, isNodeType, isRawGraphNode, isRelationField, isVisualEdge, isVisualNode, modelToGraph, nodeTypeView, normalizeGraph, reconcileFilter, relationFieldName, relationTitle, relationTypeFromField, relationView, renameEdgeType, renameNodeType, resolveCapabilities, resolveGraphCapabilities, resolveRelationEdge, setEdgeTypeProperty, setNodeProperty, setRelationProperty, toCytoscapeEdge, toCytoscapeNode, toReagraphEdge, toReagraphNode, typeLabel, updateRelation, useActionPanelStore, useCytoscapeData, useGraphFocus, useGraphRenderer, useLiveGraphData, useReagraphData, useStableRef, useWorkspaceGraphData, useWorkspaceGraphExploration, useWorkspaceGraphFilter, useWorkspaceGraphFocus, useWorkspaceSelection, validateCapabilities, validateGraphCapabilities };
|