@_linked/shape-ui 2.0.0 → 2.2.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.
Files changed (210) hide show
  1. package/lib/esm/columns.d.ts +58 -0
  2. package/lib/esm/columns.js +173 -0
  3. package/lib/esm/columns.js.map +1 -0
  4. package/lib/esm/components/AddInstanceForms.d.ts +38 -0
  5. package/lib/esm/components/AddInstanceForms.js +143 -0
  6. package/lib/esm/components/AddInstanceForms.js.map +1 -0
  7. package/lib/esm/components/AddInstanceForms.module.css +12 -0
  8. package/lib/esm/components/BatchEditDrawer.d.ts +13 -0
  9. package/lib/esm/components/BatchEditDrawer.js +122 -0
  10. package/lib/esm/components/BatchEditDrawer.js.map +1 -0
  11. package/lib/esm/components/BatchEditDrawer.module.css +193 -0
  12. package/lib/esm/components/CustomMultiSelect.d.ts +26 -0
  13. package/lib/esm/components/CustomMultiSelect.js +344 -0
  14. package/lib/esm/components/CustomMultiSelect.js.map +1 -0
  15. package/lib/esm/components/CustomMultiSelect.module.css +291 -0
  16. package/lib/esm/components/DynamicFormField.d.ts +21 -0
  17. package/lib/esm/components/DynamicFormField.js +149 -0
  18. package/lib/esm/components/DynamicFormField.js.map +1 -0
  19. package/lib/esm/components/DynamicFormField.module.css +169 -0
  20. package/lib/esm/components/EditInstanceForms.d.ts +15 -0
  21. package/lib/esm/components/EditInstanceForms.js +118 -0
  22. package/lib/esm/components/EditInstanceForms.js.map +1 -0
  23. package/lib/esm/components/FilterBadge.d.ts +20 -0
  24. package/lib/esm/components/FilterBadge.js +26 -0
  25. package/lib/esm/components/FilterBadge.js.map +1 -0
  26. package/lib/esm/components/FilterBadge.module.css +25 -0
  27. package/lib/esm/components/FormField.d.ts +18 -0
  28. package/lib/esm/components/FormField.js +9 -0
  29. package/lib/esm/components/FormField.js.map +1 -0
  30. package/lib/esm/components/FormField.module.css +57 -0
  31. package/lib/esm/components/InstanceDeletionDialog.d.ts +17 -0
  32. package/lib/esm/components/InstanceDeletionDialog.js +83 -0
  33. package/lib/esm/components/InstanceDeletionDialog.js.map +1 -0
  34. package/lib/esm/components/InstanceDeletionDialog.module.css +59 -0
  35. package/lib/esm/components/InstanceOverview.d.ts +37 -0
  36. package/lib/esm/components/InstanceOverview.js +233 -0
  37. package/lib/esm/components/InstanceOverview.js.map +1 -0
  38. package/lib/esm/components/InstanceOverview.module.css +35 -0
  39. package/lib/esm/components/InstanceView.d.ts +29 -0
  40. package/lib/esm/components/InstanceView.js +97 -0
  41. package/lib/esm/components/InstanceView.js.map +1 -0
  42. package/lib/esm/components/InstanceView.module.css +157 -0
  43. package/lib/esm/components/NodeBadge.d.ts +25 -0
  44. package/lib/esm/components/NodeBadge.js +29 -0
  45. package/lib/esm/components/NodeBadge.js.map +1 -0
  46. package/lib/esm/components/NodeValuesEditor.d.ts +15 -0
  47. package/lib/esm/components/NodeValuesEditor.js +29 -0
  48. package/lib/esm/components/NodeValuesEditor.js.map +1 -0
  49. package/lib/esm/components/NodeValuesEditor.module.css +4 -0
  50. package/lib/esm/components/ReactTable.d.ts +50 -0
  51. package/lib/esm/components/ReactTable.js +370 -0
  52. package/lib/esm/components/ReactTable.js.map +1 -0
  53. package/lib/esm/components/ReactTable.module.css +950 -0
  54. package/lib/esm/components/TextfieldEditor.d.ts +1 -2
  55. package/lib/esm/components/TextfieldEditor.js +2 -2
  56. package/lib/esm/components/TextfieldEditor.js.map +1 -1
  57. package/lib/esm/components/forms.module.css +96 -0
  58. package/lib/esm/host.d.ts +196 -0
  59. package/lib/esm/host.js +25 -0
  60. package/lib/esm/host.js.map +1 -0
  61. package/lib/esm/hostContext.d.ts +34 -0
  62. package/lib/esm/hostContext.js +95 -0
  63. package/lib/esm/hostContext.js.map +1 -0
  64. package/lib/esm/index.d.ts +64 -10
  65. package/lib/esm/index.js +63 -14
  66. package/lib/esm/index.js.map +1 -1
  67. package/lib/esm/read.d.ts +48 -0
  68. package/lib/esm/read.js +96 -0
  69. package/lib/esm/read.js.map +1 -0
  70. package/lib/esm/search.d.ts +32 -0
  71. package/lib/esm/search.js +87 -0
  72. package/lib/esm/search.js.map +1 -0
  73. package/lib/esm/shape/contracts.d.ts +58 -0
  74. package/lib/esm/shape/contracts.js +15 -0
  75. package/lib/esm/shape/contracts.js.map +1 -0
  76. package/lib/esm/shape/naming.d.ts +30 -0
  77. package/lib/esm/shape/naming.js +52 -0
  78. package/lib/esm/shape/naming.js.map +1 -0
  79. package/lib/esm/shape/nodeDisplay.d.ts +36 -0
  80. package/lib/esm/shape/nodeDisplay.js +117 -0
  81. package/lib/esm/shape/nodeDisplay.js.map +1 -0
  82. package/lib/esm/shape/propertyTypes.d.ts +12 -0
  83. package/lib/esm/shape/propertyTypes.js +60 -0
  84. package/lib/esm/shape/propertyTypes.js.map +1 -0
  85. package/lib/esm/shape/propertyVisibility.d.ts +56 -0
  86. package/lib/esm/shape/propertyVisibility.js +112 -0
  87. package/lib/esm/shape/propertyVisibility.js.map +1 -0
  88. package/lib/esm/shape/shapeDependencies.d.ts +41 -0
  89. package/lib/esm/shape/shapeDependencies.js +141 -0
  90. package/lib/esm/shape/shapeDependencies.js.map +1 -0
  91. package/lib/esm/shape/tableFilters.d.ts +35 -0
  92. package/lib/esm/shape/tableFilters.js +171 -0
  93. package/lib/esm/shape/tableFilters.js.map +1 -0
  94. package/lib/esm/shape/useFormDependencies.d.ts +38 -0
  95. package/lib/esm/shape/useFormDependencies.js +178 -0
  96. package/lib/esm/shape/useFormDependencies.js.map +1 -0
  97. package/lib/esm/shape/validation.d.ts +15 -0
  98. package/lib/esm/shape/validation.js +106 -0
  99. package/lib/esm/shape/validation.js.map +1 -0
  100. package/lib/esm/tokens.css +25 -0
  101. package/lib/esm/types.d.ts +22 -0
  102. package/lib/esm/types.js +1 -0
  103. package/lib/esm/types.js.map +1 -0
  104. package/lib/esm/write.d.ts +51 -0
  105. package/lib/esm/write.js +99 -0
  106. package/lib/esm/write.js.map +1 -0
  107. package/package.json +44 -18
  108. package/src/backend.ts +1 -0
  109. package/src/columns.regression.test.ts +143 -0
  110. package/src/columns.test.ts +200 -0
  111. package/src/columns.ts +228 -0
  112. package/src/components/AddInstanceForms.module.css +12 -0
  113. package/src/components/AddInstanceForms.tsx +321 -0
  114. package/src/components/AvatarEditor.tsx +34 -0
  115. package/src/components/BatchEditDrawer.module.css +193 -0
  116. package/src/components/BatchEditDrawer.tsx +295 -0
  117. package/src/components/CheckboxEditor.module.css +6 -0
  118. package/src/components/CheckboxEditor.tsx +86 -0
  119. package/src/components/CustomMultiSelect.module.css +291 -0
  120. package/src/components/CustomMultiSelect.tsx +527 -0
  121. package/src/components/DateEditor.tsx +50 -0
  122. package/src/components/DynamicFormField.module.css +169 -0
  123. package/src/components/DynamicFormField.tsx +357 -0
  124. package/src/components/EditInstanceForms.tsx +260 -0
  125. package/src/components/FilterBadge.module.css +25 -0
  126. package/src/components/FilterBadge.tsx +70 -0
  127. package/src/components/FormField.module.css +57 -0
  128. package/src/components/FormField.tsx +59 -0
  129. package/src/components/ImageValueEditor.module.css +3 -0
  130. package/src/components/ImageValueEditor.tsx +82 -0
  131. package/src/components/InstanceDeletionDialog.module.css +59 -0
  132. package/src/components/InstanceDeletionDialog.tsx +175 -0
  133. package/src/components/InstanceOverview.module.css +35 -0
  134. package/src/components/InstanceOverview.tsx +374 -0
  135. package/src/components/InstanceView.module.css +157 -0
  136. package/src/components/InstanceView.tsx +212 -0
  137. package/src/components/NodeBadge.tsx +60 -0
  138. package/src/components/NodeValuesEditor.module.css +4 -0
  139. package/src/components/NodeValuesEditor.tsx +64 -0
  140. package/src/components/RadioButtonEditor.module.css +22 -0
  141. package/src/components/RadioButtonEditor.tsx +96 -0
  142. package/src/components/ReactTable.module.css +950 -0
  143. package/src/components/ReactTable.tsx +991 -0
  144. package/src/components/SelectEditor.tsx +85 -0
  145. package/src/components/ShapeTable.module.css +394 -0
  146. package/src/components/SwitchEditor.tsx +60 -0
  147. package/src/components/TextareaEditor.tsx +55 -0
  148. package/src/components/TextfieldEditor.tsx +67 -0
  149. package/src/components/ToggleEditor.tsx +63 -0
  150. package/src/components/forms.module.css +96 -0
  151. package/src/host.ts +226 -0
  152. package/src/hostContext.tsx +114 -0
  153. package/src/index.ts +99 -0
  154. package/src/package.ts +21 -0
  155. package/src/read.ts +148 -0
  156. package/src/search.test.ts +174 -0
  157. package/src/search.ts +108 -0
  158. package/src/shape/contracts.ts +66 -0
  159. package/src/shape/naming.ts +52 -0
  160. package/src/shape/nodeDisplay.ts +114 -0
  161. package/src/shape/propertyTypes.ts +86 -0
  162. package/src/shape/propertyVisibility.ts +180 -0
  163. package/src/shape/shapeDependencies.ts +183 -0
  164. package/src/shape/tableFilters.ts +223 -0
  165. package/src/shape/types.ts +1158 -0
  166. package/src/shape/useFormDependencies.ts +257 -0
  167. package/src/shape/validation.ts +121 -0
  168. package/src/tokens.css +25 -0
  169. package/src/types.ts +20 -0
  170. package/src/utils/helper.ts +35 -0
  171. package/src/write.test.ts +174 -0
  172. package/src/write.ts +114 -0
  173. package/.changeset/README.md +0 -20
  174. package/.changeset/config.json +0 -14
  175. package/.github/workflows/changeset-check.yml +0 -44
  176. package/.github/workflows/ci.yml +0 -43
  177. package/.github/workflows/publish.yml +0 -158
  178. package/CHANGELOG.md +0 -30
  179. package/lib/esm/components/AvatarEditor.d.ts +0 -20
  180. package/lib/esm/components/AvatarEditor.js +0 -7
  181. package/lib/esm/components/AvatarEditor.js.map +0 -1
  182. package/lib/esm/components/CheckboxEditor.d.ts +0 -21
  183. package/lib/esm/components/CheckboxEditor.js +0 -44
  184. package/lib/esm/components/CheckboxEditor.js.map +0 -1
  185. package/lib/esm/components/DateEditor.d.ts +0 -20
  186. package/lib/esm/components/DateEditor.js +0 -22
  187. package/lib/esm/components/DateEditor.js.map +0 -1
  188. package/lib/esm/components/RadioButtonEditor.d.ts +0 -23
  189. package/lib/esm/components/RadioButtonEditor.js +0 -41
  190. package/lib/esm/components/RadioButtonEditor.js.map +0 -1
  191. package/lib/esm/components/SelectEditor.d.ts +0 -21
  192. package/lib/esm/components/SelectEditor.js +0 -30
  193. package/lib/esm/components/SelectEditor.js.map +0 -1
  194. package/lib/esm/components/SwitchEditor.d.ts +0 -21
  195. package/lib/esm/components/SwitchEditor.js +0 -23
  196. package/lib/esm/components/SwitchEditor.js.map +0 -1
  197. package/lib/esm/components/TextareaEditor.d.ts +0 -23
  198. package/lib/esm/components/TextareaEditor.js +0 -15
  199. package/lib/esm/components/TextareaEditor.js.map +0 -1
  200. package/lib/esm/components/ToggleEditor.d.ts +0 -22
  201. package/lib/esm/components/ToggleEditor.js +0 -23
  202. package/lib/esm/components/ToggleEditor.js.map +0 -1
  203. package/lib/esm/ontologies/lincd-ui.d.ts +0 -6
  204. package/lib/esm/ontologies/lincd-ui.js +0 -18
  205. package/lib/esm/ontologies/lincd-ui.js.map +0 -1
  206. package/lib/esm/package.d.ts +0 -3
  207. package/lib/esm/package.js +0 -4
  208. package/lib/esm/package.js.map +0 -1
  209. package/tsconfig-cjs.json +0 -8
  210. package/tsconfig-esm.json +0 -9
