@jvsoft/components 0.0.13-alpha.4 → 1.0.0-alpha.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/alerta/README.md +102 -0
- package/alerta/alerta.component.d.ts +29 -0
- package/alerta/index.d.ts +5 -0
- package/alerta/public-api.d.ts +1 -0
- package/dialog-flotante/README.md +169 -0
- package/dialog-flotante/dialog-flotante.component.d.ts +13 -22
- package/fesm2022/jvsoft-components-alerta.mjs +88 -0
- package/fesm2022/jvsoft-components-alerta.mjs.map +1 -0
- package/fesm2022/jvsoft-components-dialog-flotante.mjs +49 -83
- package/fesm2022/jvsoft-components-dialog-flotante.mjs.map +1 -1
- package/fesm2022/jvsoft-components-filtro-busqueda.mjs +660 -0
- package/fesm2022/jvsoft-components-filtro-busqueda.mjs.map +1 -0
- package/fesm2022/jvsoft-components-lista-arbol.mjs +121 -145
- package/fesm2022/jvsoft-components-lista-arbol.mjs.map +1 -1
- package/fesm2022/jvsoft-components-luces-navidad.mjs.map +1 -1
- package/fesm2022/jvsoft-components-mat-suffix-search-button.mjs +4 -2
- package/fesm2022/jvsoft-components-mat-suffix-search-button.mjs.map +1 -1
- package/fesm2022/jvsoft-components-menu.mjs.map +1 -1
- package/fesm2022/jvsoft-components-tabla-mantenimiento-components-progress-bar.mjs +1 -1
- package/fesm2022/jvsoft-components-tabla-mantenimiento-components-progress-bar.mjs.map +1 -1
- package/fesm2022/jvsoft-components-tabla-mantenimiento.mjs +107 -61
- package/fesm2022/jvsoft-components-tabla-mantenimiento.mjs.map +1 -1
- package/fesm2022/jvsoft-components.mjs +1004 -302
- package/fesm2022/jvsoft-components.mjs.map +1 -1
- package/filtro-busqueda/README.md +156 -0
- package/filtro-busqueda/filtro-busqueda.component.d.ts +89 -0
- package/filtro-busqueda/filtro-busqueda.component.scss +98 -0
- package/filtro-busqueda/filtro-busqueda.service.d.ts +40 -0
- package/filtro-busqueda/index.d.ts +5 -0
- package/filtro-busqueda/interfaces/filtro-busqueda.interface.d.ts +86 -0
- package/filtro-busqueda/public-api.d.ts +3 -0
- package/index.d.ts +2 -0
- package/lista-arbol/README.md +268 -0
- package/lista-arbol/lista-arbol.component.d.ts +36 -37
- package/package.json +22 -15
- package/src/styles/base-jvsoft-components.css +6 -4
- package/src/styles/base.scss +1 -0
- package/tabla-mantenimiento/interfaces/global/columnas-tabla.d.ts +9 -10
- package/tabla-mantenimiento/interfaces/global/otros.d.ts +1 -0
- package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type.module.d.ts +2 -1
- package/tabla-mantenimiento/tabla-mantenimiento.component.d.ts +15 -8
- package/tabla-mantenimiento/tabla-mantenimiento.component.scss +14 -1
package/alerta/README.md
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Alerta Component
|
|
2
|
+
|
|
3
|
+
El `AlertaComponent` (selector: `jvs-alerta`) es un componente moderno y versátil para mostrar mensajes informativos, de error, éxito o advertencia. Está construido usando **Angular 19 Signals** y es **Standalone**.
|
|
4
|
+
|
|
5
|
+
## 📦 Características
|
|
6
|
+
|
|
7
|
+
- **Moderno**: Utiliza Signals para una reactividad eficiente y sintaxis de control flow de Angular.
|
|
8
|
+
- **Standalone**: Sin dependencias de módulos, fácil de importar.
|
|
9
|
+
- **Altamente Personalizable**: Permite sobreescribir clases de Tailwind para cada parte del componente, iconos y contenido.
|
|
10
|
+
- **Premium por Defecto**: Viene con estilos predefinidos elegantes y bordes redondeados (`rounded-xl`).
|
|
11
|
+
|
|
12
|
+
## 🚀 Uso Básico
|
|
13
|
+
|
|
14
|
+
Importa el componente en tu componente standalone:
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
import { AlertaComponent } from '@jvsoft/components/alerta';
|
|
18
|
+
|
|
19
|
+
@Component({
|
|
20
|
+
imports: [AlertaComponent, ...],
|
|
21
|
+
// ...
|
|
22
|
+
})
|
|
23
|
+
export class MiComponente {}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Uso en la plantilla:
|
|
27
|
+
|
|
28
|
+
```html
|
|
29
|
+
<jvs-alerta
|
|
30
|
+
tipo="success"
|
|
31
|
+
titulo="Operación Exitosa"
|
|
32
|
+
mensaje="Los datos se han guardado correctamente."
|
|
33
|
+
></jvs-alerta>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## 🛠 API
|
|
37
|
+
|
|
38
|
+
### Inputs (Signals)
|
|
39
|
+
|
|
40
|
+
| Input | Tipo | Default | Descripción |
|
|
41
|
+
|-------|------|---------|-------------|
|
|
42
|
+
| `tipo` | `AlertaTipo` | `'info'` | Define el estilo visual. Valores: `'info' \| 'error' \| 'success' \| 'warning' \| 'custom'`. |
|
|
43
|
+
| `titulo` | `string` | `undefined` | Texto resaltado en la parte superior. |
|
|
44
|
+
| `mensaje` | `string` | `undefined` | Texto descriptivo del mensaje. |
|
|
45
|
+
| `icono` | `string` | `undefined` | Sobreescribe el icono SVG por defecto. |
|
|
46
|
+
| `clases` | `AlertaClases` | `{}` | Objeto para personalización granular de CSS (ver abajo). |
|
|
47
|
+
| `botonCerrar` | `boolean` | `false` | Muestra un botón "X" para cerrar la alerta. |
|
|
48
|
+
| `botonAcepto` | `boolean` | `false` | Muestra un botón de acción "Aceptar". |
|
|
49
|
+
| `textoAcepto` | `string` | `'Lo entiendo'` | Etiqueta del botón de acción. |
|
|
50
|
+
|
|
51
|
+
### Outputs
|
|
52
|
+
|
|
53
|
+
| Output | Evento | Descripción |
|
|
54
|
+
|--------|--------|-------------|
|
|
55
|
+
| `alCerrar` | `void` | Se emite al hacer clic en el botón de cerrar. |
|
|
56
|
+
| `alAceptar` | `void` | Se emite al hacer clic en el botón de acción "Aceptar". |
|
|
57
|
+
|
|
58
|
+
### Interfaz `AlertaClases`
|
|
59
|
+
|
|
60
|
+
Permite inyectar clases de Tailwind adicionales en partes específicas:
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
interface AlertaClases {
|
|
64
|
+
contenedor?: string; // Div principal
|
|
65
|
+
icono?: string; // Contenedor del icono
|
|
66
|
+
titulo?: string; // Título h4
|
|
67
|
+
mensaje?: string; // Div del mensaje
|
|
68
|
+
acciones?: string; // Contenedor del botón de acción
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## 🎨 Ejemplos de Personalización
|
|
73
|
+
|
|
74
|
+
### 1. Personalización de Clases
|
|
75
|
+
Si usas `tipo="custom"`, los estilos por defecto se omiten y puedes definirlos totalmente:
|
|
76
|
+
|
|
77
|
+
```html
|
|
78
|
+
<jvs-alerta
|
|
79
|
+
tipo="custom"
|
|
80
|
+
[clases]="{
|
|
81
|
+
contenedor: 'bg-indigo-600 text-white rounded-lg p-6',
|
|
82
|
+
icono: 'text-indigo-200 shadow-sm'
|
|
83
|
+
}"
|
|
84
|
+
icono="roundAutoAwesome"
|
|
85
|
+
mensaje="Este es un mensaje totalmente personalizado."
|
|
86
|
+
></jvs-alerta>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 2. Uso con Content Projection
|
|
90
|
+
En lugar del input `mensaje`, puedes proyectar cualquier HTML:
|
|
91
|
+
|
|
92
|
+
```html
|
|
93
|
+
<jvs-alerta tipo="warning" titulo="Atención Requerida">
|
|
94
|
+
<div class="flex flex-col gap-2">
|
|
95
|
+
<p>Por favor revise los siguientes puntos:</p>
|
|
96
|
+
<ul class="list-disc ml-4">
|
|
97
|
+
<li>Paso 1: Verificar firma</li>
|
|
98
|
+
<li>Paso 2: Adjuntar anexos</li>
|
|
99
|
+
</ul>
|
|
100
|
+
</div>
|
|
101
|
+
</jvs-alerta>
|
|
102
|
+
```
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
export interface AlertaClases {
|
|
3
|
+
contenedor?: string;
|
|
4
|
+
icono?: string;
|
|
5
|
+
titulo?: string;
|
|
6
|
+
mensaje?: string;
|
|
7
|
+
acciones?: string;
|
|
8
|
+
}
|
|
9
|
+
export type AlertaTipo = 'info' | 'error' | 'success' | 'warning' | 'custom';
|
|
10
|
+
export declare class AlertaComponent {
|
|
11
|
+
tipo: import("@angular/core").InputSignal<AlertaTipo>;
|
|
12
|
+
titulo: import("@angular/core").InputSignal<string | undefined>;
|
|
13
|
+
mensaje: import("@angular/core").InputSignal<string | undefined>;
|
|
14
|
+
iconoManual: import("@angular/core").InputSignal<string | undefined>;
|
|
15
|
+
clasesManual: import("@angular/core").InputSignal<AlertaClases>;
|
|
16
|
+
botonCerrar: import("@angular/core").InputSignal<boolean>;
|
|
17
|
+
botonAcepto: import("@angular/core").InputSignal<boolean>;
|
|
18
|
+
textoAcepto: import("@angular/core").InputSignal<string>;
|
|
19
|
+
alCerrar: import("@angular/core").OutputEmitterRef<void>;
|
|
20
|
+
alAceptar: import("@angular/core").OutputEmitterRef<void>;
|
|
21
|
+
private defaults;
|
|
22
|
+
clasesContenedor: import("@angular/core").Signal<string>;
|
|
23
|
+
iconoFinal: import("@angular/core").Signal<string>;
|
|
24
|
+
clasesIcono: import("@angular/core").Signal<string>;
|
|
25
|
+
clasesTitulo: import("@angular/core").Signal<string>;
|
|
26
|
+
clasesMensaje: import("@angular/core").Signal<string>;
|
|
27
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AlertaComponent, never>;
|
|
28
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<AlertaComponent, "jvs-alerta", never, { "tipo": { "alias": "tipo"; "required": false; "isSignal": true; }; "titulo": { "alias": "titulo"; "required": false; "isSignal": true; }; "mensaje": { "alias": "mensaje"; "required": false; "isSignal": true; }; "iconoManual": { "alias": "icono"; "required": false; "isSignal": true; }; "clasesManual": { "alias": "clases"; "required": false; "isSignal": true; }; "botonCerrar": { "alias": "botonCerrar"; "required": false; "isSignal": true; }; "botonAcepto": { "alias": "botonAcepto"; "required": false; "isSignal": true; }; "textoAcepto": { "alias": "textoAcepto"; "required": false; "isSignal": true; }; }, { "alCerrar": "alCerrar"; "alAceptar": "alAceptar"; }, never, ["*"], true, never>;
|
|
29
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './alerta.component';
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# Dialog Flotante Component
|
|
2
|
+
|
|
3
|
+
El `DialogFlotanteComponent` es un componente contenedor estandarizado para diálogos de Angular Material. Proporciona una estructura consistente con barra de título arrastrable (`cdkDrag`), área de contenido y barra de acciones inferior, todo altamente configurable.
|
|
4
|
+
|
|
5
|
+
## 📦 Características
|
|
6
|
+
|
|
7
|
+
- **Arrastrable**: Integra `cdkDrag` para permitir mover el diálogo desde el título.
|
|
8
|
+
- **Estructura Estándar**: Título, Cuerpo y Pie de página (acciones).
|
|
9
|
+
- **Configurable**: Permite ocultar título, barra de acciones, personalizar botones por defecto.
|
|
10
|
+
- **Content Projection**: Múltiples slots para inyectar contenido en título, cuerpo y pie.
|
|
11
|
+
- **Responsive**: Adaptado para móviles y escritorio.
|
|
12
|
+
|
|
13
|
+
## 🚀 Uso Básico
|
|
14
|
+
|
|
15
|
+
Importa el componente en tu módulo o componente standalone:
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { DialogFlotanteComponent } from '@jvsoft/components/dialog-flotante';
|
|
19
|
+
|
|
20
|
+
@Component({
|
|
21
|
+
imports: [DialogFlotanteComponent, ...],
|
|
22
|
+
// ...
|
|
23
|
+
})
|
|
24
|
+
export class MiDialogoComponent {
|
|
25
|
+
constructor(public dialogRef: MatDialogRef<MiDialogoComponent>) {}
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Úsalo en la plantilla de tu componente de diálogo:
|
|
30
|
+
|
|
31
|
+
```html
|
|
32
|
+
<div jvsDialogFlotante [matDialogRefActual]="dialogRef" [btnGuardar]="true" (btnGuardarClick)="guardar()">
|
|
33
|
+
<span titulo>Título del Diálogo</span>
|
|
34
|
+
|
|
35
|
+
<div cuerpo>
|
|
36
|
+
<p>Contenido principal del diálogo...</p>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 🛠 API
|
|
42
|
+
|
|
43
|
+
### Inputs
|
|
44
|
+
|
|
45
|
+
| Input | Tipo | Default | Descripción |
|
|
46
|
+
|-------|------|---------|-------------|
|
|
47
|
+
| `matDialogRefActual` | `MatDialogRef<any>` | `undefined` | Referencia al diálogo actual. Necesario para la funcionalidad de cerrar. |
|
|
48
|
+
| `sinTitulo` | `boolean` | `false` | Si es `true`, oculta la barra de título y deshabilita el arrastre. |
|
|
49
|
+
| `sinBarraDeAccion` | `boolean` | `false` | Si es `true`, oculta la barra de botones inferior. |
|
|
50
|
+
| `btnCerrarBarra` | `boolean` | `false` | Muestra un botón "X" de cierre en la barra de título. |
|
|
51
|
+
| `iconoTitulo` | `string` | `undefined` | Nombre del icono SVG para mostrar en el título. |
|
|
52
|
+
| `btnGuardar` | `BotonDialog \| boolean \| string` | `undefined` | Configuración del botón "Guardar". Ver [Configuración de Botones](#configuración-de-botones). |
|
|
53
|
+
| `btnCerrar` | `BotonDialog \| boolean \| string` | `undefined` | Configuración del botón "Cerrar". Ver [Configuración de Botones](#configuración-de-botones). |
|
|
54
|
+
| `cssClases` | `Record<string, string>` | `{}` | Clases CSS personalizadas para partes del componente. |
|
|
55
|
+
|
|
56
|
+
### Outputs
|
|
57
|
+
|
|
58
|
+
| Output | Evento | Descripción |
|
|
59
|
+
|--------|--------|-------------|
|
|
60
|
+
| `btnGuardarClick` | `any` | Se emite al hacer clic en el botón "Guardar" por defecto. |
|
|
61
|
+
| `btnCerrarClick` | `any` | Se emite al hacer clic en el botón "Cerrar" por defecto. |
|
|
62
|
+
|
|
63
|
+
### Content Projection (Slots)
|
|
64
|
+
|
|
65
|
+
El componente utiliza selectores de atributos para proyectar contenido en áreas específicas:
|
|
66
|
+
|
|
67
|
+
| Selector | Ubicación | Descripción |
|
|
68
|
+
|----------|-----------|-------------|
|
|
69
|
+
| `[titulo]` | Barra de Título | Texto o contenido principal del título. |
|
|
70
|
+
| `[tituloImagen]` | Barra de Título | Imagen o icono adicional a la izquierda del título. |
|
|
71
|
+
| `[selectTitulo]` | Barra de Título | Contenido a la derecha del título (ej. un selector). |
|
|
72
|
+
| `[cuerpo]` | Centro | Contenido principal del diálogo (dentro de `mat-dialog-content`). |
|
|
73
|
+
| `[pieIzquierda]` | Pie de Página | Contenido alineado a la izquierda en la barra de acciones. |
|
|
74
|
+
| `[pieCentro]` | Pie de Página | Contenido centrado en la barra de acciones. |
|
|
75
|
+
| `[pieDerecha]` | Pie de Página | Contenido a la derecha, antes de los botones por defecto. |
|
|
76
|
+
|
|
77
|
+
## ⚙️ Configuración de Botones
|
|
78
|
+
|
|
79
|
+
Los inputs `btnGuardar` y `btnCerrar` aceptan varios tipos de valores para máxima flexibilidad:
|
|
80
|
+
|
|
81
|
+
- **`boolean`**:
|
|
82
|
+
- `true`: Muestra el botón con configuración por defecto.
|
|
83
|
+
- `false`: Oculta el botón.
|
|
84
|
+
- **`string`**: Muestra el botón cambiando solo su etiqueta (label).
|
|
85
|
+
- **`BotonDialog`**: Objeto de configuración completa.
|
|
86
|
+
|
|
87
|
+
### Interfaz `BotonDialog`
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
interface BotonDialog {
|
|
91
|
+
label?: string; // Texto del botón
|
|
92
|
+
class?: string; // Clases CSS (ej. colores Tailwind)
|
|
93
|
+
icono?: string; // Icono SVG
|
|
94
|
+
tipo?: string; // Tipo de acción (opcional)
|
|
95
|
+
sinCondicion?: boolean; // (Uso interno)
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
#### Valores por Defecto
|
|
100
|
+
|
|
101
|
+
- **Guardar**: Label "GUARDAR", Clase `text-blue-700 border-blue-700`, Icono `roundSave`.
|
|
102
|
+
- **Cerrar**: Label "CERRAR", Clase `text-gray-700 border-gray-700`, Icono `roundClose`.
|
|
103
|
+
|
|
104
|
+
## 🎨 Personalización de Estilos (`cssClases`)
|
|
105
|
+
|
|
106
|
+
Puedes pasar un objeto para sobrescribir clases de secciones específicas:
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
cssClases = {
|
|
110
|
+
titulo: 'bg-red-500 text-white', // Cambia color de barra de título
|
|
111
|
+
btnGuardar: 'bg-green-600 text-white' // Estilo extra para botón guardar
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## 📝 Ejemplos
|
|
116
|
+
|
|
117
|
+
### 1. Diálogo Completo
|
|
118
|
+
|
|
119
|
+
```html
|
|
120
|
+
<div jvsDialogFlotante
|
|
121
|
+
[matDialogRefActual]="dialogRef"
|
|
122
|
+
[btnGuardar]="'ACEPTAR'"
|
|
123
|
+
[btnCerrar]="true"
|
|
124
|
+
[btnCerrarBarra]="true"
|
|
125
|
+
iconoTitulo="roundInfo"
|
|
126
|
+
(btnGuardarClick)="procesar()">
|
|
127
|
+
|
|
128
|
+
<span titulo>Confirmación Requerida</span>
|
|
129
|
+
|
|
130
|
+
<div cuerpo class="p-4">
|
|
131
|
+
¿Está seguro que desea realizar esta acción?
|
|
132
|
+
</div>
|
|
133
|
+
|
|
134
|
+
<div pieIzquierda>
|
|
135
|
+
<small class="text-gray-500">Ref: 12345</small>
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 2. Diálogo Simple (Solo Contenido)
|
|
141
|
+
|
|
142
|
+
```html
|
|
143
|
+
<div jvsDialogFlotante
|
|
144
|
+
[sinTitulo]="true"
|
|
145
|
+
[sinBarraDeAccion]="true">
|
|
146
|
+
|
|
147
|
+
<div cuerpo>
|
|
148
|
+
<app-mi-contenido-custom></app-mi-contenido-custom>
|
|
149
|
+
</div>
|
|
150
|
+
</div>
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### 3. Botones Personalizados
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
configGuardar: BotonDialog = {
|
|
157
|
+
label: 'ENVIAR',
|
|
158
|
+
icono: 'roundSend',
|
|
159
|
+
class: 'bg-indigo-600 text-white hover:bg-indigo-700'
|
|
160
|
+
};
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
```html
|
|
164
|
+
<div jvsDialogFlotante
|
|
165
|
+
[matDialogRefActual]="dialogRef"
|
|
166
|
+
[btnGuardar]="configGuardar">
|
|
167
|
+
<!-- ... -->
|
|
168
|
+
</div>
|
|
169
|
+
```
|
|
@@ -1,32 +1,23 @@
|
|
|
1
|
-
import { EventEmitter } from '@angular/core';
|
|
2
1
|
import { MatDialogRef } from '@angular/material/dialog';
|
|
3
2
|
import { BotonDialog } from './dialog-flotante.interface';
|
|
4
3
|
import * as i0 from "@angular/core";
|
|
5
4
|
export declare class DialogFlotanteComponent {
|
|
6
|
-
cssClases: Record<string, string
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
5
|
+
cssClases: import("@angular/core").InputSignal<Record<string, string>>;
|
|
6
|
+
sinTitulo: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
7
|
+
sinBarraDeAccion: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
8
|
+
btnCerrarBarra: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
9
|
+
iconoTitulo: import("@angular/core").InputSignal<string | undefined>;
|
|
10
|
+
matDialogRefActual: import("@angular/core").InputSignal<MatDialogRef<any, any> | undefined>;
|
|
11
|
+
btnGuardarInput: import("@angular/core").InputSignal<string | boolean | BotonDialog | undefined>;
|
|
12
|
+
btnCerrarInput: import("@angular/core").InputSignal<string | boolean | BotonDialog | undefined>;
|
|
13
|
+
btnGuardarClick: import("@angular/core").OutputEmitterRef<any>;
|
|
14
|
+
btnCerrarClick: import("@angular/core").OutputEmitterRef<any>;
|
|
13
15
|
private readonly defaultBtnCerrar;
|
|
14
|
-
private _btnCerrar;
|
|
15
|
-
get btnCerrar(): BotonDialog;
|
|
16
|
-
set btnCerrar(val: BotonDialog | boolean | string | '');
|
|
17
|
-
private _btnCerrarBarra;
|
|
18
|
-
get btnCerrarBarra(): boolean;
|
|
19
|
-
set btnCerrarBarra(val: boolean | '');
|
|
20
16
|
private readonly defaultBtnGuardar;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
set btnGuardar(val: BotonDialog | boolean | string | '');
|
|
24
|
-
iconoTitulo?: string;
|
|
25
|
-
matDialogRefActual: MatDialogRef<any>;
|
|
26
|
-
btnGuardarClick: EventEmitter<any>;
|
|
27
|
-
btnCerrarClick: EventEmitter<any>;
|
|
17
|
+
btnCerrar: import("@angular/core").Signal<BotonDialog | undefined>;
|
|
18
|
+
btnGuardar: import("@angular/core").Signal<BotonDialog | undefined>;
|
|
28
19
|
guardarDialogo(): void;
|
|
29
20
|
cerrarDialogo(): void;
|
|
30
21
|
static ɵfac: i0.ɵɵFactoryDeclaration<DialogFlotanteComponent, never>;
|
|
31
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<DialogFlotanteComponent, "[jvsDialogFlotante]", never, { "cssClases": { "alias": "cssClases"; "required": false; }; "sinTitulo": { "alias": "sinTitulo"; "required": false; }; "sinBarraDeAccion": { "alias": "sinBarraDeAccion"; "required": false; }; "
|
|
22
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<DialogFlotanteComponent, "[jvsDialogFlotante]", never, { "cssClases": { "alias": "cssClases"; "required": false; "isSignal": true; }; "sinTitulo": { "alias": "sinTitulo"; "required": false; "isSignal": true; }; "sinBarraDeAccion": { "alias": "sinBarraDeAccion"; "required": false; "isSignal": true; }; "btnCerrarBarra": { "alias": "btnCerrarBarra"; "required": false; "isSignal": true; }; "iconoTitulo": { "alias": "iconoTitulo"; "required": false; "isSignal": true; }; "matDialogRefActual": { "alias": "matDialogRefActual"; "required": false; "isSignal": true; }; "btnGuardarInput": { "alias": "btnGuardar"; "required": false; "isSignal": true; }; "btnCerrarInput": { "alias": "btnCerrar"; "required": false; "isSignal": true; }; }, { "btnGuardarClick": "btnGuardarClick"; "btnCerrarClick": "btnCerrarClick"; }, never, ["[tituloImagen]", "[titulo]", "[selectTitulo]", "[cuerpo]", "[pieIzquierda]", "[pieCentro]", "[pieDerecha]"], true, never>;
|
|
32
23
|
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, output, computed, Component } from '@angular/core';
|
|
3
|
+
import { CommonModule } from '@angular/common';
|
|
4
|
+
import * as i1 from '@angular/material/icon';
|
|
5
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
6
|
+
|
|
7
|
+
class AlertaComponent {
|
|
8
|
+
// Inputs (Signals)
|
|
9
|
+
tipo = input('info');
|
|
10
|
+
titulo = input();
|
|
11
|
+
mensaje = input();
|
|
12
|
+
iconoManual = input(undefined, { alias: 'icono' });
|
|
13
|
+
clasesManual = input({}, { alias: 'clases' });
|
|
14
|
+
botonCerrar = input(false);
|
|
15
|
+
botonAcepto = input(false);
|
|
16
|
+
textoAcepto = input('Lo entiendo');
|
|
17
|
+
// Outputs
|
|
18
|
+
alCerrar = output();
|
|
19
|
+
alAceptar = output();
|
|
20
|
+
// Computed properties for default styles
|
|
21
|
+
defaults = computed(() => {
|
|
22
|
+
const t = this.tipo();
|
|
23
|
+
switch (t) {
|
|
24
|
+
case 'error':
|
|
25
|
+
return {
|
|
26
|
+
bg: 'bg-red-50',
|
|
27
|
+
border: 'border-red-200',
|
|
28
|
+
text: 'text-red-800',
|
|
29
|
+
icon: 'roundError',
|
|
30
|
+
iconColor: 'text-red-400'
|
|
31
|
+
};
|
|
32
|
+
case 'success':
|
|
33
|
+
return {
|
|
34
|
+
bg: 'bg-green-50',
|
|
35
|
+
border: 'border-green-200',
|
|
36
|
+
text: 'text-green-800',
|
|
37
|
+
icon: 'roundCheckCircle',
|
|
38
|
+
iconColor: 'text-green-400'
|
|
39
|
+
};
|
|
40
|
+
case 'warning':
|
|
41
|
+
return {
|
|
42
|
+
bg: 'bg-amber-50',
|
|
43
|
+
border: 'border-amber-200',
|
|
44
|
+
text: 'text-amber-800',
|
|
45
|
+
icon: 'roundWarning',
|
|
46
|
+
iconColor: 'text-amber-400'
|
|
47
|
+
};
|
|
48
|
+
case 'info':
|
|
49
|
+
default:
|
|
50
|
+
return {
|
|
51
|
+
bg: 'bg-blue-50',
|
|
52
|
+
border: 'border-blue-200',
|
|
53
|
+
text: 'text-blue-800',
|
|
54
|
+
icon: 'roundInfo',
|
|
55
|
+
iconColor: 'text-blue-400'
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
// Final classes merged with manual overrides
|
|
60
|
+
clasesContenedor = computed(() => {
|
|
61
|
+
const d = this.defaults();
|
|
62
|
+
const custom = this.clasesManual()?.contenedor || '';
|
|
63
|
+
if (this.tipo() === 'custom')
|
|
64
|
+
return custom;
|
|
65
|
+
return `flex items-start gap-1 p-2 rounded-lg border ${d.bg} ${d.border} ${d.text} ${custom}`;
|
|
66
|
+
});
|
|
67
|
+
iconoFinal = computed(() => this.iconoManual() || this.defaults().icon);
|
|
68
|
+
clasesIcono = computed(() => {
|
|
69
|
+
const d = this.defaults();
|
|
70
|
+
const custom = this.clasesManual()?.icono || '';
|
|
71
|
+
return `shrink-0 ${d.iconColor} ${custom}`;
|
|
72
|
+
});
|
|
73
|
+
clasesTitulo = computed(() => `font-bold mb-1 ${this.clasesManual()?.titulo || ''}`);
|
|
74
|
+
clasesMensaje = computed(() => `text-xs leading-relaxed ${this.clasesManual()?.mensaje || ''}`);
|
|
75
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: AlertaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
76
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: AlertaComponent, isStandalone: true, selector: "jvs-alerta", inputs: { tipo: { classPropertyName: "tipo", publicName: "tipo", isSignal: true, isRequired: false, transformFunction: null }, titulo: { classPropertyName: "titulo", publicName: "titulo", isSignal: true, isRequired: false, transformFunction: null }, mensaje: { classPropertyName: "mensaje", publicName: "mensaje", isSignal: true, isRequired: false, transformFunction: null }, iconoManual: { classPropertyName: "iconoManual", publicName: "icono", isSignal: true, isRequired: false, transformFunction: null }, clasesManual: { classPropertyName: "clasesManual", publicName: "clases", isSignal: true, isRequired: false, transformFunction: null }, botonCerrar: { classPropertyName: "botonCerrar", publicName: "botonCerrar", isSignal: true, isRequired: false, transformFunction: null }, botonAcepto: { classPropertyName: "botonAcepto", publicName: "botonAcepto", isSignal: true, isRequired: false, transformFunction: null }, textoAcepto: { classPropertyName: "textoAcepto", publicName: "textoAcepto", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { alCerrar: "alCerrar", alAceptar: "alAceptar" }, ngImport: i0, template: "<div [class]=\"clasesContenedor()\">\n <!-- Icono -->\n <div [class]=\"clasesIcono()\">\n <mat-icon [svgIcon]=\"iconoFinal()\"></mat-icon>\n </div>\n\n <!-- Contenido -->\n <div class=\"flex-grow min-w-0\">\n @if (titulo()) {\n <h4 [class]=\"clasesTitulo()\">{{ titulo() }}</h4>\n }\n\n <div [class]=\"clasesMensaje()\">\n @if (mensaje()) {\n {{ mensaje() }}\n } @else {\n <ng-content></ng-content>\n }\n </div>\n\n <!-- Acciones -->\n @if (botonAcepto()) {\n <div [class]=\"'mt-4 flex ' + (clasesManual().acciones || '')\">\n <button\n type=\"button\"\n (click)=\"alAceptar.emit()\"\n class=\"px-4 py-2 bg-white border border-current rounded-lg font-bold text-xs hover:bg-opacity-10 transition-colors\"\n >\n {{ textoAcepto() }}\n </button>\n </div>\n }\n </div>\n\n <!-- Bot\u00F3n Cerrar -->\n @if (botonCerrar()) {\n <button\n type=\"button\"\n (click)=\"alCerrar.emit()\"\n class=\"shrink-0 hover:bg-black/5 p-1 rounded-md transition-colors\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4 opacity-50\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n }\n</div>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
|
|
77
|
+
}
|
|
78
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: AlertaComponent, decorators: [{
|
|
79
|
+
type: Component,
|
|
80
|
+
args: [{ selector: 'jvs-alerta', standalone: true, imports: [CommonModule, MatIconModule], template: "<div [class]=\"clasesContenedor()\">\n <!-- Icono -->\n <div [class]=\"clasesIcono()\">\n <mat-icon [svgIcon]=\"iconoFinal()\"></mat-icon>\n </div>\n\n <!-- Contenido -->\n <div class=\"flex-grow min-w-0\">\n @if (titulo()) {\n <h4 [class]=\"clasesTitulo()\">{{ titulo() }}</h4>\n }\n\n <div [class]=\"clasesMensaje()\">\n @if (mensaje()) {\n {{ mensaje() }}\n } @else {\n <ng-content></ng-content>\n }\n </div>\n\n <!-- Acciones -->\n @if (botonAcepto()) {\n <div [class]=\"'mt-4 flex ' + (clasesManual().acciones || '')\">\n <button\n type=\"button\"\n (click)=\"alAceptar.emit()\"\n class=\"px-4 py-2 bg-white border border-current rounded-lg font-bold text-xs hover:bg-opacity-10 transition-colors\"\n >\n {{ textoAcepto() }}\n </button>\n </div>\n }\n </div>\n\n <!-- Bot\u00F3n Cerrar -->\n @if (botonCerrar()) {\n <button\n type=\"button\"\n (click)=\"alCerrar.emit()\"\n class=\"shrink-0 hover:bg-black/5 p-1 rounded-md transition-colors\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4 opacity-50\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n }\n</div>\n", styles: [":host{display:block}\n"] }]
|
|
81
|
+
}] });
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Generated bundle index. Do not edit.
|
|
85
|
+
*/
|
|
86
|
+
|
|
87
|
+
export { AlertaComponent };
|
|
88
|
+
//# sourceMappingURL=jvsoft-components-alerta.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jvsoft-components-alerta.mjs","sources":["../../../projects/components/alerta/alerta.component.ts","../../../projects/components/alerta/alerta.component.html","../../../projects/components/alerta/jvsoft-components-alerta.ts"],"sourcesContent":["import {Component, computed, input, output} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {MatIconModule} from '@angular/material/icon';\n\nexport interface AlertaClases {\n contenedor?: string;\n icono?: string;\n titulo?: string;\n mensaje?: string;\n acciones?: string;\n}\n\nexport type AlertaTipo = 'info' | 'error' | 'success' | 'warning' | 'custom';\n\n@Component({\n selector: 'jvs-alerta',\n standalone: true,\n imports: [CommonModule, MatIconModule],\n templateUrl: './alerta.component.html',\n styles: [`\n :host { display: block; }\n `]\n})\nexport class AlertaComponent {\n // Inputs (Signals)\n tipo = input<AlertaTipo>('info');\n titulo = input<string>();\n mensaje = input<string>();\n iconoManual = input<string>(undefined, { alias: 'icono' });\n clasesManual = input<AlertaClases>({}, { alias: 'clases' });\n\n botonCerrar = input<boolean>(false);\n botonAcepto = input<boolean>(false);\n textoAcepto = input<string>('Lo entiendo');\n\n // Outputs\n alCerrar = output<void>();\n alAceptar = output<void>();\n\n // Computed properties for default styles\n private defaults = computed(() => {\n const t = this.tipo();\n switch (t) {\n case 'error':\n return {\n bg: 'bg-red-50',\n border: 'border-red-200',\n text: 'text-red-800',\n icon: 'roundError',\n iconColor: 'text-red-400'\n };\n case 'success':\n return {\n bg: 'bg-green-50',\n border: 'border-green-200',\n text: 'text-green-800',\n icon: 'roundCheckCircle',\n iconColor: 'text-green-400'\n };\n case 'warning':\n return {\n bg: 'bg-amber-50',\n border: 'border-amber-200',\n text: 'text-amber-800',\n icon: 'roundWarning',\n iconColor: 'text-amber-400'\n };\n case 'info':\n default:\n return {\n bg: 'bg-blue-50',\n border: 'border-blue-200',\n text: 'text-blue-800',\n icon: 'roundInfo',\n iconColor: 'text-blue-400'\n };\n }\n });\n\n // Final classes merged with manual overrides\n clasesContenedor = computed(() => {\n const d = this.defaults();\n const custom = this.clasesManual()?.contenedor || '';\n if (this.tipo() === 'custom') return custom;\n return `flex items-start gap-1 p-2 rounded-lg border ${d.bg} ${d.border} ${d.text} ${custom}`;\n });\n\n iconoFinal = computed(() => this.iconoManual() || this.defaults().icon);\n\n clasesIcono = computed(() => {\n const d = this.defaults();\n const custom = this.clasesManual()?.icono || '';\n return `shrink-0 ${d.iconColor} ${custom}`;\n });\n\n clasesTitulo = computed(() => `font-bold mb-1 ${this.clasesManual()?.titulo || ''}`);\n clasesMensaje = computed(() => `text-xs leading-relaxed ${this.clasesManual()?.mensaje || ''}`);\n}\n","<div [class]=\"clasesContenedor()\">\n <!-- Icono -->\n <div [class]=\"clasesIcono()\">\n <mat-icon [svgIcon]=\"iconoFinal()\"></mat-icon>\n </div>\n\n <!-- Contenido -->\n <div class=\"flex-grow min-w-0\">\n @if (titulo()) {\n <h4 [class]=\"clasesTitulo()\">{{ titulo() }}</h4>\n }\n\n <div [class]=\"clasesMensaje()\">\n @if (mensaje()) {\n {{ mensaje() }}\n } @else {\n <ng-content></ng-content>\n }\n </div>\n\n <!-- Acciones -->\n @if (botonAcepto()) {\n <div [class]=\"'mt-4 flex ' + (clasesManual().acciones || '')\">\n <button\n type=\"button\"\n (click)=\"alAceptar.emit()\"\n class=\"px-4 py-2 bg-white border border-current rounded-lg font-bold text-xs hover:bg-opacity-10 transition-colors\"\n >\n {{ textoAcepto() }}\n </button>\n </div>\n }\n </div>\n\n <!-- Botón Cerrar -->\n @if (botonCerrar()) {\n <button\n type=\"button\"\n (click)=\"alCerrar.emit()\"\n class=\"shrink-0 hover:bg-black/5 p-1 rounded-md transition-colors\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4 opacity-50\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|