refactor(modal): replace 'content' with 'description' and update related tests

This commit is contained in:
2026-09-09 08:50:05 -03:00
parent f859eba8a8
commit 8c15ad7cc1
17 changed files with 59 additions and 43 deletions

View File

@@ -122,7 +122,7 @@ describe('ModalService', () => {
it('opens the standard confirm modal with default labels', () => { it('opens the standard confirm modal with default labels', () => {
const result$ = service.openConfirm({ const result$ = service.openConfirm({
title: 'Confirmar compra', title: 'Confirmar compra',
content: 'Esto confirmara la compra actual.', description: 'Esto confirmara la compra actual.',
}); });
const activeModal = service.activeModal(); const activeModal = service.activeModal();
@@ -130,9 +130,9 @@ describe('ModalService', () => {
expect(activeModal?.component).toBe(ConfirmModalComponent); expect(activeModal?.component).toBe(ConfirmModalComponent);
expect(result$).toBeDefined(); expect(result$).toBeDefined();
expect(activeModal?.config).toEqual({ expect(activeModal?.config).toEqual({
title: 'Confirmar compra',
data: { data: {
content: 'Esto confirmara la compra actual.', title: 'Confirmar compra',
description: 'Esto confirmara la compra actual.',
confirmLabel: 'Confirmar', confirmLabel: 'Confirmar',
cancelLabel: 'Cancelar', cancelLabel: 'Cancelar',
}, },
@@ -146,7 +146,7 @@ describe('ModalService', () => {
it('maps the confirm modal close result to true', async () => { it('maps the confirm modal close result to true', async () => {
const result$ = service.openConfirm({ const result$ = service.openConfirm({
title: 'Confirmar compra', title: 'Confirmar compra',
content: 'Esto confirmara la compra actual.', description: 'Esto confirmara la compra actual.',
}); });
const activeModal = service.activeModal(); const activeModal = service.activeModal();
const resultPromise = firstValueFrom(result$); const resultPromise = firstValueFrom(result$);
@@ -159,7 +159,7 @@ describe('ModalService', () => {
it('maps dismissing a confirm modal to false', async () => { it('maps dismissing a confirm modal to false', async () => {
const result$ = service.openConfirmDelete({ const result$ = service.openConfirmDelete({
title: 'Eliminar producto', title: 'Eliminar producto',
content: 'Se eliminara el producto.', description: 'Se eliminara el producto.',
}); });
const activeModal = service.activeModal(); const activeModal = service.activeModal();
const resultPromise = firstValueFrom(result$); const resultPromise = firstValueFrom(result$);
@@ -174,7 +174,7 @@ describe('ModalService', () => {
it('opens the delete confirm modal preserving modal overrides', () => { it('opens the delete confirm modal preserving modal overrides', () => {
service.openConfirmDelete({ service.openConfirmDelete({
title: 'Eliminar producto', title: 'Eliminar producto',
content: 'Se eliminara el producto.', description: 'Se eliminara el producto.',
confirmLabel: 'Eliminar', confirmLabel: 'Eliminar',
cancelLabel: 'Conservar', cancelLabel: 'Conservar',
size: 'lg', size: 'lg',
@@ -187,9 +187,9 @@ describe('ModalService', () => {
expect(activeModal?.component).toBe(ConfirmDeleteModalComponent); expect(activeModal?.component).toBe(ConfirmDeleteModalComponent);
expect(activeModal?.config).toEqual({ expect(activeModal?.config).toEqual({
title: 'Eliminar producto',
data: { data: {
content: 'Se eliminara el producto.', title: 'Eliminar producto',
description: 'Se eliminara el producto.',
confirmLabel: 'Eliminar', confirmLabel: 'Eliminar',
cancelLabel: 'Conservar', cancelLabel: 'Conservar',
}, },
@@ -203,16 +203,16 @@ describe('ModalService', () => {
it('opens the simple modal with default button label', () => { it('opens the simple modal with default button label', () => {
service.openSimple({ service.openSimple({
title: 'Aviso', title: 'Aviso',
content: 'Este es un aviso simple.', description: 'Este es un aviso simple.',
}); });
const activeModal = service.activeModal(); const activeModal = service.activeModal();
expect(activeModal?.component).toBe(SimpleModalComponent); expect(activeModal?.component).toBe(SimpleModalComponent);
expect(activeModal?.config).toEqual({ expect(activeModal?.config).toEqual({
title: 'Aviso',
data: { data: {
content: 'Este es un aviso simple.', title: 'Aviso',
description: 'Este es un aviso simple.',
buttonLabel: 'Entendido', buttonLabel: 'Entendido',
}, },
size: 'md', size: 'md',
@@ -225,7 +225,7 @@ describe('ModalService', () => {
it('maps the simple modal close result to undefined', async () => { it('maps the simple modal close result to undefined', async () => {
const result$ = service.openSimple({ const result$ = service.openSimple({
title: 'Aviso', title: 'Aviso',
content: 'Este es un aviso simple.', description: 'Este es un aviso simple.',
}); });
const activeModal = service.activeModal(); const activeModal = service.activeModal();
const resultPromise = firstValueFrom(result$); const resultPromise = firstValueFrom(result$);

View File

@@ -31,24 +31,28 @@ export interface NormalizedModalConfig<TData = unknown> extends Omit<
} }
export interface ConfirmModalData { export interface ConfirmModalData {
content: string; title: string;
description?: string;
confirmLabel: string; confirmLabel: string;
cancelLabel: string; cancelLabel: string;
} }
export interface ConfirmModalConfig extends Omit<ModalConfig<ConfirmModalData>, 'data'> { export interface ConfirmModalConfig extends Omit<ModalConfig<ConfirmModalData>, 'data'> {
content: string; title: string;
description?: string;
confirmLabel?: string; confirmLabel?: string;
cancelLabel?: string; cancelLabel?: string;
} }
export interface SimpleModalData { export interface SimpleModalData {
content: string; title: string;
description?: string;
buttonLabel: string; buttonLabel: string;
} }
export interface SimpleModalConfig extends Omit<ModalConfig<SimpleModalData>, 'data'> { export interface SimpleModalConfig extends Omit<ModalConfig<SimpleModalData>, 'data'> {
content: string; title: string;
description?: string;
buttonLabel?: string; buttonLabel?: string;
} }
@@ -274,7 +278,8 @@ export class ModalService {
private buildConfirmModalConfig(config: ConfirmModalConfig): ModalConfig<ConfirmModalData> { private buildConfirmModalConfig(config: ConfirmModalConfig): ModalConfig<ConfirmModalData> {
const { const {
content, title,
description,
confirmLabel = DEFAULT_CONFIRM_MODAL_LABELS.confirmLabel, confirmLabel = DEFAULT_CONFIRM_MODAL_LABELS.confirmLabel,
cancelLabel = DEFAULT_CONFIRM_MODAL_LABELS.cancelLabel, cancelLabel = DEFAULT_CONFIRM_MODAL_LABELS.cancelLabel,
...modalConfig ...modalConfig
@@ -283,7 +288,8 @@ export class ModalService {
return { return {
...modalConfig, ...modalConfig,
data: { data: {
content, title,
description,
confirmLabel, confirmLabel,
cancelLabel, cancelLabel,
}, },
@@ -291,12 +297,13 @@ export class ModalService {
} }
private buildSimpleModalConfig(config: SimpleModalConfig): ModalConfig<SimpleModalData> { private buildSimpleModalConfig(config: SimpleModalConfig): ModalConfig<SimpleModalData> {
const { content, buttonLabel = 'Entendido', ...modalConfig } = config; const { title, description, buttonLabel = 'Entendido', ...modalConfig } = config;
return { return {
...modalConfig, ...modalConfig,
data: { data: {
content, title,
description,
buttonLabel, buttonLabel,
}, },
}; };

View File

@@ -299,12 +299,12 @@ describe('ReutilizablesTestPageComponent', () => {
expect(modalServiceStub.openConfirm).toHaveBeenCalledWith({ expect(modalServiceStub.openConfirm).toHaveBeenCalledWith({
title: 'Confirmar accion', title: 'Confirmar accion',
content: 'Caso base para verificar apertura, cierre y devolucion de resultado.', description: 'Caso base para verificar apertura, cierre y devolucion de resultado.',
confirmLabel: 'Confirmar', confirmLabel: 'Confirmar',
}); });
expect(modalServiceStub.openConfirmDelete).toHaveBeenCalledWith({ expect(modalServiceStub.openConfirmDelete).toHaveBeenCalledWith({
title: 'Eliminar producto', title: 'Eliminar producto',
content: description:
'Esta accion eliminara el producto del catalogo. Podras volver a crearlo manualmente.', 'Esta accion eliminara el producto del catalogo. Podras volver a crearlo manualmente.',
confirmLabel: 'Eliminar', confirmLabel: 'Eliminar',
}); });

View File

@@ -448,7 +448,7 @@ export class ReutilizablesTestPageComponent {
protected openBasicModal(): void { protected openBasicModal(): void {
this.openConfirmModal({ this.openConfirmModal({
title: 'Confirmar accion', title: 'Confirmar accion',
content: 'Caso base para verificar apertura, cierre y devolucion de resultado.', description: 'Caso base para verificar apertura, cierre y devolucion de resultado.',
confirmLabel: 'Confirmar', confirmLabel: 'Confirmar',
}); });
} }
@@ -456,7 +456,7 @@ export class ReutilizablesTestPageComponent {
protected openConfirmDeleteModal(): void { protected openConfirmDeleteModal(): void {
this.openConfirmDelete({ this.openConfirmDelete({
title: 'Eliminar producto', title: 'Eliminar producto',
content: description:
'Esta accion eliminara el producto del catalogo. Podras volver a crearlo manualmente.', 'Esta accion eliminara el producto del catalogo. Podras volver a crearlo manualmente.',
confirmLabel: 'Eliminar', confirmLabel: 'Eliminar',
}); });
@@ -465,7 +465,7 @@ export class ReutilizablesTestPageComponent {
protected openLockedModal(): void { protected openLockedModal(): void {
this.openConfirmModal({ this.openConfirmModal({
title: 'Modal bloqueado', title: 'Modal bloqueado',
content: 'Este modal no se cierra tocando el backdrop ni con la tecla Escape.', description: 'Este modal no se cierra tocando el backdrop ni con la tecla Escape.',
confirmLabel: 'Entendido', confirmLabel: 'Entendido',
closeOnBackdrop: false, closeOnBackdrop: false,
closeOnEscape: false, closeOnEscape: false,
@@ -475,7 +475,7 @@ export class ReutilizablesTestPageComponent {
protected openWideModal(): void { protected openWideModal(): void {
this.openConfirmModal({ this.openConfirmModal({
title: 'Modal ancho', title: 'Modal ancho',
content: 'Demuestra una variante visual mas amplia para contenido mas pesado.', description: 'Demuestra una variante visual mas amplia para contenido mas pesado.',
confirmLabel: 'Seguir', confirmLabel: 'Seguir',
size: 'xl', size: 'xl',
}); });
@@ -485,7 +485,7 @@ export class ReutilizablesTestPageComponent {
this.modalService this.modalService
.openSimple({ .openSimple({
title: 'Mensaje del sistema', title: 'Mensaje del sistema',
content: 'Este es un mensaje simple del sistema que no requiere confirmación.', description: 'Este es un mensaje simple del sistema que no requiere confirmación.',
buttonLabel: 'Entendido', buttonLabel: 'Entendido',
}) })
.subscribe(() => { .subscribe(() => {

View File

@@ -105,7 +105,7 @@ describe('RegisterPageComponent', () => {
password_confirmation: 'Secret!123' password_confirmation: 'Secret!123'
}); });
expect(modalService.openSimple).toHaveBeenCalledWith({ expect(modalService.openSimple).toHaveBeenCalledWith({
content: 'Tu cuenta fue creada correctamente', title: 'Tu cuenta fue creada correctamente',
buttonLabel: 'Cerrar' buttonLabel: 'Cerrar'
}); });
expect(navigateSpy).toHaveBeenCalledWith(['/login']); expect(navigateSpy).toHaveBeenCalledWith(['/login']);

View File

@@ -93,7 +93,7 @@ export class RegisterPageComponent {
next: () => { next: () => {
this.isSubmittingState.set(false); this.isSubmittingState.set(false);
this.modalService.openSimple({ this.modalService.openSimple({
content: 'Tu cuenta fue creada correctamente', title: 'Tu cuenta fue creada correctamente',
buttonLabel: 'Cerrar' buttonLabel: 'Cerrar'
}).subscribe(() => { }).subscribe(() => {
void this.router.navigate(['/login']); void this.router.navigate(['/login']);

View File

@@ -144,7 +144,7 @@ describe('ResetPasswordPageComponent', () => {
password_confirmation: 'Secret!123', password_confirmation: 'Secret!123',
}); });
expect(modalService.openSimple).toHaveBeenCalledWith({ expect(modalService.openSimple).toHaveBeenCalledWith({
content: 'Contraseña modificada correctamente', title: 'Contraseña modificada correctamente',
buttonLabel: 'Cerrar', buttonLabel: 'Cerrar',
}); });
expect(navigateSpy).toHaveBeenCalledWith(['/login']); expect(navigateSpy).toHaveBeenCalledWith(['/login']);

View File

@@ -155,7 +155,7 @@ export class ResetPasswordPageComponent {
this.modalService this.modalService
.openSimple({ .openSimple({
content: 'Contraseña modificada correctamente', title: 'Contraseña modificada correctamente',
buttonLabel: 'Cerrar', buttonLabel: 'Cerrar',
}) })
.subscribe(() => { .subscribe(() => {

View File

@@ -115,7 +115,7 @@ describe('CartComponent', () => {
expect(openConfirmDelete).toHaveBeenCalledWith({ expect(openConfirmDelete).toHaveBeenCalledWith({
title: 'Eliminar producto', title: 'Eliminar producto',
content: 'Se eliminará “Producto de prueba” del carrito. Esta acción no se puede deshacer.', description: 'Se eliminará “Producto de prueba” del carrito. Esta acción no se puede deshacer.',
confirmLabel: 'Eliminar', confirmLabel: 'Eliminar',
cancelLabel: 'Cancelar', cancelLabel: 'Cancelar',
}); });

View File

@@ -236,7 +236,7 @@ export class CartComponent {
this.modalService this.modalService
.openConfirmDelete({ .openConfirmDelete({
title: 'Eliminar producto', title: 'Eliminar producto',
content: `Se eliminará “${target.productName}” del carrito. Esta acción no se puede deshacer.`, description: `Se eliminará “${target.productName}” del carrito. Esta acción no se puede deshacer.`,
confirmLabel: 'Eliminar', confirmLabel: 'Eliminar',
cancelLabel: 'Cancelar', cancelLabel: 'Cancelar',
}) })

View File

@@ -1,5 +1,8 @@
<div class="confirm-modal"> <div class="confirm-modal">
<p class="confirm-modal__content">{{ data.content }}</p> <h2 class="confirm-modal__content">{{ data.title }}</h2>
@if (data.description) {
<p class="confirm-modal__content">{{ data.description }}</p>
}
<div class="confirm-modal__actions"> <div class="confirm-modal__actions">
<app-button variant="danger-secondary" (click)="cancel()"> <app-button variant="danger-secondary" (click)="cancel()">

View File

@@ -15,7 +15,7 @@ import { ConfirmDeleteModalComponent } from './confirm-delete-modal.component';
describe('ConfirmDeleteModalComponent', () => { describe('ConfirmDeleteModalComponent', () => {
const data: ConfirmModalData = { const data: ConfirmModalData = {
content: 'Se eliminara el elemento seleccionado.', title: 'Se eliminara el elemento seleccionado.',
confirmLabel: 'Eliminar', confirmLabel: 'Eliminar',
cancelLabel: 'Cancelar' cancelLabel: 'Cancelar'
}; };
@@ -58,7 +58,7 @@ describe('ConfirmDeleteModalComponent', () => {
const element = fixture.nativeElement as HTMLElement; const element = fixture.nativeElement as HTMLElement;
const buttons = element.querySelectorAll('button'); const buttons = element.querySelectorAll('button');
expect(element.textContent).toContain(data.content); expect(element.textContent).toContain(data.title);
expect(element.textContent).toContain(data.confirmLabel); expect(element.textContent).toContain(data.confirmLabel);
expect(buttons[1].className).toContain('btn-danger'); expect(buttons[1].className).toContain('btn-danger');
}); });

View File

@@ -1,5 +1,8 @@
<div class="confirm-modal"> <div class="confirm-modal">
<p class="confirm-modal__content">{{ data.content }}</p> <h2 class="confirm-modal__content">{{ data.title }}</h2>
@if (data.description) {
<p class="confirm-modal__content">{{ data.description }}</p>
}
<div class="confirm-modal__actions"> <div class="confirm-modal__actions">
<app-button variant="secondary" (click)="cancel()"> <app-button variant="secondary" (click)="cancel()">

View File

@@ -15,7 +15,7 @@ import { ConfirmModalComponent } from './confirm-modal.component';
describe('ConfirmModalComponent', () => { describe('ConfirmModalComponent', () => {
const data: ConfirmModalData = { const data: ConfirmModalData = {
content: 'Se confirmara la operacion seleccionada.', title: 'Se confirmara la operacion seleccionada.',
confirmLabel: 'Aceptar', confirmLabel: 'Aceptar',
cancelLabel: 'Volver' cancelLabel: 'Volver'
}; };
@@ -57,7 +57,7 @@ describe('ConfirmModalComponent', () => {
const element = fixture.nativeElement as HTMLElement; const element = fixture.nativeElement as HTMLElement;
expect(element.textContent).toContain(data.content); expect(element.textContent).toContain(data.title);
expect(element.textContent).toContain(data.confirmLabel); expect(element.textContent).toContain(data.confirmLabel);
expect(element.textContent).toContain(data.cancelLabel); expect(element.textContent).toContain(data.cancelLabel);
}); });

View File

@@ -176,7 +176,7 @@ export class ProductTicketSelectorComponent {
this.modalService this.modalService
.openConfirmDelete({ .openConfirmDelete({
title: 'Eliminar entrada', title: 'Eliminar entrada',
content: `Se eliminará esta entrada de “${this.title()}”. Si ya estaba reservada, se liberará del carrito.`, description: `Se eliminará esta entrada de “${this.title()}”. Si ya estaba reservada, se liberará del carrito.`,
confirmLabel: 'Sí, eliminar', confirmLabel: 'Sí, eliminar',
cancelLabel: 'Cancelar', cancelLabel: 'Cancelar',
size: 'md', size: 'md',

View File

@@ -1,5 +1,8 @@
<div class="simple-modal"> <div class="simple-modal">
<p class="simple-modal__content">{{ data.content }}</p> <h2 class="simple-modal__content">{{ data.title }}</h2>
@if (data.description) {
<p class="simple-modal__content">{{ data.description }}</p>
}
<div class="simple-modal__actions"> <div class="simple-modal__actions">
<app-button (click)="close()"> <app-button (click)="close()">

View File

@@ -15,7 +15,7 @@ import { SimpleModalComponent } from './simple-modal.component';
describe('SimpleModalComponent', () => { describe('SimpleModalComponent', () => {
const data: SimpleModalData = { const data: SimpleModalData = {
content: 'Este es un mensaje simple.', title: 'Este es un mensaje simple.',
buttonLabel: 'Entendido' buttonLabel: 'Entendido'
}; };
@@ -56,7 +56,7 @@ describe('SimpleModalComponent', () => {
const element = fixture.nativeElement as HTMLElement; const element = fixture.nativeElement as HTMLElement;
expect(element.textContent).toContain(data.content); expect(element.textContent).toContain(data.title);
expect(element.textContent).toContain(data.buttonLabel); expect(element.textContent).toContain(data.buttonLabel);
}); });