@@ -0,0 +1,58 @@
1
+ /**
2
+ * The table model: a shape in, ordered and filtered columns out.
3
+ *
4
+ * Pure and framework-free on purpose. Which columns a table shows, in what order, and
5
+ * which one carries the label is the part worth testing and the part that has to behave
6
+ * identically wherever the table renders. Keeping it out of the React layer means it can
7
+ * be exercised directly, and means a different renderer (a mobile list, a picker, a
8
+ * printed view) makes the same decisions.
9
+ *
10
+ * The rule throughout: **what the shape declares beats what the renderer guesses.**
11
+ * `linked_core:displayRank` orders, `linked_core:displayHidden` removes, `sh:order`
12
+ * breaks ties. The heuristics apply only where a shape declares nothing — which, until
13
+ * the display vocabulary existed, was everywhere.
14
+ */
15
+ import type { NodeShapeWire, PropertyShapeWire } from '@_linked/core/shapes/nodeShapeWire';
16
+ /**
17
+ * Whether the table shows the columns it judges useful, or every column.
18
+ *
19
+ * Lives here rather than in a page. `InstanceOverview` and `ReactTable` both imported this
20
+ * type from `pages/InstanceOverviewPage` — organisms depending on a page, which is exactly
21
+ * backwards and would have blocked moving either of them.
22
+ */
23
+ export type TableMode = 'auto' | 'full';
24
+ /** How much room the caller has. A table shows more than a card; a cell shows one. */
25
+ export type DisplayContext = 'cell' | 'card' | 'table' | 'full';
26
+ export interface Column {
27
+ /** The property this column reads. */
28
+ property: PropertyShapeWire;
29
+ /** The key a row object is expected to carry — the property's label. */
30
+ key: string;
31
+ /** What to put in the header. */
32
+ header: string;
33
+ /** True for the column that best identifies the row. */
34
+ isLabel: boolean;
35
+ }
36
+ /**
37
+ * Properties the shape does not hide, and that fit the given context.
38
+ *
39
+ * `displayHidden` is checked first and applies to every context: it is a statement about
40
+ * the property, not about how much room there is.
41
+ */
42
+ export declare function displayableProperties(shape: NodeShapeWire, context?: DisplayContext): PropertyShapeWire[];
43
+ /** True when any property on the shape declares a rank. */
44
+ export declare function hasDeclaredRanks(shape: NodeShapeWire): boolean;
45
+ /**
46
+ * The property that best identifies an instance of this shape.
47
+ *
48
+ * Declared rank first; then a conventional label predicate; then a name-ish literal.
49
+ * Undefined when the shape has nothing showable — the caller falls back to the IRI, which
50
+ * is a display decision and not this function's to make.
51
+ */
52
+ export declare function labelProperty(shape: NodeShapeWire, context?: DisplayContext): PropertyShapeWire | undefined;
53
+ /**
54
+ * Columns for a shape at a given context, label first.
55
+ *
56
+ * `limit` overrides the context's own limit for a caller that knows its space better.
57
+ */
58
+ export declare function columnsFor(shape: NodeShapeWire, context?: DisplayContext, limit?: number): Column[];
@@ -0,0 +1,173 @@
1
+ /**
2
+ * The table model: a shape in, ordered and filtered columns out.
3
+ *
4
+ * Pure and framework-free on purpose. Which columns a table shows, in what order, and
5
+ * which one carries the label is the part worth testing and the part that has to behave
6
+ * identically wherever the table renders. Keeping it out of the React layer means it can
7
+ * be exercised directly, and means a different renderer (a mobile list, a picker, a
8
+ * printed view) makes the same decisions.
9
+ *
10
+ * The rule throughout: **what the shape declares beats what the renderer guesses.**
11
+ * `linked_core:displayRank` orders, `linked_core:displayHidden` removes, `sh:order`
12
+ * breaks ties. The heuristics apply only where a shape declares nothing — which, until
13
+ * the display vocabulary existed, was everywhere.
14
+ */
15
+ const CONTEXT_LIMITS = {
16
+ cell: 1,
17
+ card: 3,
18
+ table: 6,
19
+ full: Number.POSITIVE_INFINITY,
20
+ };
21
+ /** Predicates that conventionally carry a human label, best first. */
22
+ const LABEL_PREDICATES = [
23
+ 'http://www.w3.org/2000/01/rdf-schema#label',
24
+ 'http://www.w3.org/2004/02/skos/core#prefLabel',
25
+ 'http://schema.org/name',
26
+ 'http://purl.org/dc/terms/title',
27
+ 'http://purl.org/dc/elements/1.1/title',
28
+ 'http://xmlns.com/foaf/0.1/name',
29
+ ];
30
+ /** Names that read as an identity rather than an attribute. */
31
+ const NAMEY = /(name|label|title|identifier|handle|slug|heading|caption)/i;
32
+ /** Datatypes whose values are too long to sit in a table cell. */
33
+ const LONG_TEXT = new Set([
34
+ 'http://www.w3.org/1999/02/22-rdf-syntax-ns#HTML',
35
+ 'http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral',
36
+ ]);
37
+ /** The predicate IRI of a simple path, or undefined for a complex one. */
38
+ function predicateOf(property) {
39
+ const path = property.path;
40
+ if (typeof path === 'string')
41
+ return path;
42
+ if (path && typeof path === 'object' && 'id' in path) {
43
+ return path.id;
44
+ }
45
+ return undefined; // sequence / alternative / inverse — not a single predicate
46
+ }
47
+ function localName(iri) {
48
+ const cut = Math.max(iri.lastIndexOf('#'), iri.lastIndexOf('/'));
49
+ return cut >= 0 ? iri.slice(cut + 1) : iri;
50
+ }
51
+ /**
52
+ * Whether a property can be shown at a given context.
53
+ *
54
+ * What fits depends on how much room there is, and an earlier version of this got that
55
+ * wrong: it applied the narrowest rule everywhere, so wiring it into a table silently
56
+ * deleted every relation, multi-valued and long-text column. A cell really can only hold
57
+ * one short scalar. A table can hold a badge for a related node, and a row of them.
58
+ */
59
+ function fitsContext(property, context) {
60
+ const isRelation = !!(property.valueShape || property.class);
61
+ const isMultiValued = property.maxCount != null && property.maxCount !== 1;
62
+ const isLongText = !!property.datatype && LONG_TEXT.has(property.datatype.id);
63
+ switch (context) {
64
+ case 'cell':
65
+ // One value, rendered inline. A relation would need a badge and a long text would
66
+ // need truncation; neither belongs in a cell that stands in for the whole instance.
67
+ return !isRelation && !isMultiValued && !isLongText;
68
+ case 'card':
69
+ // Room for a few values including a related node, but still not a wall of text.
70
+ return !isLongText;
71
+ case 'table':
72
+ // A table renders relations as badges and multi-values as a row of them. Long text
73
+ // is the one thing that breaks a row's height.
74
+ return !isLongText;
75
+ case 'full':
76
+ // A detail view shows everything the shape does not hide.
77
+ return true;
78
+ }
79
+ }
80
+ /**
81
+ * Sort key for an undeclared value. A finite sentinel rather than `Infinity`, because
82
+ * `Infinity - Infinity` is `NaN` and a comparator that returns NaN is undefined by spec —
83
+ * it happened to behave because V8 reads NaN as "equal".
84
+ */
85
+ const UNDECLARED = Number.MAX_SAFE_INTEGER;
86
+ const declaredRank = (p) => { var _a; return (_a = p.displayRank) !== null && _a !== void 0 ? _a : UNDECLARED; };
87
+ const declaredOrder = (p) => { var _a; return (_a = p.order) !== null && _a !== void 0 ? _a : UNDECLARED; };
88
+ /** Declared precedence: rank, then `sh:order`. Undeclared properties sort last. */
89
+ function byDeclared(a, b) {
90
+ return declaredRank(a) - declaredRank(b) || declaredOrder(a) - declaredOrder(b);
91
+ }
92
+ /**
93
+ * Heuristic score, used only where nothing is declared. Higher is more important.
94
+ *
95
+ * These weights are a guess dressed as a number, and they exist so a shape that says
96
+ * nothing still renders sensibly. A shape that declares `displayRank` never reaches here.
97
+ */
98
+ function score(property) {
99
+ var _a, _b, _c;
100
+ let s = 0;
101
+ if (((_a = property.minCount) !== null && _a !== void 0 ? _a : 0) > 0)
102
+ s += 100;
103
+ const name = `${(_b = property.label) !== null && _b !== void 0 ? _b : ''} ${localName((_c = predicateOf(property)) !== null && _c !== void 0 ? _c : '')}`;
104
+ if (NAMEY.test(name))
105
+ s += 50;
106
+ if (/(type|description|date|email|url)/i.test(name))
107
+ s += 25;
108
+ if (property.datatype)
109
+ s += 10;
110
+ return s;
111
+ }
112
+ /**
113
+ * Properties the shape does not hide, and that fit the given context.
114
+ *
115
+ * `displayHidden` is checked first and applies to every context: it is a statement about
116
+ * the property, not about how much room there is.
117
+ */
118
+ export function displayableProperties(shape, context = 'table') {
119
+ var _a;
120
+ return ((_a = shape.propertyShapes) !== null && _a !== void 0 ? _a : []).filter((p) => p.displayHidden !== true && !!p.label && fitsContext(p, context));
121
+ }
122
+ /** True when any property on the shape declares a rank. */
123
+ export function hasDeclaredRanks(shape) {
124
+ var _a;
125
+ return ((_a = shape.propertyShapes) !== null && _a !== void 0 ? _a : []).some((p) => p.displayRank != null);
126
+ }
127
+ /**
128
+ * The property that best identifies an instance of this shape.
129
+ *
130
+ * Declared rank first; then a conventional label predicate; then a name-ish literal.
131
+ * Undefined when the shape has nothing showable — the caller falls back to the IRI, which
132
+ * is a display decision and not this function's to make.
133
+ */
134
+ export function labelProperty(shape, context = 'cell') {
135
+ // The label stands in for the whole instance, so it is held to the CELL rule even when
136
+ // the surrounding table is wider — a relation or a blob does not identify a row.
137
+ const candidates = displayableProperties(shape, context);
138
+ if (candidates.length === 0)
139
+ return undefined;
140
+ if (hasDeclaredRanks(shape)) {
141
+ const ranked = candidates
142
+ .filter((p) => p.displayRank != null)
143
+ .sort(byDeclared);
144
+ if (ranked.length)
145
+ return ranked[0];
146
+ }
147
+ for (const predicate of LABEL_PREDICATES) {
148
+ const match = candidates.find((p) => predicateOf(p) === predicate);
149
+ if (match)
150
+ return match;
151
+ }
152
+ return candidates.find((p) => { var _a; return NAMEY.test(`${p.label} ${localName((_a = predicateOf(p)) !== null && _a !== void 0 ? _a : '')}`); });
153
+ }
154
+ /**
155
+ * Columns for a shape at a given context, label first.
156
+ *
157
+ * `limit` overrides the context's own limit for a caller that knows its space better.
158
+ */
159
+ export function columnsFor(shape, context = 'table', limit) {
160
+ const label = labelProperty(shape);
161
+ const declared = hasDeclaredRanks(shape);
162
+ const rest = displayableProperties(shape, context).filter((p) => p !== label);
163
+ rest.sort(declared ? byDeclared : (a, b) => score(b) - score(a));
164
+ const ordered = label ? [label, ...rest] : rest;
165
+ const max = limit !== null && limit !== void 0 ? limit : CONTEXT_LIMITS[context];
166
+ return ordered.slice(0, max).map((property) => ({
167
+ property,
168
+ key: property.label,
169
+ header: property.name || property.label,
170
+ isLabel: property === label,
171
+ }));
172
+ }
173
+ //# sourceMappingURL=columns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columns.js","sourceRoot":"","sources":["../../src/columns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { NodeShapeWire } from '@_linked/core/shapes/nodeShapeWire';
2
+ import { type CodeUsageData, type PropertyUsageData } from '../shape/propertyVisibility.js';
3
+ interface AddInstanceFormsProps {
4
+ /**
5
+ * Persist the new instance and return its id.
6
+ *
7
+ * Optional. Falls back to the host's `createInstance`, which is itself filled in from the
8
+ * DSL — so a host that wires nothing still gets a working save. It was required, which
9
+ * quietly made the package's "saving works with no host wiring" untrue through the one
10
+ * surface that does the saving: a consumer had to reach for `useDataManagerHost()` and
11
+ * thread the method back in.
12
+ *
13
+ * Override it when the save has to do more than write the instance — record an edit, flush
14
+ * a draft — which is why the seam exists at all.
15
+ */
16
+ onSave?: (formData: Record<string, any>) => Promise<{
17
+ id: string;
18
+ }>;
19
+ /**
20
+ * @deprecated Retained only for callers that still pass it; the organism no longer uses
21
+ * it for persistence. Remove once every caller supplies `onSave`.
22
+ */
23
+ projectId?: string;
24
+ shapeId: string;
25
+ shape: NodeShapeWire;
26
+ allShapes?: Record<string, NodeShapeWire>;
27
+ onComplete: (newId: string, formData?: Record<string, any>) => void;
28
+ onCancel?: () => void;
29
+ initialData?: Record<string, any>;
30
+ draftId?: string;
31
+ onFieldChange?: (data: Record<string, any>) => void;
32
+ onFlushDraft?: (data: Record<string, any>) => Promise<string | void> | string | void;
33
+ onClearDraft?: () => void;
34
+ propertyUsage?: Record<string, PropertyUsageData> | null;
35
+ codeUsage?: Record<string, CodeUsageData> | null;
36
+ }
37
+ declare function AddInstanceForms({ onSave, projectId, shapeId, shape, allShapes, onComplete, onCancel, initialData, draftId, onFieldChange, onFlushDraft, onClearDraft, propertyUsage, codeUsage, }: AddInstanceFormsProps): import("react").JSX.Element;
38
+ export default AddInstanceForms;
@@ -0,0 +1,143 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { motion } from 'framer-motion';
3
+ import { Button } from '@_linked/primitives/components/Button';
4
+ import { Select } from '@_linked/primitives/components/Select';
5
+ import { shacl } from '@_linked/core/ontologies/shacl';
6
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
7
+ import { useDataManagerHost } from '../hostContext.js';
8
+ import { Spinner } from '@_linked/primitives/components/Spinner';
9
+ import { useFormDependencies } from '../shape/useFormDependencies.js';
10
+ import { getTransition, staggerContainer, staggerItem, useReducedMotion, } from '@_linked/primitives/motion';
11
+ import { classifyProperties, getVisibleProperties, } from '../shape/propertyVisibility.js';
12
+ import { validateAllFields } from '../shape/validation.js';
13
+ import { DynamicForm } from './DynamicFormField.js';
14
+ // Shared by both form organisms — named for what it is, rather than one of its two
15
+ // consumers importing the other's stylesheet.
16
+ import style from './forms.module.css';
17
+ function AddInstanceForms({ onSave, projectId, shapeId, shape, allShapes, onComplete, onCancel, initialData, draftId, onFieldChange, onFlushDraft, onClearDraft, propertyUsage, codeUsage, }) {
18
+ const reducedMotion = useReducedMotion();
19
+ const formDataRef = useRef(initialData ? { ...initialData } : {});
20
+ const [isSaving, setIsSaving] = useState(false);
21
+ const [saveError, setSaveError] = useState(null);
22
+ const [fieldErrors, setFieldErrors] = useState({});
23
+ const [extraFields, setExtraFields] = useState(new Set());
24
+ // Dependent field visibility & narrowing
25
+ const host = useDataManagerHost();
26
+ const { depMap, onParentValueChange, initFromData, isParent, getDependencyState, } = useFormDependencies(shape, allShapes || null, projectId, host.readInstance);
27
+ // Proxy wraps formDataRef.current — intercepts property sets to detect field changes
28
+ // and trigger dependency updates when parent fields change.
29
+ const proxyOf = useMemo(() => {
30
+ return new Proxy(formDataRef.current, {
31
+ set(target, prop, value) {
32
+ const propLabel = prop;
33
+ const oldValue = target[propLabel];
34
+ target[propLabel] = value;
35
+ onFieldChange === null || onFieldChange === void 0 ? void 0 : onFieldChange(target);
36
+ // If this property is a parent in the dependency graph,
37
+ // notify the dependency system and clear dependent field values.
38
+ // Only cascade when the value actually changed (not init write-backs).
39
+ if (isParent(propLabel)) {
40
+ let changed;
41
+ if (oldValue == null || value == null) {
42
+ changed = oldValue !== value;
43
+ }
44
+ else if (Array.isArray(oldValue) && Array.isArray(value)) {
45
+ changed =
46
+ oldValue.length !== value.length ||
47
+ oldValue.some((o, i) => { var _a; return (o === null || o === void 0 ? void 0 : o.id) !== ((_a = value[i]) === null || _a === void 0 ? void 0 : _a.id); });
48
+ }
49
+ else if (typeof oldValue === 'object' && typeof value === 'object') {
50
+ changed = oldValue.id !== value.id;
51
+ }
52
+ else {
53
+ changed = oldValue !== value;
54
+ }
55
+ if (changed) {
56
+ onParentValueChange(propLabel, value);
57
+ // Cascade reset: clear child field values
58
+ for (const [childLabel, deps] of depMap) {
59
+ if (deps.some((d) => d.parentLabel === propLabel)) {
60
+ target[childLabel] = undefined;
61
+ }
62
+ }
63
+ }
64
+ }
65
+ return true;
66
+ },
67
+ });
68
+ }, [depMap, onParentValueChange, isParent]);
69
+ // Initialize dependency state from draft/initial data
70
+ useEffect(() => {
71
+ if (initialData) {
72
+ initFromData(initialData);
73
+ }
74
+ }, []);
75
+ // Immediate save for use before pick navigation — returns draftId
76
+ const handleBeforeNavigate = useCallback(async () => {
77
+ if (!onFlushDraft)
78
+ return;
79
+ return await onFlushDraft(formDataRef.current);
80
+ }, [onFlushDraft]);
81
+ const handleSave = async () => {
82
+ setSaveError(null);
83
+ // Submit-time validation
84
+ const errors = validateAllFields(shape.propertyShapes, formDataRef.current);
85
+ if (errors.length > 0) {
86
+ const errorMap = {};
87
+ errors.forEach((e) => { errorMap[e.propertyLabel] = e.message; });
88
+ setFieldErrors(errorMap);
89
+ return;
90
+ }
91
+ setFieldErrors({});
92
+ setIsSaving(true);
93
+ try {
94
+ const persist = onSave !== null && onSave !== void 0 ? onSave : ((data) => host.createInstance(shapeId, data));
95
+ const result = await persist(formDataRef.current);
96
+ onComplete(result.id, formDataRef.current);
97
+ }
98
+ catch (err) {
99
+ setSaveError(err instanceof Error ? err.message : String(err));
100
+ setIsSaving(false);
101
+ }
102
+ };
103
+ if (!shape)
104
+ return null;
105
+ return (_jsxs(motion.div, { initial: { opacity: 0 }, animate: { opacity: 1 }, transition: { duration: reducedMotion ? 0 : 0.3, ease: [0.4, 0, 0.2, 1] }, children: [_jsx(motion.div, { className: style.container, initial: { opacity: 0, y: 10 }, animate: { opacity: 1, y: 0 }, transition: {
106
+ duration: reducedMotion ? 0 : 0.4,
107
+ ease: [0.4, 0, 0.2, 1],
108
+ delay: reducedMotion ? 0 : 0.1,
109
+ }, children: _jsx(motion.div, { className: style.rows, variants: staggerContainer, initial: "initial", animate: "animate", children: (() => {
110
+ const classified = classifyProperties(shape.propertyShapes, propertyUsage || null, { codeUsage });
111
+ const autoVisible = getVisibleProperties(classified, 'form-add');
112
+ const autoVisibleLabels = new Set(autoVisible.map((c) => c.property.label));
113
+ const visibleProps = shape.propertyShapes.filter((p) => autoVisibleLabels.has(p.label) || extraFields.has(p.label));
114
+ const availableExtras = classified.filter((c) => !autoVisibleLabels.has(c.property.label) && !extraFields.has(c.property.label));
115
+ return (_jsxs(_Fragment, { children: [visibleProps.map((propShape, i) => {
116
+ var _a;
117
+ let required = propShape.minCount > 0;
118
+ let formName = propShape.label;
119
+ let label = propShape.label
120
+ .replace(/([A-Z])/g, ' $1')
121
+ .replace(/_/g, ' ')
122
+ .replace(/^./, (char) => char.toUpperCase());
123
+ let dataType;
124
+ let nodeKind = propShape.nodeKind;
125
+ if ((nodeKind === null || nodeKind === void 0 ? void 0 : nodeKind.id) === shacl.Literal.id) {
126
+ dataType = (_a = propShape.datatype) === null || _a === void 0 ? void 0 : _a.id.split('#')[1];
127
+ }
128
+ if ((nodeKind === null || nodeKind === void 0 ? void 0 : nodeKind.id) === shacl.IRI.id) {
129
+ dataType = 'nodeShape';
130
+ }
131
+ return (_jsx(motion.div, { variants: staggerItem, transition: getTransition(reducedMotion), children: _jsx(DynamicForm, { dataType: dataType, formName: formName, label: label, placeholder: `Type ${label.toLowerCase()} here`, required: required, value: formDataRef.current[propShape.label], of: proxyOf, property: propShape, shape: null, onBeforeNavigate: handleBeforeNavigate, error: fieldErrors[propShape.label], dependencyState: getDependencyState(propShape.label) }) }, propShape.label));
132
+ }), availableExtras.length > 0 && (_jsx(motion.div, { variants: staggerItem, transition: getTransition(reducedMotion), className: style.addFieldSection, children: _jsxs(Select.Root, { value: "", onValueChange: (label) => setExtraFields((prev) => new Set(prev).add(label)), children: [_jsx(Select.Trigger, { "aria-label": "Add optional field", children: _jsx(Select.Value, { placeholder: "+ Add optional field..." }) }), _jsx(Select.Content, { children: _jsx(Select.Group, { children: availableExtras.map((c) => (_jsx(Select.Item, { value: c.property.label, children: c.property.label
133
+ .replace(/([A-Z])/g, ' $1')
134
+ .replace(/_/g, ' ')
135
+ .replace(/^./, (char) => char.toUpperCase()) }, c.property.label))) }) })] }) }))] }));
136
+ })() }) }), saveError && (_jsx("p", { className: style.saveError, children: saveError })), _jsxs(motion.div, { className: style.actions, initial: { opacity: 0, y: 10 }, animate: { opacity: 1, y: 0 }, transition: {
137
+ duration: reducedMotion ? 0 : 0.3,
138
+ ease: [0.4, 0, 0.2, 1],
139
+ delay: reducedMotion ? 0 : 0.3,
140
+ }, children: [draftId && (_jsx(Button, { variant: "ghost", onClick: onClearDraft, disabled: isSaving, children: "Clear Form" })), _jsx(Button, { variant: "outline", onClick: onCancel, disabled: isSaving, children: "Cancel" }), _jsx(Button, { onClick: handleSave, disabled: isSaving, children: isSaving ? (_jsxs(_Fragment, { children: [_jsx(Spinner, { size: "small" }), " Creating"] })) : ('Create') })] })] }));
141
+ }
142
+ export default AddInstanceForms;
143
+ //# sourceMappingURL=AddInstanceForms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddInstanceForms.js","sourceRoot":"","sources":["../../../src/components/AddInstanceForms.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ .container {
2
+ display: flex;
3
+ flex-direction: column;
4
+ margin: 30px 0;
5
+ position: relative;
6
+
7
+ .saveButton {
8
+ position: fixed;
9
+ bottom: 1rem;
10
+ right: 3rem;
11
+ }
12
+ }
@@ -0,0 +1,13 @@
1
+ import type { PropertyShapeWire, NodeShapeWire } from '@_linked/core/shapes/nodeShapeWire';
2
+ import React from 'react';
3
+ interface BatchEditDrawerProps {
4
+ isOpen: boolean;
5
+ onClose: () => void;
6
+ shape: NodeShapeWire;
7
+ properties: Record<string, PropertyShapeWire>;
8
+ selectedCount: number;
9
+ onApply: (changes: Record<string, any>) => Promise<void>;
10
+ isLoading?: boolean;
11
+ }
12
+ declare function BatchEditDrawer({ isOpen, onClose, shape, properties, selectedCount, onApply, isLoading, }: BatchEditDrawerProps): React.JSX.Element;
13
+ export default BatchEditDrawer;
@@ -0,0 +1,122 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Button } from '@_linked/primitives/components/Button';
3
+ import { Checkbox } from '@_linked/primitives/components/Checkbox';
4
+ import { Drawer } from '@_linked/primitives/components/Drawer';
5
+ import { shacl } from '@_linked/core/ontologies/shacl';
6
+ import React from 'react';
7
+ import { getPropertyUiType } from '../shape/propertyTypes.js';
8
+ import { enumOptions } from '../shape/nodeDisplay.js';
9
+ import { Icons } from '@_linked/icons';
10
+ import { Spinner } from '@_linked/primitives/components/Spinner';
11
+ import style from './BatchEditDrawer.module.css';
12
+ function BatchEditDrawer({ isOpen, onClose, shape, properties, selectedCount, onApply, isLoading = false, }) {
13
+ const [fields, setFields] = React.useState({});
14
+ const [step, setStep] = React.useState('edit');
15
+ // Reset state when drawer opens/closes
16
+ React.useEffect(() => {
17
+ if (isOpen) {
18
+ setFields({});
19
+ setStep('edit');
20
+ }
21
+ }, [isOpen]);
22
+ // Get editable properties (skip id, rdf:type, and IRI/reference fields for V1)
23
+ const editableProperties = React.useMemo(() => {
24
+ return Object.entries(properties).filter(([label, prop]) => {
25
+ var _a;
26
+ if (label === 'id')
27
+ return false;
28
+ if (prop.id === 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type')
29
+ return false;
30
+ const nodeKind = (_a = prop.nodeKind) === null || _a === void 0 ? void 0 : _a.id;
31
+ // Skip IRI/reference fields — too complex for batch V1
32
+ if (nodeKind === shacl.IRI.id ||
33
+ nodeKind === shacl.BlankNode.id ||
34
+ nodeKind === shacl.BlankNodeOrIRI.id) {
35
+ return false;
36
+ }
37
+ return true;
38
+ });
39
+ }, [properties]);
40
+ const toggleField = (label) => {
41
+ setFields((prev) => {
42
+ var _a, _b, _c;
43
+ return ({
44
+ ...prev,
45
+ [label]: {
46
+ enabled: !((_a = prev[label]) === null || _a === void 0 ? void 0 : _a.enabled),
47
+ value: (_c = (_b = prev[label]) === null || _b === void 0 ? void 0 : _b.value) !== null && _c !== void 0 ? _c : '',
48
+ },
49
+ });
50
+ });
51
+ };
52
+ const updateFieldValue = (label, value) => {
53
+ setFields((prev) => ({
54
+ ...prev,
55
+ [label]: { enabled: true, value },
56
+ }));
57
+ };
58
+ const enabledFields = Object.entries(fields).filter(([, f]) => f.enabled);
59
+ const hasChanges = enabledFields.length > 0;
60
+ const handleApply = () => {
61
+ const changes = {};
62
+ for (const [label, fieldState] of enabledFields) {
63
+ changes[label] = fieldState.value;
64
+ }
65
+ onApply(changes);
66
+ };
67
+ const humanizeLabel = (label) => label
68
+ .replace(/([A-Z])/g, ' $1')
69
+ .replace(/_/g, ' ')
70
+ .replace(/^./, (c) => c.toUpperCase());
71
+ const formatValue = (value, prop) => {
72
+ if (value === '' || value === null || value === undefined)
73
+ return '(empty)';
74
+ const uiType = getPropertyUiType(prop);
75
+ if (uiType === 'boolean')
76
+ return value === 'true' || value === true ? 'Yes' : 'No';
77
+ if (uiType === 'enum-literal' || uiType === 'enum-iri') {
78
+ const match = enumOptions(prop).find((v) => v.id === value);
79
+ if (match)
80
+ return match.label;
81
+ }
82
+ return String(value);
83
+ };
84
+ const renderFieldInput = (label, prop) => {
85
+ var _a;
86
+ const uiType = getPropertyUiType(prop);
87
+ const fieldState = fields[label];
88
+ const value = (_a = fieldState === null || fieldState === void 0 ? void 0 : fieldState.value) !== null && _a !== void 0 ? _a : '';
89
+ const disabled = !(fieldState === null || fieldState === void 0 ? void 0 : fieldState.enabled);
90
+ switch (uiType) {
91
+ case 'boolean':
92
+ return (_jsxs("select", { className: style.input, disabled: disabled, value: value, onChange: (e) => updateFieldValue(label, e.target.value), children: [_jsx("option", { value: "", children: "\u2014 Select \u2014" }), _jsx("option", { value: "true", children: "Yes" }), _jsx("option", { value: "false", children: "No" })] }));
93
+ case 'enum-literal':
94
+ case 'enum-iri':
95
+ return (_jsxs("select", { className: style.input, disabled: disabled, value: value, onChange: (e) => updateFieldValue(label, e.target.value), children: [_jsx("option", { value: "", children: "\u2014 Select \u2014" }), enumOptions(prop).map((opt) => (_jsx("option", { value: opt.id, children: opt.label }, opt.id)))] }));
96
+ case 'number':
97
+ return (_jsx("input", { type: "number", className: style.input, disabled: disabled, value: value, placeholder: "Enter number...", onChange: (e) => updateFieldValue(label, e.target.value ? Number(e.target.value) : '') }));
98
+ case 'date':
99
+ return (_jsx("input", { type: "date", className: style.input, disabled: disabled, value: value, onChange: (e) => updateFieldValue(label, e.target.value) }));
100
+ case 'datetime':
101
+ return (_jsx("input", { type: "datetime-local", className: style.input, disabled: disabled, value: value, onChange: (e) => updateFieldValue(label, e.target.value) }));
102
+ case 'text':
103
+ case 'url':
104
+ default:
105
+ return (_jsx("input", { type: uiType === 'url' ? 'url' : 'text', className: style.input, disabled: disabled, value: value, placeholder: `Enter ${uiType === 'url' ? 'URL' : 'text'}...`, onChange: (e) => updateFieldValue(label, e.target.value) }));
106
+ }
107
+ };
108
+ return (_jsx(Drawer.Root, { open: isOpen, onOpenChange: (open) => { if (!open)
109
+ onClose(); }, direction: "right", handleOnly: true, children: _jsx(Drawer.Content, { hideHandle: true, className: style.drawer, children: _jsxs("div", { className: style.drawerContent, children: [_jsxs(Drawer.Header, { className: style.header, children: [_jsxs(Drawer.Title, { children: ["Edit ", selectedCount, " ", (shape === null || shape === void 0 ? void 0 : shape.label) || 'item', selectedCount > 1 ? 's' : ''] }), _jsx(Drawer.Description, { children: step === 'edit'
110
+ ? 'Toggle on the fields you want to change. Only enabled fields will be updated.'
111
+ : 'Review your changes before applying.' })] }), _jsx("div", { className: style.body, children: step === 'edit' ? (_jsxs("div", { className: style.fieldList, children: [editableProperties.map(([label, prop]) => {
112
+ var _a, _b;
113
+ const isEnabled = (_b = (_a = fields[label]) === null || _a === void 0 ? void 0 : _a.enabled) !== null && _b !== void 0 ? _b : false;
114
+ return (_jsxs("div", { className: style.fieldRow, children: [_jsxs("div", { className: style.fieldToggle, children: [_jsx(Checkbox, { checked: isEnabled, onCheckedChange: () => toggleField(label) }), _jsx("label", { className: style.fieldLabel, onClick: () => toggleField(label), children: humanizeLabel(label) })] }), _jsx("div", { className: isEnabled ? style.fieldInput : style.fieldInputDisabled, children: renderFieldInput(label, prop) })] }, label));
115
+ }), editableProperties.length === 0 && (_jsx("p", { className: style.noFields, children: "No editable fields available for batch editing." }))] })) : (_jsxs("div", { className: style.reviewList, children: [_jsxs("p", { className: style.reviewIntro, children: ["The following changes will be applied to ", selectedCount, " item", selectedCount > 1 ? 's' : '', ":"] }), enabledFields.map(([label]) => {
116
+ const prop = properties[label];
117
+ const value = fields[label].value;
118
+ return (_jsxs("div", { className: style.reviewItem, children: [_jsx("span", { className: style.reviewField, children: humanizeLabel(label) }), _jsx(Icons.ChevronRight, { width: 12, height: 12 }), _jsx("span", { className: style.reviewValue, children: formatValue(value, prop) })] }, label));
119
+ })] })) }), _jsx("div", { className: style.footer, children: step === 'edit' ? (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: onClose, disabled: isLoading, children: "Cancel" }), _jsxs(Button, { onClick: () => setStep('review'), disabled: !hasChanges || isLoading, children: ["Review Changes (", enabledFields.length, ")"] })] })) : (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: () => setStep('edit'), disabled: isLoading, children: "Back" }), _jsx(Button, { onClick: handleApply, disabled: isLoading, children: isLoading ? (_jsxs(_Fragment, { children: [_jsx(Spinner, { size: "small" }), " Updating ", selectedCount, " items..."] })) : (`Apply to ${selectedCount} items`) })] })) })] }) }) }));
120
+ }
121
+ export default BatchEditDrawer;
122
+ //# sourceMappingURL=BatchEditDrawer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BatchEditDrawer.js","sourceRoot":"","sources":["../../../src/components/BatchEditDrawer.tsx"],"names":[],"mappings":"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"}