@asteby/metacore-runtime-react 47.0.0 → 47.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/dist/audit-info.d.ts +54 -0
- package/dist/audit-info.d.ts.map +1 -0
- package/dist/audit-info.js +142 -0
- package/dist/dialogs/dynamic-record.d.ts.map +1 -1
- package/dist/dialogs/dynamic-record.js +5 -1
- package/dist/dynamic-form.d.ts.map +1 -1
- package/dist/dynamic-form.js +3 -0
- package/dist/dynamic-kanban.d.ts.map +1 -1
- package/dist/dynamic-kanban.js +8 -1
- package/dist/dynamic-line-items.d.ts.map +1 -1
- package/dist/dynamic-line-items.js +3 -0
- package/dist/dynamic-multi-select-field.d.ts.map +1 -1
- package/dist/dynamic-multi-select-field.js +2 -0
- package/dist/dynamic-select-field.d.ts.map +1 -1
- package/dist/dynamic-select-field.js +4 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/option-filter.d.ts +31 -0
- package/dist/option-filter.d.ts.map +1 -0
- package/dist/option-filter.js +49 -0
- package/dist/types.d.ts +40 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/use-options-resolver.d.ts +8 -0
- package/dist/use-options-resolver.d.ts.map +1 -1
- package/dist/use-options-resolver.js +8 -2
- package/package.json +3 -3
- package/src/__tests__/action-modal-grid-layout.test.tsx +1 -1
- package/src/__tests__/apply-sidebar-layout.test.ts +1 -1
- package/src/__tests__/audit-info.test.tsx +103 -0
- package/src/__tests__/dependent-options.test.tsx +12 -5
- package/src/__tests__/dynamic-table-infinite-scroll.test.tsx +4 -0
- package/src/__tests__/line-items-lock-rows.test.tsx +2 -1
- package/src/__tests__/option-filter.test.tsx +115 -0
- package/src/__tests__/structured-view-value.test.tsx +5 -1
- package/src/__tests__/wizard-action-modal.test.tsx +1 -1
- package/src/audit-info.tsx +219 -0
- package/src/dialogs/dynamic-record.tsx +13 -0
- package/src/dropdown-menu-entry.test.ts +23 -0
- package/src/dynamic-form.tsx +3 -0
- package/src/dynamic-kanban.tsx +7 -3
- package/src/dynamic-line-items.tsx +3 -0
- package/src/dynamic-multi-select-field.tsx +2 -0
- package/src/dynamic-select-field.tsx +4 -0
- package/src/index.ts +13 -0
- package/src/option-filter.ts +88 -0
- package/src/types.ts +41 -0
- package/src/use-options-resolver.ts +19 -1
- package/vitest.config.ts +1 -0
- package/vitest.setup.ts +7 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/** Reads the filter from a field (camelCase or the snake_case the kernel serves). */
|
|
2
|
+
export function getOptionFilter(field) {
|
|
3
|
+
if (!field || typeof field !== 'object')
|
|
4
|
+
return [];
|
|
5
|
+
const f = field;
|
|
6
|
+
const raw = f.optionFilter ?? f.option_filter;
|
|
7
|
+
const list = Array.isArray(raw) ? raw : raw && typeof raw === 'object' ? [raw] : [];
|
|
8
|
+
return list.filter((r) => !!r && typeof r === 'object' && typeof r.field === 'string' && r.field !== '');
|
|
9
|
+
}
|
|
10
|
+
function norm(v) {
|
|
11
|
+
return String(v).trim().toLowerCase();
|
|
12
|
+
}
|
|
13
|
+
function readProp(opt, key) {
|
|
14
|
+
if (key === 'id' || key === 'value' || key === 'label' || key === 'name' || key === 'description' || key === 'color' || key === 'icon' || key === 'image') {
|
|
15
|
+
return opt[key];
|
|
16
|
+
}
|
|
17
|
+
return opt.meta?.[key];
|
|
18
|
+
}
|
|
19
|
+
/** True when the option satisfies the rule. Comparison is trimmed + case-insensitive. */
|
|
20
|
+
export function optionPassesRule(opt, rule) {
|
|
21
|
+
const raw = readProp(opt, rule.field);
|
|
22
|
+
const known = raw !== undefined && raw !== null;
|
|
23
|
+
const v = known ? norm(raw) : '';
|
|
24
|
+
const notEquals = rule.notEquals ?? rule.not_equals;
|
|
25
|
+
const notIn = rule.notIn ?? rule.not_in;
|
|
26
|
+
// Positive rules need the property to exist; negative rules cannot exclude
|
|
27
|
+
// what they cannot see, so an option lacking the property is kept.
|
|
28
|
+
if (rule.equals !== undefined && !(known && v === norm(rule.equals)))
|
|
29
|
+
return false;
|
|
30
|
+
if (Array.isArray(rule.in) && !(known && rule.in.some((x) => norm(x) === v)))
|
|
31
|
+
return false;
|
|
32
|
+
if (notEquals !== undefined && known && v === norm(notEquals))
|
|
33
|
+
return false;
|
|
34
|
+
if (Array.isArray(notIn) && known && notIn.some((x) => norm(x) === v))
|
|
35
|
+
return false;
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Applies the field's filter to resolved options. Returns the SAME array when
|
|
40
|
+
* there is nothing to filter. `keepValue` (the current selection) is never
|
|
41
|
+
* hidden, so an existing record keeps showing its label after the option
|
|
42
|
+
* became ineligible.
|
|
43
|
+
*/
|
|
44
|
+
export function applyOptionFilter(options, rules, keepValue) {
|
|
45
|
+
if (rules.length === 0)
|
|
46
|
+
return options;
|
|
47
|
+
const keep = keepValue === undefined || keepValue === null || keepValue === '' ? null : String(keepValue);
|
|
48
|
+
return options.filter((o) => (keep !== null && String(o.id) === keep) || rules.every((r) => optionPassesRule(o, r)));
|
|
49
|
+
}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { OptionFilter } from './option-filter';
|
|
1
2
|
/** One spreadsheet column of a model's import template. Mirrors the kernel's
|
|
2
3
|
* `modelbase.ImportColumn`. */
|
|
3
4
|
export interface ImportColumnMeta {
|
|
@@ -56,6 +57,20 @@ export interface DocumentFormsManifest {
|
|
|
56
57
|
lines_field?: string;
|
|
57
58
|
types: DocumentFormType[];
|
|
58
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Audit columns of a model, served by the kernel (>= v0.188) on the table
|
|
62
|
+
* metadata. Each value is the COLUMN NAME (the key in the row), not a value;
|
|
63
|
+
* a key is omitted when the model lacks that column (append-only ledgers have
|
|
64
|
+
* only `created_*`). Purely additive — older kernels omit `audit` entirely.
|
|
65
|
+
*/
|
|
66
|
+
export interface AuditMeta {
|
|
67
|
+
created_at?: string;
|
|
68
|
+
created_by?: string;
|
|
69
|
+
updated_at?: string;
|
|
70
|
+
updated_by?: string;
|
|
71
|
+
deleted_at?: string;
|
|
72
|
+
deleted_by?: string;
|
|
73
|
+
}
|
|
59
74
|
export interface TableMetadata {
|
|
60
75
|
title: string;
|
|
61
76
|
endpoint: string;
|
|
@@ -70,6 +85,11 @@ export interface TableMetadata {
|
|
|
70
85
|
canExport?: boolean;
|
|
71
86
|
canImport?: boolean;
|
|
72
87
|
canCreate?: boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Audit columns (when/who) of the model. Feeds `<AuditInfo>`; absent on
|
|
90
|
+
* older kernels or models without audit columns.
|
|
91
|
+
*/
|
|
92
|
+
audit?: AuditMeta;
|
|
73
93
|
/**
|
|
74
94
|
* Formularios de alta guiados por tipo de documento (FAC-12). Cuando trae
|
|
75
95
|
* al menos un tipo, `DynamicCRUDPage` abre `DocumentFormDialog` en lugar del
|
|
@@ -349,6 +369,16 @@ export interface ColumnDefinition {
|
|
|
349
369
|
* widgets — `searchEndpoint` stays as the legacy escape hatch.
|
|
350
370
|
*/
|
|
351
371
|
ref?: string;
|
|
372
|
+
/**
|
|
373
|
+
* Hides options of this relation/dynamic picker (e.g. cancelled invoices in
|
|
374
|
+
* the payments selector). One rule or a list (AND), tested client-side
|
|
375
|
+
* against the option's extra columns (`meta`): `{ field: 'status', not_in:
|
|
376
|
+
* ['cancelada'] }`. The options endpoint must return that column. Absent →
|
|
377
|
+
* the picker lists everything (retrocompat). See `option-filter.ts`.
|
|
378
|
+
*/
|
|
379
|
+
optionFilter?: OptionFilter;
|
|
380
|
+
/** snake_case alias served by the kernel manifest for `optionFilter`. */
|
|
381
|
+
option_filter?: OptionFilter;
|
|
352
382
|
/**
|
|
353
383
|
* Write-time rules the SDK also pre-flights. Object form `{regex,min,max,custom}`
|
|
354
384
|
* or a Laravel / go-playground string (`required|min:2|email`).
|
|
@@ -489,6 +519,16 @@ export interface ActionFieldDef {
|
|
|
489
519
|
* `useOptionsResolver` against `/api/options/<ref>?field=id`.
|
|
490
520
|
*/
|
|
491
521
|
ref?: string;
|
|
522
|
+
/**
|
|
523
|
+
* Hides options of this relation/dynamic picker (e.g. cancelled invoices in
|
|
524
|
+
* the payments selector). One rule or a list (AND), tested client-side
|
|
525
|
+
* against the option's extra columns (`meta`): `{ field: 'status', not_in:
|
|
526
|
+
* ['cancelada'] }`. The options endpoint must return that column. Absent →
|
|
527
|
+
* the picker lists everything (retrocompat). See `option-filter.ts`.
|
|
528
|
+
*/
|
|
529
|
+
optionFilter?: OptionFilter;
|
|
530
|
+
/** snake_case alias served by the kernel manifest for `optionFilter`. */
|
|
531
|
+
option_filter?: OptionFilter;
|
|
492
532
|
/**
|
|
493
533
|
* snake_case aliases the kernel manifest may serve for a belongs_to FK
|
|
494
534
|
* target instead of `ref`. Treated as equivalent to `ref` by the SDK so a
|
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":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAInD;gCACgC;AAChC,MAAM,WAAW,gBAAgB;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CAC1B;AAED,sFAAsF;AACtF,MAAM,WAAW,iBAAiB;IAC9B,mGAAmG;IACnG,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,sDAAsD;IACtD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,+EAA+E;AAC/E,MAAM,WAAW,gBAAgB;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,6EAA6E;IAC7E,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,gDAAgD;IAChD,KAAK,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAA;IACnC,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,qBAAqB;IAClC,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,gBAAgB,EAAE,CAAA;CAC5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,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;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,qBAAqB,CAAA;IACtC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;IAC7C;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,cAAc,CAAA;IACvB;;;;;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;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;;;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;IAClB;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;CAClB;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,aAAa,GAEb,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;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,yEAAyE;IACzE,aAAa,CAAC,EAAE,YAAY,CAAA;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,eAAe,GAAG,MAAM,CAAA;IACrC;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,eAAe,EAAE,CAAA;IAC9B,8DAA8D;IAC9D,WAAW,CAAC,EAAE,eAAe,EAAE,CAAA;IAC/B;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,WAAW,CAAA;IAC1B,0CAA0C;IAC1C,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACnB;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,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,EAAE,CAAC,EAAE,MAAM,EAAE,CAAA;IACb;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB;AAOD,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,GAAG,MAAM,CAAA;IACrC,MAAM,CAAC,EAAE,WAAW,GAAG,MAAM,CAAA;IAC7B;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,yEAAyE;IACzE,aAAa,CAAC,EAAE,YAAY,CAAA;IAC5B;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;;;;;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;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,kCAAkC;IAClC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;;;;;;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;IACzB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACnB;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,2DAA2D;AAC3D,MAAM,WAAW,aAAa;IAC1B,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAA;IACX,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAA;CAClB;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,4EAA4E;IAC5E,KAAK,CAAC,EAAE,UAAU,EAAE,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;;OAKG;IACH,SAAS,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAA;IACtC;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAA;CAChC;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,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAA;IACtC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAA;CAChC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type OptionFilterRule } from './option-filter';
|
|
1
2
|
export interface ResolvedOption {
|
|
2
3
|
/** Canonical id (server-side primary key). */
|
|
3
4
|
id: string | number;
|
|
@@ -72,6 +73,13 @@ export interface UseOptionsResolverArgs {
|
|
|
72
73
|
* `fieldKey` / `query` / `limit` exactly the same way.
|
|
73
74
|
*/
|
|
74
75
|
endpoint?: string;
|
|
76
|
+
/**
|
|
77
|
+
* Client-side rules that hide fetched options (see `option-filter.ts`).
|
|
78
|
+
* Empty/undefined → no filtering (retrocompat).
|
|
79
|
+
*/
|
|
80
|
+
optionFilter?: OptionFilterRule[];
|
|
81
|
+
/** Current selection: never hidden by `optionFilter`, so its label survives. */
|
|
82
|
+
keepValue?: unknown;
|
|
75
83
|
}
|
|
76
84
|
export interface UseOptionsResolverResult {
|
|
77
85
|
options: ResolvedOption[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-options-resolver.d.ts","sourceRoot":"","sources":["../src/use-options-resolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-options-resolver.d.ts","sourceRoot":"","sources":["../src/use-options-resolver.ts"],"names":[],"mappings":"AAcA,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAG1E,MAAM,WAAW,cAAc;IAC3B,8CAA8C;IAC9C,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,WAAW;IACxB,oEAAoE;IACpE,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAA;IACnC,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,sBAAsB;IACnC;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAA;IACjC,gFAAgF;IAChF,SAAS,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,MAAM,WAAW,wBAAwB;IACrC,OAAO,EAAE,cAAc,EAAE,CAAA;IACzB,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,8DAA8D;IAC9D,OAAO,EAAE,MAAM,IAAI,CAAA;CACtB;AAuBD;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAI7C;AAED,wBAAgB,iBAAiB,CAC7B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,MAAM,GAAG,SAAS,GAC3B,MAAM,CAER;AA8BD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,GAAG,wBAAwB,CAuKzF;AASD,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,cAAc,CAqBtD"}
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
// free; legacy callers that still ship `searchEndpoint` keep working.
|
|
13
13
|
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
14
14
|
import { useApi } from './api-context';
|
|
15
|
+
import { applyOptionFilter } from './option-filter';
|
|
15
16
|
import { loadQueryPart, optionsBatchToken, optionsModelFromUrl } from './query-batch';
|
|
16
17
|
/**
|
|
17
18
|
* Resolves select options for a field via the canonical
|
|
@@ -72,7 +73,7 @@ function readOptionsEnvelope(body) {
|
|
|
72
73
|
};
|
|
73
74
|
}
|
|
74
75
|
export function useOptionsResolver(args) {
|
|
75
|
-
const { modelKey, fieldKey, ref, query, limit, enabled = true, endpoint, filterValue, } = args;
|
|
76
|
+
const { modelKey, fieldKey, ref, query, limit, enabled = true, endpoint, filterValue, optionFilter, keepValue, } = args;
|
|
76
77
|
const api = useApi();
|
|
77
78
|
const [options, setOptions] = useState([]);
|
|
78
79
|
const [meta, setMeta] = useState(null);
|
|
@@ -205,8 +206,13 @@ export function useOptionsResolver(args) {
|
|
|
205
206
|
cancelled = true;
|
|
206
207
|
};
|
|
207
208
|
}, [api, url, effectiveField, query, limit, enabled, filterValue, refreshKey]);
|
|
209
|
+
// Rules arrive as a fresh array each render; key on their content.
|
|
210
|
+
const filterKey = optionFilter && optionFilter.length > 0 ? JSON.stringify(optionFilter) : '';
|
|
211
|
+
const visibleOptions = useMemo(() => (filterKey ? applyOptionFilter(options, optionFilter ?? [], keepValue) : options),
|
|
212
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
213
|
+
[options, filterKey, keepValue]);
|
|
208
214
|
return {
|
|
209
|
-
options,
|
|
215
|
+
options: visibleOptions,
|
|
210
216
|
meta,
|
|
211
217
|
loading,
|
|
212
218
|
error,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@asteby/metacore-runtime-react",
|
|
3
|
-
"version": "47.
|
|
3
|
+
"version": "47.1.0",
|
|
4
4
|
"description": "React runtime for metacore hosts — renders addon contributions dynamically",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
},
|
|
28
28
|
"peerDependencies": {
|
|
29
29
|
"@asteby/metacore-sdk": "^3.12.0",
|
|
30
|
-
"@asteby/metacore-ui": "^2.24.
|
|
30
|
+
"@asteby/metacore-ui": "^2.24.1",
|
|
31
31
|
"@tanstack/react-query": ">=5",
|
|
32
32
|
"@tanstack/react-router": ">=1.100",
|
|
33
33
|
"@tanstack/react-table": ">=8",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@asteby/metacore-sdk": "3.12.0",
|
|
54
|
-
"@asteby/metacore-ui": "2.24.
|
|
54
|
+
"@asteby/metacore-ui": "2.24.1",
|
|
55
55
|
"@tanstack/react-query": "^5.95.0",
|
|
56
56
|
"@tanstack/react-router": "^1.168.0",
|
|
57
57
|
"@tanstack/react-table": "^8.20.0",
|
|
@@ -11,7 +11,7 @@ import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
|
11
11
|
import { cleanup, render, screen } from '@testing-library/react'
|
|
12
12
|
|
|
13
13
|
vi.mock('react-i18next', () => ({
|
|
14
|
-
useTranslation: () => ({ t: (k: string) => k }),
|
|
14
|
+
useTranslation: () => ({ t: (k: string) => k, i18n: { language: 'es' } }),
|
|
15
15
|
}))
|
|
16
16
|
|
|
17
17
|
import { ActionModalDispatcher } from '../action-modal-dispatcher'
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// @vitest-environment happy-dom
|
|
2
|
+
import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
3
|
+
import { cleanup, fireEvent, render, screen } from '@testing-library/react'
|
|
4
|
+
|
|
5
|
+
const lang = { current: 'es' }
|
|
6
|
+
vi.mock('react-i18next', () => {
|
|
7
|
+
const t = (k: string, o?: { defaultValue?: string; who?: string }) =>
|
|
8
|
+
(o?.defaultValue ?? k).replace('{{who}}', o?.who ?? '')
|
|
9
|
+
return { useTranslation: () => ({ t, i18n: { language: lang.current } }) }
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
import { AuditInfo, readAuditMeta, resolveAuditActor, SYSTEM_ACTOR_ID } from '../audit-info'
|
|
13
|
+
|
|
14
|
+
afterEach(() => {
|
|
15
|
+
cleanup()
|
|
16
|
+
lang.current = 'es'
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
const audit = {
|
|
20
|
+
created_at: 'created_at',
|
|
21
|
+
created_by: 'created_by_id',
|
|
22
|
+
updated_at: 'updated_at',
|
|
23
|
+
updated_by: 'updated_by_id',
|
|
24
|
+
deleted_at: 'deleted_at',
|
|
25
|
+
deleted_by: 'deleted_by_id',
|
|
26
|
+
}
|
|
27
|
+
const U1 = '11111111-2222-3333-4444-555555555555'
|
|
28
|
+
|
|
29
|
+
describe('readAuditMeta', () => {
|
|
30
|
+
it('keeps known string keys and drops junk', () => {
|
|
31
|
+
expect(readAuditMeta({ created_at: 'created_at', foo: 'x', updated_at: 3 })).toEqual({ created_at: 'created_at' })
|
|
32
|
+
expect(readAuditMeta(undefined)).toBeUndefined()
|
|
33
|
+
expect(readAuditMeta([])).toBeUndefined()
|
|
34
|
+
expect(readAuditMeta({})).toBeUndefined()
|
|
35
|
+
})
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
describe('resolveAuditActor', () => {
|
|
39
|
+
const o = { systemLabel: 'Sistema' }
|
|
40
|
+
it('system actor, expanded sibling, host resolver, short id, empty', () => {
|
|
41
|
+
expect(resolveAuditActor({ c: SYSTEM_ACTOR_ID }, 'c', o)?.name).toBe('Sistema')
|
|
42
|
+
expect(resolveAuditActor({ created_by_id: U1, created_by: { name: 'Ana' } }, 'created_by_id', o)?.name).toBe('Ana')
|
|
43
|
+
expect(resolveAuditActor({ c: U1 }, 'c', { ...o, resolveActor: () => 'Luis' })?.name).toBe('Luis')
|
|
44
|
+
expect(resolveAuditActor({ c: U1 }, 'c', o)).toEqual({ name: '11111111', resolved: false })
|
|
45
|
+
expect(resolveAuditActor({ c: null }, 'c', o)).toBeNull()
|
|
46
|
+
expect(resolveAuditActor({ c: '00000000-0000-0000-0000-000000000000' }, 'c', o)).toBeNull()
|
|
47
|
+
})
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
describe('<AuditInfo>', () => {
|
|
51
|
+
const record = {
|
|
52
|
+
created_at: '2026-01-01T10:00:00Z',
|
|
53
|
+
created_by_id: U1,
|
|
54
|
+
created_by: { name: 'Ana' },
|
|
55
|
+
updated_at: '2026-02-01T10:00:00Z',
|
|
56
|
+
updated_by_id: SYSTEM_ACTOR_ID,
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
it('renders nothing without audit', () => {
|
|
60
|
+
const { container } = render(<AuditInfo record={record} audit={undefined} />)
|
|
61
|
+
expect(container.innerHTML).toBe('')
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
it('renders nothing when the record has no audit values', () => {
|
|
65
|
+
const { container } = render(<AuditInfo record={{ name: 'x' }} audit={audit} />)
|
|
66
|
+
expect(container.innerHTML).toBe('')
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
it('shows created and modified (system actor) when expanded', () => {
|
|
70
|
+
render(<AuditInfo record={record} audit={audit} timeZone="UTC" />)
|
|
71
|
+
expect(screen.queryByText('Creado por Ana')).toBeNull() // collapsed
|
|
72
|
+
fireEvent.click(screen.getByRole('button'))
|
|
73
|
+
expect(screen.getByText('Creado por Ana')).toBeTruthy()
|
|
74
|
+
expect(screen.getByText('Modificado por Sistema')).toBeTruthy()
|
|
75
|
+
expect(document.querySelector('[data-audit-line="deleted"]')).toBeNull()
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
it('shows deleted line and english copy', () => {
|
|
79
|
+
lang.current = 'en'
|
|
80
|
+
render(
|
|
81
|
+
<AuditInfo
|
|
82
|
+
record={{ ...record, deleted_at: '2026-03-01T10:00:00Z', deleted_by_id: U1 }}
|
|
83
|
+
audit={audit}
|
|
84
|
+
defaultOpen
|
|
85
|
+
resolveActor={() => 'Bob'}
|
|
86
|
+
/>,
|
|
87
|
+
)
|
|
88
|
+
expect(screen.getByText('Deleted by Bob')).toBeTruthy()
|
|
89
|
+
expect(screen.getByText('Created by Bob')).toBeTruthy()
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
it('hides modified when it equals creation, falls back to date-only label without actor col', () => {
|
|
93
|
+
render(
|
|
94
|
+
<AuditInfo
|
|
95
|
+
record={{ created_at: '2026-01-01T10:00:00Z', updated_at: '2026-01-01T10:00:00Z' }}
|
|
96
|
+
audit={{ created_at: 'created_at', updated_at: 'updated_at' }}
|
|
97
|
+
defaultOpen
|
|
98
|
+
/>,
|
|
99
|
+
)
|
|
100
|
+
expect(screen.getByText('Creado')).toBeTruthy()
|
|
101
|
+
expect(document.querySelector('[data-audit-line="updated"]')).toBeNull()
|
|
102
|
+
})
|
|
103
|
+
})
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
// header field is empty, and once the header field has a value the options
|
|
10
10
|
// request carries that value as `filter_value` and re-fetches on change.
|
|
11
11
|
import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
12
|
-
import { act, cleanup, render, screen, waitFor } from '@testing-library/react'
|
|
12
|
+
import { act, cleanup, render, screen, waitFor, within } from '@testing-library/react'
|
|
13
13
|
|
|
14
14
|
// Identity translator so any raw i18n keys surface verbatim.
|
|
15
15
|
vi.mock('react-i18next', () => ({
|
|
@@ -194,6 +194,10 @@ function LineItemsHost({ headerValue }: { headerValue: string }) {
|
|
|
194
194
|
)
|
|
195
195
|
}
|
|
196
196
|
|
|
197
|
+
// The editor renders a mobile card list AND a desktop table (CSS picks one), so
|
|
198
|
+
// scope queries to the table to hit a single picker.
|
|
199
|
+
const tableCombobox = () => within(document.querySelector('table') as HTMLElement).getByRole('combobox')
|
|
200
|
+
|
|
197
201
|
describe('DynamicLineItems cascading cell', () => {
|
|
198
202
|
it('disables the picker while the header field is empty', () => {
|
|
199
203
|
const get = vi.fn(async () => ({
|
|
@@ -206,7 +210,7 @@ describe('DynamicLineItems cascading cell', () => {
|
|
|
206
210
|
</ApiProvider>,
|
|
207
211
|
)
|
|
208
212
|
// The combobox trigger is disabled and shows the dependency hint.
|
|
209
|
-
const trigger =
|
|
213
|
+
const trigger = tableCombobox()
|
|
210
214
|
expect((trigger as HTMLButtonElement).disabled).toBe(true)
|
|
211
215
|
expect(trigger.getAttribute('data-depends-blocked')).toBe('')
|
|
212
216
|
// No options request fires while blocked.
|
|
@@ -230,7 +234,7 @@ describe('DynamicLineItems cascading cell', () => {
|
|
|
230
234
|
)
|
|
231
235
|
|
|
232
236
|
// Open the popover so the typeahead fetches.
|
|
233
|
-
const trigger =
|
|
237
|
+
const trigger = tableCombobox()
|
|
234
238
|
expect((trigger as HTMLButtonElement).disabled).toBe(false)
|
|
235
239
|
await act(async () => {
|
|
236
240
|
trigger.click()
|
|
@@ -300,7 +304,10 @@ describe('DynamicLineItems cell with optionsConfig.source', () => {
|
|
|
300
304
|
meta: { type: 'dynamic', count: 1 },
|
|
301
305
|
},
|
|
302
306
|
}))
|
|
303
|
-
|
|
307
|
+
// `/options/<model>` lookups try the batched `/q` endpoint first; a client
|
|
308
|
+
// whose batch endpoint is unavailable falls back to the plain GET asserted here.
|
|
309
|
+
const post = vi.fn(async () => ({ data: { success: false } }))
|
|
310
|
+
const client = { get, post } as unknown as ApiClient
|
|
304
311
|
|
|
305
312
|
const { rerender } = render(
|
|
306
313
|
<ApiProvider client={client}>
|
|
@@ -308,7 +315,7 @@ describe('DynamicLineItems cell with optionsConfig.source', () => {
|
|
|
308
315
|
</ApiProvider>,
|
|
309
316
|
)
|
|
310
317
|
|
|
311
|
-
const trigger =
|
|
318
|
+
const trigger = tableCombobox()
|
|
312
319
|
expect((trigger as HTMLButtonElement).disabled).toBe(false)
|
|
313
320
|
await act(async () => {
|
|
314
321
|
trigger.click()
|
|
@@ -149,6 +149,10 @@ describe('DynamicTable infinite scroll', () => {
|
|
|
149
149
|
await waitFor(() => expect(screen.getByText('30 de 45')).toBeTruthy())
|
|
150
150
|
observers.forEach((o) => o.fire(true))
|
|
151
151
|
await waitFor(() => expect(screen.getByText('45 de 45')).toBeTruthy())
|
|
152
|
+
// The sentinel leaves the viewport once everything is loaded. While it
|
|
153
|
+
// stays intersecting the hook deliberately chains the next page after a
|
|
154
|
+
// reset (viewport-fill), which would mask the collapse asserted below.
|
|
155
|
+
observers.forEach((o) => o.fire(false))
|
|
152
156
|
|
|
153
157
|
// Change the active filters via defaultFilters (part of buildFilterParams).
|
|
154
158
|
rerender(
|
|
@@ -65,6 +65,7 @@ describe('DynamicLineItems — lock_rows', () => {
|
|
|
65
65
|
it('control: sin lock_rows muestra "Agregar renglón" y un botón de borrar por fila', () => {
|
|
66
66
|
render(<DynamicLineItems field={lineField()} value={rows} onChange={vi.fn()} />)
|
|
67
67
|
expect(screen.getByText('Agregar renglón')).toBeTruthy()
|
|
68
|
-
|
|
68
|
+
// Mobile cards + desktop table both render a delete control per row.
|
|
69
|
+
expect(screen.getAllByLabelText('Eliminar renglón')).toHaveLength(rows.length * 2)
|
|
69
70
|
})
|
|
70
71
|
})
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// @vitest-environment happy-dom
|
|
2
|
+
//
|
|
3
|
+
// `option_filter` / `optionFilter` on a relation picker hides options client-side
|
|
4
|
+
// (PIT-059: cancelled invoices must not show up in the payments selector).
|
|
5
|
+
import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
6
|
+
import { act, cleanup, render, screen, waitFor, within } from '@testing-library/react'
|
|
7
|
+
import { applyOptionFilter, getOptionFilter, optionPassesRule } from '../option-filter'
|
|
8
|
+
import { projectOption } from '../use-options-resolver'
|
|
9
|
+
import { DynamicSelectField } from '../dynamic-select-field'
|
|
10
|
+
import { ApiProvider, type ApiClient } from '../api-context'
|
|
11
|
+
import type { ActionFieldDef } from '../types'
|
|
12
|
+
|
|
13
|
+
vi.mock('react-i18next', () => ({
|
|
14
|
+
useTranslation: () => ({ t: (k: string, o?: any) => o?.defaultValue ?? k, i18n: { language: 'es' } }),
|
|
15
|
+
}))
|
|
16
|
+
|
|
17
|
+
afterEach(cleanup)
|
|
18
|
+
|
|
19
|
+
const invoices = [
|
|
20
|
+
{ id: 'i1', label: 'FAC-1', status: 'timbrada', total: 100 },
|
|
21
|
+
{ id: 'i2', label: 'FAC-2', status: 'Cancelada', total: 50 },
|
|
22
|
+
{ id: 'i3', label: 'FAC-3', status: 'pendiente', total: 70 },
|
|
23
|
+
{ id: 'i4', label: 'FAC-4' },
|
|
24
|
+
].map(projectOption)
|
|
25
|
+
|
|
26
|
+
describe('getOptionFilter', () => {
|
|
27
|
+
it('is empty when the field declares none (retrocompat)', () => {
|
|
28
|
+
expect(getOptionFilter({ key: 'x' })).toEqual([])
|
|
29
|
+
expect(getOptionFilter(undefined)).toEqual([])
|
|
30
|
+
})
|
|
31
|
+
it('reads camelCase and snake_case, one rule or a list', () => {
|
|
32
|
+
const rule = { field: 'status', not_in: ['cancelada'] }
|
|
33
|
+
expect(getOptionFilter({ optionFilter: rule })).toEqual([rule])
|
|
34
|
+
expect(getOptionFilter({ option_filter: [rule] })).toEqual([rule])
|
|
35
|
+
})
|
|
36
|
+
it('ignores malformed rules', () => {
|
|
37
|
+
expect(getOptionFilter({ option_filter: [{ nope: 1 }, null, { field: '' }] })).toEqual([])
|
|
38
|
+
})
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
describe('applyOptionFilter', () => {
|
|
42
|
+
it('returns the same array with no rules', () => {
|
|
43
|
+
expect(applyOptionFilter(invoices, [])).toBe(invoices)
|
|
44
|
+
})
|
|
45
|
+
it('not_in hides cancelled invoices (case-insensitive) and keeps options without the column', () => {
|
|
46
|
+
const out = applyOptionFilter(invoices, [{ field: 'status', not_in: ['cancelada'] }])
|
|
47
|
+
expect(out.map((o) => o.id)).toEqual(['i1', 'i3', 'i4'])
|
|
48
|
+
})
|
|
49
|
+
it('notEquals alias and equals / in need the column to exist', () => {
|
|
50
|
+
expect(applyOptionFilter(invoices, [{ field: 'status', notEquals: 'cancelada' }]).map((o) => o.id)).toEqual(['i1', 'i3', 'i4'])
|
|
51
|
+
expect(applyOptionFilter(invoices, [{ field: 'status', equals: 'timbrada' }]).map((o) => o.id)).toEqual(['i1'])
|
|
52
|
+
expect(applyOptionFilter(invoices, [{ field: 'status', in: ['timbrada', 'pendiente'] }]).map((o) => o.id)).toEqual(['i1', 'i3'])
|
|
53
|
+
})
|
|
54
|
+
it('combines rules with AND', () => {
|
|
55
|
+
const out = applyOptionFilter(invoices, [
|
|
56
|
+
{ field: 'status', not_in: ['cancelada'] },
|
|
57
|
+
{ field: 'status', not_equals: 'pendiente' },
|
|
58
|
+
])
|
|
59
|
+
expect(out.map((o) => o.id)).toEqual(['i1', 'i4'])
|
|
60
|
+
})
|
|
61
|
+
it('never hides the current selection', () => {
|
|
62
|
+
const out = applyOptionFilter(invoices, [{ field: 'status', not_in: ['cancelada'] }], 'i2')
|
|
63
|
+
expect(out.map((o) => o.id)).toEqual(['i1', 'i2', 'i3', 'i4'])
|
|
64
|
+
})
|
|
65
|
+
it('tests standard keys too (label)', () => {
|
|
66
|
+
expect(optionPassesRule(invoices[0], { field: 'label', equals: 'fac-1' })).toBe(true)
|
|
67
|
+
})
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
describe('DynamicSelectField with option_filter', () => {
|
|
71
|
+
const field = (extra: Partial<ActionFieldDef> = {}): ActionFieldDef => ({
|
|
72
|
+
key: 'invoice_id',
|
|
73
|
+
label: 'Factura',
|
|
74
|
+
type: 'dynamic_select',
|
|
75
|
+
ref: 'invoices.Invoice',
|
|
76
|
+
...extra,
|
|
77
|
+
})
|
|
78
|
+
const api = () => {
|
|
79
|
+
const get = vi.fn(async () => ({
|
|
80
|
+
data: {
|
|
81
|
+
success: true,
|
|
82
|
+
data: [
|
|
83
|
+
{ id: 'i1', label: 'FAC-1', status: 'timbrada' },
|
|
84
|
+
{ id: 'i2', label: 'FAC-2', status: 'cancelada' },
|
|
85
|
+
],
|
|
86
|
+
meta: { type: 'dynamic', count: 2 },
|
|
87
|
+
},
|
|
88
|
+
}))
|
|
89
|
+
const post = vi.fn(async () => ({ data: { success: false } }))
|
|
90
|
+
return { get, post } as unknown as ApiClient
|
|
91
|
+
}
|
|
92
|
+
const open = async (f: ActionFieldDef) => {
|
|
93
|
+
render(
|
|
94
|
+
<ApiProvider client={api()}>
|
|
95
|
+
<DynamicSelectField field={f} value="" onChange={() => {}} />
|
|
96
|
+
</ApiProvider>,
|
|
97
|
+
)
|
|
98
|
+
await act(async () => {
|
|
99
|
+
screen.getByRole('combobox').click()
|
|
100
|
+
})
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
it('lists every option without a filter', async () => {
|
|
104
|
+
await open(field())
|
|
105
|
+
await waitFor(() => expect(screen.getByText('FAC-2')).toBeTruthy())
|
|
106
|
+
expect(screen.getByText('FAC-1')).toBeTruthy()
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
it('hides the cancelled invoice when the manifest declares option_filter', async () => {
|
|
110
|
+
await open(field({ option_filter: { field: 'status', not_in: ['cancelada'] } }))
|
|
111
|
+
await waitFor(() => expect(screen.getByText('FAC-1')).toBeTruthy())
|
|
112
|
+
expect(screen.queryByText('FAC-2')).toBeNull()
|
|
113
|
+
expect(within(document.body).queryAllByText('FAC-2')).toHaveLength(0)
|
|
114
|
+
})
|
|
115
|
+
})
|
|
@@ -82,7 +82,11 @@ describe('detail-view jsonb line-items (ViewValue → inline CollectionCell)', (
|
|
|
82
82
|
record={{}}
|
|
83
83
|
/>
|
|
84
84
|
)
|
|
85
|
-
|
|
85
|
+
// Keys are humanized (the addon-declared label is the localized source);
|
|
86
|
+
// each pair renders as a <dt>/<dd>, never "[object Object]".
|
|
87
|
+
expect(screen.getByText('Price').tagName).toBe('DT')
|
|
88
|
+
expect(screen.getByText('10').tagName).toBe('DD')
|
|
89
|
+
expect(screen.getByText('Quantity')).toBeTruthy()
|
|
86
90
|
expect(container.textContent).not.toContain('[object Object]')
|
|
87
91
|
})
|
|
88
92
|
|
|
@@ -14,7 +14,7 @@ import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
|
14
14
|
import { cleanup, render, screen, fireEvent, waitFor } from '@testing-library/react'
|
|
15
15
|
|
|
16
16
|
vi.mock('react-i18next', () => ({
|
|
17
|
-
useTranslation: () => ({ t: (k: string, o?: any) => o?.defaultValue ?? k }),
|
|
17
|
+
useTranslation: () => ({ t: (k: string, o?: any) => o?.defaultValue ?? k, i18n: { language: 'es' } }),
|
|
18
18
|
}))
|
|
19
19
|
|
|
20
20
|
import { ActionModalDispatcher } from '../action-modal-dispatcher'
|