@asteby/metacore-runtime-react 17.0.0 → 17.0.2
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/CHANGELOG.md +28 -0
- package/dist/action-modal-dispatcher.d.ts +1 -1
- package/dist/action-modal-dispatcher.d.ts.map +1 -1
- package/dist/addon-layout-context.d.ts +1 -1
- package/dist/addon-layout-context.d.ts.map +1 -1
- package/dist/addon-loader.d.ts +1 -1
- package/dist/addon-loader.d.ts.map +1 -1
- package/dist/api-context.d.ts +2 -2
- package/dist/api-context.d.ts.map +1 -1
- package/dist/capability-gate.d.ts +2 -2
- package/dist/capability-gate.d.ts.map +1 -1
- package/dist/dialogs/_primitives.d.ts +4 -4
- package/dist/dialogs/_primitives.d.ts.map +1 -1
- package/dist/dialogs/create-record-dialog.d.ts +1 -1
- package/dist/dialogs/create-record-dialog.d.ts.map +1 -1
- package/dist/dialogs/dynamic-record.d.ts +1 -1
- package/dist/dialogs/dynamic-record.d.ts.map +1 -1
- package/dist/dialogs/dynamic-record.js +4 -1
- package/dist/dialogs/export.d.ts +1 -1
- package/dist/dialogs/export.d.ts.map +1 -1
- package/dist/dialogs/import.d.ts +1 -1
- package/dist/dialogs/import.d.ts.map +1 -1
- package/dist/dialogs/view-record-dialog.d.ts +1 -1
- package/dist/dialogs/view-record-dialog.d.ts.map +1 -1
- package/dist/dynamic-columns-helpers.d.ts +21 -0
- package/dist/dynamic-columns-helpers.d.ts.map +1 -0
- package/dist/dynamic-columns-helpers.js +59 -0
- package/dist/dynamic-columns.d.ts.map +1 -1
- package/dist/dynamic-columns.js +12 -6
- package/dist/dynamic-crud-page.d.ts +1 -1
- package/dist/dynamic-crud-page.d.ts.map +1 -1
- package/dist/dynamic-date-field.d.ts +1 -1
- package/dist/dynamic-date-field.d.ts.map +1 -1
- package/dist/dynamic-form.d.ts +1 -1
- package/dist/dynamic-form.d.ts.map +1 -1
- package/dist/dynamic-icon.d.ts +1 -1
- package/dist/dynamic-icon.d.ts.map +1 -1
- package/dist/dynamic-line-items.d.ts +1 -1
- package/dist/dynamic-line-items.d.ts.map +1 -1
- package/dist/dynamic-relation-helpers.d.ts +2 -0
- package/dist/dynamic-relation-helpers.d.ts.map +1 -1
- package/dist/dynamic-relation-helpers.js +69 -0
- package/dist/dynamic-relation.d.ts +2 -2
- package/dist/dynamic-relation.d.ts.map +1 -1
- package/dist/dynamic-relation.js +6 -12
- package/dist/dynamic-relations.d.ts +1 -1
- package/dist/dynamic-relations.d.ts.map +1 -1
- package/dist/dynamic-select-field.d.ts +1 -1
- package/dist/dynamic-select-field.d.ts.map +1 -1
- package/dist/dynamic-table.d.ts +1 -1
- package/dist/dynamic-table.d.ts.map +1 -1
- package/dist/i18n-provider.d.ts +1 -1
- package/dist/i18n-provider.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/model-action-toolbar.d.ts +1 -1
- package/dist/model-action-toolbar.d.ts.map +1 -1
- package/dist/navigation-builder.d.ts +1 -1
- package/dist/navigation-builder.d.ts.map +1 -1
- package/dist/slot.d.ts +1 -1
- package/dist/slot.d.ts.map +1 -1
- package/dist/upload-field.d.ts +1 -1
- package/dist/upload-field.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/dynamic-relation.test.ts +65 -0
- package/src/__tests__/humanize-token.test.ts +58 -0
- package/src/dialogs/dynamic-record.tsx +4 -1
- package/src/dynamic-columns-helpers.ts +58 -0
- package/src/dynamic-columns.tsx +13 -7
- package/src/dynamic-relation-helpers.ts +70 -0
- package/src/dynamic-relation.tsx +11 -12
- package/src/index.ts +1 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export type { DynamicRelationKind } from './dynamic-relation-helpers';
|
|
2
|
-
export { buildCreatePayload, buildPivotAttachPayload, buildPivotRowIndex, buildRelationFilterParams, deriveRelationFormFields, diffSelection, extractSelectedTargetIds, pickOptionLabel, relationRowKey, } from './dynamic-relation-helpers';
|
|
2
|
+
export { buildCreatePayload, buildPivotAttachPayload, buildPivotRowIndex, buildRelationFilterParams, deriveRelationFormFields, diffSelection, extractSelectedTargetIds, formatRelationCell, objectLabel, pickOptionLabel, relationRowKey, } from './dynamic-relation-helpers';
|
|
3
3
|
export interface DynamicRelationStrings {
|
|
4
4
|
title: string;
|
|
5
5
|
emptyState: string;
|
|
@@ -68,5 +68,5 @@ export interface DynamicRelationManyToManyProps extends CommonProps {
|
|
|
68
68
|
displayKey?: string;
|
|
69
69
|
}
|
|
70
70
|
export type DynamicRelationProps = DynamicRelationOneToManyProps | DynamicRelationManyToManyProps;
|
|
71
|
-
export declare function DynamicRelation(props: DynamicRelationProps): import("react
|
|
71
|
+
export declare function DynamicRelation(props: DynamicRelationProps): import("react").JSX.Element;
|
|
72
72
|
//# sourceMappingURL=dynamic-relation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-relation.d.ts","sourceRoot":"","sources":["../src/dynamic-relation.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dynamic-relation.d.ts","sourceRoot":"","sources":["../src/dynamic-relation.tsx"],"names":[],"mappings":"AA2CA,YAAY,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,EACH,kBAAkB,EAClB,uBAAuB,EACvB,kBAAkB,EAClB,yBAAyB,EACzB,wBAAwB,EACxB,aAAa,EACb,wBAAwB,EACxB,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,cAAc,GACjB,MAAM,4BAA4B,CAAA;AAEnC,MAAM,WAAW,sBAAsB;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,wBAAwB,EAAE,MAAM,CAAA;IAChC,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,iBAAiB,EAAE,MAAM,CAAA;IACzB,uBAAuB,EAAE,MAAM,CAAA;IAC/B,WAAW,EAAE,MAAM,CAAA;CACtB;AAiBD,UAAU,WAAW;IACjB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAA;IACzC,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACxB;AAED,MAAM,WAAW,6BAA8B,SAAQ,WAAW;IAC9D,IAAI,EAAE,aAAa,CAAA;IACnB,yFAAyF;IACzF,KAAK,EAAE,MAAM,CAAA;IACb,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAA;IAClB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,8BAA+B,SAAQ,WAAW;IAC/D,IAAI,EAAE,cAAc,CAAA;IACpB,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAA;IACf,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAA;IAClB,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,uEAAuE;IACvE,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,MAAM,oBAAoB,GAC1B,6BAA6B,GAC7B,8BAA8B,CAAA;AAEpC,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,+BAK1D"}
|
package/dist/dynamic-relation.js
CHANGED
|
@@ -11,8 +11,8 @@ import { useApi } from './api-context';
|
|
|
11
11
|
import { useMetadataCache } from './metadata-cache';
|
|
12
12
|
import { DynamicForm } from './dynamic-form';
|
|
13
13
|
import { useOptionsResolver } from './use-options-resolver';
|
|
14
|
-
import { buildCreatePayload, buildPivotAttachPayload, buildPivotRowIndex, buildRelationFilterParams, deriveRelationFormFields, diffSelection, extractSelectedTargetIds, pickOptionLabel, relationRowKey, } from './dynamic-relation-helpers';
|
|
15
|
-
export { buildCreatePayload, buildPivotAttachPayload, buildPivotRowIndex, buildRelationFilterParams, deriveRelationFormFields, diffSelection, extractSelectedTargetIds, pickOptionLabel, relationRowKey, } from './dynamic-relation-helpers';
|
|
14
|
+
import { buildCreatePayload, buildPivotAttachPayload, buildPivotRowIndex, buildRelationFilterParams, deriveRelationFormFields, diffSelection, extractSelectedTargetIds, formatRelationCell, pickOptionLabel, relationRowKey, } from './dynamic-relation-helpers';
|
|
15
|
+
export { buildCreatePayload, buildPivotAttachPayload, buildPivotRowIndex, buildRelationFilterParams, deriveRelationFormFields, diffSelection, extractSelectedTargetIds, formatRelationCell, objectLabel, pickOptionLabel, relationRowKey, } from './dynamic-relation-helpers';
|
|
16
16
|
const DEFAULT_STRINGS = {
|
|
17
17
|
title: '',
|
|
18
18
|
emptyState: 'No hay registros relacionados.',
|
|
@@ -134,18 +134,12 @@ function OneToManyRelation({ kind, model, foreignKey, parentId, filters, endpoin
|
|
|
134
134
|
setSubmitting(false);
|
|
135
135
|
}
|
|
136
136
|
}, [api, dataEndpoint, fetchAll, onChange, rowToDelete]);
|
|
137
|
-
return (_jsxs("div", { className: className, "data-relation-kind": kind, "data-relation-model": model, children: [(labels.title || canCreate) && (_jsxs("div", { className: "flex items-center justify-between pb-3", children: [labels.title ? _jsx("h3", { className: "text-sm font-medium", children: labels.title }) : _jsx("span", {}), canCreate && (_jsxs(Button, { size: "sm", variant: "outline", onClick: () => { setEditingRow(null); setFormOpen(true); }, children: [_jsx(Plus, { className: "h-4 w-4 mr-1" }), labels.addLabel] }))] })), loading ? (_jsx("div", { className: "space-y-2", children: Array.from({ length: 3 }).map((_, i) => (_jsx(Skeleton, { className: "h-10 w-full" }, `rel-skeleton-${i}`))) })) : rows.length === 0 ? (_jsx("div", { className: "text-center text-sm text-muted-foreground py-8 border rounded-md bg-muted/30", children: labels.emptyState })) : (_jsx("div", { className: "border rounded-md divide-y bg-card", children: rows.map((row, idx) => (_jsxs("div", { className: "flex items-center justify-between gap-3 px-3 py-2", children: [_jsx("div", { className: "flex-1 grid grid-cols-[repeat(auto-fit,minmax(0,1fr))] gap-2 text-sm", children: visibleColumns.map(col =>
|
|
137
|
+
return (_jsxs("div", { className: className, "data-relation-kind": kind, "data-relation-model": model, children: [(labels.title || canCreate) && (_jsxs("div", { className: "flex items-center justify-between pb-3", children: [labels.title ? _jsx("h3", { className: "text-sm font-medium", children: labels.title }) : _jsx("span", {}), canCreate && (_jsxs(Button, { size: "sm", variant: "outline", onClick: () => { setEditingRow(null); setFormOpen(true); }, children: [_jsx(Plus, { className: "h-4 w-4 mr-1" }), labels.addLabel] }))] })), loading ? (_jsx("div", { className: "space-y-2", children: Array.from({ length: 3 }).map((_, i) => (_jsx(Skeleton, { className: "h-10 w-full" }, `rel-skeleton-${i}`))) })) : rows.length === 0 ? (_jsx("div", { className: "text-center text-sm text-muted-foreground py-8 border rounded-md bg-muted/30", children: labels.emptyState })) : (_jsx("div", { className: "border rounded-md divide-y bg-card", children: rows.map((row, idx) => (_jsxs("div", { className: "flex items-center justify-between gap-3 px-3 py-2", children: [_jsx("div", { className: "flex-1 grid grid-cols-[repeat(auto-fit,minmax(0,1fr))] gap-2 text-sm", children: visibleColumns.map(col => {
|
|
138
|
+
const cell = formatRelationCell(row, col);
|
|
139
|
+
return (_jsx("span", { className: "truncate", title: cell, children: cell }, col.key));
|
|
140
|
+
}) }), _jsxs("div", { className: "flex items-center gap-1 shrink-0", children: [canEdit && (_jsx(Button, { size: "sm", variant: "ghost", onClick: () => { setEditingRow(row); setFormOpen(true); }, "aria-label": labels.editLabel, children: _jsx(Pencil, { className: "h-4 w-4" }) })), canDelete && (_jsx(Button, { size: "sm", variant: "ghost", onClick: () => setRowToDelete(row), "aria-label": labels.removeLabel, children: _jsx(Trash2, { className: "h-4 w-4" }) }))] })] }, relationRowKey(row, idx, foreignKey)))) })), _jsx(Dialog, { open: formOpen, onOpenChange: (open) => { setFormOpen(open); if (!open)
|
|
138
141
|
setEditingRow(null); }, children: _jsxs(DialogContent, { children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: editingRow ? labels.editLabel : labels.addLabel }) }), _jsx(DynamicForm, { fields: formFields, initialValues: editingRow || undefined, onSubmit: handleSubmit, onCancel: () => { setFormOpen(false); setEditingRow(null); }, submitLabel: labels.saveLabel, cancelLabel: labels.cancelLabel, disabled: submitting })] }) }), _jsx(AlertDialog, { open: !!rowToDelete, onOpenChange: (open) => !open && setRowToDelete(null), children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: labels.confirmRemoveTitle }), _jsx(AlertDialogDescription, { children: labels.confirmRemoveDescription })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { disabled: submitting, children: labels.cancelLabel }), _jsx(AlertDialogAction, { onClick: (e) => { e.preventDefault(); handleDelete(); }, className: "bg-red-600 hover:bg-red-700", disabled: submitting, children: labels.removeLabel })] })] }) })] }));
|
|
139
142
|
}
|
|
140
|
-
function formatCell(value) {
|
|
141
|
-
if (value === null || value === undefined)
|
|
142
|
-
return '—';
|
|
143
|
-
if (typeof value === 'boolean')
|
|
144
|
-
return value ? '✓' : '—';
|
|
145
|
-
if (typeof value === 'object')
|
|
146
|
-
return JSON.stringify(value);
|
|
147
|
-
return String(value);
|
|
148
|
-
}
|
|
149
143
|
function ManyToManyRelation({ kind, through, references, foreignKey, referencesKey, parentId, filters, pivotEndpoint, referencesEndpoint, displayKey, canCreate = true, canDelete = true, strings, className, onChange, }) {
|
|
150
144
|
const api = useApi();
|
|
151
145
|
const { getMetadata, setMetadata: cacheMetadata } = useMetadataCache();
|
|
@@ -47,5 +47,5 @@ export declare function resolveParentId(record: {
|
|
|
47
47
|
* both places is safe.
|
|
48
48
|
*/
|
|
49
49
|
export declare function buildRelationFilters(relation: Pick<RelationMeta, 'foreign_key' | 'scope'>, parentId: string | number): Record<string, string>;
|
|
50
|
-
export declare function DynamicRelations({ record, relations, parentIdKey, className, panelClassName, canCreate, canDelete, canEdit, strings, onChange, }: DynamicRelationsProps): import("react
|
|
50
|
+
export declare function DynamicRelations({ record, relations, parentIdKey, className, panelClassName, canCreate, canDelete, canEdit, strings, onChange, }: DynamicRelationsProps): import("react").JSX.Element | null;
|
|
51
51
|
//# sourceMappingURL=dynamic-relations.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-relations.d.ts","sourceRoot":"","sources":["../src/dynamic-relations.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAmB,KAAK,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C,MAAM,WAAW,qBAAqB;IAClC;;;OAGG;IACH,MAAM,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAAG,IAAI,GAAG,SAAS,CAAA;IACzE,gEAAgE;IAChE,SAAS,EAAE,YAAY,EAAE,GAAG,IAAI,GAAG,SAAS,CAAA;IAC5C;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mCAAmC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAA;IACzC,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAA;CAC9C;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC3B,MAAM,EAAE;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,EACnD,WAAW,SAAO,GACnB,MAAM,GAAG,MAAM,GAAG,SAAS,CAM7B;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAChC,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,aAAa,GAAG,OAAO,CAAC,EACrD,QAAQ,EAAE,MAAM,GAAG,MAAM,GAC1B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUxB;AAOD,wBAAgB,gBAAgB,CAAC,EAC7B,MAAM,EACN,SAAS,EACT,WAAkB,EAClB,SAAS,EACT,cAAc,EACd,SAAgB,EAChB,SAAgB,EAChB,OAAc,EACd,OAAO,EACP,QAAQ,GACX,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"dynamic-relations.d.ts","sourceRoot":"","sources":["../src/dynamic-relations.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAmB,KAAK,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C,MAAM,WAAW,qBAAqB;IAClC;;;OAGG;IACH,MAAM,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAAG,IAAI,GAAG,SAAS,CAAA;IACzE,gEAAgE;IAChE,SAAS,EAAE,YAAY,EAAE,GAAG,IAAI,GAAG,SAAS,CAAA;IAC5C;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mCAAmC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAA;IACzC,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAA;CAC9C;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC3B,MAAM,EAAE;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,EACnD,WAAW,SAAO,GACnB,MAAM,GAAG,MAAM,GAAG,SAAS,CAM7B;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAChC,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,aAAa,GAAG,OAAO,CAAC,EACrD,QAAQ,EAAE,MAAM,GAAG,MAAM,GAC1B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUxB;AAOD,wBAAgB,gBAAgB,CAAC,EAC7B,MAAM,EACN,SAAS,EACT,WAAkB,EAClB,SAAS,EACT,cAAc,EACd,SAAgB,EAChB,SAAgB,EAChB,OAAc,EACd,OAAO,EACP,QAAQ,GACX,EAAE,qBAAqB,sCA4DvB"}
|
|
@@ -4,6 +4,6 @@ export interface DynamicSelectFieldProps {
|
|
|
4
4
|
value: any;
|
|
5
5
|
onChange: (v: any) => void;
|
|
6
6
|
}
|
|
7
|
-
export declare function DynamicSelectField({ field, value, onChange }: DynamicSelectFieldProps): import("react
|
|
7
|
+
export declare function DynamicSelectField({ field, value, onChange }: DynamicSelectFieldProps): import("react").JSX.Element;
|
|
8
8
|
export default DynamicSelectField;
|
|
9
9
|
//# sourceMappingURL=dynamic-select-field.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-select-field.d.ts","sourceRoot":"","sources":["../src/dynamic-select-field.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAgD7C,MAAM,WAAW,uBAAuB;IACpC,KAAK,EAAE,cAAc,CAAA;IACrB,KAAK,EAAE,GAAG,CAAA;IACV,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;CAC7B;AAED,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,uBAAuB
|
|
1
|
+
{"version":3,"file":"dynamic-select-field.d.ts","sourceRoot":"","sources":["../src/dynamic-select-field.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAgD7C,MAAM,WAAW,uBAAuB;IACpC,KAAK,EAAE,cAAc,CAAA;IACrB,KAAK,EAAE,GAAG,CAAA;IACV,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;CAC7B;AAED,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,uBAAuB,+BA2KrF;AAED,eAAe,kBAAkB,CAAA"}
|
package/dist/dynamic-table.d.ts
CHANGED
|
@@ -17,6 +17,6 @@ interface DynamicTableProps {
|
|
|
17
17
|
*/
|
|
18
18
|
getDynamicColumns?: GetDynamicColumns;
|
|
19
19
|
}
|
|
20
|
-
export declare function DynamicTable({ model, endpoint, enableUrlSync, hiddenColumns, onAction, refreshTrigger, defaultFilters, extraColumns, getDynamicColumns, }: DynamicTableProps): import("react
|
|
20
|
+
export declare function DynamicTable({ model, endpoint, enableUrlSync, hiddenColumns, onAction, refreshTrigger, defaultFilters, extraColumns, getDynamicColumns, }: DynamicTableProps): import("react").JSX.Element;
|
|
21
21
|
export {};
|
|
22
22
|
//# sourceMappingURL=dynamic-table.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-table.d.ts","sourceRoot":"","sources":["../src/dynamic-table.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAKH,KAAK,SAAS,EAajB,MAAM,uBAAuB,CAAA;AA+B9B,OAAO,KAAK,EAAsB,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAUnF,UAAU,iBAAiB;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,CAAA;IAC7C,cAAc,CAAC,EAAE,GAAG,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACpC,YAAY,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAA;IAC/B;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;CACxC;AAED,wBAAgB,YAAY,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,aAAoB,EACpB,aAAkB,EAClB,QAAQ,EACR,cAAc,EACd,cAAc,EACd,YAAiB,EACjB,iBAA4C,GAC/C,EAAE,iBAAiB
|
|
1
|
+
{"version":3,"file":"dynamic-table.d.ts","sourceRoot":"","sources":["../src/dynamic-table.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAKH,KAAK,SAAS,EAajB,MAAM,uBAAuB,CAAA;AA+B9B,OAAO,KAAK,EAAsB,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAUnF,UAAU,iBAAiB;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,CAAA;IAC7C,cAAc,CAAC,EAAE,GAAG,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACpC,YAAY,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAA;IAC/B;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;CACxC;AAED,wBAAgB,YAAY,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,aAAoB,EACpB,aAAkB,EAClB,QAAQ,EACR,cAAc,EACd,cAAc,EACd,YAAiB,EACjB,iBAA4C,GAC/C,EAAE,iBAAiB,+BA+xBnB"}
|
package/dist/i18n-provider.d.ts
CHANGED
|
@@ -12,5 +12,5 @@ export interface I18nProviderProps {
|
|
|
12
12
|
contributions: AddonI18nResources[];
|
|
13
13
|
children: React.ReactNode;
|
|
14
14
|
}
|
|
15
|
-
export declare function I18nProvider({ i18n, contributions, children }: I18nProviderProps): import("react
|
|
15
|
+
export declare function I18nProvider({ i18n, contributions, children }: I18nProviderProps): import("react").JSX.Element;
|
|
16
16
|
//# sourceMappingURL=i18n-provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n-provider.d.ts","sourceRoot":"","sources":["../src/i18n-provider.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,IAAI,YAAY,EAAE,MAAM,SAAS,CAAA;AAEnD,MAAM,WAAW,kBAAkB;IAC/B,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAA;IACd,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAA;CACjD;AAED,MAAM,WAAW,iBAAiB;IAC9B,mCAAmC;IACnC,IAAI,EAAE,YAAY,CAAA;IAClB,8DAA8D;IAC9D,aAAa,EAAE,kBAAkB,EAAE,CAAA;IACnC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC5B;AAED,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,iBAAiB
|
|
1
|
+
{"version":3,"file":"i18n-provider.d.ts","sourceRoot":"","sources":["../src/i18n-provider.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,IAAI,YAAY,EAAE,MAAM,SAAS,CAAA;AAEnD,MAAM,WAAW,kBAAkB;IAC/B,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAA;IACd,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAA;CACjD;AAED,MAAM,WAAW,iBAAiB;IAC9B,mCAAmC;IACnC,IAAI,EAAE,YAAY,CAAA;IAClB,8DAA8D;IAC9D,aAAa,EAAE,kBAAkB,EAAE,CAAA;IACnC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC5B;AAED,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,iBAAiB,+BAWhF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export { useHotSwapReload, applyHotSwapReload, withVersionParam, clearFederation
|
|
|
17
17
|
export * from './dynamic-icon';
|
|
18
18
|
export type { ColumnFilterConfig, FilterOption as DynamicColumnFilterOption, GetDynamicColumns, DynamicIconComponent, } from './dynamic-columns-shim';
|
|
19
19
|
export { defaultGetDynamicColumns, makeDefaultGetDynamicColumns, relationKeyFor, resolveRelationLabel, type DynamicColumnsHelpers, } from './dynamic-columns';
|
|
20
|
+
export { humanizeToken } from './dynamic-columns-helpers';
|
|
20
21
|
export { NIL_UUID, isNilUuid, normalizeNilUuid } from './nil-uuid';
|
|
21
22
|
export { DynamicRecordDialog } from './dialogs/dynamic-record';
|
|
22
23
|
export { CreateRecordDialog } from './dialogs/create-record-dialog';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -21,6 +21,7 @@ export { ADDON_MANIFEST_CHANGED_TYPE, wireHotSwapInvalidation, useManifestHotSwa
|
|
|
21
21
|
export { useHotSwapReload, applyHotSwapReload, withVersionParam, clearFederationContainer, shortenHash, } from './hotswap-reload-policy';
|
|
22
22
|
export * from './dynamic-icon';
|
|
23
23
|
export { defaultGetDynamicColumns, makeDefaultGetDynamicColumns, relationKeyFor, resolveRelationLabel, } from './dynamic-columns';
|
|
24
|
+
export { humanizeToken } from './dynamic-columns-helpers';
|
|
24
25
|
export { NIL_UUID, isNilUuid, normalizeNilUuid } from './nil-uuid';
|
|
25
26
|
export { DynamicRecordDialog } from './dialogs/dynamic-record';
|
|
26
27
|
export { CreateRecordDialog } from './dialogs/create-record-dialog';
|
|
@@ -23,5 +23,5 @@ export interface ModelActionToolbarProps {
|
|
|
23
23
|
* `actions` prop when provided, else the metadata cache, else fetches once.
|
|
24
24
|
*/
|
|
25
25
|
export declare function useModelActions(model: string, placements?: ActionPlacement[], provided?: ActionDefinition[]): ActionDefinition[];
|
|
26
|
-
export declare function ModelActionToolbar({ model, endpoint, actions, placements, onChange, className, }: ModelActionToolbarProps): import("react
|
|
26
|
+
export declare function ModelActionToolbar({ model, endpoint, actions, placements, onChange, className, }: ModelActionToolbarProps): import("react").JSX.Element | null;
|
|
27
27
|
//# sourceMappingURL=model-action-toolbar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-action-toolbar.d.ts","sourceRoot":"","sources":["../src/model-action-toolbar.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,gBAAgB,EAAiC,MAAM,SAAS,CAAA;AAE9E,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAA;AAExD,MAAM,WAAW,uBAAuB;IACpC,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAA;IACb,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B,qEAAqE;IACrE,UAAU,CAAC,EAAE,eAAe,EAAE,CAAA;IAC9B,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAmBD;;;GAGG;AACH,wBAAgB,eAAe,CAC3B,KAAK,EAAE,MAAM,EACb,UAAU,GAAE,eAAe,EAAuB,EAClD,QAAQ,CAAC,EAAE,gBAAgB,EAAE,GAC9B,gBAAgB,EAAE,CA2BpB;AAED,wBAAgB,kBAAkB,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,OAAO,EACP,UAA+B,EAC/B,QAAQ,EACR,SAAS,GACZ,EAAE,uBAAuB,
|
|
1
|
+
{"version":3,"file":"model-action-toolbar.d.ts","sourceRoot":"","sources":["../src/model-action-toolbar.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,gBAAgB,EAAiC,MAAM,SAAS,CAAA;AAE9E,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAA;AAExD,MAAM,WAAW,uBAAuB;IACpC,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAA;IACb,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B,qEAAqE;IACrE,UAAU,CAAC,EAAE,eAAe,EAAE,CAAA;IAC9B,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAmBD;;;GAGG;AACH,wBAAgB,eAAe,CAC3B,KAAK,EAAE,MAAM,EACb,UAAU,GAAE,eAAe,EAAuB,EAClD,QAAQ,CAAC,EAAE,gBAAgB,EAAE,GAC9B,gBAAgB,EAAE,CA2BpB;AAED,wBAAgB,kBAAkB,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,OAAO,EACP,UAA+B,EAC/B,QAAQ,EACR,SAAS,GACZ,EAAE,uBAAuB,sCA4CzB"}
|
|
@@ -30,5 +30,5 @@ export interface NavigationBuilderProps {
|
|
|
30
30
|
}
|
|
31
31
|
/** Render-prop component for hosts that want the merge logic but render
|
|
32
32
|
* the sidebar with their own primitives. */
|
|
33
|
-
export declare function NavigationBuilder({ base, contributions, render }: NavigationBuilderProps): import("react
|
|
33
|
+
export declare function NavigationBuilder({ base, contributions, render }: NavigationBuilderProps): import("react").JSX.Element;
|
|
34
34
|
//# sourceMappingURL=navigation-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-builder.d.ts","sourceRoot":"","sources":["../src/navigation-builder.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,OAAO;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;IACpB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,2BAA2B;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,OAAO,EAAE,CAAA;CACnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,2BAA2B,EAAE,GAAG,OAAO,EAAE,CA8BxG;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,2BAA2B,EAAE,GAAG,OAAO,EAAE,CAEtG;AAED,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,aAAa,EAAE,2BAA2B,EAAE,CAAA;IAC5C,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,KAAK,CAAC,SAAS,CAAA;CAChD;AAED;6CAC6C;AAC7C,wBAAgB,iBAAiB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,sBAAsB
|
|
1
|
+
{"version":3,"file":"navigation-builder.d.ts","sourceRoot":"","sources":["../src/navigation-builder.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,OAAO;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;IACpB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,2BAA2B;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,OAAO,EAAE,CAAA;CACnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,2BAA2B,EAAE,GAAG,OAAO,EAAE,CA8BxG;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,2BAA2B,EAAE,GAAG,OAAO,EAAE,CAEtG;AAED,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,aAAa,EAAE,2BAA2B,EAAE,CAAA;IAC5C,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,KAAK,CAAC,SAAS,CAAA;CAChD;AAED;6CAC6C;AAC7C,wBAAgB,iBAAiB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,sBAAsB,+BAGxF"}
|
package/dist/slot.d.ts
CHANGED
|
@@ -27,6 +27,6 @@ export interface SlotProps {
|
|
|
27
27
|
/** Fallback element shown when no contribution is registered. */
|
|
28
28
|
fallback?: React.ReactNode;
|
|
29
29
|
}
|
|
30
|
-
export declare function Slot({ name, props, fallback }: SlotProps):
|
|
30
|
+
export declare function Slot({ name, props, fallback }: SlotProps): React.JSX.Element;
|
|
31
31
|
export {};
|
|
32
32
|
//# sourceMappingURL=slot.d.ts.map
|
package/dist/slot.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slot.d.ts","sourceRoot":"","sources":["../src/slot.tsx"],"names":[],"mappings":"AAGA,OAAO,KAA+B,MAAM,OAAO,CAAA;AAEnD,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAA;AAE3D,UAAU,SAAS;IACf,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,aAAa,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,KAAK,QAAQ,GAAG,MAAM,IAAI,CAAA;AAE1B,cAAM,gBAAgB;IAClB,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,SAAS,CAAsB;IAEvC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,IAAI;IAoB7G,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE;IAIhC,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,IAAI;IAKzC,OAAO,CAAC,IAAI;CACf;AAED,eAAO,MAAM,YAAY,kBAAyB,CAAA;AAElD,MAAM,WAAW,SAAS;IACtB,eAAe;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC3B,iEAAiE;IACjE,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC7B;AAED,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAe,EAAE,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"slot.d.ts","sourceRoot":"","sources":["../src/slot.tsx"],"names":[],"mappings":"AAGA,OAAO,KAA+B,MAAM,OAAO,CAAA;AAEnD,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAA;AAE3D,UAAU,SAAS;IACf,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,aAAa,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,KAAK,QAAQ,GAAG,MAAM,IAAI,CAAA;AAE1B,cAAM,gBAAgB;IAClB,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,SAAS,CAAsB;IAEvC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,IAAI;IAoB7G,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE;IAIhC,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,IAAI;IAKzC,OAAO,CAAC,IAAI;CACf;AAED,eAAO,MAAM,YAAY,kBAAyB,CAAA;AAElD,MAAM,WAAW,SAAS;IACtB,eAAe;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC3B,iEAAiE;IACjE,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC7B;AAED,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAe,EAAE,EAAE,SAAS,qBAe/D"}
|
package/dist/upload-field.d.ts
CHANGED
|
@@ -11,5 +11,5 @@ export interface UploadFieldProps {
|
|
|
11
11
|
export declare function extractUploadedValue(payload: any): string;
|
|
12
12
|
/** Short, human display name for an already-stored file value (a url/path). */
|
|
13
13
|
export declare function uploadedDisplayName(value: unknown): string;
|
|
14
|
-
export declare function UploadField({ field, value, onChange }: UploadFieldProps): import("react
|
|
14
|
+
export declare function UploadField({ field, value, onChange }: UploadFieldProps): import("react").JSX.Element;
|
|
15
15
|
//# sourceMappingURL=upload-field.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload-field.d.ts","sourceRoot":"","sources":["../src/upload-field.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,cAAc,CAAA;IACrB,KAAK,EAAE,GAAG,CAAA;IACV,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;CAC7B;AAKD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,CAWzD;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAK1D;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,gBAAgB
|
|
1
|
+
{"version":3,"file":"upload-field.d.ts","sourceRoot":"","sources":["../src/upload-field.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,cAAc,CAAA;IACrB,KAAK,EAAE,GAAG,CAAA;IACV,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;CAC7B;AAKD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,CAWzD;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAK1D;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,gBAAgB,+BAkHvE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@asteby/metacore-runtime-react",
|
|
3
|
-
"version": "17.0.
|
|
3
|
+
"version": "17.0.2",
|
|
4
4
|
"description": "React runtime for metacore hosts — renders addon contributions dynamically",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"date-fns": ">=3",
|
|
35
35
|
"react-day-picker": ">=8",
|
|
36
36
|
"@asteby/metacore-sdk": "^3.2.0",
|
|
37
|
-
"@asteby/metacore-ui": "^2.4.
|
|
37
|
+
"@asteby/metacore-ui": "^2.4.1"
|
|
38
38
|
},
|
|
39
39
|
"peerDependenciesMeta": {
|
|
40
40
|
"@tanstack/react-router": {
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
"vitest": "^4.0.0",
|
|
63
63
|
"zustand": "^5.0.0",
|
|
64
64
|
"@asteby/metacore-sdk": "3.2.0",
|
|
65
|
-
"@asteby/metacore-ui": "2.4.
|
|
65
|
+
"@asteby/metacore-ui": "2.4.1"
|
|
66
66
|
},
|
|
67
67
|
"scripts": {
|
|
68
68
|
"build": "tsc -p tsconfig.json",
|
|
@@ -7,6 +7,8 @@ import {
|
|
|
7
7
|
deriveRelationFormFields,
|
|
8
8
|
diffSelection,
|
|
9
9
|
extractSelectedTargetIds,
|
|
10
|
+
formatRelationCell,
|
|
11
|
+
objectLabel,
|
|
10
12
|
pickOptionLabel,
|
|
11
13
|
relationRowKey,
|
|
12
14
|
} from '../dynamic-relation-helpers'
|
|
@@ -350,3 +352,66 @@ describe('pickOptionLabel', () => {
|
|
|
350
352
|
expect(pickOptionLabel({ id: 1, name: { nested: true }, email: 'a@x' }, undefined, cols)).toBe('a@x')
|
|
351
353
|
})
|
|
352
354
|
})
|
|
355
|
+
|
|
356
|
+
describe('objectLabel', () => {
|
|
357
|
+
it('lee label de un sibling {value,label}', () => {
|
|
358
|
+
expect(objectLabel({ value: 'u1', label: 'Test' })).toBe('Test')
|
|
359
|
+
})
|
|
360
|
+
|
|
361
|
+
it('lee name de un objeto usuario y title como fallback', () => {
|
|
362
|
+
expect(objectLabel({ avatar: '', email: 'd@x', name: 'Danny Hernandez' })).toBe('Danny Hernandez')
|
|
363
|
+
expect(objectLabel({ title: 'Pedido 7' })).toBe('Pedido 7')
|
|
364
|
+
})
|
|
365
|
+
|
|
366
|
+
it('devuelve undefined para objetos vacíos, arrays o escalares', () => {
|
|
367
|
+
expect(objectLabel({})).toBeUndefined()
|
|
368
|
+
expect(objectLabel([1, 2])).toBeUndefined()
|
|
369
|
+
expect(objectLabel('x')).toBeUndefined()
|
|
370
|
+
expect(objectLabel(null)).toBeUndefined()
|
|
371
|
+
})
|
|
372
|
+
})
|
|
373
|
+
|
|
374
|
+
describe('formatRelationCell', () => {
|
|
375
|
+
const col = (key: string, type: ColumnDefinition['type'] = 'text'): ColumnDefinition =>
|
|
376
|
+
({ key, label: key, type, sortable: false, filterable: false }) as ColumnDefinition
|
|
377
|
+
const NIL = '00000000-0000-0000-0000-000000000000'
|
|
378
|
+
|
|
379
|
+
it('prefiere el label del sibling resuelto de una FK *_id sobre el uuid crudo', () => {
|
|
380
|
+
const row = { product_id: '249915fe-aaaa', product: { value: '249915fe-aaaa', label: 'Test' } }
|
|
381
|
+
expect(formatRelationCell(row, col('product_id'))).toBe('Test')
|
|
382
|
+
})
|
|
383
|
+
|
|
384
|
+
it('usa un sibling string plano cuando no es objeto', () => {
|
|
385
|
+
expect(formatRelationCell({ product_id: 'x', product: 'Aceite' }, col('product_id'))).toBe('Aceite')
|
|
386
|
+
})
|
|
387
|
+
|
|
388
|
+
it('ignora el sibling cuando es nil-uuid o vacío y cae al valor', () => {
|
|
389
|
+
expect(formatRelationCell({ product_id: 'abc', product: NIL }, col('product_id'))).toBe('abc')
|
|
390
|
+
})
|
|
391
|
+
|
|
392
|
+
it('nil-uuid en la celda → "—" (FK nullable sin setear)', () => {
|
|
393
|
+
expect(formatRelationCell({ seller_id: NIL }, col('seller_id'))).toBe('—')
|
|
394
|
+
})
|
|
395
|
+
|
|
396
|
+
it('objeto usuario en la celda (created_by) → name, nunca JSON', () => {
|
|
397
|
+
const row = { created_by: { avatar: '', email: 'd@x', name: 'Danny Hernandez' } }
|
|
398
|
+
expect(formatRelationCell(row, col('created_by', 'creator'))).toBe('Danny Hernandez')
|
|
399
|
+
})
|
|
400
|
+
|
|
401
|
+
it('objeto {value,label} directo en la celda → label', () => {
|
|
402
|
+
expect(formatRelationCell({ status: { value: 'open', label: 'Abierto' } }, col('status'))).toBe('Abierto')
|
|
403
|
+
})
|
|
404
|
+
|
|
405
|
+
it('objeto sin label usable → "—", no [object Object] ni JSON', () => {
|
|
406
|
+
expect(formatRelationCell({ meta: { amount: 5 } }, col('meta'))).toBe('—')
|
|
407
|
+
})
|
|
408
|
+
|
|
409
|
+
it('escalares: booleans, números, strings y vacíos', () => {
|
|
410
|
+
expect(formatRelationCell({ taxable: true }, col('taxable', 'boolean'))).toBe('✓')
|
|
411
|
+
expect(formatRelationCell({ taxable: false }, col('taxable', 'boolean'))).toBe('—')
|
|
412
|
+
expect(formatRelationCell({ qty: 0 }, col('qty', 'number'))).toBe('0')
|
|
413
|
+
expect(formatRelationCell({ sku: 'ABC' }, col('sku'))).toBe('ABC')
|
|
414
|
+
expect(formatRelationCell({ sku: '' }, col('sku'))).toBe('—')
|
|
415
|
+
expect(formatRelationCell({ note: null }, col('note'))).toBe('—')
|
|
416
|
+
})
|
|
417
|
+
})
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { humanizeToken } from '../dynamic-columns-helpers'
|
|
3
|
+
|
|
4
|
+
describe('humanizeToken', () => {
|
|
5
|
+
it('title-cases snake_case tokens', () => {
|
|
6
|
+
expect(humanizeToken('in_progress')).toBe('In Progress')
|
|
7
|
+
expect(humanizeToken('out_of_stock')).toBe('Out Of Stock')
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
it('title-cases kebab-case tokens', () => {
|
|
11
|
+
expect(humanizeToken('out-of-stock')).toBe('Out Of Stock')
|
|
12
|
+
expect(humanizeToken('draft-pending')).toBe('Draft Pending')
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
it('handles dotted tokens', () => {
|
|
16
|
+
expect(humanizeToken('payment.failed')).toBe('Payment Failed')
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
it('title-cases a single word', () => {
|
|
20
|
+
expect(humanizeToken('sale')).toBe('Sale')
|
|
21
|
+
expect(humanizeToken('completed')).toBe('Completed')
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
it('uppercases known acronyms (case-insensitive)', () => {
|
|
25
|
+
expect(humanizeToken('pos')).toBe('POS')
|
|
26
|
+
expect(humanizeToken('SKU')).toBe('SKU')
|
|
27
|
+
expect(humanizeToken('sku_count')).toBe('SKU Count')
|
|
28
|
+
expect(humanizeToken('api_url')).toBe('API URL')
|
|
29
|
+
expect(humanizeToken('rfc')).toBe('RFC')
|
|
30
|
+
expect(humanizeToken('id')).toBe('ID')
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
it('leaves already-humanized text untouched', () => {
|
|
34
|
+
expect(humanizeToken('In Progress')).toBe('In Progress')
|
|
35
|
+
expect(humanizeToken('Some free form note')).toBe('Some free form note')
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
it('leaves long free text untouched', () => {
|
|
39
|
+
const long = 'this is a fairly long sentence describing the order status today'
|
|
40
|
+
expect(humanizeToken(long)).toBe(long)
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
it('leaves UUIDs untouched', () => {
|
|
44
|
+
const uuid = '550e8400-e29b-41d4-a716-446655440000'
|
|
45
|
+
expect(humanizeToken(uuid)).toBe(uuid)
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
it('coerces non-string values without transforming them', () => {
|
|
49
|
+
expect(humanizeToken(42 as unknown as string)).toBe('42')
|
|
50
|
+
expect(humanizeToken(null)).toBe('')
|
|
51
|
+
expect(humanizeToken(undefined)).toBe('')
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
it('returns empty/whitespace input unchanged', () => {
|
|
55
|
+
expect(humanizeToken('')).toBe('')
|
|
56
|
+
expect(humanizeToken(' ')).toBe(' ')
|
|
57
|
+
})
|
|
58
|
+
})
|
|
@@ -43,6 +43,7 @@ import { useApi } from '../api-context'
|
|
|
43
43
|
import { DynamicSelectField } from '../dynamic-select-field'
|
|
44
44
|
import { getFieldRef } from '../dynamic-form-schema'
|
|
45
45
|
import { normalizeNilUuid } from '../nil-uuid'
|
|
46
|
+
import { humanizeToken } from '../dynamic-columns-helpers'
|
|
46
47
|
import type { ActionFieldDef } from '../types'
|
|
47
48
|
|
|
48
49
|
interface FieldOption {
|
|
@@ -156,7 +157,9 @@ function formatDisplayValue(rawValue: any, field: FieldDef): string {
|
|
|
156
157
|
|
|
157
158
|
if (field.type === 'select' && field.options?.length) {
|
|
158
159
|
const match = field.options.find(o => o.value === String(value))
|
|
159
|
-
|
|
160
|
+
// Matched option label wins (localized); humanize the raw token only
|
|
161
|
+
// when no declared option matches the value.
|
|
162
|
+
return match?.label ?? humanizeToken(value)
|
|
160
163
|
}
|
|
161
164
|
|
|
162
165
|
return String(value)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// Pure, DOM-free helpers for the dynamic-column / record / relation renderers.
|
|
2
|
+
// Kept in their own module so they unit-test in node (no React, no
|
|
3
|
+
// metacore-ui primitives) and the same logic is shared across every cell
|
|
4
|
+
// renderer.
|
|
5
|
+
|
|
6
|
+
// Short, case-insensitive list of tokens that read better fully capitalized
|
|
7
|
+
// than Title-Cased. Intentionally tiny: this is a last-resort fallback, not a
|
|
8
|
+
// dictionary. Addons localize real labels via the column `options`.
|
|
9
|
+
const ACRONYMS: Record<string, string> = {
|
|
10
|
+
pos: 'POS',
|
|
11
|
+
sku: 'SKU',
|
|
12
|
+
id: 'ID',
|
|
13
|
+
url: 'URL',
|
|
14
|
+
api: 'API',
|
|
15
|
+
iva: 'IVA',
|
|
16
|
+
rfc: 'RFC',
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const UUID_RE =
|
|
20
|
+
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Scalable safety net for enum/status/option values that have **no matching
|
|
24
|
+
* declared option**. Turns a raw machine token into a readable label so a cell
|
|
25
|
+
* never leaks `in_progress` / `out-of-stock` verbatim:
|
|
26
|
+
*
|
|
27
|
+
* - `in_progress` → `In Progress` (snake_case)
|
|
28
|
+
* - `out-of-stock` → `Out Of Stock` (kebab-case)
|
|
29
|
+
* - `payment.failed` → `Payment Failed` (dotted)
|
|
30
|
+
* - `sale` → `Sale` (single word)
|
|
31
|
+
* - `pos` → `POS`, `sku_count` → `SKU Count` (acronyms uppercased)
|
|
32
|
+
*
|
|
33
|
+
* This is a FALLBACK only. The localized source of truth is the `options` an
|
|
34
|
+
* addon declares; callers must prefer a matched `option.label` and only reach
|
|
35
|
+
* for `humanizeToken` when nothing matched.
|
|
36
|
+
*
|
|
37
|
+
* Values that don't look like an enum token are returned unchanged: anything
|
|
38
|
+
* already containing whitespace (free text), overly long strings, UUIDs, and
|
|
39
|
+
* non-strings. This keeps it safe to call on arbitrary cell values.
|
|
40
|
+
*/
|
|
41
|
+
export function humanizeToken(value: unknown): string {
|
|
42
|
+
if (typeof value !== 'string') return value == null ? '' : String(value)
|
|
43
|
+
const raw = value
|
|
44
|
+
const trimmed = raw.trim()
|
|
45
|
+
// Already human (has spaces), empty, or free-form long text → leave as-is.
|
|
46
|
+
if (trimmed === '' || /\s/.test(trimmed) || trimmed.length > 40) return raw
|
|
47
|
+
// UUIDs (unresolved FKs) contain dashes but are not enum tokens.
|
|
48
|
+
if (UUID_RE.test(trimmed)) return raw
|
|
49
|
+
const parts = trimmed.split(/[_.\-]+/).filter(Boolean)
|
|
50
|
+
if (parts.length === 0) return raw
|
|
51
|
+
return parts
|
|
52
|
+
.map((part) => {
|
|
53
|
+
const lower = part.toLowerCase()
|
|
54
|
+
if (ACRONYMS[lower]) return ACRONYMS[lower]
|
|
55
|
+
return lower.charAt(0).toUpperCase() + lower.slice(1)
|
|
56
|
+
})
|
|
57
|
+
.join(' ')
|
|
58
|
+
}
|
package/src/dynamic-columns.tsx
CHANGED
|
@@ -42,6 +42,7 @@ import {
|
|
|
42
42
|
relationChipStyles,
|
|
43
43
|
} from '@asteby/metacore-ui/lib'
|
|
44
44
|
import { Progress } from './dialogs/_primitives'
|
|
45
|
+
import { humanizeToken } from './dynamic-columns-helpers'
|
|
45
46
|
import { OptionsContext } from './options-context'
|
|
46
47
|
import { DynamicIcon } from './dynamic-icon'
|
|
47
48
|
import { isNilUuid, normalizeNilUuid } from './nil-uuid'
|
|
@@ -297,7 +298,9 @@ const BadgeWithEndpointOptions: React.FC<{ endpoint: string; value: any }> = ({
|
|
|
297
298
|
const options = optionsMap.get(endpoint) || []
|
|
298
299
|
const option = options.find((opt: any) => opt.value === value)
|
|
299
300
|
if (option) return <OptionBadge option={option} fallback={String(value)} />
|
|
300
|
-
|
|
301
|
+
// No declared option matched → humanize the raw token as a safety net so a
|
|
302
|
+
// cell never shows `in_progress` verbatim (option.label still wins above).
|
|
303
|
+
return <Badge variant="outline">{humanizeToken(value)}</Badge>
|
|
301
304
|
}
|
|
302
305
|
|
|
303
306
|
/**
|
|
@@ -499,17 +502,18 @@ export function makeDefaultGetDynamicColumns(
|
|
|
499
502
|
if (!value && value !== 0) return <span className="text-muted-foreground">-</span>
|
|
500
503
|
const option = col.options.find((o) => o.value === String(value))
|
|
501
504
|
if (option) return <OptionBadge option={option} fallback={String(value)} />
|
|
502
|
-
return <Badge variant="outline">{
|
|
505
|
+
return <Badge variant="outline">{humanizeToken(value)}</Badge>
|
|
503
506
|
}
|
|
504
507
|
|
|
505
508
|
if (renderAs === 'relation-badge-list') {
|
|
506
509
|
return renderRelationBadges(value, col)
|
|
507
510
|
}
|
|
508
511
|
|
|
509
|
-
// Generic badge (no options/endpoint) — still pill it
|
|
512
|
+
// Generic badge (no options/endpoint) — still pill it, and
|
|
513
|
+
// humanize raw enum tokens (no option exists to localize it).
|
|
510
514
|
if (renderAs === 'badge') {
|
|
511
515
|
if (!value && value !== 0) return <EmptyCell />
|
|
512
|
-
return <Badge variant="outline">{
|
|
516
|
+
return <Badge variant="outline">{humanizeToken(value)}</Badge>
|
|
513
517
|
}
|
|
514
518
|
|
|
515
519
|
// Status — semantic color by value, options color wins.
|
|
@@ -522,9 +526,11 @@ export function makeDefaultGetDynamicColumns(
|
|
|
522
526
|
typeof document !== 'undefined' &&
|
|
523
527
|
document.documentElement.classList.contains('dark')
|
|
524
528
|
const styles = generateBadgeStyles(statusColorFor(sv), { isDark })
|
|
529
|
+
// No declared option → humanize the status token so
|
|
530
|
+
// `in_progress` reads as "In Progress" instead of raw.
|
|
525
531
|
return (
|
|
526
|
-
<Badge variant="outline" className="border-0
|
|
527
|
-
{sv}
|
|
532
|
+
<Badge variant="outline" className="border-0" style={styles}>
|
|
533
|
+
{humanizeToken(sv)}
|
|
528
534
|
</Badge>
|
|
529
535
|
)
|
|
530
536
|
}
|
|
@@ -554,7 +560,7 @@ export function makeDefaultGetDynamicColumns(
|
|
|
554
560
|
if (!value && value !== 0) return <EmptyCell />
|
|
555
561
|
const option = col.options.find((o) => o.value === String(value))
|
|
556
562
|
if (option) return <OptionBadge option={option} fallback={String(value)} />
|
|
557
|
-
return <Badge variant="outline">{
|
|
563
|
+
return <Badge variant="outline">{humanizeToken(value)}</Badge>
|
|
558
564
|
}
|
|
559
565
|
|
|
560
566
|
switch (renderAs) {
|
|
@@ -2,9 +2,79 @@
|
|
|
2
2
|
// run in node (no DOM, no metacore-ui primitives) and consumers can reuse the
|
|
3
3
|
// URL/payload conventions outside the component.
|
|
4
4
|
import type { ActionFieldDef, ColumnDefinition, TableMetadata } from './types'
|
|
5
|
+
import { isNilUuid } from './nil-uuid'
|
|
6
|
+
import { humanizeToken } from './dynamic-columns-helpers'
|
|
7
|
+
|
|
8
|
+
// An enum-like column renders a single token value (status/select/option/badge)
|
|
9
|
+
// rather than free text, so an unmatched value should be humanized, not leaked.
|
|
10
|
+
function isEnumLikeColumn(col: ColumnDefinition): boolean {
|
|
11
|
+
const renderAs = col.cellStyle ?? col.type
|
|
12
|
+
return (
|
|
13
|
+
renderAs === 'select' ||
|
|
14
|
+
renderAs === 'option' ||
|
|
15
|
+
renderAs === 'status' ||
|
|
16
|
+
renderAs === 'badge' ||
|
|
17
|
+
!!col.options?.length
|
|
18
|
+
)
|
|
19
|
+
}
|
|
5
20
|
|
|
6
21
|
export type DynamicRelationKind = 'one_to_many' | 'many_to_many'
|
|
7
22
|
|
|
23
|
+
// Pulls a human label off a resolved relation/user object a backend serves:
|
|
24
|
+
// `{ value, label }` (FK sibling), `{ name, … }` (user object such as
|
|
25
|
+
// created_by) or `{ title }`. Returns undefined for plain/empty objects so the
|
|
26
|
+
// caller falls through to its empty marker instead of leaking raw JSON.
|
|
27
|
+
export function objectLabel(value: unknown): string | undefined {
|
|
28
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined
|
|
29
|
+
const obj = value as Record<string, unknown>
|
|
30
|
+
const label = obj.label ?? obj.name ?? obj.title
|
|
31
|
+
return label != null && label !== '' ? String(label) : undefined
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// formatRelationCell renders one DynamicRelation row cell. Beyond coercing
|
|
35
|
+
// scalars it resolves the pro siblings a backend serves so a line-item shows
|
|
36
|
+
// "Test", not a raw uuid or `{"label":"Test",…}` JSON:
|
|
37
|
+
// 1. an FK column (`product_id`) → the sibling `row.product = { value, label }`
|
|
38
|
+
// (the key with the trailing `_id` stripped), preferring its label/name;
|
|
39
|
+
// 2. a value that is itself a resolved object (`{ value, label }` / a user
|
|
40
|
+
// `{ name }`) → its label/name, never `JSON.stringify`;
|
|
41
|
+
// 3. the nil/zero UUID (unset nullable FK) → the empty marker "—".
|
|
42
|
+
export function formatRelationCell(row: Record<string, unknown>, col: ColumnDefinition): string {
|
|
43
|
+
const value = row[col.key]
|
|
44
|
+
|
|
45
|
+
// Prefer the backend-resolved FK sibling keyed by the column key with the
|
|
46
|
+
// trailing `_id` stripped (`product_id` → `row.product`).
|
|
47
|
+
if (col.key.endsWith('_id')) {
|
|
48
|
+
const sibling = row[col.key.slice(0, -3)]
|
|
49
|
+
const siblingLabel =
|
|
50
|
+
objectLabel(sibling) ??
|
|
51
|
+
(typeof sibling === 'string' && sibling !== '' && !isNilUuid(sibling) ? sibling : undefined)
|
|
52
|
+
if (siblingLabel !== undefined) return siblingLabel
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (value === null || value === undefined) return '—'
|
|
56
|
+
if (isNilUuid(value)) return '—'
|
|
57
|
+
if (typeof value === 'boolean') return value ? '✓' : '—'
|
|
58
|
+
|
|
59
|
+
// The cell value is itself a resolved relation/user object → its label/name.
|
|
60
|
+
const inlineLabel = objectLabel(value)
|
|
61
|
+
if (inlineLabel !== undefined) return inlineLabel
|
|
62
|
+
// An object with no usable label (would JSON.stringify) → empty marker.
|
|
63
|
+
if (typeof value === 'object') return '—'
|
|
64
|
+
|
|
65
|
+
const text = String(value)
|
|
66
|
+
if (text === '') return '—'
|
|
67
|
+
// Enum/status/option columns: prefer the declared option label (localized
|
|
68
|
+
// source of truth), then humanize the raw token as a fallback so a status
|
|
69
|
+
// never reads as `in_progress`. Plain text columns are left untouched.
|
|
70
|
+
if (isEnumLikeColumn(col)) {
|
|
71
|
+
const match = col.options?.find((o) => String(o.value) === text)
|
|
72
|
+
if (match) return match.label
|
|
73
|
+
return humanizeToken(text)
|
|
74
|
+
}
|
|
75
|
+
return text
|
|
76
|
+
}
|
|
77
|
+
|
|
8
78
|
export interface PivotRowLike {
|
|
9
79
|
id?: string | number | null
|
|
10
80
|
[k: string]: unknown
|