@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/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;
@@ -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": "45.3.0",
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.11.0",
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.11.0",
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 res = await api.post(url, formData)
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
  )