@_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.
- package/lib/esm/columns.d.ts +58 -0
- package/lib/esm/columns.js +173 -0
- package/lib/esm/columns.js.map +1 -0
- package/lib/esm/components/AddInstanceForms.d.ts +38 -0
- package/lib/esm/components/AddInstanceForms.js +143 -0
- package/lib/esm/components/AddInstanceForms.js.map +1 -0
- package/lib/esm/components/AddInstanceForms.module.css +12 -0
- package/lib/esm/components/BatchEditDrawer.d.ts +13 -0
- package/lib/esm/components/BatchEditDrawer.js +122 -0
- package/lib/esm/components/BatchEditDrawer.js.map +1 -0
- package/lib/esm/components/BatchEditDrawer.module.css +193 -0
- package/lib/esm/components/CustomMultiSelect.d.ts +26 -0
- package/lib/esm/components/CustomMultiSelect.js +344 -0
- package/lib/esm/components/CustomMultiSelect.js.map +1 -0
- package/lib/esm/components/CustomMultiSelect.module.css +291 -0
- package/lib/esm/components/DynamicFormField.d.ts +21 -0
- package/lib/esm/components/DynamicFormField.js +149 -0
- package/lib/esm/components/DynamicFormField.js.map +1 -0
- package/lib/esm/components/DynamicFormField.module.css +169 -0
- package/lib/esm/components/EditInstanceForms.d.ts +15 -0
- package/lib/esm/components/EditInstanceForms.js +118 -0
- package/lib/esm/components/EditInstanceForms.js.map +1 -0
- package/lib/esm/components/FilterBadge.d.ts +20 -0
- package/lib/esm/components/FilterBadge.js +26 -0
- package/lib/esm/components/FilterBadge.js.map +1 -0
- package/lib/esm/components/FilterBadge.module.css +25 -0
- package/lib/esm/components/FormField.d.ts +18 -0
- package/lib/esm/components/FormField.js +9 -0
- package/lib/esm/components/FormField.js.map +1 -0
- package/lib/esm/components/FormField.module.css +57 -0
- package/lib/esm/components/InstanceDeletionDialog.d.ts +17 -0
- package/lib/esm/components/InstanceDeletionDialog.js +83 -0
- package/lib/esm/components/InstanceDeletionDialog.js.map +1 -0
- package/lib/esm/components/InstanceDeletionDialog.module.css +59 -0
- package/lib/esm/components/InstanceOverview.d.ts +37 -0
- package/lib/esm/components/InstanceOverview.js +233 -0
- package/lib/esm/components/InstanceOverview.js.map +1 -0
- package/lib/esm/components/InstanceOverview.module.css +35 -0
- package/lib/esm/components/InstanceView.d.ts +29 -0
- package/lib/esm/components/InstanceView.js +97 -0
- package/lib/esm/components/InstanceView.js.map +1 -0
- package/lib/esm/components/InstanceView.module.css +157 -0
- package/lib/esm/components/NodeBadge.d.ts +25 -0
- package/lib/esm/components/NodeBadge.js +29 -0
- package/lib/esm/components/NodeBadge.js.map +1 -0
- package/lib/esm/components/NodeValuesEditor.d.ts +15 -0
- package/lib/esm/components/NodeValuesEditor.js +29 -0
- package/lib/esm/components/NodeValuesEditor.js.map +1 -0
- package/lib/esm/components/NodeValuesEditor.module.css +4 -0
- package/lib/esm/components/ReactTable.d.ts +50 -0
- package/lib/esm/components/ReactTable.js +370 -0
- package/lib/esm/components/ReactTable.js.map +1 -0
- package/lib/esm/components/ReactTable.module.css +950 -0
- package/lib/esm/components/TextfieldEditor.d.ts +1 -2
- package/lib/esm/components/TextfieldEditor.js +2 -2
- package/lib/esm/components/TextfieldEditor.js.map +1 -1
- package/lib/esm/components/forms.module.css +96 -0
- package/lib/esm/host.d.ts +196 -0
- package/lib/esm/host.js +25 -0
- package/lib/esm/host.js.map +1 -0
- package/lib/esm/hostContext.d.ts +34 -0
- package/lib/esm/hostContext.js +95 -0
- package/lib/esm/hostContext.js.map +1 -0
- package/lib/esm/index.d.ts +64 -10
- package/lib/esm/index.js +63 -14
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/read.d.ts +48 -0
- package/lib/esm/read.js +96 -0
- package/lib/esm/read.js.map +1 -0
- package/lib/esm/search.d.ts +32 -0
- package/lib/esm/search.js +87 -0
- package/lib/esm/search.js.map +1 -0
- package/lib/esm/shape/contracts.d.ts +58 -0
- package/lib/esm/shape/contracts.js +15 -0
- package/lib/esm/shape/contracts.js.map +1 -0
- package/lib/esm/shape/naming.d.ts +30 -0
- package/lib/esm/shape/naming.js +52 -0
- package/lib/esm/shape/naming.js.map +1 -0
- package/lib/esm/shape/nodeDisplay.d.ts +36 -0
- package/lib/esm/shape/nodeDisplay.js +117 -0
- package/lib/esm/shape/nodeDisplay.js.map +1 -0
- package/lib/esm/shape/propertyTypes.d.ts +12 -0
- package/lib/esm/shape/propertyTypes.js +60 -0
- package/lib/esm/shape/propertyTypes.js.map +1 -0
- package/lib/esm/shape/propertyVisibility.d.ts +56 -0
- package/lib/esm/shape/propertyVisibility.js +112 -0
- package/lib/esm/shape/propertyVisibility.js.map +1 -0
- package/lib/esm/shape/shapeDependencies.d.ts +41 -0
- package/lib/esm/shape/shapeDependencies.js +141 -0
- package/lib/esm/shape/shapeDependencies.js.map +1 -0
- package/lib/esm/shape/tableFilters.d.ts +35 -0
- package/lib/esm/shape/tableFilters.js +171 -0
- package/lib/esm/shape/tableFilters.js.map +1 -0
- package/lib/esm/shape/useFormDependencies.d.ts +38 -0
- package/lib/esm/shape/useFormDependencies.js +178 -0
- package/lib/esm/shape/useFormDependencies.js.map +1 -0
- package/lib/esm/shape/validation.d.ts +15 -0
- package/lib/esm/shape/validation.js +106 -0
- package/lib/esm/shape/validation.js.map +1 -0
- package/lib/esm/tokens.css +25 -0
- package/lib/esm/types.d.ts +22 -0
- package/lib/esm/types.js +1 -0
- package/lib/esm/types.js.map +1 -0
- package/lib/esm/write.d.ts +51 -0
- package/lib/esm/write.js +99 -0
- package/lib/esm/write.js.map +1 -0
- package/package.json +44 -18
- package/src/backend.ts +1 -0
- package/src/columns.regression.test.ts +143 -0
- package/src/columns.test.ts +200 -0
- package/src/columns.ts +228 -0
- package/src/components/AddInstanceForms.module.css +12 -0
- package/src/components/AddInstanceForms.tsx +321 -0
- package/src/components/AvatarEditor.tsx +34 -0
- package/src/components/BatchEditDrawer.module.css +193 -0
- package/src/components/BatchEditDrawer.tsx +295 -0
- package/src/components/CheckboxEditor.module.css +6 -0
- package/src/components/CheckboxEditor.tsx +86 -0
- package/src/components/CustomMultiSelect.module.css +291 -0
- package/src/components/CustomMultiSelect.tsx +527 -0
- package/src/components/DateEditor.tsx +50 -0
- package/src/components/DynamicFormField.module.css +169 -0
- package/src/components/DynamicFormField.tsx +357 -0
- package/src/components/EditInstanceForms.tsx +260 -0
- package/src/components/FilterBadge.module.css +25 -0
- package/src/components/FilterBadge.tsx +70 -0
- package/src/components/FormField.module.css +57 -0
- package/src/components/FormField.tsx +59 -0
- package/src/components/ImageValueEditor.module.css +3 -0
- package/src/components/ImageValueEditor.tsx +82 -0
- package/src/components/InstanceDeletionDialog.module.css +59 -0
- package/src/components/InstanceDeletionDialog.tsx +175 -0
- package/src/components/InstanceOverview.module.css +35 -0
- package/src/components/InstanceOverview.tsx +374 -0
- package/src/components/InstanceView.module.css +157 -0
- package/src/components/InstanceView.tsx +212 -0
- package/src/components/NodeBadge.tsx +60 -0
- package/src/components/NodeValuesEditor.module.css +4 -0
- package/src/components/NodeValuesEditor.tsx +64 -0
- package/src/components/RadioButtonEditor.module.css +22 -0
- package/src/components/RadioButtonEditor.tsx +96 -0
- package/src/components/ReactTable.module.css +950 -0
- package/src/components/ReactTable.tsx +991 -0
- package/src/components/SelectEditor.tsx +85 -0
- package/src/components/ShapeTable.module.css +394 -0
- package/src/components/SwitchEditor.tsx +60 -0
- package/src/components/TextareaEditor.tsx +55 -0
- package/src/components/TextfieldEditor.tsx +67 -0
- package/src/components/ToggleEditor.tsx +63 -0
- package/src/components/forms.module.css +96 -0
- package/src/host.ts +226 -0
- package/src/hostContext.tsx +114 -0
- package/src/index.ts +99 -0
- package/src/package.ts +21 -0
- package/src/read.ts +148 -0
- package/src/search.test.ts +174 -0
- package/src/search.ts +108 -0
- package/src/shape/contracts.ts +66 -0
- package/src/shape/naming.ts +52 -0
- package/src/shape/nodeDisplay.ts +114 -0
- package/src/shape/propertyTypes.ts +86 -0
- package/src/shape/propertyVisibility.ts +180 -0
- package/src/shape/shapeDependencies.ts +183 -0
- package/src/shape/tableFilters.ts +223 -0
- package/src/shape/types.ts +1158 -0
- package/src/shape/useFormDependencies.ts +257 -0
- package/src/shape/validation.ts +121 -0
- package/src/tokens.css +25 -0
- package/src/types.ts +20 -0
- package/src/utils/helper.ts +35 -0
- package/src/write.test.ts +174 -0
- package/src/write.ts +114 -0
- package/.changeset/README.md +0 -20
- package/.changeset/config.json +0 -14
- package/.github/workflows/changeset-check.yml +0 -44
- package/.github/workflows/ci.yml +0 -43
- package/.github/workflows/publish.yml +0 -158
- package/CHANGELOG.md +0 -30
- package/lib/esm/components/AvatarEditor.d.ts +0 -20
- package/lib/esm/components/AvatarEditor.js +0 -7
- package/lib/esm/components/AvatarEditor.js.map +0 -1
- package/lib/esm/components/CheckboxEditor.d.ts +0 -21
- package/lib/esm/components/CheckboxEditor.js +0 -44
- package/lib/esm/components/CheckboxEditor.js.map +0 -1
- package/lib/esm/components/DateEditor.d.ts +0 -20
- package/lib/esm/components/DateEditor.js +0 -22
- package/lib/esm/components/DateEditor.js.map +0 -1
- package/lib/esm/components/RadioButtonEditor.d.ts +0 -23
- package/lib/esm/components/RadioButtonEditor.js +0 -41
- package/lib/esm/components/RadioButtonEditor.js.map +0 -1
- package/lib/esm/components/SelectEditor.d.ts +0 -21
- package/lib/esm/components/SelectEditor.js +0 -30
- package/lib/esm/components/SelectEditor.js.map +0 -1
- package/lib/esm/components/SwitchEditor.d.ts +0 -21
- package/lib/esm/components/SwitchEditor.js +0 -23
- package/lib/esm/components/SwitchEditor.js.map +0 -1
- package/lib/esm/components/TextareaEditor.d.ts +0 -23
- package/lib/esm/components/TextareaEditor.js +0 -15
- package/lib/esm/components/TextareaEditor.js.map +0 -1
- package/lib/esm/components/ToggleEditor.d.ts +0 -22
- package/lib/esm/components/ToggleEditor.js +0 -23
- package/lib/esm/components/ToggleEditor.js.map +0 -1
- package/lib/esm/ontologies/lincd-ui.d.ts +0 -6
- package/lib/esm/ontologies/lincd-ui.js +0 -18
- package/lib/esm/ontologies/lincd-ui.js.map +0 -1
- package/lib/esm/package.d.ts +0 -3
- package/lib/esm/package.js +0 -4
- package/lib/esm/package.js.map +0 -1
- package/tsconfig-cjs.json +0 -8
- 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,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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"}
|