@asteby/metacore-runtime-react 37.0.2 → 37.0.3
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 +6 -0
- package/dist/addon-loader.d.ts.map +1 -1
- package/dist/addon-loader.js +18 -10
- package/dist/dynamic-form-schema.d.ts +27 -0
- package/dist/dynamic-form-schema.d.ts.map +1 -1
- package/dist/dynamic-form-schema.js +79 -0
- package/dist/dynamic-table.d.ts +1 -8
- package/dist/dynamic-table.d.ts.map +1 -1
- package/dist/dynamic-table.js +100 -20
- 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 +7 -6
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/visible-when.test.ts +41 -1
- package/src/addon-loader.tsx +22 -10
- package/src/dynamic-form-schema.ts +81 -0
- package/src/dynamic-table.tsx +89 -27
- package/src/index.ts +3 -0
- package/src/types.ts +7 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @asteby/metacore-runtime-react
|
|
2
2
|
|
|
3
|
+
## 37.0.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 46a9505: List/board honor Column.visible_when against locked defaultFilters / URL scope (CxC hides Proveedor); AddonLoader retries transient remoteEntry 502s.
|
|
8
|
+
|
|
3
9
|
## 37.0.2
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addon-loader.d.ts","sourceRoot":"","sources":["../src/addon-loader.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAc3E,MAAM,WAAW,gBAAgB;IAC7B,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAA;IACb,+EAA+E;IAC/E,GAAG,EAAE,MAAM,CAAA;IACX,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,+DAA+D;IAC/D,GAAG,EAAE,QAAQ,CAAA;IACb;;;;OAIG;IACH,YAAY,CAAC,EAAE,QAAQ,CAAA;IACvB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAA;IAC9B;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC7B;
|
|
1
|
+
{"version":3,"file":"addon-loader.d.ts","sourceRoot":"","sources":["../src/addon-loader.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAc3E,MAAM,WAAW,gBAAgB;IAC7B,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAA;IACb,+EAA+E;IAC/E,GAAG,EAAE,MAAM,CAAA;IACX,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,+DAA+D;IAC/D,GAAG,EAAE,QAAQ,CAAA;IACb;;;;OAIG;IACH,YAAY,CAAC,EAAE,QAAQ,CAAA;IACvB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAA;IAC9B;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC7B;AAwED,wBAAgB,WAAW,CAAC,EACxB,KAAK,EACL,GAAG,EACH,MAAqB,EACrB,GAAG,EACH,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,QAAe,EACf,OAAO,EACP,OAAO,EACP,MAAM,EACN,QAAQ,GACX,EAAE,gBAAgB,sCAmElB"}
|
package/dist/addon-loader.js
CHANGED
|
@@ -33,20 +33,28 @@ function isRuntimeNotReady(e) {
|
|
|
33
33
|
const msg = e instanceof Error ? e.message : String(e);
|
|
34
34
|
return msg.includes('#RUNTIME-009') || msg.includes('call createInstance');
|
|
35
35
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
36
|
+
/** Transient network / gateway failures while the host API is restarting. */
|
|
37
|
+
function isTransientRemoteLoadError(e) {
|
|
38
|
+
if (isRuntimeNotReady(e))
|
|
39
|
+
return true;
|
|
40
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
41
|
+
return (/failed to fetch|networkerror|load failed|502|503|504|ERR_CONNECTION_REFUSED|ECONNREFUSED|Outdated Optimize Dep/i.test(msg) ||
|
|
42
|
+
// MF wraps fetch failures variously
|
|
43
|
+
/ScriptExternalLoadError|Loading script failed|remoteEntry/i.test(msg));
|
|
44
|
+
}
|
|
45
|
+
// Retry host-boot races (RUNTIME-009) and brief API blips (502 while backend
|
|
46
|
+
// SyncAll is still running). Permanent errors (404, missing register) fail fast.
|
|
47
|
+
async function withRemoteLoadRetry(op) {
|
|
48
|
+
const maxAttempts = 8;
|
|
42
49
|
for (let attempt = 1;; attempt++) {
|
|
43
50
|
try {
|
|
44
51
|
return await op();
|
|
45
52
|
}
|
|
46
53
|
catch (e) {
|
|
47
|
-
if (!
|
|
54
|
+
if (!isTransientRemoteLoadError(e) || attempt >= maxAttempts)
|
|
48
55
|
throw e;
|
|
49
|
-
|
|
56
|
+
// 80, 160, 320… capped — ~3s worst case for API restart
|
|
57
|
+
await sleep(Math.min(80 * 2 ** (attempt - 1), 800));
|
|
50
58
|
}
|
|
51
59
|
}
|
|
52
60
|
}
|
|
@@ -55,10 +63,10 @@ async function loadAddon(scope, url, module) {
|
|
|
55
63
|
// fetches the new remoteEntry. `force: true` wipes that remote's module
|
|
56
64
|
// cache — without it, loadRemote would keep serving the previous bundle.
|
|
57
65
|
if (shouldReregisterRemote(scope, url)) {
|
|
58
|
-
await
|
|
66
|
+
await withRemoteLoadRetry(() => registerRemotes([{ name: scope, entry: url, type: 'module' }], { force: true }));
|
|
59
67
|
markRemoteRegistered(scope, url);
|
|
60
68
|
}
|
|
61
|
-
return
|
|
69
|
+
return withRemoteLoadRetry(() => loadRemote(remoteId(scope, module)));
|
|
62
70
|
}
|
|
63
71
|
export function AddonLoader({ scope, url, module = './register', api, hostRegistry, addonKey, unbindKey, fallback = null, onReady, onError, layout, children, }) {
|
|
64
72
|
const [status, setStatus] = useState('loading');
|
|
@@ -122,6 +122,33 @@ export declare function getVisibleWhen(field: {
|
|
|
122
122
|
* `getVisibleWhen` to normalize first.
|
|
123
123
|
*/
|
|
124
124
|
export declare function evaluateVisibleWhen(cond: VisibleWhen | null | undefined, formValues: Record<string, any> | null | undefined): boolean;
|
|
125
|
+
/**
|
|
126
|
+
* Strip a DynamicTable / URL filter token down to the comparable scalar the
|
|
127
|
+
* kernel `visible_when.equals` / `.in` predicates expect.
|
|
128
|
+
*
|
|
129
|
+
* `eq:customer` → `customer`, bare `customer` stays, `in:a,b` keeps the raw
|
|
130
|
+
* multi-value (list-scope only gates on known single-eq scopes today).
|
|
131
|
+
*/
|
|
132
|
+
export declare function scopeValueFromFilterToken(raw: unknown): string;
|
|
133
|
+
/**
|
|
134
|
+
* Flat "known field → value" map for list/board surfaces. Built from locked
|
|
135
|
+
* `defaultFilters` (nav / branch scope) plus active `dynamicFilters`. Only
|
|
136
|
+
* fields present here are considered known — see
|
|
137
|
+
* `evaluateVisibleWhenForListScope`.
|
|
138
|
+
*/
|
|
139
|
+
export declare function buildListScopeValues(defaultFilters?: Record<string, unknown> | null, dynamicFilters?: Record<string, string[] | undefined> | null): Record<string, string>;
|
|
140
|
+
/**
|
|
141
|
+
* List/board variant of `evaluateVisibleWhen`.
|
|
142
|
+
*
|
|
143
|
+
* Forms always have a live sibling value (or ''). Lists often do not — a
|
|
144
|
+
* mixed AccountStatement table has no single `party_type`. Hiding every
|
|
145
|
+
* `visible_when` column when the governing field is unknown would wipe both
|
|
146
|
+
* Cliente and Proveedor on the unscoped view. Rule: if the governing field is
|
|
147
|
+
* not in `scope` (or is empty), keep the column; once the scope pins it
|
|
148
|
+
* (sidebar locked_scope / defaultFilters / a single-eq chip), apply the same
|
|
149
|
+
* predicate as the form.
|
|
150
|
+
*/
|
|
151
|
+
export declare function evaluateVisibleWhenForListScope(cond: VisibleWhen | null | undefined, scope: Record<string, any> | null | undefined): boolean;
|
|
125
152
|
/**
|
|
126
153
|
* Reads a field's enriched options-resolution config, tolerating the camelCase
|
|
127
154
|
* `optionsConfig` (authored SDK shape) and the snake_case `options_config` the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-form-schema.d.ts","sourceRoot":"","sources":["../src/dynamic-form-schema.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dynamic-form-schema.d.ts","sourceRoot":"","sources":["../src/dynamic-form-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -355,6 +355,85 @@ export function evaluateVisibleWhen(cond, formValues) {
|
|
|
355
355
|
// Named a field but declared no comparison → nothing to gate on.
|
|
356
356
|
return true;
|
|
357
357
|
}
|
|
358
|
+
/**
|
|
359
|
+
* Strip a DynamicTable / URL filter token down to the comparable scalar the
|
|
360
|
+
* kernel `visible_when.equals` / `.in` predicates expect.
|
|
361
|
+
*
|
|
362
|
+
* `eq:customer` → `customer`, bare `customer` stays, `in:a,b` keeps the raw
|
|
363
|
+
* multi-value (list-scope only gates on known single-eq scopes today).
|
|
364
|
+
*/
|
|
365
|
+
export function scopeValueFromFilterToken(raw) {
|
|
366
|
+
if (raw == null)
|
|
367
|
+
return '';
|
|
368
|
+
const s = String(raw);
|
|
369
|
+
const i = s.indexOf(':');
|
|
370
|
+
if (i <= 0)
|
|
371
|
+
return s;
|
|
372
|
+
const op = s.slice(0, i).toLowerCase();
|
|
373
|
+
const rest = s.slice(i + 1);
|
|
374
|
+
if (op === 'eq' ||
|
|
375
|
+
op === 'neq' ||
|
|
376
|
+
op === 'gt' ||
|
|
377
|
+
op === 'gte' ||
|
|
378
|
+
op === 'lt' ||
|
|
379
|
+
op === 'lte' ||
|
|
380
|
+
op === 'like' ||
|
|
381
|
+
op === 'ilike' ||
|
|
382
|
+
op === 'contains') {
|
|
383
|
+
return rest;
|
|
384
|
+
}
|
|
385
|
+
return s;
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Flat "known field → value" map for list/board surfaces. Built from locked
|
|
389
|
+
* `defaultFilters` (nav / branch scope) plus active `dynamicFilters`. Only
|
|
390
|
+
* fields present here are considered known — see
|
|
391
|
+
* `evaluateVisibleWhenForListScope`.
|
|
392
|
+
*/
|
|
393
|
+
export function buildListScopeValues(defaultFilters, dynamicFilters) {
|
|
394
|
+
const out = {};
|
|
395
|
+
if (defaultFilters) {
|
|
396
|
+
for (const [key, value] of Object.entries(defaultFilters)) {
|
|
397
|
+
const v = scopeValueFromFilterToken(value);
|
|
398
|
+
if (v !== '')
|
|
399
|
+
out[key] = v;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
if (dynamicFilters) {
|
|
403
|
+
for (const [key, values] of Object.entries(dynamicFilters)) {
|
|
404
|
+
if (defaultFilters && key in defaultFilters)
|
|
405
|
+
continue;
|
|
406
|
+
if (!values || values.length !== 1)
|
|
407
|
+
continue;
|
|
408
|
+
const v = scopeValueFromFilterToken(values[0]);
|
|
409
|
+
if (v !== '')
|
|
410
|
+
out[key] = v;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
return out;
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* List/board variant of `evaluateVisibleWhen`.
|
|
417
|
+
*
|
|
418
|
+
* Forms always have a live sibling value (or ''). Lists often do not — a
|
|
419
|
+
* mixed AccountStatement table has no single `party_type`. Hiding every
|
|
420
|
+
* `visible_when` column when the governing field is unknown would wipe both
|
|
421
|
+
* Cliente and Proveedor on the unscoped view. Rule: if the governing field is
|
|
422
|
+
* not in `scope` (or is empty), keep the column; once the scope pins it
|
|
423
|
+
* (sidebar locked_scope / defaultFilters / a single-eq chip), apply the same
|
|
424
|
+
* predicate as the form.
|
|
425
|
+
*/
|
|
426
|
+
export function evaluateVisibleWhenForListScope(cond, scope) {
|
|
427
|
+
if (!cond || typeof cond.field !== 'string' || cond.field.trim() === '')
|
|
428
|
+
return true;
|
|
429
|
+
const key = cond.field.trim();
|
|
430
|
+
if (!scope || !(key in scope))
|
|
431
|
+
return true;
|
|
432
|
+
const raw = scope[key];
|
|
433
|
+
if (raw == null || String(raw) === '')
|
|
434
|
+
return true;
|
|
435
|
+
return evaluateVisibleWhen(cond, scope);
|
|
436
|
+
}
|
|
358
437
|
/**
|
|
359
438
|
* Reads a field's enriched options-resolution config, tolerating the camelCase
|
|
360
439
|
* `optionsConfig` (authored SDK shape) and the snake_case `options_config` the
|
package/dist/dynamic-table.d.ts
CHANGED
|
@@ -40,13 +40,6 @@ export interface DynamicTableProps {
|
|
|
40
40
|
*/
|
|
41
41
|
onRowClick?: (row: any) => void;
|
|
42
42
|
refreshTrigger?: any;
|
|
43
|
-
/**
|
|
44
|
-
* Refetch when the host's realtime client reports a data event for this
|
|
45
|
-
* model (created/updated/deleted by anyone in the org, or a `resync`).
|
|
46
|
-
* Off by default; `<RealtimeProvider defaultRealtime>` turns it on for
|
|
47
|
-
* every table, and an explicit prop always wins. No-op without a client.
|
|
48
|
-
*/
|
|
49
|
-
realtime?: boolean;
|
|
50
43
|
defaultFilters?: Record<string, any>;
|
|
51
44
|
extraColumns?: ColumnDef<any>[];
|
|
52
45
|
/**
|
|
@@ -91,5 +84,5 @@ export interface DynamicTableProps {
|
|
|
91
84
|
*/
|
|
92
85
|
infiniteScroll?: boolean;
|
|
93
86
|
}
|
|
94
|
-
export declare function DynamicTable({ model, endpoint, mutationEndpoint, enableUrlSync, hideImport, hideExport, hiddenColumns, allowedActionKeys, onAction, onRowClick, refreshTrigger,
|
|
87
|
+
export declare function DynamicTable({ model, endpoint, mutationEndpoint, enableUrlSync, hideImport, hideExport, hiddenColumns, allowedActionKeys, onAction, onRowClick, refreshTrigger, defaultFilters, extraColumns, getDynamicColumns, timeZone, currency, pagination: paginationMode, infiniteScroll: infiniteScrollProp, }: DynamicTableProps): import("react").JSX.Element;
|
|
95
88
|
//# sourceMappingURL=dynamic-table.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-table.d.ts","sourceRoot":"","sources":["../src/dynamic-table.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAKH,KAAK,SAAS,EAajB,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"dynamic-table.d.ts","sourceRoot":"","sources":["../src/dynamic-table.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAKH,KAAK,SAAS,EAajB,MAAM,uBAAuB,CAAA;AAgC9B,OAAO,KAAK,EAAsB,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAkGnF,MAAM,WAAW,iBAAiB;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB;;;;;;;;;OASG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,CAAA;IAC7C;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAA;IAC/B,cAAc,CAAC,EAAE,GAAG,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACpC,YAAY,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAA;IAC/B;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;;;;;;;;OAaG;IACH,UAAU,CAAC,EAAE,OAAO,GAAG,UAAU,CAAA;IACjC;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED,wBAAgB,YAAY,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,gBAAgB,EAChB,aAAoB,EACpB,UAAU,EACV,UAAU,EACV,aAAkB,EAClB,iBAAiB,EACjB,QAAQ,EACR,UAAU,EACV,cAAc,EACd,cAAc,EACd,YAAiB,EACjB,iBAA4C,EAC5C,QAAQ,EACR,QAAQ,EACR,UAAU,EAAE,cAAc,EAC1B,cAAc,EAAE,kBAA0B,GAC7C,EAAE,iBAAiB,+BAw0CnB"}
|
package/dist/dynamic-table.js
CHANGED
|
@@ -23,7 +23,6 @@ import { toast } from 'sonner';
|
|
|
23
23
|
import { Progress } from './dialogs/_primitives';
|
|
24
24
|
import { useMetadataCache } from './metadata-cache';
|
|
25
25
|
import { useApi, useCurrentBranch } from './api-context';
|
|
26
|
-
import { useRealtimeDefault, useRealtimeTick } from './realtime-context';
|
|
27
26
|
import { defaultGetDynamicColumns, DATE_CELL_TYPES, aggregateOf, formatAggregateTotal } from './dynamic-columns';
|
|
28
27
|
import { useFacetLoaders, isLongTextColumn } from './use-facet-loaders';
|
|
29
28
|
import { translateOptionLabels } from './filter-chips';
|
|
@@ -35,6 +34,7 @@ import { useCan, usePermissionsActive, gateTableMetadata } from './permissions-c
|
|
|
35
34
|
import { useDynamicRowActions } from './dynamic-row-actions';
|
|
36
35
|
import { ExportDialog } from './dialogs/export';
|
|
37
36
|
import { ImportDialog } from './dialogs/import';
|
|
37
|
+
import { buildListScopeValues, evaluateVisibleWhenForListScope, getVisibleWhen, scopeValueFromFilterToken, } from './dynamic-form-schema';
|
|
38
38
|
// ---------------------------------------------------------------------------
|
|
39
39
|
// Row-data cache (perceived performance).
|
|
40
40
|
//
|
|
@@ -105,20 +105,13 @@ function writeStoredPageSize(model, size) {
|
|
|
105
105
|
// quota / private mode — persistence is a nicety, never fatal
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
|
-
export function DynamicTable({ model, endpoint, mutationEndpoint, enableUrlSync = true, hideImport, hideExport, hiddenColumns = [], allowedActionKeys, onAction, onRowClick, refreshTrigger,
|
|
108
|
+
export function DynamicTable({ model, endpoint, mutationEndpoint, enableUrlSync = true, hideImport, hideExport, hiddenColumns = [], allowedActionKeys, onAction, onRowClick, refreshTrigger, defaultFilters, extraColumns = [], getDynamicColumns = defaultGetDynamicColumns, timeZone, currency, pagination: paginationMode, infiniteScroll: infiniteScrollProp = false, }) {
|
|
109
109
|
// The explicit `pagination` prop wins; the legacy `infiniteScroll` boolean
|
|
110
110
|
// still selects the mode when `pagination` is absent (back-compat).
|
|
111
111
|
const infiniteScroll = paginationMode ? paginationMode === 'infinite' : infiniteScrollProp;
|
|
112
112
|
const { t, i18n } = useTranslation();
|
|
113
113
|
const api = useApi();
|
|
114
114
|
const currentBranch = useCurrentBranch();
|
|
115
|
-
// Realtime refetch (opt-in): a debounced counter that bumps on every
|
|
116
|
-
// DATA_EVENT for this model and rides the same deps as `refreshTrigger`.
|
|
117
|
-
const realtimeDefault = useRealtimeDefault();
|
|
118
|
-
const realtimeTick = useRealtimeTick({
|
|
119
|
-
models: [model],
|
|
120
|
-
enabled: realtimeProp ?? realtimeDefault,
|
|
121
|
-
});
|
|
122
115
|
const prevBranchId = useRef(currentBranch?.id);
|
|
123
116
|
const { getMetadata, setMetadata: cacheMetadata } = useMetadataCache();
|
|
124
117
|
const cachedMeta = getMetadata(model);
|
|
@@ -345,6 +338,24 @@ export function DynamicTable({ model, endpoint, mutationEndpoint, enableUrlSync
|
|
|
345
338
|
else
|
|
346
339
|
params.set(`f_${key}`, `in:${values.join(',')}`);
|
|
347
340
|
});
|
|
341
|
+
// Re-pin locked scope into the URL so sidebar matching + deep-links keep
|
|
342
|
+
// working after "Limpiar filtros" (those keys are not in dynamicFilters).
|
|
343
|
+
if (defaultFilters) {
|
|
344
|
+
Object.entries(defaultFilters).forEach(([key, value]) => {
|
|
345
|
+
params.set(`f_${key}`, internalValueToUrl(String(value ?? '')));
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
// Preserve f_* already in the location that we did not rebuild above.
|
|
349
|
+
// Sidebar deep-links (CxC→CxP) push f_party_type=eq:supplier before React
|
|
350
|
+
// re-renders with matching defaultFilters; without this carry-through the
|
|
351
|
+
// write effect races and strips the filter down to bare ?view=list.
|
|
352
|
+
current.forEach((value, key) => {
|
|
353
|
+
if (!key.startsWith('f_'))
|
|
354
|
+
return;
|
|
355
|
+
if (params.has(key))
|
|
356
|
+
return;
|
|
357
|
+
params.set(key, value);
|
|
358
|
+
});
|
|
348
359
|
const search = params.toString();
|
|
349
360
|
// If what we'd write is semantically identical to what's already in the
|
|
350
361
|
// bar (only key order / colon-encoding differ from the router's form),
|
|
@@ -537,6 +548,58 @@ export function DynamicTable({ model, endpoint, mutationEndpoint, enableUrlSync
|
|
|
537
548
|
// host to flip a flag per view.
|
|
538
549
|
const importEnabled = !hideImport && (viewMetadata?.canImport ?? Boolean(viewMetadata?.import?.columns?.length));
|
|
539
550
|
const exportEnabled = !hideExport && Boolean(viewMetadata?.canExport);
|
|
551
|
+
const listScopeValues = useMemo(() => {
|
|
552
|
+
const base = buildListScopeValues(defaultFilters, dynamicFilters);
|
|
553
|
+
// Deep-links pin f_* in the URL before defaultFilters / nav matching
|
|
554
|
+
// catch up; adopt single-eq scope values so visible_when columns hide
|
|
555
|
+
// on first paint (CxC hides Proveedor without waiting for navFilter).
|
|
556
|
+
if (!enableUrlSync || typeof window === 'undefined')
|
|
557
|
+
return base;
|
|
558
|
+
const params = new URLSearchParams(window.location.search);
|
|
559
|
+
const fromUrl = {};
|
|
560
|
+
params.forEach((raw, key) => {
|
|
561
|
+
if (!key.startsWith('f_'))
|
|
562
|
+
return;
|
|
563
|
+
const col = key.slice(2);
|
|
564
|
+
if (!col || col in base)
|
|
565
|
+
return;
|
|
566
|
+
const v = scopeValueFromFilterToken(raw);
|
|
567
|
+
if (!v)
|
|
568
|
+
return;
|
|
569
|
+
// Multi-value / range tokens are not a single list-scope pin.
|
|
570
|
+
if (v.includes(',') || /^(in|not_in|range|gte|lte):/i.test(String(raw)))
|
|
571
|
+
return;
|
|
572
|
+
fromUrl[col] = v;
|
|
573
|
+
});
|
|
574
|
+
return Object.keys(fromUrl).length === 0 ? base : { ...fromUrl, ...base };
|
|
575
|
+
}, [defaultFilters, dynamicFilters, enableUrlSync, urlSynced]);
|
|
576
|
+
// Columns whose kernel `visible_when` fails against the known list scope
|
|
577
|
+
// (locked nav defaultFilters, single-eq chips). Host `hiddenColumns` still
|
|
578
|
+
// wins; this is the scalable path so CxC hides Proveedor without each nav
|
|
579
|
+
// item re-listing every allowed column.
|
|
580
|
+
const scopeHiddenColumns = useMemo(() => {
|
|
581
|
+
const cols = (viewMetadata?.columns ?? metadata?.columns ?? []);
|
|
582
|
+
if (cols.length === 0 || Object.keys(listScopeValues).length === 0)
|
|
583
|
+
return [];
|
|
584
|
+
const hidden = [];
|
|
585
|
+
for (const col of cols) {
|
|
586
|
+
const key = col.key;
|
|
587
|
+
if (!key)
|
|
588
|
+
continue;
|
|
589
|
+
if (!evaluateVisibleWhenForListScope(getVisibleWhen(col), listScopeValues)) {
|
|
590
|
+
hidden.push(key);
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
return hidden;
|
|
594
|
+
}, [metadata, viewMetadata, listScopeValues]);
|
|
595
|
+
const effectiveHiddenColumns = useMemo(() => {
|
|
596
|
+
if (scopeHiddenColumns.length === 0)
|
|
597
|
+
return hiddenColumns;
|
|
598
|
+
const set = new Set(hiddenColumns);
|
|
599
|
+
for (const k of scopeHiddenColumns)
|
|
600
|
+
set.add(k);
|
|
601
|
+
return Array.from(set);
|
|
602
|
+
}, [hiddenColumns, scopeHiddenColumns]);
|
|
540
603
|
const buildFilterParams = useCallback(() => {
|
|
541
604
|
const params = {};
|
|
542
605
|
if (sorting.length > 0) {
|
|
@@ -553,10 +616,14 @@ export function DynamicTable({ model, endpoint, mutationEndpoint, enableUrlSync
|
|
|
553
616
|
}
|
|
554
617
|
// searchableKeys === [] → drop the search request entirely
|
|
555
618
|
}
|
|
556
|
-
columnFilters.forEach((filter) => {
|
|
557
|
-
|
|
558
|
-
|
|
619
|
+
columnFilters.forEach((filter) => {
|
|
620
|
+
if (defaultFilters && filter.id in defaultFilters)
|
|
621
|
+
return;
|
|
622
|
+
params[`f_${filter.id}`] = filter.value;
|
|
623
|
+
});
|
|
559
624
|
Object.entries(dynamicFilters).forEach(([key, values]) => {
|
|
625
|
+
if (defaultFilters && key in defaultFilters)
|
|
626
|
+
return;
|
|
560
627
|
if (values.length === 0)
|
|
561
628
|
return;
|
|
562
629
|
const gteVal = values.find(v => v.startsWith('GTE:'));
|
|
@@ -572,6 +639,9 @@ export function DynamicTable({ model, endpoint, mutationEndpoint, enableUrlSync
|
|
|
572
639
|
else
|
|
573
640
|
params[`f_${key}`] = `IN:${values.join(',')}`;
|
|
574
641
|
});
|
|
642
|
+
// Locked scope last so it always wins over stale dynamic/column filters.
|
|
643
|
+
if (defaultFilters)
|
|
644
|
+
Object.entries(defaultFilters).forEach(([key, value]) => { params[`f_${key}`] = value; });
|
|
575
645
|
if (dateRange?.from) {
|
|
576
646
|
const startDate = format(dateRange.from, 'yyyy-MM-dd');
|
|
577
647
|
const endDate = dateRange.to ? format(dateRange.to, 'yyyy-MM-dd') : startDate;
|
|
@@ -619,8 +689,7 @@ export function DynamicTable({ model, endpoint, mutationEndpoint, enableUrlSync
|
|
|
619
689
|
finally {
|
|
620
690
|
setLoadingData(false);
|
|
621
691
|
}
|
|
622
|
-
|
|
623
|
-
}, [model, metadata, pagination, buildFilterParams, refreshTrigger, realtimeTick, endpoint, currentBranch?.id, api, enableUrlSync]);
|
|
692
|
+
}, [model, metadata, pagination, buildFilterParams, refreshTrigger, endpoint, currentBranch?.id, api, enableUrlSync]);
|
|
624
693
|
// Columns whose metadata opts into a footer total (display_config.aggregate
|
|
625
694
|
// → styleConfig.aggregate). When empty, no footer row is rendered and no
|
|
626
695
|
// aggregate request is made.
|
|
@@ -781,9 +850,8 @@ export function DynamicTable({ model, endpoint, mutationEndpoint, enableUrlSync
|
|
|
781
850
|
// matching the classic path (fetchData carries refreshTrigger in its
|
|
782
851
|
// deps). Without it the comment above lied: infinite lists silently
|
|
783
852
|
// failed to reload after a create ("a veces no recarga la tabla").
|
|
784
|
-
// realtimeTick plays the same role for data events (see the `realtime` prop).
|
|
785
853
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
786
|
-
}, [infiniteScroll, metadata, filterSignature, refreshTrigger
|
|
854
|
+
}, [infiniteScroll, metadata, filterSignature, refreshTrigger]);
|
|
787
855
|
const handleRefresh = useCallback(() => {
|
|
788
856
|
// Infinite mode owns its own list: refresh reloads page 1 and drops the
|
|
789
857
|
// accumulated pages (a classic fetchData would collapse it to one small
|
|
@@ -845,9 +913,12 @@ export function DynamicTable({ model, endpoint, mutationEndpoint, enableUrlSync
|
|
|
845
913
|
handleRefresh();
|
|
846
914
|
};
|
|
847
915
|
const handleDynamicFilterChange = useCallback((filterKey, values) => {
|
|
916
|
+
// Locked scope (nav / branch defaultFilters) cannot be changed from the UI.
|
|
917
|
+
if (defaultFilters && filterKey in defaultFilters)
|
|
918
|
+
return;
|
|
848
919
|
setDynamicFilters((prev) => ({ ...prev, [filterKey]: values }));
|
|
849
920
|
setPagination((prev) => ({ ...prev, pageIndex: 0 }));
|
|
850
|
-
}, []);
|
|
921
|
+
}, [defaultFilters]);
|
|
851
922
|
// Same facet loader machinery the board uses, so a text column filters
|
|
852
923
|
// identically in the table header and the kanban Sheet (the host's
|
|
853
924
|
// getDynamicColumns forwards `loadOptions` into the column meta). Facets base
|
|
@@ -873,6 +944,11 @@ export function DynamicTable({ model, endpoint, mutationEndpoint, enableUrlSync
|
|
|
873
944
|
// `filterable: true` — keeps the kernel API minimal (one flag on the
|
|
874
945
|
// column) while still rendering the FilterableColumnHeader.
|
|
875
946
|
for (const f of metadata.filters ?? []) {
|
|
947
|
+
const filterCol = f.column || f.key;
|
|
948
|
+
if (defaultFilters && filterCol in defaultFilters)
|
|
949
|
+
continue;
|
|
950
|
+
if (effectiveHiddenColumns.includes(filterCol))
|
|
951
|
+
continue;
|
|
876
952
|
let fType = f.type;
|
|
877
953
|
let options = [];
|
|
878
954
|
if (f.options && f.options.length > 0) {
|
|
@@ -918,6 +994,10 @@ export function DynamicTable({ model, endpoint, mutationEndpoint, enableUrlSync
|
|
|
918
994
|
for (const c of metadata.columns ?? []) {
|
|
919
995
|
if (!c.filterable || map.has(c.key))
|
|
920
996
|
continue;
|
|
997
|
+
if (defaultFilters && c.key in defaultFilters)
|
|
998
|
+
continue;
|
|
999
|
+
if (effectiveHiddenColumns.includes(c.key))
|
|
1000
|
+
continue;
|
|
921
1001
|
const hasStaticOptions = (c.options?.length ?? 0) > 0;
|
|
922
1002
|
const hasEndpoint = !!c.searchEndpoint;
|
|
923
1003
|
const isRelation = !!c.ref || c.filterType === 'dynamic_select';
|
|
@@ -987,7 +1067,7 @@ export function DynamicTable({ model, endpoint, mutationEndpoint, enableUrlSync
|
|
|
987
1067
|
});
|
|
988
1068
|
}
|
|
989
1069
|
return map;
|
|
990
|
-
}, [metadata, filterOptionsMap, dynamicFilters, handleDynamicFilterChange, facetsBase, getFacetLoader, facetOptions, t]);
|
|
1070
|
+
}, [metadata, filterOptionsMap, dynamicFilters, handleDynamicFilterChange, facetsBase, getFacetLoader, facetOptions, t, defaultFilters, effectiveHiddenColumns]);
|
|
991
1071
|
// Prewarm every facet field once the configs settle, so a text column's
|
|
992
1072
|
// header filter opens instantly with values + counts (same as the kanban).
|
|
993
1073
|
const facetFieldsSig = useMemo(() => {
|
|
@@ -1025,11 +1105,11 @@ export function DynamicTable({ model, endpoint, mutationEndpoint, enableUrlSync
|
|
|
1025
1105
|
return actions === viewMetadata.actions ? viewMetadata : { ...viewMetadata, actions };
|
|
1026
1106
|
})();
|
|
1027
1107
|
const baseColumns = getDynamicColumns(rowMetadata, handleInternalAction, t, i18n.language, columnFilterConfigs, timeZone, currency);
|
|
1028
|
-
const filteredBase = baseColumns.filter((col) => !
|
|
1108
|
+
const filteredBase = baseColumns.filter((col) => !effectiveHiddenColumns.includes(col.id));
|
|
1029
1109
|
const actionsCol = filteredBase.find((c) => c.id === 'actions');
|
|
1030
1110
|
const otherCols = filteredBase.filter((c) => c.id !== 'actions');
|
|
1031
1111
|
return [...otherCols, ...extraColumns, ...(actionsCol ? [actionsCol] : [])];
|
|
1032
|
-
}, [viewMetadata, handleInternalAction,
|
|
1112
|
+
}, [viewMetadata, handleInternalAction, effectiveHiddenColumns, allowedActionKeys, extraColumns, t, i18n.language, columnFilterConfigs, getDynamicColumns, timeZone, currency]);
|
|
1033
1113
|
const filters = useMemo(() => [], []);
|
|
1034
1114
|
const table = useReactTable({
|
|
1035
1115
|
data,
|
package/dist/index.d.ts
CHANGED
|
@@ -70,7 +70,7 @@ export { registerModelExtension, getModelExtension, clearModelExtensions, type M
|
|
|
70
70
|
export { isColumnVisibleInTable, isColumnVisibleInModal, isColumnVisibleInLineSubtable, AUDIT_SUBTABLE_COLUMN_KEYS, getSearchableColumnKeys, } from './column-visibility';
|
|
71
71
|
export { useOptionsResolver, projectOption, type ResolvedOption, type OptionsMeta, type UseOptionsResolverArgs, type UseOptionsResolverResult, } from './use-options-resolver';
|
|
72
72
|
export { setOrgConfigBridge, getOrgConfigBridge, resolveValidatorToken, type OrgConfigBridge, } from './use-org-config-bridge';
|
|
73
|
-
export { registerValidator, getDependsOn, resolveDependsValue, getOptionsConfig, resolveOptionsSource, getVisibleWhen, evaluateVisibleWhen, } from './dynamic-form-schema';
|
|
73
|
+
export { registerValidator, getDependsOn, resolveDependsValue, getOptionsConfig, resolveOptionsSource, getVisibleWhen, evaluateVisibleWhen, scopeValueFromFilterToken, buildListScopeValues, evaluateVisibleWhenForListScope, } from './dynamic-form-schema';
|
|
74
74
|
export { ActivityValueRenderer, type ActivityValueRendererProps, } from './activity-value-renderer';
|
|
75
75
|
export { ActivityDiff, type ActivityEvent, type ActivityDiffProps, } from './activity-diff';
|
|
76
76
|
export { RecordHistory, type RecordHistoryProps, } from './record-history';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -70,7 +70,7 @@ export { registerModelExtension, getModelExtension, clearModelExtensions, } from
|
|
|
70
70
|
export { isColumnVisibleInTable, isColumnVisibleInModal, isColumnVisibleInLineSubtable, AUDIT_SUBTABLE_COLUMN_KEYS, getSearchableColumnKeys, } from './column-visibility';
|
|
71
71
|
export { useOptionsResolver, projectOption, } from './use-options-resolver';
|
|
72
72
|
export { setOrgConfigBridge, getOrgConfigBridge, resolveValidatorToken, } from './use-org-config-bridge';
|
|
73
|
-
export { registerValidator, getDependsOn, resolveDependsValue, getOptionsConfig, resolveOptionsSource, getVisibleWhen, evaluateVisibleWhen, } from './dynamic-form-schema';
|
|
73
|
+
export { registerValidator, getDependsOn, resolveDependsValue, getOptionsConfig, resolveOptionsSource, getVisibleWhen, evaluateVisibleWhen, scopeValueFromFilterToken, buildListScopeValues, evaluateVisibleWhenForListScope, } from './dynamic-form-schema';
|
|
74
74
|
export { ActivityValueRenderer, } from './activity-value-renderer';
|
|
75
75
|
export { ActivityDiff, } from './activity-diff';
|
|
76
76
|
export { RecordHistory, } from './record-history';
|
package/dist/types.d.ts
CHANGED
|
@@ -309,12 +309,13 @@ export interface ColumnDefinition {
|
|
|
309
309
|
/** snake_case alias served by the kernel for `itemFields`. */
|
|
310
310
|
item_fields?: ColumnItemField[];
|
|
311
311
|
/**
|
|
312
|
-
* Conditional visibility
|
|
313
|
-
*
|
|
314
|
-
*
|
|
315
|
-
*
|
|
316
|
-
*
|
|
317
|
-
*
|
|
312
|
+
* Conditional visibility (kernel v3 `Column.visible_when`):
|
|
313
|
+
* - create/edit modal → `evaluateVisibleWhen` against live form values
|
|
314
|
+
* - list/board → `evaluateVisibleWhenForListScope` against known filter
|
|
315
|
+
* scope (`defaultFilters` / single-eq chips), so a locked nav scope
|
|
316
|
+
* like `party_type=customer` hides `supplier_id` without each nav
|
|
317
|
+
* item re-declaring a full column allowlist.
|
|
318
|
+
* Tolerates the camelCase alias. Absent = always visible.
|
|
318
319
|
*/
|
|
319
320
|
visible_when?: VisibleWhen;
|
|
320
321
|
/** camelCase alias for `visible_when`. */
|
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":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@asteby/metacore-runtime-react",
|
|
3
|
-
"version": "37.0.
|
|
3
|
+
"version": "37.0.3",
|
|
4
4
|
"description": "React runtime for metacore hosts — renders addon contributions dynamically",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -67,8 +67,8 @@
|
|
|
67
67
|
"typescript": "^6.0.0",
|
|
68
68
|
"vitest": "^4.0.0",
|
|
69
69
|
"zustand": "^5.0.0",
|
|
70
|
-
"@asteby/metacore-
|
|
71
|
-
"@asteby/metacore-
|
|
70
|
+
"@asteby/metacore-sdk": "3.7.0",
|
|
71
|
+
"@asteby/metacore-ui": "2.17.3"
|
|
72
72
|
},
|
|
73
73
|
"scripts": {
|
|
74
74
|
"build": "tsc -p tsconfig.json",
|
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest'
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
evaluateVisibleWhen,
|
|
4
|
+
evaluateVisibleWhenForListScope,
|
|
5
|
+
buildListScopeValues,
|
|
6
|
+
scopeValueFromFilterToken,
|
|
7
|
+
getVisibleWhen,
|
|
8
|
+
} from '../dynamic-form-schema'
|
|
3
9
|
import type { VisibleWhen } from '../types'
|
|
4
10
|
|
|
5
11
|
// The discount_rules use case: a `rule_scope` field decides which picker shows.
|
|
6
12
|
const equalsProduct: VisibleWhen = { field: 'rule_scope', equals: 'product' }
|
|
7
13
|
const inCategory: VisibleWhen = { field: 'rule_scope', in: ['category'] }
|
|
8
14
|
const inMulti: VisibleWhen = { field: 'scope', in: ['a', 'b'] }
|
|
15
|
+
const customerOnly: VisibleWhen = { field: 'party_type', equals: 'customer' }
|
|
16
|
+
const supplierOnly: VisibleWhen = { field: 'party_type', equals: 'supplier' }
|
|
9
17
|
|
|
10
18
|
describe('evaluateVisibleWhen', () => {
|
|
11
19
|
it('no predicate → always visible', () => {
|
|
@@ -61,3 +69,35 @@ describe('getVisibleWhen', () => {
|
|
|
61
69
|
expect(getVisibleWhen({ visible_when: { equals: 'x' } as unknown as VisibleWhen })).toBeUndefined()
|
|
62
70
|
})
|
|
63
71
|
})
|
|
72
|
+
|
|
73
|
+
describe('scopeValueFromFilterToken / buildListScopeValues', () => {
|
|
74
|
+
it('strips eq: and leaves bare values', () => {
|
|
75
|
+
expect(scopeValueFromFilterToken('eq:customer')).toBe('customer')
|
|
76
|
+
expect(scopeValueFromFilterToken('customer')).toBe('customer')
|
|
77
|
+
expect(scopeValueFromFilterToken('IN:a,b')).toBe('IN:a,b')
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
it('merges defaultFilters over dynamic and skips multi-value chips', () => {
|
|
81
|
+
expect(
|
|
82
|
+
buildListScopeValues(
|
|
83
|
+
{ party_type: 'eq:customer', branch_id: 'eq:b1' },
|
|
84
|
+
{ party_type: ['supplier'], status: ['open', 'draft'], warehouse: ['w1'] },
|
|
85
|
+
),
|
|
86
|
+
).toEqual({ party_type: 'customer', branch_id: 'b1', warehouse: 'w1' })
|
|
87
|
+
})
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
describe('evaluateVisibleWhenForListScope', () => {
|
|
91
|
+
it('keeps columns when the governing field is unknown (mixed list)', () => {
|
|
92
|
+
expect(evaluateVisibleWhenForListScope(customerOnly, {})).toBe(true)
|
|
93
|
+
expect(evaluateVisibleWhenForListScope(supplierOnly, {})).toBe(true)
|
|
94
|
+
expect(evaluateVisibleWhenForListScope(customerOnly, { other: 'x' })).toBe(true)
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
it('hides the opposite party column when nav locks party_type', () => {
|
|
98
|
+
expect(evaluateVisibleWhenForListScope(customerOnly, { party_type: 'customer' })).toBe(true)
|
|
99
|
+
expect(evaluateVisibleWhenForListScope(supplierOnly, { party_type: 'customer' })).toBe(false)
|
|
100
|
+
expect(evaluateVisibleWhenForListScope(customerOnly, { party_type: 'supplier' })).toBe(false)
|
|
101
|
+
expect(evaluateVisibleWhenForListScope(supplierOnly, { party_type: 'supplier' })).toBe(true)
|
|
102
|
+
})
|
|
103
|
+
})
|
package/src/addon-loader.tsx
CHANGED
|
@@ -93,18 +93,30 @@ function isRuntimeNotReady(e: unknown): boolean {
|
|
|
93
93
|
return msg.includes('#RUNTIME-009') || msg.includes('call createInstance')
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
96
|
+
/** Transient network / gateway failures while the host API is restarting. */
|
|
97
|
+
function isTransientRemoteLoadError(e: unknown): boolean {
|
|
98
|
+
if (isRuntimeNotReady(e)) return true
|
|
99
|
+
const msg = e instanceof Error ? e.message : String(e)
|
|
100
|
+
return (
|
|
101
|
+
/failed to fetch|networkerror|load failed|502|503|504|ERR_CONNECTION_REFUSED|ECONNREFUSED|Outdated Optimize Dep/i.test(
|
|
102
|
+
msg,
|
|
103
|
+
) ||
|
|
104
|
+
// MF wraps fetch failures variously
|
|
105
|
+
/ScriptExternalLoadError|Loading script failed|remoteEntry/i.test(msg)
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Retry host-boot races (RUNTIME-009) and brief API blips (502 while backend
|
|
110
|
+
// SyncAll is still running). Permanent errors (404, missing register) fail fast.
|
|
111
|
+
async function withRemoteLoadRetry<T>(op: () => T | Promise<T>): Promise<T> {
|
|
112
|
+
const maxAttempts = 8
|
|
102
113
|
for (let attempt = 1; ; attempt++) {
|
|
103
114
|
try {
|
|
104
115
|
return await op()
|
|
105
116
|
} catch (e) {
|
|
106
|
-
if (!
|
|
107
|
-
|
|
117
|
+
if (!isTransientRemoteLoadError(e) || attempt >= maxAttempts) throw e
|
|
118
|
+
// 80, 160, 320… capped — ~3s worst case for API restart
|
|
119
|
+
await sleep(Math.min(80 * 2 ** (attempt - 1), 800))
|
|
108
120
|
}
|
|
109
121
|
}
|
|
110
122
|
}
|
|
@@ -118,12 +130,12 @@ async function loadAddon(
|
|
|
118
130
|
// fetches the new remoteEntry. `force: true` wipes that remote's module
|
|
119
131
|
// cache — without it, loadRemote would keep serving the previous bundle.
|
|
120
132
|
if (shouldReregisterRemote(scope, url)) {
|
|
121
|
-
await
|
|
133
|
+
await withRemoteLoadRetry(() =>
|
|
122
134
|
registerRemotes([{ name: scope, entry: url, type: 'module' }], { force: true }),
|
|
123
135
|
)
|
|
124
136
|
markRemoteRegistered(scope, url)
|
|
125
137
|
}
|
|
126
|
-
return
|
|
138
|
+
return withRemoteLoadRetry(() =>
|
|
127
139
|
loadRemote<AddonRegisterModule>(remoteId(scope, module)),
|
|
128
140
|
)
|
|
129
141
|
}
|
|
@@ -382,6 +382,87 @@ export function evaluateVisibleWhen(
|
|
|
382
382
|
return true
|
|
383
383
|
}
|
|
384
384
|
|
|
385
|
+
/**
|
|
386
|
+
* Strip a DynamicTable / URL filter token down to the comparable scalar the
|
|
387
|
+
* kernel `visible_when.equals` / `.in` predicates expect.
|
|
388
|
+
*
|
|
389
|
+
* `eq:customer` → `customer`, bare `customer` stays, `in:a,b` keeps the raw
|
|
390
|
+
* multi-value (list-scope only gates on known single-eq scopes today).
|
|
391
|
+
*/
|
|
392
|
+
export function scopeValueFromFilterToken(raw: unknown): string {
|
|
393
|
+
if (raw == null) return ''
|
|
394
|
+
const s = String(raw)
|
|
395
|
+
const i = s.indexOf(':')
|
|
396
|
+
if (i <= 0) return s
|
|
397
|
+
const op = s.slice(0, i).toLowerCase()
|
|
398
|
+
const rest = s.slice(i + 1)
|
|
399
|
+
if (
|
|
400
|
+
op === 'eq' ||
|
|
401
|
+
op === 'neq' ||
|
|
402
|
+
op === 'gt' ||
|
|
403
|
+
op === 'gte' ||
|
|
404
|
+
op === 'lt' ||
|
|
405
|
+
op === 'lte' ||
|
|
406
|
+
op === 'like' ||
|
|
407
|
+
op === 'ilike' ||
|
|
408
|
+
op === 'contains'
|
|
409
|
+
) {
|
|
410
|
+
return rest
|
|
411
|
+
}
|
|
412
|
+
return s
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Flat "known field → value" map for list/board surfaces. Built from locked
|
|
417
|
+
* `defaultFilters` (nav / branch scope) plus active `dynamicFilters`. Only
|
|
418
|
+
* fields present here are considered known — see
|
|
419
|
+
* `evaluateVisibleWhenForListScope`.
|
|
420
|
+
*/
|
|
421
|
+
export function buildListScopeValues(
|
|
422
|
+
defaultFilters?: Record<string, unknown> | null,
|
|
423
|
+
dynamicFilters?: Record<string, string[] | undefined> | null,
|
|
424
|
+
): Record<string, string> {
|
|
425
|
+
const out: Record<string, string> = {}
|
|
426
|
+
if (defaultFilters) {
|
|
427
|
+
for (const [key, value] of Object.entries(defaultFilters)) {
|
|
428
|
+
const v = scopeValueFromFilterToken(value)
|
|
429
|
+
if (v !== '') out[key] = v
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
if (dynamicFilters) {
|
|
433
|
+
for (const [key, values] of Object.entries(dynamicFilters)) {
|
|
434
|
+
if (defaultFilters && key in defaultFilters) continue
|
|
435
|
+
if (!values || values.length !== 1) continue
|
|
436
|
+
const v = scopeValueFromFilterToken(values[0])
|
|
437
|
+
if (v !== '') out[key] = v
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
return out
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/**
|
|
444
|
+
* List/board variant of `evaluateVisibleWhen`.
|
|
445
|
+
*
|
|
446
|
+
* Forms always have a live sibling value (or ''). Lists often do not — a
|
|
447
|
+
* mixed AccountStatement table has no single `party_type`. Hiding every
|
|
448
|
+
* `visible_when` column when the governing field is unknown would wipe both
|
|
449
|
+
* Cliente and Proveedor on the unscoped view. Rule: if the governing field is
|
|
450
|
+
* not in `scope` (or is empty), keep the column; once the scope pins it
|
|
451
|
+
* (sidebar locked_scope / defaultFilters / a single-eq chip), apply the same
|
|
452
|
+
* predicate as the form.
|
|
453
|
+
*/
|
|
454
|
+
export function evaluateVisibleWhenForListScope(
|
|
455
|
+
cond: VisibleWhen | null | undefined,
|
|
456
|
+
scope: Record<string, any> | null | undefined,
|
|
457
|
+
): boolean {
|
|
458
|
+
if (!cond || typeof cond.field !== 'string' || cond.field.trim() === '') return true
|
|
459
|
+
const key = cond.field.trim()
|
|
460
|
+
if (!scope || !(key in scope)) return true
|
|
461
|
+
const raw = scope[key]
|
|
462
|
+
if (raw == null || String(raw) === '') return true
|
|
463
|
+
return evaluateVisibleWhen(cond, scope)
|
|
464
|
+
}
|
|
465
|
+
|
|
385
466
|
/**
|
|
386
467
|
* Reads a field's enriched options-resolution config, tolerating the camelCase
|
|
387
468
|
* `optionsConfig` (authored SDK shape) and the snake_case `options_config` the
|
package/src/dynamic-table.tsx
CHANGED
|
@@ -64,20 +64,25 @@ import { toast } from 'sonner'
|
|
|
64
64
|
import { Progress } from './dialogs/_primitives'
|
|
65
65
|
import { useMetadataCache } from './metadata-cache'
|
|
66
66
|
import { useApi, useCurrentBranch } from './api-context'
|
|
67
|
-
import { useRealtimeDefault, useRealtimeTick } from './realtime-context'
|
|
68
67
|
import type { ColumnFilterConfig, GetDynamicColumns } from './dynamic-columns-shim'
|
|
69
68
|
import { defaultGetDynamicColumns, DATE_CELL_TYPES, aggregateOf, formatAggregateTotal } from './dynamic-columns'
|
|
70
69
|
import { useFacetLoaders, isLongTextColumn } from './use-facet-loaders'
|
|
71
70
|
import { translateOptionLabels } from './filter-chips'
|
|
72
71
|
import { dedupeById, useInfiniteScrollSentinel } from './use-infinite-scroll'
|
|
73
72
|
import { OptionsContext } from './options-context'
|
|
74
|
-
import type { TableMetadata, ApiResponse } from './types'
|
|
73
|
+
import type { TableMetadata, ApiResponse, ColumnDefinition } from './types'
|
|
75
74
|
import { getSearchableColumnKeys } from './column-visibility'
|
|
76
75
|
import { useDebouncedValue } from './use-debounced-value'
|
|
77
76
|
import { useCan, usePermissionsActive, gateTableMetadata } from './permissions-context'
|
|
78
77
|
import { useDynamicRowActions } from './dynamic-row-actions'
|
|
79
78
|
import { ExportDialog } from './dialogs/export'
|
|
80
79
|
import { ImportDialog } from './dialogs/import'
|
|
80
|
+
import {
|
|
81
|
+
buildListScopeValues,
|
|
82
|
+
evaluateVisibleWhenForListScope,
|
|
83
|
+
getVisibleWhen,
|
|
84
|
+
scopeValueFromFilterToken,
|
|
85
|
+
} from './dynamic-form-schema'
|
|
81
86
|
|
|
82
87
|
// ---------------------------------------------------------------------------
|
|
83
88
|
// Row-data cache (perceived performance).
|
|
@@ -197,13 +202,6 @@ export interface DynamicTableProps {
|
|
|
197
202
|
*/
|
|
198
203
|
onRowClick?: (row: any) => void
|
|
199
204
|
refreshTrigger?: any
|
|
200
|
-
/**
|
|
201
|
-
* Refetch when the host's realtime client reports a data event for this
|
|
202
|
-
* model (created/updated/deleted by anyone in the org, or a `resync`).
|
|
203
|
-
* Off by default; `<RealtimeProvider defaultRealtime>` turns it on for
|
|
204
|
-
* every table, and an explicit prop always wins. No-op without a client.
|
|
205
|
-
*/
|
|
206
|
-
realtime?: boolean
|
|
207
205
|
defaultFilters?: Record<string, any>
|
|
208
206
|
extraColumns?: ColumnDef<any>[]
|
|
209
207
|
/**
|
|
@@ -261,7 +259,6 @@ export function DynamicTable({
|
|
|
261
259
|
onAction,
|
|
262
260
|
onRowClick,
|
|
263
261
|
refreshTrigger,
|
|
264
|
-
realtime: realtimeProp,
|
|
265
262
|
defaultFilters,
|
|
266
263
|
extraColumns = [],
|
|
267
264
|
getDynamicColumns = defaultGetDynamicColumns,
|
|
@@ -276,13 +273,6 @@ export function DynamicTable({
|
|
|
276
273
|
const { t, i18n } = useTranslation()
|
|
277
274
|
const api = useApi()
|
|
278
275
|
const currentBranch = useCurrentBranch()
|
|
279
|
-
// Realtime refetch (opt-in): a debounced counter that bumps on every
|
|
280
|
-
// DATA_EVENT for this model and rides the same deps as `refreshTrigger`.
|
|
281
|
-
const realtimeDefault = useRealtimeDefault()
|
|
282
|
-
const realtimeTick = useRealtimeTick({
|
|
283
|
-
models: [model],
|
|
284
|
-
enabled: realtimeProp ?? realtimeDefault,
|
|
285
|
-
})
|
|
286
276
|
|
|
287
277
|
const prevBranchId = useRef(currentBranch?.id)
|
|
288
278
|
|
|
@@ -512,6 +502,22 @@ export function DynamicTable({
|
|
|
512
502
|
if (values.length === 1) params.set(`f_${key}`, internalValueToUrl(values[0]))
|
|
513
503
|
else params.set(`f_${key}`, `in:${values.join(',')}`)
|
|
514
504
|
})
|
|
505
|
+
// Re-pin locked scope into the URL so sidebar matching + deep-links keep
|
|
506
|
+
// working after "Limpiar filtros" (those keys are not in dynamicFilters).
|
|
507
|
+
if (defaultFilters) {
|
|
508
|
+
Object.entries(defaultFilters).forEach(([key, value]) => {
|
|
509
|
+
params.set(`f_${key}`, internalValueToUrl(String(value ?? '')))
|
|
510
|
+
})
|
|
511
|
+
}
|
|
512
|
+
// Preserve f_* already in the location that we did not rebuild above.
|
|
513
|
+
// Sidebar deep-links (CxC→CxP) push f_party_type=eq:supplier before React
|
|
514
|
+
// re-renders with matching defaultFilters; without this carry-through the
|
|
515
|
+
// write effect races and strips the filter down to bare ?view=list.
|
|
516
|
+
current.forEach((value, key) => {
|
|
517
|
+
if (!key.startsWith('f_')) return
|
|
518
|
+
if (params.has(key)) return
|
|
519
|
+
params.set(key, value)
|
|
520
|
+
})
|
|
515
521
|
const search = params.toString()
|
|
516
522
|
// If what we'd write is semantically identical to what's already in the
|
|
517
523
|
// bar (only key order / colon-encoding differ from the router's form),
|
|
@@ -695,6 +701,52 @@ export function DynamicTable({
|
|
|
695
701
|
!hideImport && (viewMetadata?.canImport ?? Boolean(viewMetadata?.import?.columns?.length))
|
|
696
702
|
const exportEnabled = !hideExport && Boolean(viewMetadata?.canExport)
|
|
697
703
|
|
|
704
|
+
const listScopeValues = useMemo(() => {
|
|
705
|
+
const base = buildListScopeValues(defaultFilters, dynamicFilters)
|
|
706
|
+
// Deep-links pin f_* in the URL before defaultFilters / nav matching
|
|
707
|
+
// catch up; adopt single-eq scope values so visible_when columns hide
|
|
708
|
+
// on first paint (CxC hides Proveedor without waiting for navFilter).
|
|
709
|
+
if (!enableUrlSync || typeof window === 'undefined') return base
|
|
710
|
+
const params = new URLSearchParams(window.location.search)
|
|
711
|
+
const fromUrl: Record<string, string> = {}
|
|
712
|
+
params.forEach((raw, key) => {
|
|
713
|
+
if (!key.startsWith('f_')) return
|
|
714
|
+
const col = key.slice(2)
|
|
715
|
+
if (!col || col in base) return
|
|
716
|
+
const v = scopeValueFromFilterToken(raw)
|
|
717
|
+
if (!v) return
|
|
718
|
+
// Multi-value / range tokens are not a single list-scope pin.
|
|
719
|
+
if (v.includes(',') || /^(in|not_in|range|gte|lte):/i.test(String(raw))) return
|
|
720
|
+
fromUrl[col] = v
|
|
721
|
+
})
|
|
722
|
+
return Object.keys(fromUrl).length === 0 ? base : { ...fromUrl, ...base }
|
|
723
|
+
}, [defaultFilters, dynamicFilters, enableUrlSync, urlSynced])
|
|
724
|
+
|
|
725
|
+
// Columns whose kernel `visible_when` fails against the known list scope
|
|
726
|
+
// (locked nav defaultFilters, single-eq chips). Host `hiddenColumns` still
|
|
727
|
+
// wins; this is the scalable path so CxC hides Proveedor without each nav
|
|
728
|
+
// item re-listing every allowed column.
|
|
729
|
+
const scopeHiddenColumns = useMemo(() => {
|
|
730
|
+
const cols = (viewMetadata?.columns ?? metadata?.columns ?? []) as ColumnDefinition[]
|
|
731
|
+
if (cols.length === 0 || Object.keys(listScopeValues).length === 0) return [] as string[]
|
|
732
|
+
const hidden: string[] = []
|
|
733
|
+
for (const col of cols) {
|
|
734
|
+
const key = col.key
|
|
735
|
+
if (!key) continue
|
|
736
|
+
if (!evaluateVisibleWhenForListScope(getVisibleWhen(col), listScopeValues)) {
|
|
737
|
+
hidden.push(key)
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
return hidden
|
|
741
|
+
}, [metadata, viewMetadata, listScopeValues])
|
|
742
|
+
|
|
743
|
+
const effectiveHiddenColumns = useMemo(() => {
|
|
744
|
+
if (scopeHiddenColumns.length === 0) return hiddenColumns
|
|
745
|
+
const set = new Set(hiddenColumns)
|
|
746
|
+
for (const k of scopeHiddenColumns) set.add(k)
|
|
747
|
+
return Array.from(set)
|
|
748
|
+
}, [hiddenColumns, scopeHiddenColumns])
|
|
749
|
+
|
|
698
750
|
const buildFilterParams = useCallback(() => {
|
|
699
751
|
const params: Record<string, any> = {}
|
|
700
752
|
if (sorting.length > 0) {
|
|
@@ -710,9 +762,12 @@ export function DynamicTable({
|
|
|
710
762
|
}
|
|
711
763
|
// searchableKeys === [] → drop the search request entirely
|
|
712
764
|
}
|
|
713
|
-
columnFilters.forEach((filter: { id: string; value: unknown }) => {
|
|
714
|
-
|
|
765
|
+
columnFilters.forEach((filter: { id: string; value: unknown }) => {
|
|
766
|
+
if (defaultFilters && filter.id in defaultFilters) return
|
|
767
|
+
params[`f_${filter.id}`] = filter.value
|
|
768
|
+
})
|
|
715
769
|
Object.entries(dynamicFilters).forEach(([key, values]) => {
|
|
770
|
+
if (defaultFilters && key in defaultFilters) return
|
|
716
771
|
if (values.length === 0) return
|
|
717
772
|
const gteVal = values.find(v => v.startsWith('GTE:'))
|
|
718
773
|
const lteVal = values.find(v => v.startsWith('LTE:'))
|
|
@@ -725,6 +780,8 @@ export function DynamicTable({
|
|
|
725
780
|
if (values.length === 1) params[`f_${key}`] = values[0]
|
|
726
781
|
else params[`f_${key}`] = `IN:${values.join(',')}`
|
|
727
782
|
})
|
|
783
|
+
// Locked scope last so it always wins over stale dynamic/column filters.
|
|
784
|
+
if (defaultFilters) Object.entries(defaultFilters).forEach(([key, value]) => { params[`f_${key}`] = value })
|
|
728
785
|
if (dateRange?.from) {
|
|
729
786
|
const startDate = format(dateRange.from, 'yyyy-MM-dd')
|
|
730
787
|
const endDate = dateRange.to ? format(dateRange.to, 'yyyy-MM-dd') : startDate
|
|
@@ -770,8 +827,7 @@ export function DynamicTable({
|
|
|
770
827
|
} finally {
|
|
771
828
|
setLoadingData(false)
|
|
772
829
|
}
|
|
773
|
-
|
|
774
|
-
}, [model, metadata, pagination, buildFilterParams, refreshTrigger, realtimeTick, endpoint, currentBranch?.id, api, enableUrlSync])
|
|
830
|
+
}, [model, metadata, pagination, buildFilterParams, refreshTrigger, endpoint, currentBranch?.id, api, enableUrlSync])
|
|
775
831
|
|
|
776
832
|
// Columns whose metadata opts into a footer total (display_config.aggregate
|
|
777
833
|
// → styleConfig.aggregate). When empty, no footer row is rendered and no
|
|
@@ -940,9 +996,8 @@ export function DynamicTable({
|
|
|
940
996
|
// matching the classic path (fetchData carries refreshTrigger in its
|
|
941
997
|
// deps). Without it the comment above lied: infinite lists silently
|
|
942
998
|
// failed to reload after a create ("a veces no recarga la tabla").
|
|
943
|
-
// realtimeTick plays the same role for data events (see the `realtime` prop).
|
|
944
999
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
945
|
-
}, [infiniteScroll, metadata, filterSignature, refreshTrigger
|
|
1000
|
+
}, [infiniteScroll, metadata, filterSignature, refreshTrigger])
|
|
946
1001
|
|
|
947
1002
|
const handleRefresh = useCallback(() => {
|
|
948
1003
|
// Infinite mode owns its own list: refresh reloads page 1 and drops the
|
|
@@ -997,9 +1052,11 @@ export function DynamicTable({
|
|
|
997
1052
|
}
|
|
998
1053
|
|
|
999
1054
|
const handleDynamicFilterChange = useCallback((filterKey: string, values: string[]) => {
|
|
1055
|
+
// Locked scope (nav / branch defaultFilters) cannot be changed from the UI.
|
|
1056
|
+
if (defaultFilters && filterKey in defaultFilters) return
|
|
1000
1057
|
setDynamicFilters((prev: Record<string, string[]>) => ({ ...prev, [filterKey]: values }))
|
|
1001
1058
|
setPagination((prev: PaginationState) => ({ ...prev, pageIndex: 0 }))
|
|
1002
|
-
}, [])
|
|
1059
|
+
}, [defaultFilters])
|
|
1003
1060
|
|
|
1004
1061
|
// Same facet loader machinery the board uses, so a text column filters
|
|
1005
1062
|
// identically in the table header and the kanban Sheet (the host's
|
|
@@ -1026,6 +1083,9 @@ export function DynamicTable({
|
|
|
1026
1083
|
// `filterable: true` — keeps the kernel API minimal (one flag on the
|
|
1027
1084
|
// column) while still rendering the FilterableColumnHeader.
|
|
1028
1085
|
for (const f of metadata.filters ?? []) {
|
|
1086
|
+
const filterCol = f.column || f.key
|
|
1087
|
+
if (defaultFilters && filterCol in defaultFilters) continue
|
|
1088
|
+
if (effectiveHiddenColumns.includes(filterCol)) continue
|
|
1029
1089
|
let fType = f.type as ColumnFilterConfig['filterType']
|
|
1030
1090
|
let options: { label: string; value: string; icon?: string; color?: string }[] = []
|
|
1031
1091
|
if (f.options && f.options.length > 0) {
|
|
@@ -1069,6 +1129,8 @@ export function DynamicTable({
|
|
|
1069
1129
|
}
|
|
1070
1130
|
for (const c of metadata.columns ?? []) {
|
|
1071
1131
|
if (!c.filterable || map.has(c.key)) continue
|
|
1132
|
+
if (defaultFilters && c.key in defaultFilters) continue
|
|
1133
|
+
if (effectiveHiddenColumns.includes(c.key)) continue
|
|
1072
1134
|
const hasStaticOptions = (c.options?.length ?? 0) > 0
|
|
1073
1135
|
const hasEndpoint = !!c.searchEndpoint
|
|
1074
1136
|
const isRelation = !!c.ref || c.filterType === 'dynamic_select'
|
|
@@ -1133,7 +1195,7 @@ export function DynamicTable({
|
|
|
1133
1195
|
})
|
|
1134
1196
|
}
|
|
1135
1197
|
return map
|
|
1136
|
-
}, [metadata, filterOptionsMap, dynamicFilters, handleDynamicFilterChange, facetsBase, getFacetLoader, facetOptions, t])
|
|
1198
|
+
}, [metadata, filterOptionsMap, dynamicFilters, handleDynamicFilterChange, facetsBase, getFacetLoader, facetOptions, t, defaultFilters, effectiveHiddenColumns])
|
|
1137
1199
|
|
|
1138
1200
|
// Prewarm every facet field once the configs settle, so a text column's
|
|
1139
1201
|
// header filter opens instantly with values + counts (same as the kanban).
|
|
@@ -1170,11 +1232,11 @@ export function DynamicTable({
|
|
|
1170
1232
|
return actions === viewMetadata.actions ? viewMetadata : { ...viewMetadata, actions }
|
|
1171
1233
|
})()
|
|
1172
1234
|
const baseColumns = getDynamicColumns(rowMetadata, handleInternalAction, t, i18n.language, columnFilterConfigs, timeZone, currency)
|
|
1173
|
-
const filteredBase = baseColumns.filter((col: ColumnDef<any>) => !
|
|
1235
|
+
const filteredBase = baseColumns.filter((col: ColumnDef<any>) => !effectiveHiddenColumns.includes(col.id as string))
|
|
1174
1236
|
const actionsCol = filteredBase.find((c: ColumnDef<any>) => c.id === 'actions')
|
|
1175
1237
|
const otherCols = filteredBase.filter((c: ColumnDef<any>) => c.id !== 'actions')
|
|
1176
1238
|
return [...otherCols, ...extraColumns, ...(actionsCol ? [actionsCol] : [])]
|
|
1177
|
-
}, [viewMetadata, handleInternalAction,
|
|
1239
|
+
}, [viewMetadata, handleInternalAction, effectiveHiddenColumns, allowedActionKeys, extraColumns, t, i18n.language, columnFilterConfigs, getDynamicColumns, timeZone, currency])
|
|
1178
1240
|
|
|
1179
1241
|
const filters = useMemo(() => [], [])
|
|
1180
1242
|
|
package/src/index.ts
CHANGED
package/src/types.ts
CHANGED
|
@@ -337,12 +337,13 @@ export interface ColumnDefinition {
|
|
|
337
337
|
/** snake_case alias served by the kernel for `itemFields`. */
|
|
338
338
|
item_fields?: ColumnItemField[]
|
|
339
339
|
/**
|
|
340
|
-
* Conditional visibility
|
|
341
|
-
*
|
|
342
|
-
*
|
|
343
|
-
*
|
|
344
|
-
*
|
|
345
|
-
*
|
|
340
|
+
* Conditional visibility (kernel v3 `Column.visible_when`):
|
|
341
|
+
* - create/edit modal → `evaluateVisibleWhen` against live form values
|
|
342
|
+
* - list/board → `evaluateVisibleWhenForListScope` against known filter
|
|
343
|
+
* scope (`defaultFilters` / single-eq chips), so a locked nav scope
|
|
344
|
+
* like `party_type=customer` hides `supplier_id` without each nav
|
|
345
|
+
* item re-declaring a full column allowlist.
|
|
346
|
+
* Tolerates the camelCase alias. Absent = always visible.
|
|
346
347
|
*/
|
|
347
348
|
visible_when?: VisibleWhen
|
|
348
349
|
/** camelCase alias for `visible_when`. */
|