🧠 AlpuraModalViewModel – Guía de uso
El servicio AlpuraModalViewModel proporciona una interfaz programática para desplegar modales estandarizados (AlpuraModalComponent) y modales personalizados con inyección dinámica de componentes. Encapsula la configuración de Angular Material Dialog para asegurar la consistencia visual y de comportamiento en toda la aplicación.
📁 Importación
import {
AlpuraModalViewModel,
IAlpuraModalData,
IAlpuraCustomModalData,
ALPURA_CUSTOM_MODAL_DATA
} from '@alpura/commons';
📞 Métodos Públicos
1. showModal(data: IAlpuraModalData)
Despliega un modal estandarizado con la configuración proporcionada (para alertas de confirmación, advertencia, éxito o error).
- Parámetros:
data: Objeto de tipoIAlpuraModalDataque define el título, mensaje, tipo y etiquetas de los botones.
- Retorno:
MatDialogRef<AlpuraModalComponent, boolean>: Referencia del diálogo abierto que permite suscribirse al evento.afterClosed().
2. showModalCustom<R = any, D = any>(config: IAlpuraCustomModalData<D>)
Despliega un modal personalizado inyectando dinámicamente cualquier componente de Angular dentro del cuerpo del modal.
- Características:
- Barra Superior Fija: La línea de estado superior permanece siempre visible con el color del tipo elegido.
- Botones Opcionales (0, 1 o 2 botones):
confirmTextycancelTextson parametrizables. Si no se especifican, la barra inferior de botones no se renderiza. - Integración con Formularios: Al hacer clic en el botón primario de confirmación, el modal evalúa automáticamente si el componente inyectado implementa
onSubmit(),submit()o posee unformGrouppara validar y enviar los datos antes de cerrar el modal.
- Parámetros:
config: Objeto de tipoIAlpuraCustomModalData<D>que define el componente a renderizar, datos de inyección, título y configuración de botones.
- Retorno:
MatDialogRef<AlpuraModalComponent, R>: Referencia del diálogo que emite la respuesta enviada por el componente inyectado.
🧪 Estructuras de Datos
Modal Estándar (IAlpuraModalData)
export interface IAlpuraModalData {
title: string;
boldTitle?: boolean;
message: string;
type: 'success' | 'error' | 'warning' | 'info';
confirmText?: string;
cancelText?: string;
}
Modal Personalizado (IAlpuraCustomModalData<D>)
export interface IAlpuraCustomModalData<D = any> {
title?: string;
boldTitle?: boolean;
type?: 'success' | 'error' | 'warning' | 'info' | 'primary';
confirmText?: string;
cancelText?: string;
component: Type<any>;
componentData?: D;
width?: string;
disableClose?: boolean;
}
💻 Ejemplos de uso
Ejemplo 1: Modal Estándar (Confirmación)
this.alpuraModalViewModel.showModal({
title: 'Atención',
message: 'IMPORTANTE: Esta acción no se puede deshacer.',
type: 'warning',
confirmText: 'Aceptar',
cancelText: 'Cancelar'
}).afterClosed().subscribe(result => {
if (result) {
// Lógica al confirmar
}
});
Ejemplo 2: Modal Custom con Inyección de Componente y Datos
mi-formulario-modal.component.ts (Componente inyectado)
import { Component, inject } from '@angular/core';
import { FormBuilder, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms';
import { ALPURA_CUSTOM_MODAL_DATA } from '@alpura/commons';
@Component({
selector: 'app-mi-formulario-modal',
standalone: true,
imports: [ReactiveFormsModule],
template: `
<form [formGroup]="form">
<label>Motivo de edición para registro #{{ modalData?.id }}:</label>
<textarea formControlName="motivo" class="form-control"></textarea>
</form>
`
})
export class MiFormularioModalComponent {
// Recibir datos inyectados
public modalData = inject<{ id: number }>(ALPURA_CUSTOM_MODAL_DATA, { optional: true });
private fb = inject(FormBuilder);
public form: FormGroup = this.fb.group({
motivo: ['', Validators.required]
});
// Se ejecuta automáticamente al dar clic en el botón confirmText del modal
onSubmit() {
if (this.form.valid) {
return this.form.value; // Retorna los datos que recibirá el .afterClosed()
}
this.form.markAllAsTouched();
return false; // Evita el cierre del modal si es inválido
}
}
Invocación desde tu vista/servicio:
this.alpuraModalViewModel.showModalCustom({
title: 'Editar Registro',
type: 'primary',
confirmText: 'Guardar Cambios',
cancelText: 'Cancelar',
component: MiFormularioModalComponent,
componentData: { id: 1045 },
width: '500px'
}).afterClosed().subscribe((resData) => {
if (resData) {
console.log('Datos guardados desde el modal custom:', resData);
}
});
📬 Soporte
Para dudas o mantenimiento del servicio AlpuraModalViewModel, contactar al equipo de arquitectura.