@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.
Files changed (51) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/audit-info.d.ts +54 -0
  3. package/dist/audit-info.d.ts.map +1 -0
  4. package/dist/audit-info.js +142 -0
  5. package/dist/dialogs/dynamic-record.d.ts.map +1 -1
  6. package/dist/dialogs/dynamic-record.js +5 -1
  7. package/dist/dynamic-form.d.ts.map +1 -1
  8. package/dist/dynamic-form.js +3 -0
  9. package/dist/dynamic-kanban.d.ts.map +1 -1
  10. package/dist/dynamic-kanban.js +8 -1
  11. package/dist/dynamic-line-items.d.ts.map +1 -1
  12. package/dist/dynamic-line-items.js +3 -0
  13. package/dist/dynamic-multi-select-field.d.ts.map +1 -1
  14. package/dist/dynamic-multi-select-field.js +2 -0
  15. package/dist/dynamic-select-field.d.ts.map +1 -1
  16. package/dist/dynamic-select-field.js +4 -0
  17. package/dist/index.d.ts +3 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +4 -0
  20. package/dist/option-filter.d.ts +31 -0
  21. package/dist/option-filter.d.ts.map +1 -0
  22. package/dist/option-filter.js +49 -0
  23. package/dist/types.d.ts +40 -0
  24. package/dist/types.d.ts.map +1 -1
  25. package/dist/use-options-resolver.d.ts +8 -0
  26. package/dist/use-options-resolver.d.ts.map +1 -1
  27. package/dist/use-options-resolver.js +8 -2
  28. package/package.json +3 -3
  29. package/src/__tests__/action-modal-grid-layout.test.tsx +1 -1
  30. package/src/__tests__/apply-sidebar-layout.test.ts +1 -1
  31. package/src/__tests__/audit-info.test.tsx +103 -0
  32. package/src/__tests__/dependent-options.test.tsx +12 -5
  33. package/src/__tests__/dynamic-table-infinite-scroll.test.tsx +4 -0
  34. package/src/__tests__/line-items-lock-rows.test.tsx +2 -1
  35. package/src/__tests__/option-filter.test.tsx +115 -0
  36. package/src/__tests__/structured-view-value.test.tsx +5 -1
  37. package/src/__tests__/wizard-action-modal.test.tsx +1 -1
  38. package/src/audit-info.tsx +219 -0
  39. package/src/dialogs/dynamic-record.tsx +13 -0
  40. package/src/dropdown-menu-entry.test.ts +23 -0
  41. package/src/dynamic-form.tsx +3 -0
  42. package/src/dynamic-kanban.tsx +7 -3
  43. package/src/dynamic-line-items.tsx +3 -0
  44. package/src/dynamic-multi-select-field.tsx +2 -0
  45. package/src/dynamic-select-field.tsx +4 -0
  46. package/src/index.ts +13 -0
  47. package/src/option-filter.ts +88 -0
  48. package/src/types.ts +41 -0
  49. package/src/use-options-resolver.ts +19 -1
  50. package/vitest.config.ts +1 -0
  51. 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
@@ -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":"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"}
@@ -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":"AAgBA,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;CACpB;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,CA6JzF;AASD,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,cAAc,CAqBtD"}
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.0.0",
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.0",
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.0",
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'
@@ -7,7 +7,7 @@ import {
7
7
  slugifyFolderKey,
8
8
  type CatalogLeaf,
9
9
  type SidebarLayoutNode,
10
- } from './apply-sidebar-layout'
10
+ } from '../apply-sidebar-layout'
11
11
 
12
12
  describe('applySidebarLayout', () => {
13
13
  const catalog: CatalogLeaf[] = [
@@ -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 = screen.getByRole('combobox')
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 = screen.getByRole('combobox')
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
- const client = { get } as unknown as ApiClient
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 = screen.getByRole('combobox')
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
- expect(screen.getAllByLabelText('Eliminar renglón')).toHaveLength(2)
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
- expect(screen.getByText('Precio:')).toBeTruthy()
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'