@asteby/metacore-runtime-react 23.9.3 → 23.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/README.md +43 -0
- package/dist/action-modal-dispatcher.d.ts.map +1 -1
- package/dist/action-modal-dispatcher.js +122 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/license/index.d.ts +5 -0
- package/dist/license/index.d.ts.map +1 -0
- package/dist/license/index.js +4 -0
- package/dist/license/license-expiry-banner.d.ts +16 -0
- package/dist/license/license-expiry-banner.d.ts.map +1 -0
- package/dist/license/license-expiry-banner.js +85 -0
- package/dist/license/license-gate.d.ts +40 -0
- package/dist/license/license-gate.d.ts.map +1 -0
- package/dist/license/license-gate.js +108 -0
- package/dist/license/license-status-badge.d.ts +7 -0
- package/dist/license/license-status-badge.d.ts.map +1 -0
- package/dist/license/license-status-badge.js +57 -0
- package/dist/license/types.d.ts +63 -0
- package/dist/license/types.d.ts.map +1 -0
- package/dist/license/types.js +45 -0
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/license-gate.test.tsx +242 -0
- package/src/__tests__/wizard-action-modal.test.tsx +121 -0
- package/src/action-modal-dispatcher.tsx +233 -0
- package/src/index.ts +15 -0
- package/src/license/index.ts +21 -0
- package/src/license/license-expiry-banner.tsx +151 -0
- package/src/license/license-gate.tsx +277 -0
- package/src/license/license-status-badge.tsx +93 -0
- package/src/license/types.ts +90 -0
- package/src/types.ts +9 -0
- package/LICENSE +0 -201
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Licencia de instancia — el contrato de estado que el backend del host (ops
|
|
3
|
+
* vía kernel `LicenseService`) expone y que este módulo pinta. El SDK NO habla
|
|
4
|
+
* con el kernel ni impone su versión: el host resuelve el `LicenseState` con su
|
|
5
|
+
* propio transporte y se lo pasa a <LicenseGate>. Así el gate es un primitivo
|
|
6
|
+
* reutilizable e INDEPENDIENTE del release del kernel.
|
|
7
|
+
*
|
|
8
|
+
* División de responsabilidades del blindaje:
|
|
9
|
+
* - kernel → enforcement (qué está permitido; firma/verifica el estado).
|
|
10
|
+
* - SDK → UX (este módulo: gate, banner, badge).
|
|
11
|
+
* - hub → emisión (mintea el token Ed25519).
|
|
12
|
+
* - hosts → wiring (resuelven el estado y montan <LicenseGate> en 1 línea).
|
|
13
|
+
*/
|
|
14
|
+
/** El estado operativo de la licencia, tal como lo deriva el backend. */
|
|
15
|
+
export type LicenseStatus = 'valid' | 'stale' | 'grace' | 'expired' | 'missing' | 'invalid';
|
|
16
|
+
export interface LicenseState {
|
|
17
|
+
/** Licensing activo en esta instancia (LICENSING_ENFORCE). Si es false el
|
|
18
|
+
* gate es transparente: nunca bloquea ni degrada. */
|
|
19
|
+
enforced: boolean;
|
|
20
|
+
configured: boolean;
|
|
21
|
+
valid: boolean;
|
|
22
|
+
status: LicenseStatus;
|
|
23
|
+
reason?: string;
|
|
24
|
+
org_id?: string;
|
|
25
|
+
plan?: string;
|
|
26
|
+
preset?: string;
|
|
27
|
+
entitlements: string[];
|
|
28
|
+
wildcard: boolean;
|
|
29
|
+
/** Lease: la instancia falló su check-in obligatorio con el hub. */
|
|
30
|
+
stale: boolean;
|
|
31
|
+
max_offline_hours?: number;
|
|
32
|
+
issued_at?: string;
|
|
33
|
+
expires_at?: string;
|
|
34
|
+
in_grace: boolean;
|
|
35
|
+
grace_until?: string;
|
|
36
|
+
days_remaining: number;
|
|
37
|
+
last_checked_at?: string;
|
|
38
|
+
}
|
|
39
|
+
/** La licencia es OPERABLE cuando permite operar (aunque sea degradada):
|
|
40
|
+
* valid, la postura `stale` del lease, o dentro de la ventana de gracia.
|
|
41
|
+
* missing/invalid/expired no son operables. Sin enforcement → siempre operable.
|
|
42
|
+
* Espeja `State.Operable()` del backend. */
|
|
43
|
+
export declare function isLicenseOperable(state: LicenseState | undefined): boolean;
|
|
44
|
+
/** La instancia debe BLOQUEARSE tras el modal de activación cuando hay
|
|
45
|
+
* enforcement y la licencia es missing/invalid/expired (pasada la gracia).
|
|
46
|
+
* grace/stale degradan con banner en vez de bloquear. Espeja `State.Blocking()`.
|
|
47
|
+
* Mientras el estado aún carga (undefined) NO bloquea: fail-open en la UI para
|
|
48
|
+
* que un check lento/fallido nunca destelle un candado sobre la app. */
|
|
49
|
+
export declare function isLicenseBlocking(state: LicenseState | undefined): boolean;
|
|
50
|
+
/** Un preset/vertical está habilitado si la licencia otorga wildcard o lo lista
|
|
51
|
+
* explícitamente. Sin enforcement → todo habilitado. */
|
|
52
|
+
export declare function isPresetEntitled(state: LicenseState | undefined, presetKey: string): boolean;
|
|
53
|
+
/** Marca trial vencido: el copy del gate cambia a "tu prueba terminó". */
|
|
54
|
+
export declare function isTrialExpired(state: LicenseState | undefined): boolean;
|
|
55
|
+
/** Branding opcional para teñir el gate/banner. El host lo pasa desde su
|
|
56
|
+
* PlatformConfig del SDK (o cualquier fuente); sin él, fallback neutro. */
|
|
57
|
+
export interface LicenseBranding {
|
|
58
|
+
/** Nombre de la plataforma/tenant, para el encabezado del gate. */
|
|
59
|
+
name?: string;
|
|
60
|
+
/** URL del logo (se embebe como <img>). */
|
|
61
|
+
logo?: string;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/license/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,yEAAyE;AACzE,MAAM,MAAM,aAAa,GACnB,OAAO,GACP,OAAO,GACP,OAAO,GACP,SAAS,GACT,SAAS,GACT,SAAS,CAAA;AAEf,MAAM,WAAW,YAAY;IACzB;yDACqD;IACrD,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,OAAO,CAAA;IACnB,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,aAAa,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,QAAQ,EAAE,OAAO,CAAA;IACjB,oEAAoE;IACpE,KAAK,EAAE,OAAO,CAAA;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,OAAO,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED;;;4CAG4C;AAC5C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAG1E;AAED;;;;wEAIwE;AACxE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAG1E;AAED;wDACwD;AACxD,wBAAgB,gBAAgB,CAC5B,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,SAAS,EAAE,MAAM,GAClB,OAAO,CAIT;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAEvE;AAED;2EAC2E;AAC3E,MAAM,WAAW,eAAe;IAC5B,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAA;CAChB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Licencia de instancia — el contrato de estado que el backend del host (ops
|
|
3
|
+
* vía kernel `LicenseService`) expone y que este módulo pinta. El SDK NO habla
|
|
4
|
+
* con el kernel ni impone su versión: el host resuelve el `LicenseState` con su
|
|
5
|
+
* propio transporte y se lo pasa a <LicenseGate>. Así el gate es un primitivo
|
|
6
|
+
* reutilizable e INDEPENDIENTE del release del kernel.
|
|
7
|
+
*
|
|
8
|
+
* División de responsabilidades del blindaje:
|
|
9
|
+
* - kernel → enforcement (qué está permitido; firma/verifica el estado).
|
|
10
|
+
* - SDK → UX (este módulo: gate, banner, badge).
|
|
11
|
+
* - hub → emisión (mintea el token Ed25519).
|
|
12
|
+
* - hosts → wiring (resuelven el estado y montan <LicenseGate> en 1 línea).
|
|
13
|
+
*/
|
|
14
|
+
/** La licencia es OPERABLE cuando permite operar (aunque sea degradada):
|
|
15
|
+
* valid, la postura `stale` del lease, o dentro de la ventana de gracia.
|
|
16
|
+
* missing/invalid/expired no son operables. Sin enforcement → siempre operable.
|
|
17
|
+
* Espeja `State.Operable()` del backend. */
|
|
18
|
+
export function isLicenseOperable(state) {
|
|
19
|
+
if (!state || !state.enforced)
|
|
20
|
+
return true;
|
|
21
|
+
return state.valid || state.in_grace;
|
|
22
|
+
}
|
|
23
|
+
/** La instancia debe BLOQUEARSE tras el modal de activación cuando hay
|
|
24
|
+
* enforcement y la licencia es missing/invalid/expired (pasada la gracia).
|
|
25
|
+
* grace/stale degradan con banner en vez de bloquear. Espeja `State.Blocking()`.
|
|
26
|
+
* Mientras el estado aún carga (undefined) NO bloquea: fail-open en la UI para
|
|
27
|
+
* que un check lento/fallido nunca destelle un candado sobre la app. */
|
|
28
|
+
export function isLicenseBlocking(state) {
|
|
29
|
+
if (!state || !state.enforced)
|
|
30
|
+
return false;
|
|
31
|
+
return !isLicenseOperable(state);
|
|
32
|
+
}
|
|
33
|
+
/** Un preset/vertical está habilitado si la licencia otorga wildcard o lo lista
|
|
34
|
+
* explícitamente. Sin enforcement → todo habilitado. */
|
|
35
|
+
export function isPresetEntitled(state, presetKey) {
|
|
36
|
+
if (!state || !state.enforced)
|
|
37
|
+
return true;
|
|
38
|
+
if (state.wildcard)
|
|
39
|
+
return true;
|
|
40
|
+
return state.entitlements?.includes(presetKey) ?? false;
|
|
41
|
+
}
|
|
42
|
+
/** Marca trial vencido: el copy del gate cambia a "tu prueba terminó". */
|
|
43
|
+
export function isTrialExpired(state) {
|
|
44
|
+
return !!state && state.plan === 'trial' && state.status === 'expired';
|
|
45
|
+
}
|
package/dist/types.d.ts
CHANGED
|
@@ -495,6 +495,12 @@ export interface PaginationMeta {
|
|
|
495
495
|
to: number;
|
|
496
496
|
total: number;
|
|
497
497
|
}
|
|
498
|
+
/** One page of a multi-step (wizard) action. Mirrors the sdk's ActionStep. */
|
|
499
|
+
export interface ActionStep {
|
|
500
|
+
title: string;
|
|
501
|
+
description?: string;
|
|
502
|
+
fields: ActionFieldDef[];
|
|
503
|
+
}
|
|
498
504
|
export interface ActionMetadata {
|
|
499
505
|
key: string;
|
|
500
506
|
label: string;
|
|
@@ -503,6 +509,8 @@ export interface ActionMetadata {
|
|
|
503
509
|
confirm?: boolean;
|
|
504
510
|
confirmMessage?: string;
|
|
505
511
|
fields?: ActionFieldDef[];
|
|
512
|
+
/** Multi-step wizard form; when present the dispatcher renders a wizard. */
|
|
513
|
+
steps?: ActionStep[];
|
|
506
514
|
requiresState?: string[];
|
|
507
515
|
executable?: boolean;
|
|
508
516
|
placement?: 'row' | 'table' | 'create';
|
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":"AAGA,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,UAAU,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,YAAY,EAAE,CAAA;IAC1B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;IAC9C;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,SAAS,EAAE,CAAA;IACpB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,aAAa,EAAE,CAAA;IAC7B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,eAAe,EAAE,CAAA;CAClC;AAED;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACxD;;;;;OAKG;IACH,QAAQ,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,OAAO,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAC3D,CAAA;CACJ;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAC1D;AAED,4EAA4E;AAC5E,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;CACb;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IACzB,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAA;IACZ,kEAAkE;IAClE,IAAI,EAAE,aAAa,GAAG,cAAc,CAAA;IACpC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAA;IACf,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAA;IACnB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb;;;;;OAKG;IACH,IAAI,EAAE,QAAQ,GAAG,gBAAgB,GAAG,SAAS,GAAG,YAAY,GAAG,cAAc,GAAG,MAAM,CAAA;IACtF,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACrF,cAAc,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;AAEjF,MAAM,WAAW,gBAAgB;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EACE,MAAM,GACN,QAAQ,GACR,MAAM,GAGN,UAAU,GACV,WAAW,GACX,aAAa,GACb,QAAQ,GACR,QAAQ,GACR,qBAAqB,GACrB,QAAQ,GACR,SAAS,GACT,OAAO,GACP,eAAe,GACf,OAAO,GAEP,KAAK,GACL,MAAM,GACN,OAAO,GACP,UAAU,GACV,SAAS,GACT,UAAU,GACV,OAAO,GACP,QAAQ,GACR,MAAM,GACN,OAAO,GACP,MAAM,GACN,eAAe,GACf,SAAS,GACT,MAAM,GAKN,UAAU,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,OAAO,CAAA;IACnB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,QAAQ,GAAG,gBAAgB,GAAG,SAAS,GAAG,YAAY,GAAG,cAAc,GAAG,MAAM,CAAA;IAC7F,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAA;IAC7B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACjC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC3E;;;;;;OAMG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,UAAU,CAAC,EAAE,eAAe,CAAA;IAC5B;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,eAAe,EAAE,CAAA;IAC9B,8DAA8D;IAC9D,WAAW,CAAC,EAAE,eAAe,EAAE,CAAA;CAClC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,QAAQ,CAAA;IACxC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAC3B;AASD,MAAM,WAAW,eAAe;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;CAClB;AAID,MAAM,MAAM,WAAW,GACjB,MAAM,GACN,UAAU,GACV,UAAU,GACV,OAAO,GACP,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,gBAAgB,GAChB,QAAQ,GACR,QAAQ,CAAA;AAEd;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IACvB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wEAAwE;IACxE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAA;IACb,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,UAAU,CAAA;CACpB;AAED,MAAM,WAAW,cAAc;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,SAAS,EAAE,CAAA;IACrB,YAAY,CAAC,EAAE,GAAG,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,eAAe,CAAA;IAC5B,MAAM,CAAC,EAAE,WAAW,GAAG,MAAM,CAAA;IAC7B;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,kBAAkB,CAAA;IAClC,0EAA0E;IAC1E,cAAc,CAAC,EAAE,kBAAkB,CAAA;IACnC;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,cAAc,EAAE,CAAA;IAC7B;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,gBAAgB,CAAA;IAC1B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IAC/B,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAA;IACpD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,eAAe,CAAA;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,cAAc,EAAE,CAAA;IACzB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAA;CACzC;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,CAAC,CAAA;IACP,IAAI,CAAC,EAAE,cAAc,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,cAAc;IAC3B,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;CAChB;AAKD,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,cAAc,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,cAAc;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,cAAc,EAAE,CAAA;IACzB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,UAAU,EAAE,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,SAAS,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAA;CACzC"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
// @vitest-environment happy-dom
|
|
2
|
+
//
|
|
3
|
+
// Contrato del blindaje de licencia (LicenseGate + banner + helpers):
|
|
4
|
+
// - Sin enforcement o estado operable → children, sin candado.
|
|
5
|
+
// - stale/grace → children + banner degradado (grace descartable, expired no).
|
|
6
|
+
// - enforcement && missing/invalid/expired → modal bloqueante con activación.
|
|
7
|
+
// - trial vencido → copy "tu prueba terminó".
|
|
8
|
+
// - onActivate: éxito desbloquea (el host refresca), error muestra el mensaje.
|
|
9
|
+
//
|
|
10
|
+
// Gotcha conocido (reference_radix_select_happydom_reset): nada de Radix Select
|
|
11
|
+
// aquí — el gate usa un <Input> plano y el texto visible es el gate de los asserts.
|
|
12
|
+
import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
13
|
+
import { cleanup, render, screen, fireEvent, waitFor } from '@testing-library/react'
|
|
14
|
+
|
|
15
|
+
vi.mock('react-i18next', () => ({
|
|
16
|
+
useTranslation: () => ({
|
|
17
|
+
t: (_k: string, opts?: Record<string, unknown>) => {
|
|
18
|
+
let s = (opts?.defaultValue as string) ?? _k
|
|
19
|
+
// interpolación mínima {{x}} para los mensajes del banner.
|
|
20
|
+
for (const [k, v] of Object.entries(opts ?? {})) {
|
|
21
|
+
if (k === 'defaultValue') continue
|
|
22
|
+
s = s.replace(new RegExp(`{{\\s*${k}\\s*}}`, 'g'), String(v))
|
|
23
|
+
}
|
|
24
|
+
return s
|
|
25
|
+
},
|
|
26
|
+
}),
|
|
27
|
+
}))
|
|
28
|
+
|
|
29
|
+
afterEach(() => {
|
|
30
|
+
cleanup()
|
|
31
|
+
localStorage.clear()
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
import {
|
|
35
|
+
LicenseGate,
|
|
36
|
+
LicenseExpiryBanner,
|
|
37
|
+
LicenseStatusBadge,
|
|
38
|
+
isLicenseBlocking,
|
|
39
|
+
isLicenseOperable,
|
|
40
|
+
isPresetEntitled,
|
|
41
|
+
isTrialExpired,
|
|
42
|
+
type LicenseState,
|
|
43
|
+
} from '../license'
|
|
44
|
+
|
|
45
|
+
function make(partial: Partial<LicenseState>): LicenseState {
|
|
46
|
+
return {
|
|
47
|
+
enforced: true,
|
|
48
|
+
configured: true,
|
|
49
|
+
valid: false,
|
|
50
|
+
status: 'missing',
|
|
51
|
+
entitlements: [],
|
|
52
|
+
wildcard: false,
|
|
53
|
+
stale: false,
|
|
54
|
+
in_grace: false,
|
|
55
|
+
days_remaining: 0,
|
|
56
|
+
...partial,
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const CHILD = <div>contenido protegido</div>
|
|
61
|
+
|
|
62
|
+
describe('helpers de estado', () => {
|
|
63
|
+
it('operable/blocking espejan al backend', () => {
|
|
64
|
+
expect(isLicenseOperable(make({ status: 'valid', valid: true }))).toBe(true)
|
|
65
|
+
expect(isLicenseOperable(make({ status: 'grace', in_grace: true }))).toBe(true)
|
|
66
|
+
expect(isLicenseOperable(make({ status: 'missing' }))).toBe(false)
|
|
67
|
+
expect(isLicenseBlocking(make({ status: 'expired' }))).toBe(true)
|
|
68
|
+
// Sin enforcement nunca bloquea, aunque el status sea feo.
|
|
69
|
+
expect(isLicenseBlocking(make({ enforced: false, status: 'expired' }))).toBe(false)
|
|
70
|
+
// undefined (aún cargando) → fail-open.
|
|
71
|
+
expect(isLicenseBlocking(undefined)).toBe(false)
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
it('entitlement respeta wildcard y lista explícita', () => {
|
|
75
|
+
expect(isPresetEntitled(make({ wildcard: true }), 'pitsline')).toBe(true)
|
|
76
|
+
expect(isPresetEntitled(make({ entitlements: ['pitsline'] }), 'pitsline')).toBe(true)
|
|
77
|
+
expect(isPresetEntitled(make({ entitlements: ['otro'] }), 'pitsline')).toBe(false)
|
|
78
|
+
expect(isPresetEntitled(make({ enforced: false }), 'lo-que-sea')).toBe(true)
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
it('trial vencido se detecta', () => {
|
|
82
|
+
expect(isTrialExpired(make({ plan: 'trial', status: 'expired' }))).toBe(true)
|
|
83
|
+
expect(isTrialExpired(make({ plan: 'pro', status: 'expired' }))).toBe(false)
|
|
84
|
+
})
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
describe('LicenseGate', () => {
|
|
88
|
+
const noop = () => Promise.resolve()
|
|
89
|
+
|
|
90
|
+
it('renderiza children sin candado cuando la licencia es válida', () => {
|
|
91
|
+
render(
|
|
92
|
+
<LicenseGate state={make({ status: 'valid', valid: true })} onActivate={noop}>
|
|
93
|
+
{CHILD}
|
|
94
|
+
</LicenseGate>,
|
|
95
|
+
)
|
|
96
|
+
expect(screen.getByText('contenido protegido')).toBeTruthy()
|
|
97
|
+
expect(screen.queryByRole('dialog')).toBeNull()
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
it('sin enforcement es transparente', () => {
|
|
101
|
+
render(
|
|
102
|
+
<LicenseGate state={make({ enforced: false, status: 'missing' })} onActivate={noop}>
|
|
103
|
+
{CHILD}
|
|
104
|
+
</LicenseGate>,
|
|
105
|
+
)
|
|
106
|
+
expect(screen.getByText('contenido protegido')).toBeTruthy()
|
|
107
|
+
expect(screen.queryByRole('dialog')).toBeNull()
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
it('bloquea con modal cuando falta la licencia', () => {
|
|
111
|
+
render(
|
|
112
|
+
<LicenseGate state={make({ status: 'missing' })} onActivate={noop}>
|
|
113
|
+
{CHILD}
|
|
114
|
+
</LicenseGate>,
|
|
115
|
+
)
|
|
116
|
+
expect(screen.getByRole('dialog')).toBeTruthy()
|
|
117
|
+
expect(screen.getByText('Activa tu licencia')).toBeTruthy()
|
|
118
|
+
// children siguen montados detrás del overlay (no reload).
|
|
119
|
+
expect(screen.getByText('contenido protegido')).toBeTruthy()
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
it('trial vencido muestra el copy de prueba terminada', () => {
|
|
123
|
+
render(
|
|
124
|
+
<LicenseGate state={make({ status: 'expired', plan: 'trial' })} onActivate={noop}>
|
|
125
|
+
{CHILD}
|
|
126
|
+
</LicenseGate>,
|
|
127
|
+
)
|
|
128
|
+
expect(screen.getByText('Tu prueba gratuita terminó')).toBeTruthy()
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
it('activación exitosa llama onActivate con el código pegado', async () => {
|
|
132
|
+
const onActivate = vi.fn().mockResolvedValue(undefined)
|
|
133
|
+
render(
|
|
134
|
+
<LicenseGate state={make({ status: 'missing' })} onActivate={onActivate}>
|
|
135
|
+
{CHILD}
|
|
136
|
+
</LicenseGate>,
|
|
137
|
+
)
|
|
138
|
+
fireEvent.change(screen.getByLabelText('Clave o token de licencia'), {
|
|
139
|
+
target: { value: ' lic_abc123 ' },
|
|
140
|
+
})
|
|
141
|
+
fireEvent.click(screen.getByText('Activar licencia'))
|
|
142
|
+
await waitFor(() => expect(onActivate).toHaveBeenCalledWith('lic_abc123'))
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
it('muestra el mensaje de error del backend al fallar', async () => {
|
|
146
|
+
const onActivate = vi.fn().mockRejectedValue(new Error('Token no corresponde a esta instancia'))
|
|
147
|
+
render(
|
|
148
|
+
<LicenseGate state={make({ status: 'invalid' })} onActivate={onActivate}>
|
|
149
|
+
{CHILD}
|
|
150
|
+
</LicenseGate>,
|
|
151
|
+
)
|
|
152
|
+
fireEvent.change(screen.getByLabelText('Clave o token de licencia'), {
|
|
153
|
+
target: { value: 'lic_bad' },
|
|
154
|
+
})
|
|
155
|
+
fireEvent.click(screen.getByText('Activar licencia'))
|
|
156
|
+
await waitFor(() =>
|
|
157
|
+
expect(screen.getByText('Token no corresponde a esta instancia')).toBeTruthy(),
|
|
158
|
+
)
|
|
159
|
+
})
|
|
160
|
+
|
|
161
|
+
it('el botón activar está deshabilitado sin código', () => {
|
|
162
|
+
render(
|
|
163
|
+
<LicenseGate state={make({ status: 'missing' })} onActivate={noop}>
|
|
164
|
+
{CHILD}
|
|
165
|
+
</LicenseGate>,
|
|
166
|
+
)
|
|
167
|
+
const btn = screen.getByText('Activar licencia').closest('button')!
|
|
168
|
+
expect(btn.disabled).toBe(true)
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
it('grace degrada con banner en vez de bloquear', () => {
|
|
172
|
+
render(
|
|
173
|
+
<LicenseGate
|
|
174
|
+
state={make({ status: 'grace', in_grace: true, days_remaining: 5, grace_until: '2026-08-01' })}
|
|
175
|
+
onActivate={noop}
|
|
176
|
+
>
|
|
177
|
+
{CHILD}
|
|
178
|
+
</LicenseGate>,
|
|
179
|
+
)
|
|
180
|
+
expect(screen.queryByRole('dialog')).toBeNull()
|
|
181
|
+
expect(screen.getByText('contenido protegido')).toBeTruthy()
|
|
182
|
+
expect(screen.getByRole('alert')).toBeTruthy()
|
|
183
|
+
})
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
describe('LicenseExpiryBanner', () => {
|
|
187
|
+
it('silencioso sin enforcement', () => {
|
|
188
|
+
const { container } = render(
|
|
189
|
+
<LicenseExpiryBanner state={make({ enforced: false, status: 'expired' })} />,
|
|
190
|
+
)
|
|
191
|
+
expect(container.firstChild).toBeNull()
|
|
192
|
+
})
|
|
193
|
+
|
|
194
|
+
it('expired no es descartable (no hay botón cerrar)', () => {
|
|
195
|
+
render(<LicenseExpiryBanner state={make({ status: 'expired' })} />)
|
|
196
|
+
expect(screen.getByRole('alert')).toBeTruthy()
|
|
197
|
+
expect(screen.queryByTitle('Descartar')).toBeNull()
|
|
198
|
+
})
|
|
199
|
+
|
|
200
|
+
it('grace es descartable y persiste el descarte', () => {
|
|
201
|
+
const { rerender } = render(
|
|
202
|
+
<LicenseExpiryBanner state={make({ status: 'grace', in_grace: true, days_remaining: 3 })} />,
|
|
203
|
+
)
|
|
204
|
+
fireEvent.click(screen.getByTitle('Descartar'))
|
|
205
|
+
expect(screen.queryByRole('alert')).toBeNull()
|
|
206
|
+
// Re-render: sigue descartado por el TTL en localStorage.
|
|
207
|
+
rerender(
|
|
208
|
+
<LicenseExpiryBanner state={make({ status: 'grace', in_grace: true, days_remaining: 3 })} />,
|
|
209
|
+
)
|
|
210
|
+
expect(screen.queryByRole('alert')).toBeNull()
|
|
211
|
+
})
|
|
212
|
+
|
|
213
|
+
it('aviso de renovación próxima cuando quedan pocos días', () => {
|
|
214
|
+
render(
|
|
215
|
+
<LicenseExpiryBanner state={make({ status: 'valid', valid: true, days_remaining: 7 })} />,
|
|
216
|
+
)
|
|
217
|
+
expect(screen.getByText('Tu licencia vence en 7 días.')).toBeTruthy()
|
|
218
|
+
})
|
|
219
|
+
|
|
220
|
+
it('botón gestionar solo cuando el host pasa onManage', () => {
|
|
221
|
+
const onManage = vi.fn()
|
|
222
|
+
render(
|
|
223
|
+
<LicenseExpiryBanner
|
|
224
|
+
state={make({ status: 'expired' })}
|
|
225
|
+
onManage={onManage}
|
|
226
|
+
/>,
|
|
227
|
+
)
|
|
228
|
+
fireEvent.click(screen.getByText('Gestionar licencia'))
|
|
229
|
+
expect(onManage).toHaveBeenCalled()
|
|
230
|
+
})
|
|
231
|
+
})
|
|
232
|
+
|
|
233
|
+
describe('LicenseStatusBadge', () => {
|
|
234
|
+
it('traduce cada status a etiqueta legible', () => {
|
|
235
|
+
const { rerender } = render(<LicenseStatusBadge status="valid" />)
|
|
236
|
+
expect(screen.getByText('Activa')).toBeTruthy()
|
|
237
|
+
rerender(<LicenseStatusBadge status="expired" />)
|
|
238
|
+
expect(screen.getByText('Vencida')).toBeTruthy()
|
|
239
|
+
rerender(<LicenseStatusBadge status="stale" />)
|
|
240
|
+
expect(screen.getByText('Sin verificar')).toBeTruthy()
|
|
241
|
+
})
|
|
242
|
+
})
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// @vitest-environment happy-dom
|
|
2
|
+
//
|
|
3
|
+
// WizardActionModal contract (the third render-path of ActionModalDispatcher):
|
|
4
|
+
// when an action declares `steps: [{title, fields[]}]`, the dispatcher renders a
|
|
5
|
+
// multi-step wizard instead of the single-page GenericActionModal. It:
|
|
6
|
+
// - shows only the current step's fields,
|
|
7
|
+
// - gates advancing on the current step's required fields,
|
|
8
|
+
// - accumulates every step's values and POSTs all of them, once, on submit.
|
|
9
|
+
//
|
|
10
|
+
// happy-dom gotcha: Radix Select resets its value in this environment, so these
|
|
11
|
+
// tests gate on visible text/behavior (which fields render, what POST body is
|
|
12
|
+
// sent), never on a Select's value.
|
|
13
|
+
import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
14
|
+
import { cleanup, render, screen, fireEvent, waitFor } from '@testing-library/react'
|
|
15
|
+
|
|
16
|
+
vi.mock('react-i18next', () => ({
|
|
17
|
+
useTranslation: () => ({ t: (k: string, o?: any) => o?.defaultValue ?? k }),
|
|
18
|
+
}))
|
|
19
|
+
|
|
20
|
+
import { ActionModalDispatcher } from '../action-modal-dispatcher'
|
|
21
|
+
import { ApiProvider, type ApiClient } from '../api-context'
|
|
22
|
+
import type { ActionMetadata } from '@asteby/metacore-sdk'
|
|
23
|
+
|
|
24
|
+
afterEach(cleanup)
|
|
25
|
+
|
|
26
|
+
function makeApi() {
|
|
27
|
+
const post = vi.fn().mockResolvedValue({ data: { success: true } })
|
|
28
|
+
const api = {
|
|
29
|
+
get: vi.fn().mockResolvedValue({ data: {} }),
|
|
30
|
+
post,
|
|
31
|
+
} as unknown as ApiClient
|
|
32
|
+
return { api, post }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const action: ActionMetadata = {
|
|
36
|
+
key: 'workshop_checklist',
|
|
37
|
+
label: 'Checklist de taller',
|
|
38
|
+
icon: 'wrench',
|
|
39
|
+
steps: [
|
|
40
|
+
{
|
|
41
|
+
title: 'Recepción',
|
|
42
|
+
fields: [
|
|
43
|
+
{ key: 'plate', label: 'Placa', type: 'text', required: true },
|
|
44
|
+
{ key: 'mileage', label: 'Kilometraje', type: 'number' },
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
title: 'Diagnóstico',
|
|
49
|
+
fields: [{ key: 'notes', label: 'Notas', type: 'textarea', required: true }],
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
} as unknown as ActionMetadata
|
|
53
|
+
|
|
54
|
+
function renderModal(api: ApiClient) {
|
|
55
|
+
return render(
|
|
56
|
+
<ApiProvider client={api}>
|
|
57
|
+
<ActionModalDispatcher
|
|
58
|
+
open
|
|
59
|
+
onOpenChange={() => {}}
|
|
60
|
+
action={action}
|
|
61
|
+
model="service_order"
|
|
62
|
+
record={{ id: '42' } as any}
|
|
63
|
+
endpoint="/data/service_order"
|
|
64
|
+
onSuccess={() => {}}
|
|
65
|
+
/>
|
|
66
|
+
</ApiProvider>,
|
|
67
|
+
)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
describe('WizardActionModal', () => {
|
|
71
|
+
it('renders only the first step initially and shows a progress indicator', () => {
|
|
72
|
+
const { api } = makeApi()
|
|
73
|
+
renderModal(api)
|
|
74
|
+
// First step fields present, later step field absent.
|
|
75
|
+
expect(screen.getByText('Placa')).toBeTruthy()
|
|
76
|
+
expect(screen.queryByText('Notas')).toBeNull()
|
|
77
|
+
// Progress label "Paso 1/2".
|
|
78
|
+
expect(screen.getByText(/1\/2/)).toBeTruthy()
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
it('blocks advancing when the current step has an unmet required field', () => {
|
|
82
|
+
const { api } = makeApi()
|
|
83
|
+
renderModal(api)
|
|
84
|
+
fireEvent.click(screen.getByText('Siguiente'))
|
|
85
|
+
// Still on step 1 (Notas not shown) because Placa is empty+required.
|
|
86
|
+
expect(screen.queryByText('Notas')).toBeNull()
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
it('advances to the next step once required fields pass', () => {
|
|
90
|
+
const { api } = makeApi()
|
|
91
|
+
renderModal(api)
|
|
92
|
+
fireEvent.change(document.getElementById('plate') as HTMLInputElement, {
|
|
93
|
+
target: { value: 'ABC-123' },
|
|
94
|
+
})
|
|
95
|
+
fireEvent.click(screen.getByText('Siguiente'))
|
|
96
|
+
expect(screen.getByText('Notas')).toBeTruthy()
|
|
97
|
+
// Back returns to step 1 with the value retained.
|
|
98
|
+
fireEvent.click(screen.getByText('Atrás'))
|
|
99
|
+
expect((document.getElementById('plate') as HTMLInputElement).value).toBe('ABC-123')
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
it('submits ALL accumulated fields once, to the record action endpoint', async () => {
|
|
103
|
+
const { api, post } = makeApi()
|
|
104
|
+
renderModal(api)
|
|
105
|
+
fireEvent.change(document.getElementById('plate') as HTMLInputElement, {
|
|
106
|
+
target: { value: 'ABC-123' },
|
|
107
|
+
})
|
|
108
|
+
fireEvent.click(screen.getByText('Siguiente'))
|
|
109
|
+
fireEvent.change(document.getElementById('notes') as HTMLTextAreaElement, {
|
|
110
|
+
target: { value: 'frenos' },
|
|
111
|
+
})
|
|
112
|
+
// Final step shows the action label as the submit button (the label also
|
|
113
|
+
// appears in the dialog title, so click the last match — the button).
|
|
114
|
+
const labels = screen.getAllByText('Checklist de taller')
|
|
115
|
+
fireEvent.click(labels[labels.length - 1])
|
|
116
|
+
await waitFor(() => expect(post).toHaveBeenCalledTimes(1))
|
|
117
|
+
const [url, body] = post.mock.calls[0]
|
|
118
|
+
expect(url).toBe('/data/service_order/42/action/workshop_checklist')
|
|
119
|
+
expect(body).toMatchObject({ plate: 'ABC-123', notes: 'frenos' })
|
|
120
|
+
})
|
|
121
|
+
})
|