@asteby/metacore-runtime-react 45.3.0 → 46.0.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 +23 -0
- package/dist/action-modal-dispatcher.d.ts.map +1 -1
- package/dist/action-modal-dispatcher.js +25 -4
- package/dist/dynamic-kanban.d.ts +62 -4
- package/dist/dynamic-kanban.d.ts.map +1 -1
- package/dist/dynamic-kanban.js +158 -27
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/supervised-action.d.ts +27 -0
- package/dist/supervised-action.d.ts.map +1 -0
- package/dist/supervised-action.js +42 -0
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/dynamic-kanban.test.tsx +141 -0
- package/src/__tests__/supervised-action.test.tsx +100 -0
- package/src/action-modal-dispatcher.tsx +27 -3
- package/src/dynamic-kanban.tsx +197 -19
- package/src/index.ts +11 -0
- package/src/supervised-action.ts +67 -0
- package/src/types.ts +12 -0
package/dist/index.js
CHANGED
|
@@ -12,7 +12,7 @@ export { parseRuleString, fieldValidationOf, checkValue, validateValues, bagHasE
|
|
|
12
12
|
export { VALIDATION_CATALOGS, validationCatalog, validationMessageKey } from './validation-catalog';
|
|
13
13
|
export { labelForValidationPath, labelsForValidationFields, formatFieldErrorsDescription, clearFieldErrorTree, lineItemErrorsFor, } from './field-validation-ui';
|
|
14
14
|
export * from './dynamic-table';
|
|
15
|
-
export { DynamicKanban, deriveStages, groupByStage, isTransitionAllowed, applyOptimisticMove, applyStageOverrides, laneDeltasFromOverrides, selectCardColumns, visibleCardFields, isEmptyCardValue, nextLaneCoordinates, UNASSIGNED_LANE, } from './dynamic-kanban';
|
|
15
|
+
export { DynamicKanban, deriveStages, groupByStage, isTransitionAllowed, applyOptimisticMove, applyStageOverrides, laneDeltasFromOverrides, selectCardColumns, isCardOverdue, refLaneSource, withGroupBy, withRefLanes, visibleCardFields, isEmptyCardValue, nextLaneCoordinates, UNASSIGNED_LANE, } from './dynamic-kanban';
|
|
16
16
|
export { PortalDragOverlay } from './portal-drag-overlay';
|
|
17
17
|
export { useStageAutomations, StageAutomationsButton, isTagColumn, automationFieldOptions, groupAutomationsByStage, activeAutomationCount, } from './stage-automations';
|
|
18
18
|
export { useCustomStages, splitCustomStages, mergeLaneStages, resolveSmartLanes, smartLaneParams, cardMatchesStageFilters, customStageFilterFields, isCustomStageDraftValid, slugifyStageKey, emptyCustomStageFilter, AddStageColumn, CustomStageLaneMenu, CustomStageDialog, CustomStageDeleteDialog, StageConditionBuilder, StageConfigDialog, stageFilterOpSymbol, SmartLane, CUSTOM_STAGE_COLORS, CUSTOM_STAGE_FILTER_OPS, } from './custom-stages';
|
|
@@ -43,6 +43,7 @@ export * from './capability-gate';
|
|
|
43
43
|
export { PermissionsProvider, useCan, usePermissionsActive, makeCan, capabilityForActionKey, modelCapability, gateTableMetadata, resolveRowActions, } from './permissions-context';
|
|
44
44
|
export { ApprovalPinDialog, approvalErrorMessage, } from './approval-pin-dialog';
|
|
45
45
|
export { ApprovalGateProvider, useApprovalGate, approvalCapability, approvalRequiredInfo, approvalGateAvailable, APPROVAL_PARKED_EVENT, APPROVAL_DECIDED_EVENT, } from './approval-gate';
|
|
46
|
+
export { useSupervisor, withApproval, } from './supervised-action';
|
|
46
47
|
export { ReasonPromptDialog, useReasonPrompt, reasonRequiredInfo, DEFAULT_REASON_MIN, } from './reason-prompt';
|
|
47
48
|
export { useDynamicRowActions, } from './dynamic-row-actions';
|
|
48
49
|
export { resolveRequiresAddon, setAddonInstallHandler, getAddonInstallHandler, requiresAddonName, useRequiresAddonLabel, RequiresAddonLock, RequiresAddonDialog, } from './requires-addon';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface SupervisedAction {
|
|
2
|
+
label?: string;
|
|
3
|
+
supervisorPolicy?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface SupervisorAuthorization {
|
|
6
|
+
/** Grant id to send as `approval_id`; undefined when the caller bypassed. */
|
|
7
|
+
approvalId?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface AuthorizeOptions {
|
|
10
|
+
model?: string;
|
|
11
|
+
recordId?: string;
|
|
12
|
+
/** Free-form audit data stored with the grant (document folio, motive…). */
|
|
13
|
+
context?: Record<string, unknown>;
|
|
14
|
+
description?: React.ReactNode;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Resolves the authorization for `action`, `{}` when it needs none, or null when
|
|
18
|
+
* the operator cancelled the PIN prompt (do NOT dispatch).
|
|
19
|
+
*/
|
|
20
|
+
export declare function useSupervisor(): {
|
|
21
|
+
authorize: (action: SupervisedAction, opts?: AuthorizeOptions) => Promise<SupervisorAuthorization | null>;
|
|
22
|
+
};
|
|
23
|
+
/** Adds `approval_id` to an action payload when a grant was collected. */
|
|
24
|
+
export declare function withApproval<T extends Record<string, unknown>>(payload: T, auth: SupervisorAuthorization | null | undefined): T & {
|
|
25
|
+
approval_id?: string;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=supervised-action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervised-action.d.ts","sourceRoot":"","sources":["../src/supervised-action.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,gBAAgB;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACpC,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAChC;AAED;;;GAGG;AACH,wBAAgB,aAAa;wBAIN,gBAAgB,SAAQ,gBAAgB,KAAQ,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;EAmB7G;AAED,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1D,OAAO,EAAE,CAAC,EACV,IAAI,EAAE,uBAAuB,GAAG,IAAI,GAAG,SAAS,GACjD,CAAC,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAE9B"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Supervisor authorization for actions that declare `supervisor_policy`
|
|
2
|
+
// (POS-2 / PER-2). The served action metadata carries `supervisorPolicy`; before
|
|
3
|
+
// dispatching, the action modals call `useSupervisor().authorize(action, …)`:
|
|
4
|
+
// - a caller who holds `general.approve_<policy>` (or is admin) passes straight
|
|
5
|
+
// through (the server bypasses them too);
|
|
6
|
+
// - anyone else gets the PIN dialog (ApprovalGate) and the resulting grant id
|
|
7
|
+
// travels as `approval_id` in the action payload, where the host redeems it
|
|
8
|
+
// (single use, same caller, fresh, same record — kernel ConsumePINGrant).
|
|
9
|
+
// The grant is anchored to the record so it cannot be spent on another document.
|
|
10
|
+
import { useCallback } from 'react';
|
|
11
|
+
import { useTranslation } from 'react-i18next';
|
|
12
|
+
import { useApprovalGate } from './approval-gate';
|
|
13
|
+
/**
|
|
14
|
+
* Resolves the authorization for `action`, `{}` when it needs none, or null when
|
|
15
|
+
* the operator cancelled the PIN prompt (do NOT dispatch).
|
|
16
|
+
*/
|
|
17
|
+
export function useSupervisor() {
|
|
18
|
+
const gate = useApprovalGate();
|
|
19
|
+
const { t } = useTranslation();
|
|
20
|
+
const authorize = useCallback(async (action, opts = {}) => {
|
|
21
|
+
const policy = action.supervisorPolicy;
|
|
22
|
+
if (!policy)
|
|
23
|
+
return {};
|
|
24
|
+
const grant = await gate.requestApproval({
|
|
25
|
+
policy,
|
|
26
|
+
label: action.label || t(`approvals.policy.${policy}`, { defaultValue: 'Requiere autorización' }),
|
|
27
|
+
description: opts.description ??
|
|
28
|
+
t('approvals.supervisor_needed', { defaultValue: 'Esta acción necesita la autorización de un supervisor.' }),
|
|
29
|
+
context: opts.context,
|
|
30
|
+
model: opts.model,
|
|
31
|
+
recordId: opts.recordId,
|
|
32
|
+
});
|
|
33
|
+
if (!grant)
|
|
34
|
+
return null;
|
|
35
|
+
return grant.bypassed || !grant.id ? {} : { approvalId: grant.id };
|
|
36
|
+
}, [gate, t]);
|
|
37
|
+
return { authorize };
|
|
38
|
+
}
|
|
39
|
+
/** Adds `approval_id` to an action payload when a grant was collected. */
|
|
40
|
+
export function withApproval(payload, auth) {
|
|
41
|
+
return auth?.approvalId ? { ...payload, approval_id: auth.approvalId } : payload;
|
|
42
|
+
}
|
package/dist/types.d.ts
CHANGED
|
@@ -61,6 +61,12 @@ export interface TableMetadata {
|
|
|
61
61
|
* lane. Mirrors the nav item's `group_by` (RFC §1.2).
|
|
62
62
|
*/
|
|
63
63
|
group_by?: string;
|
|
64
|
+
/**
|
|
65
|
+
* The model's stage column (`stage_field`), when the host serves it. Lets a
|
|
66
|
+
* board grouped by ANOTHER column (`?group_by=`) tell it apart from the stage
|
|
67
|
+
* board; absent on older hosts (the served `group_by` stands in).
|
|
68
|
+
*/
|
|
69
|
+
stage_field?: string;
|
|
64
70
|
/**
|
|
65
71
|
* Board lanes (the stage machine of the `group_by`/`stage_field` column).
|
|
66
72
|
* When present the kanban renders one lane per stage in `order`. When absent
|
|
@@ -622,6 +628,12 @@ export interface ActionDefinition {
|
|
|
622
628
|
/** Multi-step wizard form; when present the dispatcher renders a wizard. */
|
|
623
629
|
steps?: ActionStep[];
|
|
624
630
|
requiresState?: string[];
|
|
631
|
+
/**
|
|
632
|
+
* Manifest `supervisor_policy`: the action needs the on-the-spot
|
|
633
|
+
* authorization of a supervisor for that policy (`general.approve_<policy>`).
|
|
634
|
+
* The action modals ask for the PIN and send the grant as `approval_id`.
|
|
635
|
+
*/
|
|
636
|
+
supervisorPolicy?: string;
|
|
625
637
|
executable?: boolean;
|
|
626
638
|
/** Federated modal slug "<addon_key>.<action_key>" (manifest `modal`). */
|
|
627
639
|
modal?: string;
|
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": "
|
|
3
|
+
"version": "46.0.0",
|
|
4
4
|
"description": "React runtime for metacore hosts — renders addon contributions dynamically",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"zod": "^4.3.0"
|
|
27
27
|
},
|
|
28
28
|
"peerDependencies": {
|
|
29
|
-
"@asteby/metacore-sdk": "^3.
|
|
29
|
+
"@asteby/metacore-sdk": "^3.12.0",
|
|
30
30
|
"@asteby/metacore-ui": "^2.23.0",
|
|
31
31
|
"@tanstack/react-query": ">=5",
|
|
32
32
|
"@tanstack/react-router": ">=1.100",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
|
-
"@asteby/metacore-sdk": "3.
|
|
53
|
+
"@asteby/metacore-sdk": "3.12.0",
|
|
54
54
|
"@asteby/metacore-ui": "2.23.0",
|
|
55
55
|
"@tanstack/react-query": "^5.95.0",
|
|
56
56
|
"@tanstack/react-router": "^1.168.0",
|
|
@@ -38,6 +38,10 @@ import {
|
|
|
38
38
|
isTransitionAllowed,
|
|
39
39
|
applyOptimisticMove,
|
|
40
40
|
selectCardColumns,
|
|
41
|
+
isCardOverdue,
|
|
42
|
+
refLaneSource,
|
|
43
|
+
withRefLanes,
|
|
44
|
+
withGroupBy,
|
|
41
45
|
cardMatchesLaneQuery,
|
|
42
46
|
cardMatchesLaneFunnel,
|
|
43
47
|
laneFunnelCount,
|
|
@@ -226,6 +230,143 @@ describe('selectCardColumns', () => {
|
|
|
226
230
|
})
|
|
227
231
|
})
|
|
228
232
|
|
|
233
|
+
describe('selectCardColumns — explicit card layout (display_config)', () => {
|
|
234
|
+
const col = (key: string, styleConfig?: Record<string, unknown>, extra: object = {}) =>
|
|
235
|
+
({ key, label: key, type: 'text', sortable: false, filterable: false, styleConfig, ...extra }) as any
|
|
236
|
+
const boardMeta = (columns: any[]) => ({ ...meta(), columns }) as any
|
|
237
|
+
|
|
238
|
+
it('shows every flagged field in column order and the flagged title', () => {
|
|
239
|
+
const { title, fields, explicit } = selectCardColumns(
|
|
240
|
+
boardMeta([
|
|
241
|
+
col('stage'),
|
|
242
|
+
col('folio', { card_title: true }),
|
|
243
|
+
col('customer', { card: true }),
|
|
244
|
+
col('plate', { card: true }),
|
|
245
|
+
col('promised_at', { card: true }),
|
|
246
|
+
col('amount', { card: true }),
|
|
247
|
+
col('notes'),
|
|
248
|
+
]),
|
|
249
|
+
)
|
|
250
|
+
expect(explicit).toBe(true)
|
|
251
|
+
expect(title?.key).toBe('folio')
|
|
252
|
+
expect(fields.map((f) => f.key)).toEqual(['customer', 'plate', 'promised_at', 'amount'])
|
|
253
|
+
})
|
|
254
|
+
|
|
255
|
+
it('keeps the legacy heuristic when no column is flagged', () => {
|
|
256
|
+
expect(selectCardColumns(meta()).explicit).toBe(false)
|
|
257
|
+
})
|
|
258
|
+
})
|
|
259
|
+
|
|
260
|
+
describe('isCardOverdue', () => {
|
|
261
|
+
const now = Date.parse('2026-09-29T12:00:00Z')
|
|
262
|
+
const due = (cfg: Record<string, unknown>) =>
|
|
263
|
+
({ key: 'promised_at', label: 'p', type: 'datetime', styleConfig: cfg }) as any
|
|
264
|
+
|
|
265
|
+
it('flags a past date on an opted-in column', () => {
|
|
266
|
+
expect(isCardOverdue({ promised_at: '2026-09-28T10:00:00Z' }, due({ overdue: true }), now)).toBe(true)
|
|
267
|
+
})
|
|
268
|
+
it('does not flag a future, empty or non-opted-in date', () => {
|
|
269
|
+
expect(isCardOverdue({ promised_at: '2026-09-30T10:00:00Z' }, due({ overdue: true }), now)).toBe(false)
|
|
270
|
+
expect(isCardOverdue({ promised_at: null }, due({ overdue: true }), now)).toBe(false)
|
|
271
|
+
expect(isCardOverdue({ promised_at: '2026-09-28T10:00:00Z' }, due({}), now)).toBe(false)
|
|
272
|
+
})
|
|
273
|
+
it('honours overdue_unless (delivered orders are never late)', () => {
|
|
274
|
+
const cfg = { overdue: true, overdue_unless: { stage: ['delivered'] } }
|
|
275
|
+
expect(isCardOverdue({ promised_at: '2026-09-28T10:00:00Z', stage: 'delivered' }, due(cfg), now)).toBe(false)
|
|
276
|
+
expect(isCardOverdue({ promised_at: '2026-09-28T10:00:00Z', stage: 'in_process' }, due(cfg), now)).toBe(true)
|
|
277
|
+
})
|
|
278
|
+
})
|
|
279
|
+
|
|
280
|
+
describe('withGroupBy (one model, several boards)', () => {
|
|
281
|
+
const boardMeta = (over: object = {}) =>
|
|
282
|
+
({
|
|
283
|
+
columns: [
|
|
284
|
+
{ key: 'stage', label: 'Etapa', type: 'text' },
|
|
285
|
+
{ key: 'assigned_mechanic_id', label: 'Técnico', type: 'text', ref: 'users' },
|
|
286
|
+
],
|
|
287
|
+
// The host projects ONE group_by per model: here another nav entry's.
|
|
288
|
+
group_by: 'assigned_mechanic_id',
|
|
289
|
+
stage_field: 'stage',
|
|
290
|
+
stages: [{ key: 'a', label: 'A' }],
|
|
291
|
+
transitions: [{ from: 'a', to: 'a' }],
|
|
292
|
+
smart_lanes: [{ key: 's', label: 'S', filters: [] }],
|
|
293
|
+
...over,
|
|
294
|
+
}) as any
|
|
295
|
+
|
|
296
|
+
it('is the same object when there is no override or it matches the served group_by', () => {
|
|
297
|
+
const m = boardMeta()
|
|
298
|
+
expect(withGroupBy(m, undefined)).toBe(m)
|
|
299
|
+
expect(withGroupBy(m, 'assigned_mechanic_id')).toBe(m)
|
|
300
|
+
expect(withGroupBy(null, 'stage')).toBeNull()
|
|
301
|
+
})
|
|
302
|
+
it('ignores a column the model does not have', () => {
|
|
303
|
+
const m = boardMeta()
|
|
304
|
+
expect(withGroupBy(m, 'nope')).toBe(m)
|
|
305
|
+
})
|
|
306
|
+
it('keeps the stage machine when grouping by the stage column', () => {
|
|
307
|
+
const out = withGroupBy(boardMeta(), 'stage')!
|
|
308
|
+
expect(out.group_by).toBe('stage')
|
|
309
|
+
expect(out.stages).toHaveLength(1)
|
|
310
|
+
expect(out.transitions).toHaveLength(1)
|
|
311
|
+
expect(out.smart_lanes).toHaveLength(1)
|
|
312
|
+
})
|
|
313
|
+
it('falls back to the served group_by as stage column on hosts without stage_field', () => {
|
|
314
|
+
const out = withGroupBy(boardMeta({ stage_field: undefined, group_by: 'stage' }), 'assigned_mechanic_id')!
|
|
315
|
+
expect(out.stages).toBeUndefined()
|
|
316
|
+
const back = withGroupBy(boardMeta({ stage_field: undefined, group_by: 'assigned_mechanic_id' }), 'stage')
|
|
317
|
+
// no stage_field and the served group_by is not the stage column: cannot tell, machine dropped
|
|
318
|
+
expect(back!.stages).toBeUndefined()
|
|
319
|
+
})
|
|
320
|
+
it('drops the stage machine when grouping by another column', () => {
|
|
321
|
+
const out = withGroupBy(boardMeta({ group_by: 'stage' }), 'assigned_mechanic_id')!
|
|
322
|
+
expect(out.group_by).toBe('assigned_mechanic_id')
|
|
323
|
+
expect(out.stages).toBeUndefined()
|
|
324
|
+
expect(out.transitions).toBeUndefined()
|
|
325
|
+
expect(out.smart_lanes).toBeUndefined()
|
|
326
|
+
expect(refLaneSource(out)).toEqual({ ref: 'users' })
|
|
327
|
+
})
|
|
328
|
+
})
|
|
329
|
+
|
|
330
|
+
describe('reference lanes (group_by on a reference column)', () => {
|
|
331
|
+
const refMeta = (over: object = {}) =>
|
|
332
|
+
({
|
|
333
|
+
columns: [{ key: 'assigned_mechanic_id', label: 'Técnico', type: 'text', ref: 'users' }],
|
|
334
|
+
group_by: 'assigned_mechanic_id',
|
|
335
|
+
...over,
|
|
336
|
+
}) as any
|
|
337
|
+
|
|
338
|
+
it('resolves the lane source from the column ref or search endpoint', () => {
|
|
339
|
+
expect(refLaneSource(refMeta())).toEqual({ ref: 'users' })
|
|
340
|
+
expect(
|
|
341
|
+
refLaneSource(
|
|
342
|
+
refMeta({ columns: [{ key: 'assigned_mechanic_id', label: 't', type: 'text', searchEndpoint: '/options/x?field=id' }] }),
|
|
343
|
+
),
|
|
344
|
+
).toEqual({ endpoint: '/options/x?field=id' })
|
|
345
|
+
})
|
|
346
|
+
it('yields no source when stages or inline options already declare the lanes', () => {
|
|
347
|
+
expect(refLaneSource(refMeta({ stages: [{ key: 'a', label: 'A' }] }))).toBeNull()
|
|
348
|
+
expect(
|
|
349
|
+
refLaneSource(refMeta({ columns: [{ key: 'assigned_mechanic_id', label: 't', type: 'text', ref: 'users', options: [{ value: 'a', label: 'A' }] }] })),
|
|
350
|
+
).toBeNull()
|
|
351
|
+
expect(refLaneSource(null)).toBeNull()
|
|
352
|
+
})
|
|
353
|
+
it('builds one lane per option, alphabetical, with no transitions', () => {
|
|
354
|
+
const out = withRefLanes(refMeta(), [
|
|
355
|
+
{ value: 'u2', label: 'Zoe' },
|
|
356
|
+
{ value: 'u1', label: 'Ana' },
|
|
357
|
+
])
|
|
358
|
+
expect(deriveStages(out).map((s) => [s.key, s.label])).toEqual([
|
|
359
|
+
['u1', 'Ana'],
|
|
360
|
+
['u2', 'Zoe'],
|
|
361
|
+
])
|
|
362
|
+
expect(out.transitions).toBeUndefined()
|
|
363
|
+
})
|
|
364
|
+
it('leaves the metadata alone while the options are still loading', () => {
|
|
365
|
+
const m = refMeta()
|
|
366
|
+
expect(withRefLanes(m, [])).toBe(m)
|
|
367
|
+
})
|
|
368
|
+
})
|
|
369
|
+
|
|
229
370
|
describe('cardMatchesLaneQuery', () => {
|
|
230
371
|
const cols = [
|
|
231
372
|
{ key: 'title', label: 'Title', type: 'text', sortable: false, filterable: false },
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// @vitest-environment happy-dom
|
|
2
|
+
//
|
|
3
|
+
// useSupervisor: an action with supervisorPolicy asks for the supervisor PIN
|
|
4
|
+
// (ApprovalGate) and yields the grant id to send as approval_id; a capability
|
|
5
|
+
// holder passes without a prompt; cancelling yields null (do not dispatch).
|
|
6
|
+
import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
7
|
+
import { cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react'
|
|
8
|
+
|
|
9
|
+
vi.mock('react-i18next', () => ({
|
|
10
|
+
useTranslation: () => ({
|
|
11
|
+
t: (_k: string, opts?: { defaultValue?: string }) => opts?.defaultValue ?? _k,
|
|
12
|
+
}),
|
|
13
|
+
}))
|
|
14
|
+
vi.mock('sonner', () => ({ toast: Object.assign(vi.fn(), { info: vi.fn(), success: vi.fn(), error: vi.fn() }) }))
|
|
15
|
+
|
|
16
|
+
import { ApiProvider, type ApiClient } from '../api-context'
|
|
17
|
+
import { PermissionsProvider } from '../permissions-context'
|
|
18
|
+
import { ApprovalGateProvider } from '../approval-gate'
|
|
19
|
+
import { useSupervisor, withApproval, type SupervisorAuthorization } from '../supervised-action'
|
|
20
|
+
|
|
21
|
+
afterEach(() => {
|
|
22
|
+
cleanup()
|
|
23
|
+
vi.clearAllMocks()
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
let result: SupervisorAuthorization | null | 'unset'
|
|
27
|
+
function Probe({ policy }: { policy?: string }) {
|
|
28
|
+
const { authorize } = useSupervisor()
|
|
29
|
+
return (
|
|
30
|
+
<button
|
|
31
|
+
onClick={async () => {
|
|
32
|
+
result = await authorize({ label: 'Cancelar CFDI', supervisorPolicy: policy }, { model: 'Invoice', recordId: 'inv-1' })
|
|
33
|
+
}}
|
|
34
|
+
>
|
|
35
|
+
go
|
|
36
|
+
</button>
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function mount(post: ApiClient['post'], caps: string[], policy?: string) {
|
|
41
|
+
result = 'unset'
|
|
42
|
+
const api = { get: vi.fn(), post, put: vi.fn(), delete: vi.fn() } as unknown as ApiClient
|
|
43
|
+
return render(
|
|
44
|
+
<ApiProvider client={api}>
|
|
45
|
+
<PermissionsProvider permissions={caps} isAdmin={false}>
|
|
46
|
+
<ApprovalGateProvider>
|
|
47
|
+
<Probe policy={policy} />
|
|
48
|
+
</ApprovalGateProvider>
|
|
49
|
+
</PermissionsProvider>
|
|
50
|
+
</ApiProvider>,
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
describe('useSupervisor', () => {
|
|
55
|
+
it('needs nothing when the action declares no policy', async () => {
|
|
56
|
+
const post = vi.fn()
|
|
57
|
+
mount(post, [])
|
|
58
|
+
fireEvent.click(screen.getByText('go'))
|
|
59
|
+
await waitFor(() => expect(result).toEqual({}))
|
|
60
|
+
expect(post).not.toHaveBeenCalled()
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
it('a holder of general.approve_<policy> passes without a prompt or a grant id', async () => {
|
|
64
|
+
const post = vi.fn()
|
|
65
|
+
mount(post, ['general.approve_cancel_cfdi'], 'cancel_cfdi')
|
|
66
|
+
fireEvent.click(screen.getByText('go'))
|
|
67
|
+
await waitFor(() => expect(result).toEqual({}))
|
|
68
|
+
expect(post).not.toHaveBeenCalled()
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
it('anyone else types a supervisor PIN and gets the grant id, anchored to the record', async () => {
|
|
72
|
+
const post = vi.fn().mockResolvedValue({ data: { data: { id: 'grant-9' } } })
|
|
73
|
+
mount(post, [], 'cancel_cfdi')
|
|
74
|
+
fireEvent.click(screen.getByText('go'))
|
|
75
|
+
fireEvent.change(await screen.findByLabelText('Motivo'), { target: { value: 'error de captura' } })
|
|
76
|
+
fireEvent.change(screen.getByLabelText('PIN del supervisor'), { target: { value: '4321' } })
|
|
77
|
+
fireEvent.click(screen.getByText('Autorizar'))
|
|
78
|
+
await waitFor(() => expect(result).toEqual({ approvalId: 'grant-9' }))
|
|
79
|
+
expect(post).toHaveBeenCalledWith(
|
|
80
|
+
'/approvals/pin-grant',
|
|
81
|
+
expect.objectContaining({ policy: 'cancel_cfdi', model: 'Invoice', record_id: 'inv-1', pin: '4321' }),
|
|
82
|
+
)
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
it('cancelling the prompt yields null', async () => {
|
|
86
|
+
mount(vi.fn(), [], 'cancel_cfdi')
|
|
87
|
+
fireEvent.click(screen.getByText('go'))
|
|
88
|
+
await screen.findByLabelText('Motivo')
|
|
89
|
+
fireEvent.click(screen.getByText('Cancelar'))
|
|
90
|
+
await waitFor(() => expect(result).toBeNull())
|
|
91
|
+
})
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
describe('withApproval', () => {
|
|
95
|
+
it('adds approval_id only when a grant was collected', () => {
|
|
96
|
+
expect(withApproval({ a: 1 }, { approvalId: 'g' })).toEqual({ a: 1, approval_id: 'g' })
|
|
97
|
+
expect(withApproval({ a: 1 }, {})).toEqual({ a: 1 })
|
|
98
|
+
expect(withApproval({ a: 1 }, null)).toEqual({ a: 1 })
|
|
99
|
+
})
|
|
100
|
+
})
|
|
@@ -58,6 +58,7 @@ import {
|
|
|
58
58
|
import { validationCatalog } from './validation-catalog'
|
|
59
59
|
import { useApi } from './api-context'
|
|
60
60
|
import { useReasonPrompt } from './reason-prompt'
|
|
61
|
+
import { useSupervisor, withApproval } from './supervised-action'
|
|
61
62
|
import { buildRelationFilterParams } from './dynamic-relation-helpers'
|
|
62
63
|
import { DynamicIcon } from './dynamic-icon'
|
|
63
64
|
import { DynamicLineItems } from './dynamic-line-items'
|
|
@@ -800,6 +801,7 @@ function ConfirmActionDialog({ open, onOpenChange, action, model, record, endpoi
|
|
|
800
801
|
// Actions listed in the model's `reason_required.actions` (cancel, void…)
|
|
801
802
|
// answer 422 errors.reason without a motive; the prompt asks and retries.
|
|
802
803
|
const reasonPrompt = useReasonPrompt()
|
|
804
|
+
const supervisor = useSupervisor()
|
|
803
805
|
// `action.label` is an addon-contributed i18n key; its locale bundle loads
|
|
804
806
|
// asynchronously, so translate at render (defaultValue keeps an already
|
|
805
807
|
// localized label unchanged).
|
|
@@ -809,10 +811,13 @@ function ConfirmActionDialog({ open, onOpenChange, action, model, record, endpoi
|
|
|
809
811
|
setExecuting(true)
|
|
810
812
|
try {
|
|
811
813
|
const url = buildActionUrl(endpoint, model, record.id, action.key)
|
|
814
|
+
// Supervisor PIN first (action.supervisorPolicy); null = cancelled.
|
|
815
|
+
const auth = await supervisor.authorize({ label, supervisorPolicy: action.supervisorPolicy }, { model, recordId: String(record.id) })
|
|
816
|
+
if (!auth) return
|
|
812
817
|
const res = await reasonPrompt.run({
|
|
813
818
|
title: label,
|
|
814
819
|
description: t('actions.reason_desc', { defaultValue: 'Esta acción pide el motivo. Queda en la bitácora del documento.' }),
|
|
815
|
-
request: (reason) => api.post(url, reason ? { reason } : {}),
|
|
820
|
+
request: (reason) => api.post(url, withApproval(reason ? { reason } : {}, auth)),
|
|
816
821
|
})
|
|
817
822
|
// Operator cancelled the reason prompt: nothing ran.
|
|
818
823
|
if (!res) return
|
|
@@ -870,6 +875,7 @@ function GenericActionModal({ open, onOpenChange, action, model, record, endpoin
|
|
|
870
875
|
const tl = (s: string) => t(s, { defaultValue: s })
|
|
871
876
|
const api = useApi()
|
|
872
877
|
const reasonPrompt = useReasonPrompt()
|
|
878
|
+
const supervisor = useSupervisor()
|
|
873
879
|
const branchGate = useBranchCreateGate()
|
|
874
880
|
const [formData, setFormData] = useState<Record<string, any>>({})
|
|
875
881
|
const [executing, setExecuting] = useState(false)
|
|
@@ -1050,10 +1056,15 @@ function GenericActionModal({ open, onOpenChange, action, model, record, endpoin
|
|
|
1050
1056
|
if (branchId) payload = { ...payload, branch_id: branchId }
|
|
1051
1057
|
}
|
|
1052
1058
|
const url = buildActionUrl(endpoint, model, record?.id, action.key)
|
|
1059
|
+
const auth = await supervisor.authorize(
|
|
1060
|
+
{ label: tl(action.label), supervisorPolicy: action.supervisorPolicy },
|
|
1061
|
+
{ model, recordId: record?.id != null ? String(record.id) : undefined },
|
|
1062
|
+
)
|
|
1063
|
+
if (!auth) return
|
|
1053
1064
|
const res = await reasonPrompt.run({
|
|
1054
1065
|
title: tl(action.label),
|
|
1055
1066
|
description: t('actions.reason_desc', { defaultValue: 'Esta acción pide el motivo. Queda en la bitácora del documento.' }),
|
|
1056
|
-
request: (reason) => api.post(url, reason ? { ...payload, reason } : payload),
|
|
1067
|
+
request: (reason) => api.post(url, withApproval(reason ? { ...payload, reason } : payload, auth)),
|
|
1057
1068
|
})
|
|
1058
1069
|
if (!res) return
|
|
1059
1070
|
if (res.data.success) {
|
|
@@ -1218,6 +1229,8 @@ function WizardActionModal({ open, onOpenChange, action, model, record, endpoint
|
|
|
1218
1229
|
const { t, i18n } = useTranslation()
|
|
1219
1230
|
const tl = (s: string) => t(s, { defaultValue: s })
|
|
1220
1231
|
const api = useApi()
|
|
1232
|
+
const reasonPrompt = useReasonPrompt()
|
|
1233
|
+
const supervisor = useSupervisor()
|
|
1221
1234
|
const steps = action.steps ?? []
|
|
1222
1235
|
const [stepIndex, setStepIndex] = useState(0)
|
|
1223
1236
|
const [formData, setFormData] = useState<Record<string, any>>({})
|
|
@@ -1273,7 +1286,17 @@ function WizardActionModal({ open, onOpenChange, action, model, record, endpoint
|
|
|
1273
1286
|
setExecuting(true)
|
|
1274
1287
|
try {
|
|
1275
1288
|
const url = buildActionUrl(endpoint, model, record?.id, action.key)
|
|
1276
|
-
const
|
|
1289
|
+
const auth = await supervisor.authorize(
|
|
1290
|
+
{ label: tl(action.label), supervisorPolicy: action.supervisorPolicy },
|
|
1291
|
+
{ model, recordId: record?.id != null ? String(record.id) : undefined },
|
|
1292
|
+
)
|
|
1293
|
+
if (!auth) return
|
|
1294
|
+
const res = await reasonPrompt.run({
|
|
1295
|
+
title: tl(action.label),
|
|
1296
|
+
description: t('actions.reason_desc', { defaultValue: 'Esta acción pide el motivo. Queda en la bitácora del documento.' }),
|
|
1297
|
+
request: (reason) => api.post(url, withApproval(reason ? { ...formData, reason } : formData, auth)),
|
|
1298
|
+
})
|
|
1299
|
+
if (!res) return
|
|
1277
1300
|
if (res.data.success) {
|
|
1278
1301
|
toastServerSuccess(res.data, { t })
|
|
1279
1302
|
onOpenChange(false)
|
|
@@ -1371,6 +1394,7 @@ function WizardActionModal({ open, onOpenChange, action, model, record, endpoint
|
|
|
1371
1394
|
</Button>
|
|
1372
1395
|
)}
|
|
1373
1396
|
</DialogFooter>
|
|
1397
|
+
{reasonPrompt.dialog}
|
|
1374
1398
|
</DialogContent>
|
|
1375
1399
|
</Dialog>
|
|
1376
1400
|
)
|