sapenlinea-components 0.11.92 → 0.11.94
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/README.md +305 -1
- package/fesm2022/sapenlinea-components.mjs +894 -113
- package/fesm2022/sapenlinea-components.mjs.map +1 -1
- package/index.d.ts +259 -41
- package/package.json +1 -1
- package/src/lib/components/footer/footer-layout.css +23 -0
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Componentes de la librería `sapenlinea-components`
|
|
2
2
|
|
|
3
|
-
Esta librería incluye una colección de componentes reutilizables para formularios, tablas y
|
|
3
|
+
Esta librería incluye una colección de componentes reutilizables para formularios, tablas, filtros, dashboards, gestión de menús/sidebar y más.
|
|
4
4
|
A continuación se documenta **qué hace cada componente** y **cómo se utiliza**.
|
|
5
5
|
|
|
6
6
|
> Nota: todos los componentes son _standalone_ de Angular, por lo que se importan directamente en el `imports` del componente donde se usen.
|
|
@@ -1851,3 +1851,307 @@ infracciones: GeoPoint[] = [
|
|
|
1851
1851
|
}
|
|
1852
1852
|
];
|
|
1853
1853
|
```
|
|
1854
|
+
|
|
1855
|
+
---
|
|
1856
|
+
|
|
1857
|
+
### 45. `lib-rol-card` (RolCard)
|
|
1858
|
+
|
|
1859
|
+
**Qué hace**
|
|
1860
|
+
Tarjeta resumen de un **rol de usuario**, con nombre, descripción, color identificador, contador de usuarios asignados y accesos rápidos a editar o gestionar permisos.
|
|
1861
|
+
|
|
1862
|
+
**Selector:** `lib-rol-card`
|
|
1863
|
+
|
|
1864
|
+
**Inputs:**
|
|
1865
|
+
|
|
1866
|
+
| Input | Tipo | Default | Descripción |
|
|
1867
|
+
|---|---|---|---|
|
|
1868
|
+
| `roleName` | `string` | (requerido) | Nombre del rol |
|
|
1869
|
+
| `description` | `string` | `''` | Descripción breve |
|
|
1870
|
+
| `color` | `string` | `'#596300'` | Color de acento (borde / badge) |
|
|
1871
|
+
| `userCount` | `number` | `0` | Cantidad de usuarios con ese rol |
|
|
1872
|
+
|
|
1873
|
+
**Outputs:**
|
|
1874
|
+
|
|
1875
|
+
- `edit: void` – Al pulsar editar rol.
|
|
1876
|
+
- `permissions: void` – Al pulsar gestionar permisos.
|
|
1877
|
+
|
|
1878
|
+
**Ejemplo de uso:**
|
|
1879
|
+
|
|
1880
|
+
```html
|
|
1881
|
+
<lib-rol-card
|
|
1882
|
+
[roleName]="'Administrador'"
|
|
1883
|
+
[description]="'Acceso completo al sistema'"
|
|
1884
|
+
[color]="'#596300'"
|
|
1885
|
+
[userCount]="12"
|
|
1886
|
+
(edit)="onEditRol()"
|
|
1887
|
+
(permissions)="onManagePermissions()" />
|
|
1888
|
+
```
|
|
1889
|
+
|
|
1890
|
+
---
|
|
1891
|
+
|
|
1892
|
+
### 46. `lib-module-card` y `lib-module-card-list` (ModuleCard / ModuleCardList)
|
|
1893
|
+
|
|
1894
|
+
**Qué hacen**
|
|
1895
|
+
Componentes para **administrar la estructura del sidebar/menú** de la aplicación: módulos, submódulos y aplicativos (pantallas/rutas). Permiten expandir/colapsar, mostrar/ocultar, reordenar con animación FLIP y gestionar acciones (permisos granulares) por aplicativo.
|
|
1896
|
+
|
|
1897
|
+
Pensados como **pieza de UI** dentro de un módulo de roles y permisos: el componente maneja la interacción visual; la persistencia, reglas de negocio y autorización las implementa el contenedor.
|
|
1898
|
+
|
|
1899
|
+
> **Guía de implementación para roles y permisos:** ver [`GUIA-MODULE-CARD-LIST.md`](./src/lib/components/module-card/GUIA-MODULE-CARD-LIST.md).
|
|
1900
|
+
|
|
1901
|
+
**Selectores:** `lib-module-card`, `lib-module-card-list`
|
|
1902
|
+
|
|
1903
|
+
#### Jerarquía de datos
|
|
1904
|
+
|
|
1905
|
+
```
|
|
1906
|
+
ModuleData
|
|
1907
|
+
├── submodules[] → Submódulos del menú
|
|
1908
|
+
│ └── aplicativos[] → Aplicativos anidados en el submódulo
|
|
1909
|
+
├── aplicativos[] → Aplicativos directos del módulo (sin submódulo)
|
|
1910
|
+
└── childOrder?[] → Orden mixto submódulos + aplicativos directos
|
|
1911
|
+
```
|
|
1912
|
+
|
|
1913
|
+
**Interfaces principales:**
|
|
1914
|
+
|
|
1915
|
+
```ts
|
|
1916
|
+
export interface ModuleCardAction {
|
|
1917
|
+
key: string;
|
|
1918
|
+
label: string;
|
|
1919
|
+
}
|
|
1920
|
+
|
|
1921
|
+
export interface ModuleApplicativo {
|
|
1922
|
+
id: string | number;
|
|
1923
|
+
name: string;
|
|
1924
|
+
icon?: string; // SVG inline como string
|
|
1925
|
+
visible: boolean;
|
|
1926
|
+
actions: ModuleCardAction[];
|
|
1927
|
+
}
|
|
1928
|
+
|
|
1929
|
+
export interface ModuleSubmodule {
|
|
1930
|
+
id: string | number;
|
|
1931
|
+
name: string;
|
|
1932
|
+
icon?: string;
|
|
1933
|
+
visible: boolean;
|
|
1934
|
+
aplicativos: ModuleApplicativo[];
|
|
1935
|
+
}
|
|
1936
|
+
|
|
1937
|
+
export type ModuleChildType = 'submodule' | 'aplicativo';
|
|
1938
|
+
|
|
1939
|
+
export interface ModuleChildRef {
|
|
1940
|
+
type: ModuleChildType;
|
|
1941
|
+
id: string | number;
|
|
1942
|
+
}
|
|
1943
|
+
|
|
1944
|
+
export interface ModuleData {
|
|
1945
|
+
id: string | number;
|
|
1946
|
+
name: string;
|
|
1947
|
+
icon?: string;
|
|
1948
|
+
visible: boolean;
|
|
1949
|
+
submodules: ModuleSubmodule[];
|
|
1950
|
+
aplicativos: ModuleApplicativo[];
|
|
1951
|
+
/** Orden unificado de hijos directos del módulo (submódulos + aplicativos) */
|
|
1952
|
+
childOrder?: ModuleChildRef[];
|
|
1953
|
+
}
|
|
1954
|
+
```
|
|
1955
|
+
|
|
1956
|
+
#### Orden unificado (`childOrder`)
|
|
1957
|
+
|
|
1958
|
+
Dentro de cada módulo, **submódulos y aplicativos directos comparten una sola lista ordenable**. Un aplicativo directo puede quedar antes, entre o después de submódulos.
|
|
1959
|
+
|
|
1960
|
+
| Situación | Comportamiento |
|
|
1961
|
+
|---|---|
|
|
1962
|
+
| Sin `childOrder` | Orden por defecto: todos los submódulos primero, luego aplicativos directos |
|
|
1963
|
+
| Con `childOrder` | Se respeta el orden definido; ítems nuevos se agregan al final si faltan en el array |
|
|
1964
|
+
| Reordenar ↑/↓ | Actualiza `childOrder` y anima con FLIP |
|
|
1965
|
+
|
|
1966
|
+
**Helpers exportados:**
|
|
1967
|
+
|
|
1968
|
+
```ts
|
|
1969
|
+
import { getModuleChildOrder, resolveModuleChildren } from 'sapenlinea-components';
|
|
1970
|
+
|
|
1971
|
+
// Obtiene el orden efectivo (default o childOrder normalizado)
|
|
1972
|
+
const order = getModuleChildOrder(module);
|
|
1973
|
+
|
|
1974
|
+
// Resuelve refs → objetos completos para renderizar
|
|
1975
|
+
const children = resolveModuleChildren(order, module.submodules, module.aplicativos);
|
|
1976
|
+
```
|
|
1977
|
+
|
|
1978
|
+
#### `lib-module-card-list` — lista de módulos
|
|
1979
|
+
|
|
1980
|
+
Orquesta varias tarjetas de módulo, persiste cambios en el modelo y aplica animación FLIP al reordenar módulos.
|
|
1981
|
+
|
|
1982
|
+
**Inputs / model:**
|
|
1983
|
+
|
|
1984
|
+
- `[(modules)]="ModuleData[]"` – Lista de módulos (two-way binding con `model`).
|
|
1985
|
+
|
|
1986
|
+
**Outputs:**
|
|
1987
|
+
|
|
1988
|
+
| Output | Descripción |
|
|
1989
|
+
|---|---|
|
|
1990
|
+
| `moduleEvent` | Eventos del encabezado del módulo |
|
|
1991
|
+
| `submoduleEvent` | Eventos de submódulos |
|
|
1992
|
+
| `applicativoEvent` | Eventos de aplicativos |
|
|
1993
|
+
| *(interno)* | Actualiza `modules` y `childOrder` automáticamente en move/visibleChange |
|
|
1994
|
+
|
|
1995
|
+
**Ejemplo completo:**
|
|
1996
|
+
|
|
1997
|
+
```html
|
|
1998
|
+
<lib-module-card-list
|
|
1999
|
+
[modules]="menuModules()"
|
|
2000
|
+
(modulesChange)="menuModules.set($event)"
|
|
2001
|
+
(moduleEvent)="onModuleEvent($event)"
|
|
2002
|
+
(submoduleEvent)="onSubmoduleEvent($event)"
|
|
2003
|
+
(applicativoEvent)="onApplicativoEvent($event)" />
|
|
2004
|
+
```
|
|
2005
|
+
|
|
2006
|
+
```ts
|
|
2007
|
+
menuModules = signal<ModuleData[]>([
|
|
2008
|
+
{
|
|
2009
|
+
id: 'mod1',
|
|
2010
|
+
name: 'Administración',
|
|
2011
|
+
icon: '<svg>...</svg>',
|
|
2012
|
+
visible: true,
|
|
2013
|
+
submodules: [
|
|
2014
|
+
{
|
|
2015
|
+
id: 'sub1',
|
|
2016
|
+
name: 'Usuarios',
|
|
2017
|
+
visible: true,
|
|
2018
|
+
aplicativos: [
|
|
2019
|
+
{ id: 'app1', name: 'Crear Usuario', visible: true, actions: [{ key: 'bulk', label: 'Creación masiva' }] },
|
|
2020
|
+
],
|
|
2021
|
+
},
|
|
2022
|
+
],
|
|
2023
|
+
aplicativos: [
|
|
2024
|
+
{ id: 'app2', name: 'Panel General', visible: true, actions: [] },
|
|
2025
|
+
],
|
|
2026
|
+
childOrder: [
|
|
2027
|
+
{ type: 'aplicativo', id: 'app2' }, // aplicativo directo primero
|
|
2028
|
+
{ type: 'submodule', id: 'sub1' },
|
|
2029
|
+
],
|
|
2030
|
+
},
|
|
2031
|
+
]);
|
|
2032
|
+
```
|
|
2033
|
+
|
|
2034
|
+
#### `lib-module-card` — tarjeta individual
|
|
2035
|
+
|
|
2036
|
+
Usar directamente cuando solo se necesita un módulo, o dejar que `lib-module-card-list` lo renderice internamente.
|
|
2037
|
+
|
|
2038
|
+
**Inputs:**
|
|
2039
|
+
|
|
2040
|
+
| Input | Tipo | Descripción |
|
|
2041
|
+
|---|---|---|
|
|
2042
|
+
| `moduleId` | `string \| number` | Id del módulo |
|
|
2043
|
+
| `moduleName` | `string` | Nombre visible |
|
|
2044
|
+
| `moduleIcon` | `string` | SVG inline (opcional) |
|
|
2045
|
+
| `visible` | `boolean` | Visible en sidebar |
|
|
2046
|
+
| `submodules` | `ModuleSubmodule[]` | Submódulos |
|
|
2047
|
+
| `aplicativos` | `ModuleApplicativo[]` | Aplicativos directos |
|
|
2048
|
+
| `childOrder` | `ModuleChildRef[]` | Orden unificado (opcional) |
|
|
2049
|
+
| `isFirst` | `boolean` | Deshabilita ↑ si es el primer módulo de la lista |
|
|
2050
|
+
| `isLast` | `boolean` | Deshabilita ↓ si es el último módulo de la lista |
|
|
2051
|
+
|
|
2052
|
+
**Outputs:**
|
|
2053
|
+
|
|
2054
|
+
| Output | Descripción |
|
|
2055
|
+
|---|---|
|
|
2056
|
+
| `moduleEvent` | Acciones del encabezado del módulo |
|
|
2057
|
+
| `submoduleEvent` | Acciones de submódulos |
|
|
2058
|
+
| `applicativoEvent` | Acciones de aplicativos |
|
|
2059
|
+
| `childOrderChange` | Nuevo `childOrder` tras reordenar hijos |
|
|
2060
|
+
|
|
2061
|
+
#### Eventos
|
|
2062
|
+
|
|
2063
|
+
**`ModuleEvent`** — encabezado del módulo:
|
|
2064
|
+
|
|
2065
|
+
```ts
|
|
2066
|
+
type: 'moveUp' | 'moveDown' | 'edit' | 'delete' | 'visibleChange'
|
|
2067
|
+
| 'addApplicativo' | 'addSubmodule';
|
|
2068
|
+
moduleId: string | number;
|
|
2069
|
+
data?: any; // En moveUp/moveDown: índice nuevo en la lista de módulos
|
|
2070
|
+
```
|
|
2071
|
+
|
|
2072
|
+
**`SubmoduleEvent`** — submódulo:
|
|
2073
|
+
|
|
2074
|
+
```ts
|
|
2075
|
+
type: 'moveUp' | 'moveDown' | 'edit' | 'delete' | 'visibleChange';
|
|
2076
|
+
submoduleId: string | number;
|
|
2077
|
+
moduleId: string | number;
|
|
2078
|
+
data?: any; // En moveUp/moveDown: índice nuevo en childOrder unificado
|
|
2079
|
+
```
|
|
2080
|
+
|
|
2081
|
+
**`ApplicativoEvent`** — aplicativo:
|
|
2082
|
+
|
|
2083
|
+
```ts
|
|
2084
|
+
type: 'moveUp' | 'moveDown' | 'edit' | 'delete' | 'visibleChange'
|
|
2085
|
+
| 'addAction' | 'removeAction';
|
|
2086
|
+
moduleId: string | number; // Siempre presente
|
|
2087
|
+
applicativoId: string | number;
|
|
2088
|
+
submoduleId?: string | number | null;
|
|
2089
|
+
data?: any;
|
|
2090
|
+
```
|
|
2091
|
+
|
|
2092
|
+
**Interpretación de `submoduleId` en aplicativos:**
|
|
2093
|
+
|
|
2094
|
+
| Valor | Ubicación del aplicativo |
|
|
2095
|
+
|---|---|
|
|
2096
|
+
| `null` | `module.aplicativos[]` (directo del módulo) |
|
|
2097
|
+
| `'sub1'` (id) | `module.submodules[].aplicativos[]` |
|
|
2098
|
+
|
|
2099
|
+
**Ejemplo de resolución en el contenedor:**
|
|
2100
|
+
|
|
2101
|
+
```ts
|
|
2102
|
+
onApplicativoEvent(event: ApplicativoEvent) {
|
|
2103
|
+
const module = this.modules().find(m => m.id === event.moduleId);
|
|
2104
|
+
if (!module) return;
|
|
2105
|
+
|
|
2106
|
+
const apps = event.submoduleId == null
|
|
2107
|
+
? module.aplicativos
|
|
2108
|
+
: module.submodules.find(s => s.id === event.submoduleId)?.aplicativos;
|
|
2109
|
+
|
|
2110
|
+
const app = apps?.find(a => a.id === event.applicativoId);
|
|
2111
|
+
|
|
2112
|
+
if (event.type === 'addAction') {
|
|
2113
|
+
// Abrir modal para agregar permiso/acción a `app`
|
|
2114
|
+
}
|
|
2115
|
+
if (event.type === 'moveDown') {
|
|
2116
|
+
// event.data → nueva posición (índice en childOrder o en lista de apps del submódulo)
|
|
2117
|
+
}
|
|
2118
|
+
}
|
|
2119
|
+
```
|
|
2120
|
+
|
|
2121
|
+
**Valores de `data` en reordenamiento:**
|
|
2122
|
+
|
|
2123
|
+
| Evento | `data` en moveUp / moveDown |
|
|
2124
|
+
|---|---|
|
|
2125
|
+
| `ModuleEvent` | Índice nuevo del módulo en la lista |
|
|
2126
|
+
| `SubmoduleEvent` | Índice nuevo en `childOrder` (lista unificada del módulo) |
|
|
2127
|
+
| `ApplicativoEvent` (directo) | Índice nuevo en `childOrder` |
|
|
2128
|
+
| `ApplicativoEvent` (en submódulo) | Índice nuevo dentro de `sub.aplicativos[]` |
|
|
2129
|
+
|
|
2130
|
+
#### Comportamiento de botones ↑ / ↓
|
|
2131
|
+
|
|
2132
|
+
Los botones de mover se **deshabilitan visualmente** (sin hover activo) cuando no aplican:
|
|
2133
|
+
|
|
2134
|
+
- Primer ítem de su lista → ↑ deshabilitado
|
|
2135
|
+
- Último ítem de su lista → ↓ deshabilitado
|
|
2136
|
+
|
|
2137
|
+
Aplica a módulos, hijos unificados del módulo y aplicativos dentro de submódulos.
|
|
2138
|
+
|
|
2139
|
+
#### Acciones por aplicativo (permisos granulares)
|
|
2140
|
+
|
|
2141
|
+
Al expandir un aplicativo se muestran **chips de acciones** (`ModuleCardAction`). Cada chip representa un permiso o acción asociada (ej. "Exportar Excel", "Creación masiva").
|
|
2142
|
+
|
|
2143
|
+
- `addAction` – solicita agregar una acción (`data` no incluido; abrir selector en el padre).
|
|
2144
|
+
- `removeAction` – `data` contiene el `key` de la acción a quitar.
|
|
2145
|
+
|
|
2146
|
+
#### Animación FLIP
|
|
2147
|
+
|
|
2148
|
+
Al reordenar módulos (`lib-module-card-list`) o hijos de un módulo (`lib-module-card`), los ítems se animan con transición suave y sombra durante el movimiento.
|
|
2149
|
+
|
|
2150
|
+
#### Notas de integración
|
|
2151
|
+
|
|
2152
|
+
1. **Persistencia:** escuchar eventos y/o `childOrderChange` / `modulesChange` para guardar en API.
|
|
2153
|
+
2. **Alta de ítems:** al crear submódulo o aplicativo, agregar también su entrada en `childOrder` si ya existe uno definido.
|
|
2154
|
+
3. **Iconos:** pasar SVG como string en `icon`; el componente lo sanitiza con `DomSanitizer`.
|
|
2155
|
+
4. **Separación de responsabilidades:** `visible` controla visibilidad en menú; la autorización real por rol la define el módulo contenedor.
|
|
2156
|
+
|
|
2157
|
+
---
|