@asteby/metacore-runtime-react 28.3.6 → 28.4.1
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 +56 -0
- package/dist/action-modal-dispatcher.js +1 -1
- package/dist/column-visibility.d.ts +0 -14
- package/dist/column-visibility.d.ts.map +1 -1
- package/dist/column-visibility.js +11 -1
- package/dist/dashboard-grid.d.ts.map +1 -1
- package/dist/dashboard-grid.js +5 -1
- package/dist/dialogs/dynamic-record.d.ts +13 -1
- package/dist/dialogs/dynamic-record.d.ts.map +1 -1
- package/dist/dialogs/dynamic-record.js +18 -6
- package/dist/dynamic-form-schema.d.ts +26 -1
- package/dist/dynamic-form-schema.d.ts.map +1 -1
- package/dist/dynamic-form-schema.js +41 -0
- package/dist/dynamic-form.d.ts.map +1 -1
- package/dist/dynamic-form.js +12 -5
- package/dist/dynamic-relation.d.ts +12 -0
- package/dist/dynamic-relation.d.ts.map +1 -1
- package/dist/dynamic-relation.js +12 -6
- package/dist/dynamic-relations.d.ts +9 -1
- package/dist/dynamic-relations.d.ts.map +1 -1
- package/dist/dynamic-relations.js +5 -4
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/types.d.ts +35 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/dynamic-relation-subtable-context.test.tsx +74 -0
- package/src/__tests__/visible-when.test.ts +63 -0
- package/src/action-modal-dispatcher.tsx +1 -1
- package/src/column-visibility.ts +14 -1
- package/src/dashboard-grid.tsx +5 -1
- package/src/dialogs/dynamic-record.tsx +29 -4
- package/src/dynamic-form-schema.ts +47 -1
- package/src/dynamic-form.tsx +17 -4
- package/src/dynamic-relation.tsx +25 -8
- package/src/dynamic-relations.tsx +16 -1
- package/src/index.ts +2 -0
- package/src/types.ts +36 -0
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,cAAc,SAAS,CAAA;AACvB,OAAO,EACH,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,eAAe,GACvB,MAAM,WAAW,CAAA;AAClB,cAAc,mBAAmB,CAAA;AACjC,OAAO,EACH,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,SAAS,GACjB,MAAM,gBAAgB,CAAA;AACvB,cAAc,iBAAiB,CAAA;AAC/B,OAAO,EACH,aAAa,EACb,KAAK,kBAAkB,EACvB,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,GAClB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACH,mBAAmB,EACnB,sBAAsB,EACtB,WAAW,EACX,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,2BAA2B,GACnC,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACH,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,SAAS,EACT,mBAAmB,EACnB,uBAAuB,EACvB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,0BAA0B,EAC/B,KAAK,sBAAsB,GAC9B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACH,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,oBAAoB,GAC5B,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACH,iBAAiB,EACjB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,GAC/B,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACH,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,KAAK,gBAAgB,GACxB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACH,iBAAiB,EACjB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,GAC/B,MAAM,uBAAuB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EACH,qBAAqB,EACrB,KAAK,gBAAgB,GACxB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EACH,kBAAkB,EAClB,eAAe,EACf,KAAK,uBAAuB,EAC5B,KAAK,eAAe,GACvB,MAAM,wBAAwB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,OAAO,EACH,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,WAAW,EAChB,KAAK,wBAAwB,GAChC,MAAM,wBAAwB,CAAA;AAC/B,cAAc,QAAQ,CAAA;AACtB,cAAc,mBAAmB,CAAA;AACjC,OAAO,EACH,mBAAmB,EACnB,MAAM,EACN,oBAAoB,EACpB,OAAO,EACP,sBAAsB,EACtB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,KAAK,EACV,KAAK,wBAAwB,GAChC,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACH,oBAAoB,EACpB,KAAK,0BAA0B,EAC/B,KAAK,iBAAiB,GACzB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACH,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,aAAa,EACb,kBAAkB,EAClB,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,OAAO,EACZ,KAAK,SAAS,GACjB,MAAM,uBAAuB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,sBAAsB,CAAA;AACpC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,kBAAkB,CAAA;AAChC,OAAO,EACH,2BAA2B,EAC3B,uBAAuB,EACvB,4BAA4B,EAC5B,KAAK,2BAA2B,EAChC,KAAK,qBAAqB,EAC1B,KAAK,8BAA8B,GACtC,MAAM,+BAA+B,CAAA;AACtC,OAAO,EACH,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,EACxB,WAAW,EACX,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,GAC9B,MAAM,yBAAyB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,YAAY,EACR,kBAAkB,EAClB,YAAY,IAAI,yBAAyB,EACzC,iBAAiB,EACjB,oBAAoB,GACvB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACH,wBAAwB,EACxB,4BAA4B,EAC5B,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,qBAAqB,GAC7B,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EACH,OAAO,EACP,QAAQ,EACR,cAAc,EACd,UAAU,EACV,QAAQ,EACR,WAAW,EACX,WAAW,EACX,UAAU,EACV,SAAS,EACT,UAAU,EACV,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,KAAK,OAAO,EACZ,KAAK,cAAc,GACtB,MAAM,YAAY,CAAA;AACnB,OAAO,EACH,cAAc,EACd,YAAY,EACZ,WAAW,EACX,UAAU,EACV,KAAK,mBAAmB,EACxB,KAAK,SAAS,IAAI,uBAAuB,GAC5C,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClE,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAA;AACxE,YAAY,EAAE,wBAAwB,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC5G,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAC/D,YAAY,EACR,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,GACxB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EACH,eAAe,EACf,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,GAC9B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACH,eAAe,EACf,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,wBAAwB,EACxB,cAAc,GACjB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACH,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,KAAK,qBAAqB,GAC7B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACH,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,mBAAmB,GAC3B,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACH,sBAAsB,EACtB,sBAAsB,EACtB,6BAA6B,EAC7B,0BAA0B,EAC1B,uBAAuB,GAC1B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACH,kBAAkB,EAClB,aAAa,EACb,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,GAChC,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACH,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,KAAK,eAAe,GACvB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACH,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -54,7 +54,7 @@ export { registerModelExtension, getModelExtension, clearModelExtensions, } from
|
|
|
54
54
|
export { isColumnVisibleInTable, isColumnVisibleInModal, isColumnVisibleInLineSubtable, AUDIT_SUBTABLE_COLUMN_KEYS, getSearchableColumnKeys, } from './column-visibility';
|
|
55
55
|
export { useOptionsResolver, projectOption, } from './use-options-resolver';
|
|
56
56
|
export { setOrgConfigBridge, getOrgConfigBridge, resolveValidatorToken, } from './use-org-config-bridge';
|
|
57
|
-
export { registerValidator, getDependsOn, resolveDependsValue, getOptionsConfig, resolveOptionsSource, } from './dynamic-form-schema';
|
|
57
|
+
export { registerValidator, getDependsOn, resolveDependsValue, getOptionsConfig, resolveOptionsSource, getVisibleWhen, evaluateVisibleWhen, } from './dynamic-form-schema';
|
|
58
58
|
export { ActivityValueRenderer, } from './activity-value-renderer';
|
|
59
59
|
export { ActivityDiff, } from './activity-diff';
|
|
60
60
|
export { RecordHistory, } from './record-history';
|
package/dist/types.d.ts
CHANGED
|
@@ -271,6 +271,17 @@ export interface ColumnDefinition {
|
|
|
271
271
|
itemFields?: ColumnItemField[];
|
|
272
272
|
/** snake_case alias served by the kernel for `itemFields`. */
|
|
273
273
|
item_fields?: ColumnItemField[];
|
|
274
|
+
/**
|
|
275
|
+
* Conditional visibility in the create/edit modal: render this field only
|
|
276
|
+
* when a sibling field's current value matches the predicate. Mirrors the
|
|
277
|
+
* kernel v3 `Column.visible_when` (projected onto the served ColumnDef).
|
|
278
|
+
* Tolerates the camelCase alias. Absent = always visible; a hidden field is
|
|
279
|
+
* skipped by the required-gate so it never blocks submit. See
|
|
280
|
+
* `evaluateVisibleWhen`.
|
|
281
|
+
*/
|
|
282
|
+
visible_when?: VisibleWhen;
|
|
283
|
+
/** camelCase alias for `visible_when`. */
|
|
284
|
+
visibleWhen?: VisibleWhen;
|
|
274
285
|
}
|
|
275
286
|
/**
|
|
276
287
|
* One declared sub-field of a jsonb line-items column (see
|
|
@@ -290,6 +301,20 @@ export interface ActionCondition {
|
|
|
290
301
|
operator: 'eq' | 'neq' | 'in' | 'not_in';
|
|
291
302
|
value: string | string[];
|
|
292
303
|
}
|
|
304
|
+
/**
|
|
305
|
+
* Conditional-visibility predicate for a create/edit form field. Mirrors the
|
|
306
|
+
* kernel v3 `visible_when` block (json `visible_when`): the owning field is
|
|
307
|
+
* rendered only when the SIBLING field named by `field` holds a value that
|
|
308
|
+
* matches — either equal to `equals` (exact string) OR a member of `in`
|
|
309
|
+
* (any-of). When both are set `in` wins. Absent = the field is always visible
|
|
310
|
+
* (retrocompat). Evaluated by `evaluateVisibleWhen` against the live form
|
|
311
|
+
* values; a hidden field never gates submit (its required-check is skipped).
|
|
312
|
+
*/
|
|
313
|
+
export interface VisibleWhen {
|
|
314
|
+
field: string;
|
|
315
|
+
equals?: string;
|
|
316
|
+
in?: string[];
|
|
317
|
+
}
|
|
293
318
|
export interface FieldValidation {
|
|
294
319
|
regex?: string;
|
|
295
320
|
min?: number;
|
|
@@ -442,6 +467,16 @@ export interface ActionFieldDef {
|
|
|
442
467
|
storagePath?: string;
|
|
443
468
|
/** snake_case alias served by the kernel manifest for `storagePath`. */
|
|
444
469
|
storage_path?: string;
|
|
470
|
+
/**
|
|
471
|
+
* Conditional visibility: render this field only when a sibling field's
|
|
472
|
+
* current value matches the predicate. Mirrors the kernel v3
|
|
473
|
+
* `ActionField.visible_when`. Tolerates the camelCase alias. Absent = always
|
|
474
|
+
* visible; a hidden field is skipped by the required-gate so it never blocks
|
|
475
|
+
* submit. See `evaluateVisibleWhen`.
|
|
476
|
+
*/
|
|
477
|
+
visible_when?: VisibleWhen;
|
|
478
|
+
/** camelCase alias for `visible_when`. */
|
|
479
|
+
visibleWhen?: VisibleWhen;
|
|
445
480
|
}
|
|
446
481
|
/**
|
|
447
482
|
* Declarative reconciliation constraint on a line-items field: the summed value
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,UAAU,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,YAAY,EAAE,CAAA;IAC1B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;IAC9C;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,SAAS,EAAE,CAAA;IACpB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,aAAa,EAAE,CAAA;IAC7B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,eAAe,EAAE,CAAA;CAClC;AAED;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACxD;;;;;OAKG;IACH,QAAQ,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,OAAO,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAC3D,CAAA;CACJ;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAC1D;AAED,4EAA4E;AAC5E,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;CACb;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IACzB,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAA;IACZ,kEAAkE;IAClE,IAAI,EAAE,aAAa,GAAG,cAAc,CAAA;IACpC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAA;IACf,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAA;IACnB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb;;;;;OAKG;IACH,IAAI,EAAE,QAAQ,GAAG,gBAAgB,GAAG,SAAS,GAAG,YAAY,GAAG,cAAc,GAAG,MAAM,CAAA;IACtF,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACrF,cAAc,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;AAEjF,MAAM,WAAW,gBAAgB;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EACE,MAAM,GACN,QAAQ,GACR,MAAM,GAGN,UAAU,GACV,WAAW,GACX,aAAa,GACb,QAAQ,GACR,QAAQ,GACR,qBAAqB,GACrB,QAAQ,GACR,SAAS,GACT,OAAO,GACP,eAAe,GACf,OAAO,GAEP,KAAK,GACL,MAAM,GACN,OAAO,GACP,UAAU,GACV,SAAS,GACT,UAAU,GACV,OAAO,GACP,QAAQ,GACR,MAAM,GACN,OAAO,GACP,MAAM,GACN,eAAe,GACf,SAAS,GACT,MAAM,GAKN,UAAU,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,OAAO,CAAA;IACnB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,QAAQ,GAAG,gBAAgB,GAAG,SAAS,GAAG,YAAY,GAAG,cAAc,GAAG,MAAM,CAAA;IAC7F,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAA;IAC7B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACjC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC3E;;;;;;OAMG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,UAAU,CAAC,EAAE,eAAe,CAAA;IAC5B;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,eAAe,EAAE,CAAA;IAC9B,8DAA8D;IAC9D,WAAW,CAAC,EAAE,eAAe,EAAE,CAAA;IAC/B;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,WAAW,CAAA;IAC1B,0CAA0C;IAC1C,WAAW,CAAC,EAAE,WAAW,CAAA;CAC5B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,QAAQ,CAAA;IACxC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAC3B;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,EAAE,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB;AASD,MAAM,WAAW,eAAe;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;CAClB;AAID,MAAM,MAAM,WAAW,GACjB,MAAM,GACN,UAAU,GACV,UAAU,GACV,OAAO,GACP,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,gBAAgB,GAChB,QAAQ,GACR,QAAQ,GACR,MAAM,CAAA;AAEZ;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IACvB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wEAAwE;IACxE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAA;IACb,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,UAAU,CAAA;CACpB;AAED,MAAM,WAAW,cAAc;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,SAAS,EAAE,CAAA;IACrB,YAAY,CAAC,EAAE,GAAG,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,eAAe,CAAA;IAC5B,MAAM,CAAC,EAAE,WAAW,GAAG,MAAM,CAAA;IAC7B;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,kBAAkB,CAAA;IAClC,0EAA0E;IAC1E,cAAc,CAAC,EAAE,kBAAkB,CAAA;IACnC;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,cAAc,EAAE,CAAA;IAC7B;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,gBAAgB,CAAA;IAC1B;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,WAAW,CAAA;IAC1B,0CAA0C;IAC1C,WAAW,CAAC,EAAE,WAAW,CAAA;CAC5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IAC/B,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAA;IACpD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,eAAe,CAAA;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,cAAc,EAAE,CAAA;IACzB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAA;CACzC;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,CAAC,CAAA;IACP,IAAI,CAAC,EAAE,cAAc,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,cAAc;IAC3B,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;CAChB;AAKD,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,cAAc,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,cAAc;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,cAAc,EAAE,CAAA;IACzB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,UAAU,EAAE,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,SAAS,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAA;CACzC"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// @vitest-environment happy-dom
|
|
2
|
+
//
|
|
3
|
+
// `lineSubtable` scopes the audit/system-column hiding to the view-modal
|
|
4
|
+
// line-subtable context. On a standalone detail page (default, lineSubtable
|
|
5
|
+
// omitted) the relation panel keeps the previous behaviour and still renders
|
|
6
|
+
// audit columns (created_at, created_by, …). Inside the view modal the host
|
|
7
|
+
// passes `lineSubtable` and those redundant columns are dropped.
|
|
8
|
+
//
|
|
9
|
+
// Guards against the regression CodeRabbit flagged on SDK #659: the audit
|
|
10
|
+
// filter was applied unconditionally to every DynamicRelation, hiding those
|
|
11
|
+
// columns on full detail pages too.
|
|
12
|
+
import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
13
|
+
import { cleanup, render, screen, waitFor } from '@testing-library/react'
|
|
14
|
+
import { DynamicRelation } from '../dynamic-relation'
|
|
15
|
+
import { ApiProvider, type ApiClient } from '../api-context'
|
|
16
|
+
|
|
17
|
+
afterEach(cleanup)
|
|
18
|
+
|
|
19
|
+
const META = {
|
|
20
|
+
name: 'line_item',
|
|
21
|
+
columns: [
|
|
22
|
+
{ key: 'id', label: 'ID', type: 'text', sortable: true, filterable: false, hidden: true },
|
|
23
|
+
{ key: 'invoice_id', label: 'Factura', type: 'text', sortable: false, filterable: false },
|
|
24
|
+
{ key: 'sku', label: 'SKU', type: 'text', sortable: true, filterable: true },
|
|
25
|
+
{ key: 'created_at', label: 'Creado', type: 'datetime', sortable: true, filterable: false },
|
|
26
|
+
],
|
|
27
|
+
actions: [],
|
|
28
|
+
hasActions: false,
|
|
29
|
+
enableCRUDActions: false,
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const DATA = [{ id: 'li_1', invoice_id: 'inv_42', sku: 'A-1', created_at: '2026-01-01T00:00:00Z' }]
|
|
33
|
+
|
|
34
|
+
function mockApi(): ApiClient {
|
|
35
|
+
return {
|
|
36
|
+
get: vi.fn((url: string) => {
|
|
37
|
+
if (url.startsWith('/metadata/table/')) {
|
|
38
|
+
return Promise.resolve({ data: { success: true, data: META } })
|
|
39
|
+
}
|
|
40
|
+
return Promise.resolve({ data: { success: true, data: DATA } })
|
|
41
|
+
}),
|
|
42
|
+
post: vi.fn(() => Promise.resolve({ data: { success: true, data: {} } })),
|
|
43
|
+
put: vi.fn(() => Promise.resolve({ data: { success: true, data: {} } })),
|
|
44
|
+
delete: vi.fn(() => Promise.resolve({ data: { success: true, data: {} } })),
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function renderPanel(extra: Record<string, unknown>) {
|
|
49
|
+
return render(
|
|
50
|
+
<ApiProvider client={mockApi()}>
|
|
51
|
+
<DynamicRelation
|
|
52
|
+
kind="one_to_many"
|
|
53
|
+
model="line_item"
|
|
54
|
+
foreignKey="invoice_id"
|
|
55
|
+
parentId="inv_42"
|
|
56
|
+
{...extra}
|
|
57
|
+
/>
|
|
58
|
+
</ApiProvider>,
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
describe('DynamicRelation — lineSubtable context', () => {
|
|
63
|
+
it('página de detalle (default): conserva la columna de auditoría created_at', async () => {
|
|
64
|
+
renderPanel({})
|
|
65
|
+
await waitFor(() => expect(screen.getByText('A-1')).toBeTruthy())
|
|
66
|
+
expect(screen.getByText('Creado')).toBeTruthy()
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
it('sub-tabla del modal de vista (lineSubtable): oculta created_at', async () => {
|
|
70
|
+
renderPanel({ lineSubtable: true })
|
|
71
|
+
await waitFor(() => expect(screen.getByText('A-1')).toBeTruthy())
|
|
72
|
+
expect(screen.queryByText('Creado')).toBeNull()
|
|
73
|
+
})
|
|
74
|
+
})
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { evaluateVisibleWhen, getVisibleWhen } from '../dynamic-form-schema'
|
|
3
|
+
import type { VisibleWhen } from '../types'
|
|
4
|
+
|
|
5
|
+
// The discount_rules use case: a `rule_scope` field decides which picker shows.
|
|
6
|
+
const equalsProduct: VisibleWhen = { field: 'rule_scope', equals: 'product' }
|
|
7
|
+
const inCategory: VisibleWhen = { field: 'rule_scope', in: ['category'] }
|
|
8
|
+
const inMulti: VisibleWhen = { field: 'scope', in: ['a', 'b'] }
|
|
9
|
+
|
|
10
|
+
describe('evaluateVisibleWhen', () => {
|
|
11
|
+
it('no predicate → always visible', () => {
|
|
12
|
+
expect(evaluateVisibleWhen(undefined, { rule_scope: 'all' })).toBe(true)
|
|
13
|
+
expect(evaluateVisibleWhen(null, {})).toBe(true)
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
it('empty field → always visible (no-op)', () => {
|
|
17
|
+
expect(evaluateVisibleWhen({ field: '' } as VisibleWhen, { rule_scope: 'x' })).toBe(true)
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it('`equals` matches the sibling value exactly', () => {
|
|
21
|
+
expect(evaluateVisibleWhen(equalsProduct, { rule_scope: 'product' })).toBe(true)
|
|
22
|
+
expect(evaluateVisibleWhen(equalsProduct, { rule_scope: 'category' })).toBe(false)
|
|
23
|
+
expect(evaluateVisibleWhen(equalsProduct, { rule_scope: 'all' })).toBe(false)
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
it('`in` matches membership; wins over `equals` when both present', () => {
|
|
27
|
+
expect(evaluateVisibleWhen(inCategory, { rule_scope: 'category' })).toBe(true)
|
|
28
|
+
expect(evaluateVisibleWhen(inCategory, { rule_scope: 'product' })).toBe(false)
|
|
29
|
+
expect(evaluateVisibleWhen(inMulti, { scope: 'b' })).toBe(true)
|
|
30
|
+
const both: VisibleWhen = { field: 'rule_scope', equals: 'product', in: ['category'] }
|
|
31
|
+
// `in` wins: category matches, product does not.
|
|
32
|
+
expect(evaluateVisibleWhen(both, { rule_scope: 'category' })).toBe(true)
|
|
33
|
+
expect(evaluateVisibleWhen(both, { rule_scope: 'product' })).toBe(false)
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
it('missing / null sibling value compares as empty string', () => {
|
|
37
|
+
expect(evaluateVisibleWhen(equalsProduct, {})).toBe(false)
|
|
38
|
+
expect(evaluateVisibleWhen(equalsProduct, { rule_scope: null })).toBe(false)
|
|
39
|
+
expect(evaluateVisibleWhen({ field: 'x', equals: '' } as VisibleWhen, {})).toBe(true)
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
it('coerces non-string sibling values before comparison', () => {
|
|
43
|
+
expect(evaluateVisibleWhen({ field: 'n', equals: '5' } as VisibleWhen, { n: 5 })).toBe(true)
|
|
44
|
+
expect(evaluateVisibleWhen({ field: 'b', in: ['true'] } as VisibleWhen, { b: true })).toBe(true)
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
it('predicate naming a field but no comparison → visible', () => {
|
|
48
|
+
expect(evaluateVisibleWhen({ field: 'rule_scope' } as VisibleWhen, { rule_scope: 'all' })).toBe(true)
|
|
49
|
+
})
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
describe('getVisibleWhen', () => {
|
|
53
|
+
it('reads snake_case and camelCase aliases', () => {
|
|
54
|
+
expect(getVisibleWhen({ visible_when: equalsProduct })).toEqual(equalsProduct)
|
|
55
|
+
expect(getVisibleWhen({ visibleWhen: inCategory })).toEqual(inCategory)
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
it('returns undefined for none / malformed', () => {
|
|
59
|
+
expect(getVisibleWhen(undefined)).toBeUndefined()
|
|
60
|
+
expect(getVisibleWhen({})).toBeUndefined()
|
|
61
|
+
expect(getVisibleWhen({ visible_when: { equals: 'x' } as unknown as VisibleWhen })).toBeUndefined()
|
|
62
|
+
})
|
|
63
|
+
})
|
|
@@ -686,7 +686,7 @@ function GenericActionModal({ open, onOpenChange, action, model, record, endpoin
|
|
|
686
686
|
})}
|
|
687
687
|
{relations.length > 0 && (
|
|
688
688
|
<FieldCell fullWidth>
|
|
689
|
-
<DynamicRelations record={record} relations={relations} />
|
|
689
|
+
<DynamicRelations record={record} relations={relations} lineSubtable />
|
|
690
690
|
</FieldCell>
|
|
691
691
|
)}
|
|
692
692
|
</FieldGrid>
|
package/src/column-visibility.ts
CHANGED
|
@@ -68,9 +68,22 @@ export const AUDIT_SUBTABLE_COLUMN_KEYS: readonly string[] = [
|
|
|
68
68
|
* Only applies to the embedded child-list context; the main `/m/<model>` table
|
|
69
69
|
* uses {@link isColumnVisibleInTable} and is unaffected.
|
|
70
70
|
*/
|
|
71
|
+
/**
|
|
72
|
+
* True when a column key is (or belongs to) an audit column. Matches the plain
|
|
73
|
+
* key AND its resolved-relation projections: a `created_by` user relation is
|
|
74
|
+
* served as `created_by.avatar` / `created_by.name` (avatar+name+email cell),
|
|
75
|
+
* so an exact-match check missed it and the column still showed. We match the
|
|
76
|
+
* base key or any `<key>.<subfield>` projection.
|
|
77
|
+
*/
|
|
78
|
+
function isAuditColumnKey(key: string): boolean {
|
|
79
|
+
return AUDIT_SUBTABLE_COLUMN_KEYS.some(
|
|
80
|
+
(k) => key === k || key.startsWith(k + '.'),
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
|
|
71
84
|
export function isColumnVisibleInLineSubtable(col: ColumnDefinition): boolean {
|
|
72
85
|
if (!isColumnVisibleInModal(col)) return false
|
|
73
|
-
if (!col.visibility &&
|
|
86
|
+
if (!col.visibility && isAuditColumnKey(col.key)) return false
|
|
74
87
|
return true
|
|
75
88
|
}
|
|
76
89
|
|
package/src/dashboard-grid.tsx
CHANGED
|
@@ -164,7 +164,11 @@ export function DashboardGrid({
|
|
|
164
164
|
// box auto-height and the tiles collapse into a strip — so we own
|
|
165
165
|
// the height here instead of hoping the dashboard layout supplies
|
|
166
166
|
// one.
|
|
167
|
-
|
|
167
|
+
// No dashed border / padding wrapper: the skeleton tiles ARE
|
|
168
|
+
// cards (same anatomy as the real widgets), so the mockup
|
|
169
|
+
// should float exactly like the loaded dashboard, not sit
|
|
170
|
+
// inside a boxed placeholder. Keep only the definite height.
|
|
171
|
+
'h-[clamp(420px,60vh,720px)] w-full',
|
|
168
172
|
className,
|
|
169
173
|
)}
|
|
170
174
|
>
|
|
@@ -52,7 +52,8 @@ import { toastServerError, extractFieldErrors, localizeFieldIssue } from '../ser
|
|
|
52
52
|
import { DynamicSelectField, OptionLead, OptionThumb } from '../dynamic-select-field'
|
|
53
53
|
import { DynamicRelations } from '../dynamic-relations'
|
|
54
54
|
import { useOptionsResolver, type ResolvedOption } from '../use-options-resolver'
|
|
55
|
-
import { getFieldRef } from '../dynamic-form-schema'
|
|
55
|
+
import { getFieldRef, getVisibleWhen, evaluateVisibleWhen } from '../dynamic-form-schema'
|
|
56
|
+
import type { VisibleWhen } from '../types'
|
|
56
57
|
import { FieldCell } from '../field-grid'
|
|
57
58
|
import { isNilUuid, normalizeNilUuid } from '../nil-uuid'
|
|
58
59
|
import { normalizeRefFieldsForSubmit } from './normalize-submit'
|
|
@@ -146,6 +147,17 @@ export interface FieldDef {
|
|
|
146
147
|
itemFields?: ItemField[]
|
|
147
148
|
/** snake_case alias served by the kernel for `itemFields`. */
|
|
148
149
|
item_fields?: ItemField[]
|
|
150
|
+
/**
|
|
151
|
+
* Conditional visibility: render — and required-check — this field only
|
|
152
|
+
* while a sibling field's current value matches the predicate. Mirrors the
|
|
153
|
+
* kernel v3 `visible_when` (projected onto the served modal FieldDef).
|
|
154
|
+
* Tolerates the camelCase alias. Absent = always visible; a hidden field is
|
|
155
|
+
* dropped from the required-gate so it never blocks submit. Evaluated by
|
|
156
|
+
* `evaluateVisibleWhen` against the live form values.
|
|
157
|
+
*/
|
|
158
|
+
visible_when?: VisibleWhen
|
|
159
|
+
/** camelCase alias for `visible_when`. */
|
|
160
|
+
visibleWhen?: VisibleWhen
|
|
149
161
|
}
|
|
150
162
|
|
|
151
163
|
// Permissive shape: the wire payload may omit some fields (e.g. `title` is
|
|
@@ -458,13 +470,22 @@ export function isMoneyField(field: FieldDef, value: any): boolean {
|
|
|
458
470
|
// given mode. `hidden` fields never render. A `readonly` (server/system-
|
|
459
471
|
// generated) field is EXCLUDED on create — the user can't set a value the
|
|
460
472
|
// server will overwrite — but stays visible on edit/view (rendered disabled).
|
|
473
|
+
//
|
|
474
|
+
// `formValues`, when provided, additionally applies each field's `visible_when`
|
|
475
|
+
// predicate against the live form values (conditional visibility): a field is
|
|
476
|
+
// dropped while the referenced sibling's value does not match. Driving both the
|
|
477
|
+
// render and the required-gate off this same list means a hidden field never
|
|
478
|
+
// blocks submit. Omitting `formValues` keeps the legacy (always-visible)
|
|
479
|
+
// behaviour for callers that only gate on mode.
|
|
461
480
|
export function filterVisibleFields(
|
|
462
481
|
fields: FieldDef[] | undefined,
|
|
463
482
|
mode: 'view' | 'edit' | 'create',
|
|
483
|
+
formValues?: Record<string, any>,
|
|
464
484
|
): FieldDef[] {
|
|
465
485
|
return (fields ?? []).filter(f => {
|
|
466
486
|
if (f.hidden) return false
|
|
467
487
|
if (mode === 'create' && f.readonly) return false
|
|
488
|
+
if (formValues && !evaluateVisibleWhen(getVisibleWhen(f), formValues)) return false
|
|
468
489
|
return true
|
|
469
490
|
})
|
|
470
491
|
}
|
|
@@ -711,9 +732,12 @@ export function DynamicRecordDialog({
|
|
|
711
732
|
|
|
712
733
|
if (isEditable) {
|
|
713
734
|
// Collect ALL missing required fields (not just the first) and mark
|
|
714
|
-
// each inline instead of a single toast.
|
|
735
|
+
// each inline instead of a single toast. Only CURRENTLY-VISIBLE
|
|
736
|
+
// fields are gated: a field hidden by its `visible_when` predicate
|
|
737
|
+
// must not block submit even when it is declared required (matching
|
|
738
|
+
// the render, which drops it via the same filter).
|
|
715
739
|
const missing: Record<string, string> = {}
|
|
716
|
-
for (const field of modalMeta.fields
|
|
740
|
+
for (const field of filterVisibleFields(modalMeta.fields, mode, formValues)) {
|
|
717
741
|
if (field.required && !formValues[field.key] && formValues[field.key] !== 0 && formValues[field.key] !== false) {
|
|
718
742
|
missing[field.key] = localizeFieldIssue({ code: 'required' }, field.label, t)
|
|
719
743
|
}
|
|
@@ -803,7 +827,7 @@ export function DynamicRecordDialog({
|
|
|
803
827
|
|
|
804
828
|
const title = modalMeta ? config.getTitle(modalMeta, t) : ''
|
|
805
829
|
|
|
806
|
-
const visibleFields = filterVisibleFields(modalMeta?.fields, mode)
|
|
830
|
+
const visibleFields = filterVisibleFields(modalMeta?.fields, mode, formValues)
|
|
807
831
|
|
|
808
832
|
return (
|
|
809
833
|
<Dialog open={open} onOpenChange={onOpenChange}>
|
|
@@ -881,6 +905,7 @@ export function DynamicRecordDialog({
|
|
|
881
905
|
<DynamicRelations
|
|
882
906
|
record={record}
|
|
883
907
|
relations={relations}
|
|
908
|
+
lineSubtable
|
|
884
909
|
canCreate={mode === 'edit'}
|
|
885
910
|
canEdit={mode === 'edit'}
|
|
886
911
|
canDelete={mode === 'edit'}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// callers (and unit tests) can use the zod schema without pulling in React or
|
|
3
3
|
// metacore-ui primitives.
|
|
4
4
|
import { z, type ZodTypeAny } from 'zod'
|
|
5
|
-
import type { ActionFieldDef, FieldValidation, FieldOptionsConfig, OptionDef } from './types'
|
|
5
|
+
import type { ActionFieldDef, FieldValidation, FieldOptionsConfig, OptionDef, VisibleWhen } from './types'
|
|
6
6
|
import { resolveValidatorToken } from './use-org-config-bridge'
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -335,6 +335,52 @@ export function applyOptionWhen(
|
|
|
335
335
|
})
|
|
336
336
|
}
|
|
337
337
|
|
|
338
|
+
/**
|
|
339
|
+
* Reads a field's `visible_when` predicate, tolerating the camelCase alias
|
|
340
|
+
* (`visibleWhen`) an app may author and the snake_case (`visible_when`) the
|
|
341
|
+
* kernel serves. Returns `undefined` when the field declares neither.
|
|
342
|
+
*/
|
|
343
|
+
export function getVisibleWhen(
|
|
344
|
+
field: { visible_when?: VisibleWhen; visibleWhen?: VisibleWhen } | null | undefined,
|
|
345
|
+
): VisibleWhen | undefined {
|
|
346
|
+
if (!field) return undefined
|
|
347
|
+
const vw = field.visible_when ?? field.visibleWhen
|
|
348
|
+
return vw && typeof vw === 'object' && typeof vw.field === 'string' ? vw : undefined
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Evaluates a `visible_when` predicate against the current flat form values.
|
|
353
|
+
* Pure — no React, no side effects.
|
|
354
|
+
*
|
|
355
|
+
* - No predicate → `true` (the field is always visible; retrocompat).
|
|
356
|
+
* - With a predicate: read the value of the sibling `cond.field` from
|
|
357
|
+
* `formValues` (as string, null/undefined → ''). Visible when it is a member
|
|
358
|
+
* of `cond.in` (any-of, wins when present) OR equals `cond.equals`. A
|
|
359
|
+
* predicate with an empty `field` is a no-op (visible). A predicate that
|
|
360
|
+
* names a field but declares neither `in` nor `equals` hides nothing
|
|
361
|
+
* (visible) — nothing to gate on.
|
|
362
|
+
*
|
|
363
|
+
* `cond` may be the raw block off either the snake_case or camelCase slot; use
|
|
364
|
+
* `getVisibleWhen` to normalize first.
|
|
365
|
+
*/
|
|
366
|
+
export function evaluateVisibleWhen(
|
|
367
|
+
cond: VisibleWhen | null | undefined,
|
|
368
|
+
formValues: Record<string, any> | null | undefined,
|
|
369
|
+
): boolean {
|
|
370
|
+
if (!cond || typeof cond.field !== 'string' || cond.field.trim() === '') return true
|
|
371
|
+
const raw = formValues ? formValues[cond.field.trim()] : undefined
|
|
372
|
+
const current = raw == null ? '' : String(raw)
|
|
373
|
+
const inList = cond.in
|
|
374
|
+
if (Array.isArray(inList) && inList.length > 0) {
|
|
375
|
+
return inList.some((v) => String(v) === current)
|
|
376
|
+
}
|
|
377
|
+
if (typeof cond.equals === 'string') {
|
|
378
|
+
return cond.equals === current
|
|
379
|
+
}
|
|
380
|
+
// Named a field but declared no comparison → nothing to gate on.
|
|
381
|
+
return true
|
|
382
|
+
}
|
|
383
|
+
|
|
338
384
|
/**
|
|
339
385
|
* Reads a field's enriched options-resolution config, tolerating the camelCase
|
|
340
386
|
* `optionsConfig` (authored SDK shape) and the snake_case `options_config` the
|
package/src/dynamic-form.tsx
CHANGED
|
@@ -22,6 +22,8 @@ import {
|
|
|
22
22
|
evaluateBalance,
|
|
23
23
|
applyOptionWhen,
|
|
24
24
|
getDependsOn,
|
|
25
|
+
getVisibleWhen,
|
|
26
|
+
evaluateVisibleWhen,
|
|
25
27
|
} from './dynamic-form-schema'
|
|
26
28
|
import { useOptionsResolver, type ResolvedOption } from './use-options-resolver'
|
|
27
29
|
import { DynamicLineItems } from './dynamic-line-items'
|
|
@@ -70,19 +72,30 @@ export function DynamicForm({
|
|
|
70
72
|
[fields],
|
|
71
73
|
)
|
|
72
74
|
|
|
73
|
-
|
|
75
|
+
// Conditional visibility: a field carrying `visible_when` is rendered — and
|
|
76
|
+
// validated — only while the referenced sibling field's current value
|
|
77
|
+
// matches the predicate. Driving BOTH the schema and the render off the same
|
|
78
|
+
// filtered list means a hidden field never blocks submit (its required-gate
|
|
79
|
+
// is dropped with it), matching the primitive's contract. Fields with no
|
|
80
|
+
// `visible_when` are always kept (retrocompat).
|
|
81
|
+
const visibleFields = useMemo(
|
|
82
|
+
() => editableFields.filter((f) => evaluateVisibleWhen(getVisibleWhen(f), values)),
|
|
83
|
+
[editableFields, values],
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
const schema = useMemo(() => buildZodSchema(visibleFields), [visibleFields])
|
|
74
87
|
|
|
75
88
|
// Line-items fields carrying a balance rule gate submit: an unbalanced entry
|
|
76
89
|
// (Σdebit ≠ Σcredit, or all-zero when require_nonzero) can't be saved. This
|
|
77
90
|
// is fully declarative — `evaluateBalance` returns undefined for fields with
|
|
78
91
|
// no rule, so non-balanced forms are unaffected.
|
|
79
92
|
const balanceBlocked = useMemo(() => {
|
|
80
|
-
for (const f of
|
|
93
|
+
for (const f of visibleFields) {
|
|
81
94
|
const state = evaluateBalance(f, values[f.key])
|
|
82
95
|
if (state && !state.balanced) return true
|
|
83
96
|
}
|
|
84
97
|
return false
|
|
85
|
-
}, [
|
|
98
|
+
}, [visibleFields, values])
|
|
86
99
|
|
|
87
100
|
useEffect(() => {
|
|
88
101
|
const defaults: Record<string, any> = {}
|
|
@@ -125,7 +138,7 @@ export function DynamicForm({
|
|
|
125
138
|
return (
|
|
126
139
|
<form onSubmit={handleSubmit} className="grid gap-4">
|
|
127
140
|
<div className="grid gap-4 sm:grid-cols-2">
|
|
128
|
-
{
|
|
141
|
+
{visibleFields.map((field) => (
|
|
129
142
|
<FieldRow
|
|
130
143
|
key={field.key}
|
|
131
144
|
field={field}
|
package/src/dynamic-relation.tsx
CHANGED
|
@@ -48,7 +48,7 @@ import { useTimeZone, useCurrency } from './org-runtime-context'
|
|
|
48
48
|
import { makeDefaultGetDynamicColumns } from './dynamic-columns'
|
|
49
49
|
import { isColumnVisibleInLineSubtable } from './column-visibility'
|
|
50
50
|
import { useOptionsResolver } from './use-options-resolver'
|
|
51
|
-
import type { ApiResponse, TableMetadata } from './types'
|
|
51
|
+
import type { ApiResponse, ColumnDefinition, TableMetadata } from './types'
|
|
52
52
|
import {
|
|
53
53
|
buildCreatePayload,
|
|
54
54
|
buildPivotAttachPayload,
|
|
@@ -120,6 +120,18 @@ interface CommonProps {
|
|
|
120
120
|
filters?: Record<string, string>
|
|
121
121
|
/** Hidden columns; el FK siempre se oculta automáticamente. */
|
|
122
122
|
hiddenColumns?: string[]
|
|
123
|
+
/**
|
|
124
|
+
* Contexto de sub-tabla de líneas dentro del MODAL de vista de un registro
|
|
125
|
+
* padre. Cuando es true se aplican las reglas de {@link isColumnVisibleInLineSubtable}
|
|
126
|
+
* — se ocultan por defecto las columnas de auditoría/sistema (created_by,
|
|
127
|
+
* timestamps, organization_id) y las scopeadas a `visibility: "table"`, que
|
|
128
|
+
* son ruido redundante bajo el registro padre.
|
|
129
|
+
*
|
|
130
|
+
* Default false: en una página de detalle autónoma (`/m/<model>/<id>`) el
|
|
131
|
+
* panel de relación conserva el comportamiento previo (solo oculta FK, scope
|
|
132
|
+
* y columnas `hidden`), donde esas columnas SÍ son útiles.
|
|
133
|
+
*/
|
|
134
|
+
lineSubtable?: boolean
|
|
123
135
|
/** Permisos visibles. Default true. */
|
|
124
136
|
canCreate?: boolean
|
|
125
137
|
canDelete?: boolean
|
|
@@ -191,6 +203,7 @@ function OneToManyRelation({
|
|
|
191
203
|
filters,
|
|
192
204
|
endpoint,
|
|
193
205
|
hiddenColumns = [],
|
|
206
|
+
lineSubtable = false,
|
|
194
207
|
canCreate = true,
|
|
195
208
|
canDelete = true,
|
|
196
209
|
canEdit = true,
|
|
@@ -266,13 +279,17 @@ function OneToManyRelation({
|
|
|
266
279
|
// Hide the FK and every scope column — they're fixed for this parent and
|
|
267
280
|
// would just render the same value on every row.
|
|
268
281
|
const hidden = new Set([foreignKey, ...Object.keys(filters || {}), ...hiddenColumns])
|
|
269
|
-
//
|
|
270
|
-
// columns AND the audit/system
|
|
271
|
-
// that's redundant under a parent
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
282
|
+
// In the view-modal line-subtable context, isColumnVisibleInLineSubtable
|
|
283
|
+
// additionally drops `hidden`/table-scoped columns AND the audit/system
|
|
284
|
+
// noise (created_by, timestamps, org_id) that's redundant under a parent
|
|
285
|
+
// record — see column-visibility.ts. Outside that context (standalone
|
|
286
|
+
// detail page) we keep the previous behaviour and only drop `hidden`
|
|
287
|
+
// columns, so those columns still show where they're useful.
|
|
288
|
+
const keep = lineSubtable
|
|
289
|
+
? (c: ColumnDefinition) => !hidden.has(c.key) && isColumnVisibleInLineSubtable(c)
|
|
290
|
+
: (c: ColumnDefinition) => !hidden.has(c.key) && !c.hidden
|
|
291
|
+
return metadata.columns.filter(keep)
|
|
292
|
+
}, [metadata, foreignKey, filtersKey, hiddenColumns, lineSubtable])
|
|
276
293
|
|
|
277
294
|
// Reuse the EXACT column factory the main `<DynamicTable>` uses so each cell
|
|
278
295
|
// renders identically — money in the org currency right-aligned, FK chips
|