feat(web): maestros de clientes, proveedores y artículos (lista, formulario con pestañas, extensiones por cliente)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
b759c7bce7
commit
9f003ee4bf
30 files changed
+1553
-23
No files matched your search
@@ -0,0 +1,43 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { MASTER_EXTENSIONS, BASE_MASTER_SCREENS, MASTER_SCREENS } from './master-screens';
|
||||
import { type MasterExtensions, applyMasterExtensions } from './master-extensions';
|
||||
import { masterKeysOf } from './master-model';
|
||||
|
||||
const by = (screens: readonly { path: string }[], path: string) => screens.find((s) => s.path === path)! as (typeof BASE_MASTER_SCREENS)[number];
|
||||
|
||||
const EXT: MasterExtensions = {
|
||||
'/socios/clientes': {
|
||||
header: { right: [{ type: 'text', key: 'U_Ref', label: 'Ref.' }] },
|
||||
tabs: { general: { right: [{ type: 'text', key: 'U_Zona', label: 'Zona' }] }, pago: { left: [{ type: 'number', key: 'U_Cupo', label: 'Cupo' }] } },
|
||||
newTabs: [{ id: 'extra', label: 'Extra', left: [{ type: 'checkbox', key: 'U_Vip', label: 'VIP' }], right: [] }],
|
||||
listColumns: [{ key: 'U_Zona', title: 'Zona', searchable: true }],
|
||||
},
|
||||
};
|
||||
|
||||
describe('extensiones por cliente de los maestros', () => {
|
||||
it('en main no agregan nada', () => {
|
||||
expect(MASTER_EXTENSIONS).toEqual({});
|
||||
expect(MASTER_SCREENS).toEqual(BASE_MASTER_SCREENS);
|
||||
});
|
||||
|
||||
it('agregan campos al final de la cabecera y de las pestañas, una pestaña nueva y columnas de lista', () => {
|
||||
const s = by(applyMasterExtensions(BASE_MASTER_SCREENS, EXT), '/socios/clientes');
|
||||
expect(s.layout.header.right.at(-1)).toMatchObject({ key: 'U_Ref' });
|
||||
expect(s.layout.tabs.find((t) => t.id === 'general')!.right.at(-1)).toMatchObject({ key: 'U_Zona' });
|
||||
expect(s.layout.tabs.find((t) => t.id === 'pago')!.left.at(-1)).toMatchObject({ key: 'U_Cupo' });
|
||||
expect(s.layout.tabs.at(-1)).toMatchObject({ id: 'extra' });
|
||||
expect(s.columns.at(-1)).toMatchObject({ key: 'U_Zona' });
|
||||
expect(masterKeysOf(s.layout)).toEqual(expect.arrayContaining(['U_Ref', 'U_Zona', 'U_Cupo', 'U_Vip']));
|
||||
});
|
||||
|
||||
it('solo cambia la pantalla extendida', () => {
|
||||
const out = applyMasterExtensions(BASE_MASTER_SCREENS, EXT);
|
||||
expect(by(out, '/socios/proveedores')).toEqual(by(BASE_MASTER_SCREENS, '/socios/proveedores'));
|
||||
expect(masterKeysOf(by(BASE_MASTER_SCREENS, '/socios/clientes').layout)).not.toContain('U_Zona');
|
||||
});
|
||||
|
||||
it('una ruta o una pestaña que no existen son un error', () => {
|
||||
expect(() => applyMasterExtensions(BASE_MASTER_SCREENS, { '/socios/clientez': { listColumns: [] } })).toThrow(/no existe la pantalla/);
|
||||
expect(() => applyMasterExtensions(BASE_MASTER_SCREENS, { '/socios/clientes': { tabs: { nada: { left: [] } } } })).toThrow(/no tiene la pestaña/);
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user