From f25037f6517ecbba0dfe542b484a0deebb08f5af Mon Sep 17 00:00:00 2001 From: George Date: Fri, 16 Oct 2026 11:18:03 -0500 Subject: [PATCH] =?UTF-8?q?fix(web):=20el=20formulario=20de=20documentos?= =?UTF-8?q?=20dibuja=20los=20campos=20S=C3=AD/No=20(checkbox)=20de=20las?= =?UTF-8?q?=20extensiones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5.5 --- .../documents/document-form.page.html | 8 ++++ .../features/documents/document-form.page.ts | 4 +- .../documents/screen-extensions.spec.ts | 44 +++++++++++++++++++ 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/apps/web/src/app/features/documents/document-form.page.html b/apps/web/src/app/features/documents/document-form.page.html index 4915457..8f692bc 100644 --- a/apps/web/src/app/features/documents/document-form.page.html +++ b/apps/web/src/app/features/documents/document-form.page.html @@ -91,6 +91,14 @@ (picked)="onPartner($event)" /> } + @case ('checkbox') { + + } @case ('lookup') { { @Component({ selector: 'sbo-document-form-page', changeDetection: ChangeDetectionStrategy.OnPush, - imports: [DateField, Icon, LinesGrid, LookupField, MenuButton, NgTemplateOutlet, NumberField, NumberInput, RouterLink, SboField, SelectField, SelectInput, SboWindow, TextField, TextInput, TextareaField, Toolbar, ValueHelp], + imports: [CheckboxField, DateField, Icon, LinesGrid, LookupField, MenuButton, NgTemplateOutlet, NumberField, NumberInput, RouterLink, SboField, SelectField, SelectInput, SboWindow, TextField, TextInput, TextareaField, Toolbar, ValueHelp], templateUrl: './document-form.page.html', styles: ` h1 { margin: 0 0 6px; font-size: 18px; font-weight: 600; } diff --git a/apps/web/src/app/features/documents/screen-extensions.spec.ts b/apps/web/src/app/features/documents/screen-extensions.spec.ts index 4eafeb6..881430c 100644 --- a/apps/web/src/app/features/documents/screen-extensions.spec.ts +++ b/apps/web/src/app/features/documents/screen-extensions.spec.ts @@ -344,3 +344,47 @@ describe('formulario con campos ocultos o de solo lectura', () => { expect(input('Indicador')!.readOnly).toBe(false); }); }); + +describe('campos Sí/No (checkbox) en los documentos', () => { + it('un campo de usuario de tipo casilla se dibuja como casilla y guarda tYES / tNO', async () => { + TestBed.resetTestingModule(); + const screen = by( + applyExtensions(BASE_SCREENS, { '/ventas/ordenes': { headerLeft: [{ type: 'checkbox', key: 'U_Urgente', label: 'Urgente' }] } }), + '/ventas/ordenes', + ); + const route = { + snapshot: { data: { screen, title: 'Documento' }, paramMap: convertToParamMap({ docEntry: '5' }) }, + paramMap: of(convertToParamMap({ docEntry: '5' })), + }; + await TestBed.configureTestingModule({ + imports: [DocumentFormPage], + providers: [provideRouter([]), provideHttpClient(), provideHttpClientTesting(), { provide: ActivatedRoute, useValue: route }], + }).compileComponents(); + const ctrl = TestBed.inject(HttpTestingController); + vi.spyOn(TestBed.inject(Router), 'navigate').mockResolvedValue(true); + const fixture = TestBed.createComponent(DocumentFormPage); + const tick = async () => { + fixture.detectChanges(); + await new Promise((r) => setTimeout(r)); + fixture.detectChanges(); + }; + await tick(); + ctrl.match((r) => r.url === '/api/sl/SalesTaxCodes').forEach((r) => r.flush({ value: [] })); + ctrl.match((r) => r.url === '/api/sl/AdditionalExpenses').forEach((r) => r.flush({ value: [] })); + ctrl.match((r) => r.url.includes('SeriesService')).forEach((r) => r.flush({ value: [] })); + ctrl.expectOne('/api/sl/Orders/5').flush({ + 'odata.etag': 'W/"1"', DocEntry: 5, DocNum: 5, CardCode: 'C1', CardName: 'ACME', U_Urgente: 'tNO', + DocDate: '2026-09-11T00:00:00Z', DocDueDate: '2026-09-20T00:00:00Z', DocumentStatus: 'bost_Open', Cancelled: 'tNO', + DocumentLines: [{ LineNum: 0, ItemCode: 'A1', ItemDescription: 'Pieza', Quantity: 1, Price: 10, TaxCode: '', LineTotal: 10 }], + }); + await tick(); + const el = fixture.nativeElement as HTMLElement; + const box = [...el.querySelectorAll('sbo-checkbox-field')].find((f) => f.querySelector('label')?.textContent?.trim() === 'Urgente')!.querySelector('input[type=checkbox]') as HTMLInputElement; + expect(box.checked).toBe(false); + box.click(); + await tick(); + (el.querySelector('.actions .btn.main') as HTMLElement).click(); + await tick(); + expect(ctrl.expectOne((r) => r.method === 'PATCH').request.body).toEqual({ U_Urgente: 'tYES' }); + }); +});