@_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,60 @@
1
+ import { shacl } from '@_linked/core/ontologies/shacl';
2
+ import { xsd } from '@_linked/core/ontologies/xsd';
3
+ export function getPropertyUiType(property) {
4
+ var _a, _b, _c, _d, _e, _f;
5
+ const nodeKind = property.nodeKind;
6
+ if (!nodeKind)
7
+ return null;
8
+ // Enum: sh:in with values present.
9
+ //
10
+ // `sh:in`, the metamodel spelling. The DTO's `inValues` is still read for a host that
11
+ // hands one over, but nothing in this package produces it any more.
12
+ // (was: accepts BOTH forms. The DTO calls it `inValues` — `{id, label}` pairs with a derived
13
+ // display label); the metamodel calls it `in` and keeps members as members. The table
14
+ // now receives the metamodel form, and keying only on `inValues` silently downgraded
15
+ // every enum column to a free-text filter and a free-text batch-edit input.
16
+ const enumValues = (_a = (property.inValues)) !== null && _a !== void 0 ? _a : (property.in);
17
+ if (enumValues && enumValues.length > 0) {
18
+ if (nodeKind.id === shacl.Literal.id)
19
+ return 'enum-literal';
20
+ return 'enum-iri';
21
+ }
22
+ // Object / IRI properties
23
+ if (nodeKind.id === shacl.IRI.id ||
24
+ nodeKind.id === shacl.BlankNode.id ||
25
+ nodeKind.id === shacl.BlankNodeOrIRI.id) {
26
+ return property.maxCount === 1 ? 'iri-single' : 'iri-multi';
27
+ }
28
+ // Literal properties — classify by datatype
29
+ if (nodeKind.id === shacl.Literal.id) {
30
+ const dt = (_b = property.datatype) === null || _b === void 0 ? void 0 : _b.id;
31
+ if (!dt)
32
+ return 'text';
33
+ if (dt === xsd.boolean.id)
34
+ return 'boolean';
35
+ if (dt === xsd.date.id)
36
+ return 'date';
37
+ if (dt === xsd.dateTime.id)
38
+ return 'datetime';
39
+ if (dt === xsd.integer.id ||
40
+ dt === ((_c = xsd.long) === null || _c === void 0 ? void 0 : _c.id) ||
41
+ dt === ((_d = xsd.decimal) === null || _d === void 0 ? void 0 : _d.id) ||
42
+ dt === ((_e = xsd.float) === null || _e === void 0 ? void 0 : _e.id) ||
43
+ dt === ((_f = xsd.double) === null || _f === void 0 ? void 0 : _f.id)) {
44
+ return 'number';
45
+ }
46
+ if (dt === 'http://www.w3.org/2001/XMLSchema#anyURI')
47
+ return 'url';
48
+ return 'text';
49
+ }
50
+ return 'text';
51
+ }
52
+ /**
53
+ * Returns whether a property UI type represents an integer (vs floating point).
54
+ */
55
+ export function isIntegerType(property) {
56
+ var _a, _b;
57
+ const dt = (_a = property.datatype) === null || _a === void 0 ? void 0 : _a.id;
58
+ return dt === xsd.integer.id || dt === ((_b = xsd.long) === null || _b === void 0 ? void 0 : _b.id);
59
+ }
60
+ //# sourceMappingURL=propertyTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"propertyTypes.js","sourceRoot":"","sources":["../../../src/shape/propertyTypes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,GAAG,EAAE,MAAM,8BAA8B,CAAC;AAmBnD,MAAM,UAAU,iBAAiB,CAAC,QAA2B;;IAC3D,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACnC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,mCAAmC;IACnC,EAAE;IACF,sFAAsF;IACtF,oEAAoE;IACpE,6FAA6F;IAC7F,sFAAsF;IACtF,qFAAqF;IACrF,4EAA4E;IAC5E,MAAM,UAAU,GACd,MAAA,CAAE,QAAmC,CAAC,QAAQ,CAAC,mCAC/C,CAAE,QAAwC,CAAC,EAAE,CAAC,CAAC;IACjD,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,OAAO,CAAC,EAAE;YAAE,OAAO,cAAc,CAAC;QAC5D,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,0BAA0B;IAC1B,IACE,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE;QAC5B,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,SAAS,CAAC,EAAE;QAClC,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,cAAc,CAAC,EAAE,EACvC,CAAC;QACD,OAAO,QAAQ,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC;IAC9D,CAAC;IAED,4CAA4C;IAC5C,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,MAAA,QAAQ,CAAC,QAAQ,0CAAE,EAAE,CAAC;QACjC,IAAI,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC;QAEvB,IAAI,EAAE,KAAK,GAAG,CAAC,OAAO,CAAC,EAAE;YAAE,OAAO,SAAS,CAAC;QAE5C,IAAI,EAAE,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC;QAEtC,IAAI,EAAE,KAAK,GAAG,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,UAAU,CAAC;QAE9C,IACE,EAAE,KAAK,GAAG,CAAC,OAAO,CAAC,EAAE;YACrB,EAAE,MAAK,MAAA,GAAG,CAAC,IAAI,0CAAE,EAAE,CAAA;YACnB,EAAE,MAAK,MAAA,GAAG,CAAC,OAAO,0CAAE,EAAE,CAAA;YACtB,EAAE,MAAK,MAAA,GAAG,CAAC,KAAK,0CAAE,EAAE,CAAA;YACpB,EAAE,MAAK,MAAA,GAAG,CAAC,MAAM,0CAAE,EAAE,CAAA,EACrB,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,IAAI,EAAE,KAAK,yCAAyC;YAAE,OAAO,KAAK,CAAC;QAEnE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAA2B;;IACvD,MAAM,EAAE,GAAG,MAAA,QAAQ,CAAC,QAAQ,0CAAE,EAAE,CAAC;IACjC,OAAO,EAAE,KAAK,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAK,MAAA,GAAG,CAAC,IAAI,0CAAE,EAAE,CAAA,CAAC;AACtD,CAAC"}
@@ -0,0 +1,56 @@
1
+ import type { PropertyShapeWire } from '@_linked/core/shapes/nodeShapeWire';
2
+ /**
3
+ * `hidden` is a REMOVAL, not the weakest shown category.
4
+ *
5
+ * `optional` is still displayed — it fills the "add another field" picker and is rendered
6
+ * in `full` and in `form-edit` whenever the instance has a value. So mapping
7
+ * `linked_core:displayHidden` onto `optional` did nothing at all. Hidden needs its own
8
+ * value that every mode filters, including the "nothing qualified, show everything"
9
+ * fallback.
10
+ */
11
+ export type PropertyVisibility = 'required' | 'used' | 'optional' | 'hidden';
12
+ export interface PropertyUsageData {
13
+ count: number;
14
+ total: number;
15
+ percentage: number;
16
+ }
17
+ /** Code analysis classification from analyze-shape-usage.ts */
18
+ export type CodeClassification = 'essential' | 'common' | 'contextual' | 'display' | 'unused';
19
+ export interface CodeUsageData {
20
+ classification: CodeClassification;
21
+ writeRefs: number;
22
+ readRefs: number;
23
+ }
24
+ /** Per-shape code usage manifest (keyed by shape class name → property label) */
25
+ export type CodeUsageManifest = Record<string, Record<string, CodeUsageData>>;
26
+ export interface ClassifiedProperty {
27
+ property: PropertyShapeWire;
28
+ visibility: PropertyVisibility;
29
+ usage?: PropertyUsageData;
30
+ codeUsage?: CodeUsageData;
31
+ }
32
+ /**
33
+ * Classify properties using three signals (in priority order):
34
+ *
35
+ * 1. Shape constraints (SHACL): minCount > 0 → required
36
+ * 2. Code analysis: essential/common → used; contextual/display/unused → optional
37
+ * 3. Data usage (SPARQL): percentage >= threshold → used
38
+ *
39
+ * The code analysis signal is the primary differentiator for non-required
40
+ * properties — it reflects how the shape is actually used when submitting
41
+ * data in the project's code.
42
+ */
43
+ export declare function classifyProperties(properties: PropertyShapeWire[], usageData: Record<string, PropertyUsageData> | null, options?: {
44
+ usageThreshold?: number;
45
+ codeUsage?: Record<string, CodeUsageData> | null;
46
+ }): ClassifiedProperty[];
47
+ export type VisibilityMode = 'auto' | 'full' | 'form-add' | 'form-edit';
48
+ /**
49
+ * Filter properties to only those that should be visible in a given context.
50
+ *
51
+ * - auto: required + used (for tables); falls back to all if nothing qualifies
52
+ * - full: all properties
53
+ * - form-add: required + used (essential/common from code); falls back to all
54
+ * - form-edit: required + used + properties with data on this instance; falls back to all
55
+ */
56
+ export declare function getVisibleProperties(classified: ClassifiedProperty[], mode: VisibilityMode, instanceData?: Record<string, any>): ClassifiedProperty[];
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Classify properties using three signals (in priority order):
3
+ *
4
+ * 1. Shape constraints (SHACL): minCount > 0 → required
5
+ * 2. Code analysis: essential/common → used; contextual/display/unused → optional
6
+ * 3. Data usage (SPARQL): percentage >= threshold → used
7
+ *
8
+ * The code analysis signal is the primary differentiator for non-required
9
+ * properties — it reflects how the shape is actually used when submitting
10
+ * data in the project's code.
11
+ */
12
+ export function classifyProperties(properties, usageData, options) {
13
+ var _a, _b;
14
+ const threshold = (_a = options === null || options === void 0 ? void 0 : options.usageThreshold) !== null && _a !== void 0 ? _a : 1;
15
+ const codeUsage = (_b = options === null || options === void 0 ? void 0 : options.codeUsage) !== null && _b !== void 0 ? _b : null;
16
+ return properties.map((prop) => {
17
+ const usage = usageData === null || usageData === void 0 ? void 0 : usageData[prop.label];
18
+ const code = codeUsage === null || codeUsage === void 0 ? void 0 : codeUsage[prop.label];
19
+ // Display metadata the shape itself declares. Read structurally so this works for
20
+ // both the metamodel and the derived DTO, which has no home for these fields.
21
+ const display = prop;
22
+ let visibility;
23
+ // 0. The shape says not to render it. This outranks everything below, including
24
+ // minCount: a required property can still be one a person should not be shown.
25
+ if (display.displayHidden === true) {
26
+ visibility = 'hidden';
27
+ }
28
+ // 1. SHACL constraint: minCount > 0 means required
29
+ else if (prop.minCount > 0) {
30
+ visibility = 'required';
31
+ }
32
+ // 1b. A declared display rank is the shape stating the property matters. It is a
33
+ // first-party statement, so it outranks the inferred signals below.
34
+ else if (display.displayRank != null) {
35
+ visibility = 'used';
36
+ }
37
+ // 2. Code analysis: essential/common properties are "used"
38
+ else if (code &&
39
+ (code.classification === 'essential' || code.classification === 'common')) {
40
+ visibility = 'used';
41
+ }
42
+ // 3. Data usage: >= threshold% of instances have this property
43
+ else if (usage && usage.percentage >= threshold) {
44
+ visibility = 'used';
45
+ }
46
+ // 4. Code analysis: display properties are optional but may be shown in views
47
+ else {
48
+ visibility = 'optional';
49
+ }
50
+ return { property: prop, visibility, usage, codeUsage: code };
51
+ });
52
+ }
53
+ /**
54
+ * Returns true if a property value is considered "populated" (has meaningful data).
55
+ * Handles all data types: primitives, objects ({id, label}), arrays, numbers.
56
+ */
57
+ function hasValue(val) {
58
+ if (val === undefined || val === null)
59
+ return false;
60
+ if (typeof val === 'string')
61
+ return val !== '';
62
+ if (typeof val === 'number')
63
+ return true; // 0 is a valid value
64
+ if (typeof val === 'boolean')
65
+ return true;
66
+ if (Array.isArray(val))
67
+ return val.length > 0;
68
+ if (typeof val === 'object')
69
+ return Object.keys(val).length > 0;
70
+ return true;
71
+ }
72
+ /**
73
+ * Filter properties to only those that should be visible in a given context.
74
+ *
75
+ * - auto: required + used (for tables); falls back to all if nothing qualifies
76
+ * - full: all properties
77
+ * - form-add: required + used (essential/common from code); falls back to all
78
+ * - form-edit: required + used + properties with data on this instance; falls back to all
79
+ */
80
+ export function getVisibleProperties(classified, mode, instanceData) {
81
+ // Removed before any mode gets a say, and before the fallback below can reinstate it.
82
+ const visible = classified.filter((c) => c.visibility !== 'hidden');
83
+ let result;
84
+ switch (mode) {
85
+ case 'full':
86
+ return visible;
87
+ case 'auto':
88
+ result = visible.filter((c) => c.visibility === 'required' || c.visibility === 'used');
89
+ break;
90
+ case 'form-add':
91
+ result = visible.filter((c) => c.visibility === 'required' || c.visibility === 'used');
92
+ break;
93
+ case 'form-edit':
94
+ result = visible.filter((c) => {
95
+ if (c.visibility === 'required')
96
+ return true;
97
+ if (c.visibility === 'used')
98
+ return true;
99
+ if (instanceData && hasValue(instanceData[c.property.label]))
100
+ return true;
101
+ return false;
102
+ });
103
+ break;
104
+ default:
105
+ return visible;
106
+ }
107
+ // Fallback: if filtering yields nothing, show all NON-HIDDEN properties. This handles
108
+ // shapes that haven't declared any minCount/required yet — but it must not be a back
109
+ // door that reinstates what the shape explicitly hid.
110
+ return result.length > 0 ? result : visible;
111
+ }
112
+ //# sourceMappingURL=propertyVisibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"propertyVisibility.js","sourceRoot":"","sources":["../../../src/shape/propertyVisibility.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { NodeShapeWire } from '@_linked/core/shapes/nodeShapeWire';
2
+ /**
3
+ * A dependency link: a child property depends on a parent property.
4
+ * When the parent's value changes, the child should be narrowed or reset.
5
+ */
6
+ export interface PropertyDependency {
7
+ /** The parent property label (e.g., "agent") */
8
+ parentLabel: string;
9
+ /** The dependent property label (e.g., "team") */
10
+ childLabel: string;
11
+ /** The shape URI of the parent's valueShape (e.g., Player shape URI) */
12
+ parentValueShapeId: string;
13
+ /** The label of the property on the parent's valueShape that links to the child's valueShape
14
+ * (e.g., "currentTeam" on the Player shape) */
15
+ linkingPropertyLabel: string;
16
+ /** The full predicate URI of the linking property — needed for SPARQL queries */
17
+ linkingPropertyPath: string;
18
+ /** The shape URI of the child's valueShape (e.g., Team shape URI) */
19
+ childValueShapeId: string;
20
+ }
21
+ /**
22
+ * Compute dependency relationships between IRI properties on a shape.
23
+ *
24
+ * Algorithm: For each pair of IRI properties (A, B) on the same shape,
25
+ * check if A's valueShape has a property whose valueShape matches B's valueShape.
26
+ * If so, B depends on A via that linking property.
27
+ *
28
+ * Only looks 1 level deep and breaks cycles: if A→B and B→A are both found,
29
+ * only the first-discovered direction is kept.
30
+ */
31
+ export declare function computeDependencies(shape: NodeShapeWire, allShapes: Record<string, NodeShapeWire>): PropertyDependency[];
32
+ /**
33
+ * Build a lookup map: childLabel → PropertyDependency[]
34
+ * A child can depend on multiple parents (rare but possible).
35
+ */
36
+ export declare function buildDependencyMap(deps: PropertyDependency[]): Map<string, PropertyDependency[]>;
37
+ /**
38
+ * Extract the IDs that a child field should be narrowed to,
39
+ * based on the parent instance data and the linking property.
40
+ */
41
+ export declare function extractNarrowingIds(instanceData: Record<string, any>, linkingPropertyLabel: string): string[];
@@ -0,0 +1,141 @@
1
+ import { shacl } from '@_linked/core/ontologies/shacl';
2
+ const IRI_NODE_KINDS = new Set([
3
+ shacl.IRI.id,
4
+ shacl.BlankNode.id,
5
+ shacl.BlankNodeOrIRI.id,
6
+ ]);
7
+ function isIriProperty(p) {
8
+ var _a;
9
+ return !!p.nodeKind && IRI_NODE_KINDS.has(p.nodeKind.id) && !!((_a = p.valueShape) === null || _a === void 0 ? void 0 : _a.id);
10
+ }
11
+ /**
12
+ * Compute dependency relationships between IRI properties on a shape.
13
+ *
14
+ * Algorithm: For each pair of IRI properties (A, B) on the same shape,
15
+ * check if A's valueShape has a property whose valueShape matches B's valueShape.
16
+ * If so, B depends on A via that linking property.
17
+ *
18
+ * Only looks 1 level deep and breaks cycles: if A→B and B→A are both found,
19
+ * only the first-discovered direction is kept.
20
+ */
21
+ export function computeDependencies(shape, allShapes) {
22
+ var _a, _b;
23
+ const candidates = [];
24
+ const iriProperties = (shape.propertyShapes || []).filter(isIriProperty);
25
+ for (const propA of iriProperties) {
26
+ // Look up the full shape definition for A's valueShape
27
+ const aValueShape = allShapes[propA.valueShape.id];
28
+ if (!(aValueShape === null || aValueShape === void 0 ? void 0 : aValueShape.propertyShapes))
29
+ continue;
30
+ for (const propB of iriProperties) {
31
+ if (propA.label === propB.label)
32
+ continue;
33
+ if (!((_a = propB.valueShape) === null || _a === void 0 ? void 0 : _a.id))
34
+ continue;
35
+ // Check if A's valueShape has a property pointing to B's valueShape
36
+ for (const linkProp of aValueShape.propertyShapes) {
37
+ if (((_b = linkProp.valueShape) === null || _b === void 0 ? void 0 : _b.id) === propB.valueShape.id) {
38
+ const pathObj = Array.isArray(linkProp.path)
39
+ ? linkProp.path[0]
40
+ : linkProp.path;
41
+ candidates.push({
42
+ parentLabel: propA.label,
43
+ childLabel: propB.label,
44
+ parentValueShapeId: propA.valueShape.id,
45
+ linkingPropertyLabel: linkProp.label,
46
+ linkingPropertyPath: (pathObj === null || pathObj === void 0 ? void 0 : pathObj.id) || '',
47
+ childValueShapeId: propB.valueShape.id,
48
+ });
49
+ break; // Only one linking path per A→B pair
50
+ }
51
+ }
52
+ }
53
+ }
54
+ // Break cycles: if A→B and B→A both exist, keep only the first one found.
55
+ // Also ensure no field ends up as a child of ALL other fields (deadlock).
56
+ return removeCycles(candidates);
57
+ }
58
+ /**
59
+ * Remove circular dependencies from the candidate list.
60
+ * When A→B and B→A both exist, keep only the first direction found.
61
+ * Then ensure no field is blocked by all other fields (prune so at least
62
+ * one field per connected component has no parents).
63
+ */
64
+ function removeCycles(deps) {
65
+ const kept = [];
66
+ const edges = new Set(); // "parent->child" strings
67
+ for (const dep of deps) {
68
+ const forward = `${dep.parentLabel}->${dep.childLabel}`;
69
+ const reverse = `${dep.childLabel}->${dep.parentLabel}`;
70
+ // If the reverse direction is already kept, skip this one
71
+ if (edges.has(reverse))
72
+ continue;
73
+ edges.add(forward);
74
+ kept.push(dep);
75
+ }
76
+ // Ensure at least one root (a field with no parents) exists.
77
+ // If every field is someone's child, remove the dependency that has the
78
+ // most children as parent (it's the most "primary" field).
79
+ const allChildren = new Set(kept.map((d) => d.childLabel));
80
+ const allParents = new Set(kept.map((d) => d.parentLabel));
81
+ const roots = [...allParents].filter((p) => !allChildren.has(p));
82
+ if (roots.length === 0 && kept.length > 0) {
83
+ // No root — every field is a child. Break the cycle by finding the
84
+ // field that is a child the fewest times and removing its parent deps.
85
+ const childCount = new Map();
86
+ for (const d of kept) {
87
+ childCount.set(d.childLabel, (childCount.get(d.childLabel) || 0) + 1);
88
+ }
89
+ // Pick the field that appears as parent most often to be the root
90
+ const parentCount = new Map();
91
+ for (const d of kept) {
92
+ parentCount.set(d.parentLabel, (parentCount.get(d.parentLabel) || 0) + 1);
93
+ }
94
+ let bestRoot = '';
95
+ let bestCount = -1;
96
+ for (const [label, count] of parentCount) {
97
+ if (count > bestCount) {
98
+ bestCount = count;
99
+ bestRoot = label;
100
+ }
101
+ }
102
+ // Remove all deps where bestRoot is a child
103
+ return kept.filter((d) => d.childLabel !== bestRoot);
104
+ }
105
+ return kept;
106
+ }
107
+ /**
108
+ * Build a lookup map: childLabel → PropertyDependency[]
109
+ * A child can depend on multiple parents (rare but possible).
110
+ */
111
+ export function buildDependencyMap(deps) {
112
+ const map = new Map();
113
+ for (const dep of deps) {
114
+ const existing = map.get(dep.childLabel) || [];
115
+ existing.push(dep);
116
+ map.set(dep.childLabel, existing);
117
+ }
118
+ return map;
119
+ }
120
+ /**
121
+ * Extract the IDs that a child field should be narrowed to,
122
+ * based on the parent instance data and the linking property.
123
+ */
124
+ export function extractNarrowingIds(instanceData, linkingPropertyLabel) {
125
+ const linkedValue = instanceData[linkingPropertyLabel];
126
+ if (!linkedValue)
127
+ return [];
128
+ if (Array.isArray(linkedValue)) {
129
+ return linkedValue
130
+ .map((v) => (typeof v === 'object' ? v.id : v))
131
+ .filter(Boolean);
132
+ }
133
+ if (typeof linkedValue === 'object' && linkedValue.id) {
134
+ return [linkedValue.id];
135
+ }
136
+ if (typeof linkedValue === 'string') {
137
+ return [linkedValue];
138
+ }
139
+ return [];
140
+ }
141
+ //# sourceMappingURL=shapeDependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapeDependencies.js","sourceRoot":"","sources":["../../../src/shape/shapeDependencies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { PropertyShapeWire } from '@_linked/core/shapes/nodeShapeWire';
2
+ import { type PropertyUiType } from './propertyTypes.js';
3
+ export type FilterOperator = 'contains' | 'equals' | 'startsWith' | 'endsWith' | 'gt' | 'lt' | 'gte' | 'lte' | 'before' | 'after' | 'is' | 'isNot' | 'in';
4
+ export interface FilterOperatorOption {
5
+ value: FilterOperator;
6
+ label: string;
7
+ }
8
+ export interface TableFilter {
9
+ id: string;
10
+ columnId: string;
11
+ columnLabel: string;
12
+ operator: FilterOperator;
13
+ /** Single value or array of values for multi-select (enum OR) */
14
+ value: string | string[];
15
+ isActive: boolean;
16
+ }
17
+ /**
18
+ * Returns the available filter operators for a property based on its SHACL type.
19
+ */
20
+ export declare function getOperatorsForProperty(property: PropertyShapeWire): FilterOperatorOption[];
21
+ export declare function getOperatorsForUiType(uiType: PropertyUiType | null): FilterOperatorOption[];
22
+ /**
23
+ * Apply a filter to a cell value. Returns true if the row should be included.
24
+ */
25
+ export declare function applyFilter(cellValue: any, filter: TableFilter): boolean;
26
+ /**
27
+ * Apply all active filters to a row. Returns true if the row passes all filters (AND logic).
28
+ * Same-column filters with 'in' operator use OR within the column.
29
+ */
30
+ export declare function applyAllFilters(row: Record<string, any>, filters: TableFilter[]): boolean;
31
+ export declare function generateFilterId(): string;
32
+ /**
33
+ * Format a filter for display as a badge label.
34
+ */
35
+ export declare function formatFilterLabel(filter: TableFilter): string;
@@ -0,0 +1,171 @@
1
+ import { humanizeEnumLabel } from './nodeDisplay.js';
2
+ import { getPropertyUiType } from './propertyTypes.js';
3
+ // ─── Operator sets by UI type ────────────────────────────────────────
4
+ const STRING_OPERATORS = [
5
+ { value: 'contains', label: 'contains' },
6
+ { value: 'equals', label: 'equals' },
7
+ { value: 'startsWith', label: 'starts with' },
8
+ { value: 'endsWith', label: 'ends with' },
9
+ ];
10
+ const NUMBER_OPERATORS = [
11
+ { value: 'equals', label: '=' },
12
+ { value: 'gt', label: '>' },
13
+ { value: 'lt', label: '<' },
14
+ { value: 'gte', label: '>=' },
15
+ { value: 'lte', label: '<=' },
16
+ ];
17
+ const DATE_OPERATORS = [
18
+ { value: 'equals', label: 'equals' },
19
+ { value: 'before', label: 'before' },
20
+ { value: 'after', label: 'after' },
21
+ ];
22
+ const BOOLEAN_OPERATORS = [
23
+ { value: 'is', label: 'is' },
24
+ { value: 'isNot', label: 'is not' },
25
+ ];
26
+ const IRI_OPERATORS = [
27
+ { value: 'contains', label: 'contains' },
28
+ { value: 'equals', label: 'equals' },
29
+ ];
30
+ const ENUM_OPERATORS = [
31
+ { value: 'in', label: 'is one of' },
32
+ { value: 'equals', label: 'equals' },
33
+ ];
34
+ /**
35
+ * Returns the available filter operators for a property based on its SHACL type.
36
+ */
37
+ export function getOperatorsForProperty(property) {
38
+ const uiType = getPropertyUiType(property);
39
+ return getOperatorsForUiType(uiType);
40
+ }
41
+ export function getOperatorsForUiType(uiType) {
42
+ switch (uiType) {
43
+ case 'number':
44
+ return NUMBER_OPERATORS;
45
+ case 'date':
46
+ case 'datetime':
47
+ return DATE_OPERATORS;
48
+ case 'boolean':
49
+ return BOOLEAN_OPERATORS;
50
+ case 'iri-single':
51
+ case 'iri-multi':
52
+ return IRI_OPERATORS;
53
+ case 'enum-literal':
54
+ case 'enum-iri':
55
+ return ENUM_OPERATORS;
56
+ case 'text':
57
+ case 'url':
58
+ default:
59
+ return STRING_OPERATORS;
60
+ }
61
+ }
62
+ /**
63
+ * Apply a filter to a cell value. Returns true if the row should be included.
64
+ */
65
+ export function applyFilter(cellValue, filter) {
66
+ if (!filter.isActive)
67
+ return true;
68
+ const { operator, value } = filter;
69
+ // Multi-select enum: "in" operator
70
+ if (operator === 'in' && Array.isArray(value)) {
71
+ if (value.length === 0)
72
+ return true;
73
+ const cellStr = extractStringValue(cellValue);
74
+ return value.some((v) => cellStr.toLowerCase() === v.toLowerCase());
75
+ }
76
+ const filterVal = typeof value === 'string' ? value : String(value);
77
+ if (!filterVal)
78
+ return true;
79
+ const cellStr = extractStringValue(cellValue);
80
+ switch (operator) {
81
+ case 'contains':
82
+ return cellStr.toLowerCase().includes(filterVal.toLowerCase());
83
+ case 'equals':
84
+ return cellStr.toLowerCase() === filterVal.toLowerCase();
85
+ case 'startsWith':
86
+ return cellStr.toLowerCase().startsWith(filterVal.toLowerCase());
87
+ case 'endsWith':
88
+ return cellStr.toLowerCase().endsWith(filterVal.toLowerCase());
89
+ case 'gt':
90
+ return toNumber(cellStr) > toNumber(filterVal);
91
+ case 'lt':
92
+ return toNumber(cellStr) < toNumber(filterVal);
93
+ case 'gte':
94
+ return toNumber(cellStr) >= toNumber(filterVal);
95
+ case 'lte':
96
+ return toNumber(cellStr) <= toNumber(filterVal);
97
+ case 'before':
98
+ return new Date(cellStr) < new Date(filterVal);
99
+ case 'after':
100
+ return new Date(cellStr) > new Date(filterVal);
101
+ case 'is':
102
+ return cellStr.toLowerCase() === filterVal.toLowerCase();
103
+ case 'isNot':
104
+ return cellStr.toLowerCase() !== filterVal.toLowerCase();
105
+ default:
106
+ return true;
107
+ }
108
+ }
109
+ /**
110
+ * Apply all active filters to a row. Returns true if the row passes all filters (AND logic).
111
+ * Same-column filters with 'in' operator use OR within the column.
112
+ */
113
+ export function applyAllFilters(row, filters) {
114
+ const activeFilters = filters.filter((f) => f.isActive);
115
+ if (activeFilters.length === 0)
116
+ return true;
117
+ // Group filters by column for same-column OR handling
118
+ const byColumn = new Map();
119
+ for (const f of activeFilters) {
120
+ const group = byColumn.get(f.columnId) || [];
121
+ group.push(f);
122
+ byColumn.set(f.columnId, group);
123
+ }
124
+ // Each column group must pass (AND across columns)
125
+ for (const [columnId, columnFilters] of byColumn) {
126
+ const cellValue = row[columnId];
127
+ // Within a column, ANY filter passing counts (OR within column)
128
+ const columnPasses = columnFilters.some((f) => applyFilter(cellValue, f));
129
+ if (!columnPasses)
130
+ return false;
131
+ }
132
+ return true;
133
+ }
134
+ /**
135
+ * Generate a unique filter ID.
136
+ */
137
+ let filterCounter = 0;
138
+ export function generateFilterId() {
139
+ return `filter-${++filterCounter}-${Date.now()}`;
140
+ }
141
+ /**
142
+ * Format a filter for display as a badge label.
143
+ */
144
+ export function formatFilterLabel(filter) {
145
+ var _a;
146
+ const { columnLabel, operator, value } = filter;
147
+ if (operator === 'in' && Array.isArray(value)) {
148
+ return `${columnLabel}: ${value.map(humanizeEnumLabel).join(', ')}`;
149
+ }
150
+ const opLabel = ((_a = [...STRING_OPERATORS, ...NUMBER_OPERATORS, ...DATE_OPERATORS, ...BOOLEAN_OPERATORS, ...ENUM_OPERATORS]
151
+ .find((o) => o.value === operator)) === null || _a === void 0 ? void 0 : _a.label) || operator;
152
+ return `${columnLabel} ${opLabel} ${value}`;
153
+ }
154
+ // ─── Helpers ─────────────────────────────────────────────────────────
155
+ function extractStringValue(val) {
156
+ if (val == null)
157
+ return '';
158
+ if (typeof val === 'string')
159
+ return val;
160
+ if (typeof val === 'number' || typeof val === 'boolean')
161
+ return String(val);
162
+ if (typeof val === 'object') {
163
+ return val.label || val.name || val.id || String(val);
164
+ }
165
+ return String(val);
166
+ }
167
+ function toNumber(val) {
168
+ const n = parseFloat(val);
169
+ return isNaN(n) ? 0 : n;
170
+ }
171
+ //# sourceMappingURL=tableFilters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tableFilters.js","sourceRoot":"","sources":["../../../src/shape/tableFilters.ts"],"names":[],"mappings":"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"}