feat(web): el selector de artículo de una línea admite varios (el primero completa la línea, los demás se insertan debajo)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
GeorgeandClaude Sonnet 5.5 committed 2026-10-14 14:27:36 -05:00
1 parent 1528f7cb96
commit 45c0ca536e
5 files changed
+37 -1

No files matched your search

@@ -218,11 +218,34 @@ describe('LinesGrid', () => {
await tick();
(q('.dlg tbody tr') as HTMLElement).click();
await tick();
(q('.dlg footer .btn.main') as HTMLElement).click();
await tick();
expect(lines()[0]).toMatchObject({ ItemCode: 'I00002', ItemDescription: 'DVD+R Disc 50-Pack', Quantity: 2, Price: 50, LineTotal: 100 });
expect(el.querySelector('.dlg')).toBeNull();
expect(document.activeElement).toBe(cell(0, 0));
});
it('varios artículos: el primero completa la línea y los demás se insertan debajo', async () => {
fixture.componentInstance.lines.set([line('A', 2, 50), line('Z', 1, 10)]);
await tick();
(qa('.pick button')[0] as HTMLButtonElement).click();
await tick();
ctrl.expectOne((r) => r.url === '/api/sl/Items').flush({
value: [
{ ItemCode: 'I1', ItemName: 'Uno' },
{ ItemCode: 'I2', ItemName: 'Dos' },
],
'odata.count': '2',
});
await tick();
qa('.dlg tbody tr').forEach((r) => (r as HTMLElement).click());
await tick();
(q('.dlg footer .btn.main') as HTMLElement).click();
await tick();
expect(lines().map((l) => l['ItemCode'])).toEqual(['I1', 'I2', 'Z']);
expect(lines()[0]).toMatchObject({ Quantity: 2, Price: 50 });
});
it('F4 abre la lista de la celda; una celda sin lista no', async () => {
await key(0, 3, 'F4'); // almacén
ctrl.expectOne((r) => r.url === '/api/sl/Warehouses').flush({ value: [], 'odata.count': '0' });