@c80/ui 1.0.1 → 1.0.2
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 +112 -1
- package/esm2022/index.mjs +4 -1
- package/esm2022/lib/button/button.component.mjs +11 -0
- package/esm2022/lib/card/card.component.mjs +17 -0
- package/esm2022/lib/input/input.component.mjs +11 -0
- package/esm2022/lib/table/table.component.mjs +35 -53
- package/index.d.ts +3 -0
- package/lib/button/button.component.d.ts +5 -0
- package/lib/card/card.component.d.ts +5 -0
- package/lib/input/input.component.d.ts +5 -0
- package/lib/table/table.component.d.ts +14 -14
- package/package.json +1 -2
package/README.md
CHANGED
|
@@ -1,2 +1,113 @@
|
|
|
1
|
-
|
|
1
|
+
|
|
2
|
+
# UI Library (`@c80/ui`)
|
|
3
|
+
|
|
4
|
+
Librería de componentes de interfaz de usuario reutilizables para Angular, diseñada para acelerar el desarrollo de aplicaciones con una experiencia visual consistente y componentes listos para producción.
|
|
5
|
+
|
|
6
|
+
## Componentes incluidos
|
|
7
|
+
|
|
8
|
+
### `c80-icon`
|
|
9
|
+
Componente para mostrar íconos SVG personalizables, con soporte para distintos tipos, colores, tamaños y modo botón.
|
|
10
|
+
|
|
11
|
+
**Props principales:**
|
|
12
|
+
- `icon`: `'check' | 'cancel' | 'edit' | 'delete' | 'add'` (ícono a mostrar)
|
|
13
|
+
- `color`: `'primary' | 'secondary' | 'warn'` (color del ícono)
|
|
14
|
+
- `size`: `number` (escala del ícono, por defecto 1)
|
|
15
|
+
- `button`: `boolean` (si es true, renderiza como botón nativo)
|
|
16
|
+
- `disabled`: `boolean` (deshabilita el ícono/botón)
|
|
17
|
+
- `type`: `'button' | 'submit' | 'reset'` (tipo de botón si aplica)
|
|
18
|
+
- `iconClick`: `EventEmitter<Event>` (emite evento al hacer click si es botón)
|
|
19
|
+
|
|
20
|
+
**Ejemplos:**
|
|
21
|
+
```html
|
|
22
|
+
<c80-icon icon="check"></c80-icon>
|
|
23
|
+
<c80-icon icon="delete" color="warn" [button]="true" (iconClick)="onDelete()"></c80-icon>
|
|
24
|
+
<c80-icon icon="add" [size]="2"></c80-icon>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### `c80-table`
|
|
28
|
+
Componente de tabla editable y dinámica, con soporte para operaciones CRUD conectadas a un servicio, definición de columnas, edición en línea y acciones integradas.
|
|
29
|
+
|
|
30
|
+
**Props principales:**
|
|
31
|
+
- `service`: `C80TableService<T>` (servicio con métodos `get`, `create`, `update`, `delete`)
|
|
32
|
+
- `columns`: `C80TableColDef[]` (definición de columnas: accessor, label, tipo, visible)
|
|
33
|
+
- `errorEvent`: `EventEmitter<string>` (emite errores de operación)
|
|
34
|
+
|
|
35
|
+
**Definición de columna:**
|
|
36
|
+
```typescript
|
|
37
|
+
interface C80TableColDef {
|
|
38
|
+
accessor: string;
|
|
39
|
+
label: string;
|
|
40
|
+
visible?: boolean;
|
|
41
|
+
type?: 'string' | 'number' | 'boolean';
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Ejemplo de uso:**
|
|
46
|
+
```html
|
|
47
|
+
<c80-table [service]="userService" [columns]="userColumns" (errorEvent)="onError($event)"></c80-table>
|
|
48
|
+
```
|
|
49
|
+
```typescript
|
|
50
|
+
userColumns = [
|
|
51
|
+
{ accessor: 'id', label: 'ID', type: 'number', visible: false },
|
|
52
|
+
{ accessor: 'name', label: 'Nombre', type: 'string' },
|
|
53
|
+
{ accessor: 'active', label: 'Activo', type: 'boolean' }
|
|
54
|
+
];
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Instalación y uso
|
|
58
|
+
Esta librería está pensada para ser utilizada dentro del monorepo Nx. Para usar los componentes, impórtalos directamente:
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
import { C80IconComponent, C80TableComponent } from '@c80/ui';
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Estructura del proyecto
|
|
65
|
+
- `src/lib/icon/`: Componente de íconos (`c80-icon`)
|
|
66
|
+
- `src/lib/table/`: Componente de tablas (`c80-table`)
|
|
67
|
+
- `src/index.ts`: Punto de entrada público de la librería
|
|
68
|
+
|
|
69
|
+
## Publicación y visualización en npm
|
|
70
|
+
Una vez publicada, la librería puede consultarse en:
|
|
71
|
+
https://www.npmjs.com/package/@c80/ui
|
|
72
|
+
|
|
73
|
+
## Desarrollo y contribución
|
|
74
|
+
1. Clona el repositorio y navega a `libs/ui`.
|
|
75
|
+
2. Realiza los cambios necesarios en los componentes o estilos.
|
|
76
|
+
3. Ejecuta pruebas y build local:
|
|
77
|
+
```sh
|
|
78
|
+
pnpm nx test ui
|
|
79
|
+
pnpm nx build ui
|
|
80
|
+
```
|
|
81
|
+
4. Realiza un PR siguiendo las convenciones del repositorio.
|
|
82
|
+
|
|
83
|
+
## Contacto y soporte
|
|
84
|
+
Para reportar errores, solicitar funcionalidades o recibir soporte, utiliza el sistema de issues del repositorio o contacta al equipo de desarrollo.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
© 2025 c80. Todos los derechos reservados.
|
|
88
|
+
|
|
89
|
+
1. Clona el repositorio y navega a la carpeta `libs/ui`.
|
|
90
|
+
2. Realiza los cambios necesarios en los componentes o estilos.
|
|
91
|
+
3. Ejecuta las pruebas y la build local:
|
|
92
|
+
```sh
|
|
93
|
+
pnpm nx test ui
|
|
94
|
+
pnpm nx build ui
|
|
95
|
+
```
|
|
96
|
+
4. Realiza un PR siguiendo las convenciones del repositorio.
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
## Publicación y visualización en npm
|
|
100
|
+
Esta librería puede ser publicada y visualizada en el registro de npm para su distribución y consulta pública. Una vez publicada, puedes encontrarla buscando el nombre del paquete en [npmjs.com](https://www.npmjs.com/):
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
https://www.npmjs.com/package/@c80/ui
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Desde la página de npm podrás consultar la documentación, versiones, dependencias y descargar el paquete para su uso externo si así se habilita.
|
|
107
|
+
|
|
108
|
+
## Contacto y soporte
|
|
109
|
+
Para reportar errores, solicitar nuevas funcionalidades o recibir soporte, utiliza el sistema de issues del repositorio o contacta al equipo de desarrollo.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
© 2025 c80. Todos los derechos reservados.
|
|
2
113
|
|
package/esm2022/index.mjs
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
export * from './lib/table/table.component';
|
|
2
2
|
export * from './lib/icon/icon.component';
|
|
3
|
-
|
|
3
|
+
export * from './lib/input/input.component';
|
|
4
|
+
export * from './lib/card/card.component';
|
|
5
|
+
export * from './lib/button/button.component';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWJzL3VpL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsK0JBQStCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi90YWJsZS90YWJsZS5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvaWNvbi9pY29uLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9pbnB1dC9pbnB1dC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY2FyZC9jYXJkLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG4iXX0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class ButtonComponent {
|
|
4
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
5
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ButtonComponent, isStandalone: true, selector: "ui-button", ngImport: i0, template: `<button class="ui-btn">Button Example</button>`, isInline: true, styles: [".ui-btn{background:#1976d2;color:#fff;border:none;padding:.75rem 1.5rem;border-radius:4px;font-size:1rem;cursor:pointer;transition:background .2s}.ui-btn:hover{background:#1565c0}\n"] });
|
|
6
|
+
}
|
|
7
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ButtonComponent, decorators: [{
|
|
8
|
+
type: Component,
|
|
9
|
+
args: [{ selector: 'ui-button', standalone: true, template: `<button class="ui-btn">Button Example</button>`, styles: [".ui-btn{background:#1976d2;color:#fff;border:none;padding:.75rem 1.5rem;border-radius:4px;font-size:1rem;cursor:pointer;transition:background .2s}.ui-btn:hover{background:#1565c0}\n"] }]
|
|
10
|
+
}] });
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvdWkvc3JjL2xpYi9idXR0b24vYnV0dG9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQVExQyxNQUFNLE9BQU8sZUFBZTt3R0FBZixlQUFlOzRGQUFmLGVBQWUscUVBSGQsZ0RBQWdEOzs0RkFHakQsZUFBZTtrQkFOM0IsU0FBUzsrQkFDSSxXQUFXLGNBQ1QsSUFBSSxZQUNOLGdEQUFnRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3VpLWJ1dHRvbicsXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgdGVtcGxhdGU6IGA8YnV0dG9uIGNsYXNzPVwidWktYnRuXCI+QnV0dG9uIEV4YW1wbGU8L2J1dHRvbj5gLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vYnV0dG9uLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEJ1dHRvbkNvbXBvbmVudCB7IH1cclxuIl19
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class CardComponent {
|
|
4
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
5
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CardComponent, isStandalone: true, selector: "ui-card", ngImport: i0, template: `<div class="ui-card">
|
|
6
|
+
<h3>Card Example</h3>
|
|
7
|
+
<p>This is a simple card component.</p>
|
|
8
|
+
</div>`, isInline: true, styles: [".ui-card{background:#fff;border-radius:8px;box-shadow:0 2px 8px #00000014;padding:2rem;margin:1rem 0}.ui-card h3{margin-top:0}\n"] });
|
|
9
|
+
}
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CardComponent, decorators: [{
|
|
11
|
+
type: Component,
|
|
12
|
+
args: [{ selector: 'ui-card', standalone: true, template: `<div class="ui-card">
|
|
13
|
+
<h3>Card Example</h3>
|
|
14
|
+
<p>This is a simple card component.</p>
|
|
15
|
+
</div>`, styles: [".ui-card{background:#fff;border-radius:8px;box-shadow:0 2px 8px #00000014;padding:2rem;margin:1rem 0}.ui-card h3{margin-top:0}\n"] }]
|
|
16
|
+
}] });
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3VpL3NyYy9saWIvY2FyZC9jYXJkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQVcxQyxNQUFNLE9BQU8sYUFBYTt3R0FBYixhQUFhOzRGQUFiLGFBQWEsbUVBTlo7OztTQUdMOzs0RkFHSSxhQUFhO2tCQVR6QixTQUFTOytCQUNJLFNBQVMsY0FDUCxJQUFJLFlBQ047OztTQUdMIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAndWktY2FyZCcsXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwidWktY2FyZFwiPlxyXG4gICAgPGgzPkNhcmQgRXhhbXBsZTwvaDM+XHJcbiAgICA8cD5UaGlzIGlzIGEgc2ltcGxlIGNhcmQgY29tcG9uZW50LjwvcD5cclxuICA8L2Rpdj5gLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vY2FyZC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYXJkQ29tcG9uZW50IHsgfVxyXG4iXX0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class InputComponent {
|
|
4
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
5
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: InputComponent, isStandalone: true, selector: "ui-input", ngImport: i0, template: `<input class="ui-input" placeholder="Input Example" />`, isInline: true, styles: [".ui-input{padding:.5rem 1rem;border:1px solid #bdbdbd;border-radius:4px;font-size:1rem;width:100%;box-sizing:border-box}\n"] });
|
|
6
|
+
}
|
|
7
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InputComponent, decorators: [{
|
|
8
|
+
type: Component,
|
|
9
|
+
args: [{ selector: 'ui-input', standalone: true, template: `<input class="ui-input" placeholder="Input Example" />`, styles: [".ui-input{padding:.5rem 1rem;border:1px solid #bdbdbd;border-radius:4px;font-size:1rem;width:100%;box-sizing:border-box}\n"] }]
|
|
10
|
+
}] });
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy91aS9zcmMvbGliL2lucHV0L2lucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQVExQyxNQUFNLE9BQU8sY0FBYzt3R0FBZCxjQUFjOzRGQUFkLGNBQWMsb0VBSGIsd0RBQXdEOzs0RkFHekQsY0FBYztrQkFOMUIsU0FBUzsrQkFDSSxVQUFVLGNBQ1IsSUFBSSxZQUNOLHdEQUF3RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3VpLWlucHV0JyxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICB0ZW1wbGF0ZTogYDxpbnB1dCBjbGFzcz1cInVpLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJJbnB1dCBFeGFtcGxlXCIgLz5gLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vaW5wdXQuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgSW5wdXRDb21wb25lbnQgeyB9XHJcbiJdfQ==
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Component, Input, Output, signal, EventEmitter } from '@angular/core';
|
|
2
|
-
import { take } from 'rxjs';
|
|
3
|
-
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
4
2
|
import { C80IconComponent } from '../icon/icon.component';
|
|
5
3
|
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/material/checkbox";
|
|
7
4
|
export class C80TableComponent {
|
|
8
|
-
|
|
5
|
+
data$;
|
|
9
6
|
columns = [];
|
|
7
|
+
create = new EventEmitter();
|
|
8
|
+
update = new EventEmitter();
|
|
9
|
+
delete = new EventEmitter();
|
|
10
10
|
errorEvent = new EventEmitter();
|
|
11
11
|
data = signal([]);
|
|
12
12
|
keys = signal([]);
|
|
@@ -14,15 +14,26 @@ export class C80TableComponent {
|
|
|
14
14
|
newRow = signal(null);
|
|
15
15
|
editing = signal(null); // id of row being edited
|
|
16
16
|
editRow = signal(null);
|
|
17
|
+
dataSub;
|
|
17
18
|
ngOnInit() {
|
|
18
|
-
if (!this.
|
|
19
|
+
if (!this.data$)
|
|
19
20
|
return;
|
|
20
|
-
this.
|
|
21
|
+
this.dataSub = this.data$.subscribe({
|
|
22
|
+
next: (items) => {
|
|
23
|
+
this.data.set(items);
|
|
24
|
+
// Solo mostrar las columnas visibles
|
|
25
|
+
const visibleColumns = this.columns.filter(col => col?.visible !== false);
|
|
26
|
+
this.keys.set(visibleColumns.map(col => col.accessor));
|
|
27
|
+
},
|
|
28
|
+
error: (err) => this.errorEvent.emit(err?.message || 'Error al cargar datos')
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
ngOnDestroy() {
|
|
32
|
+
this.dataSub?.unsubscribe();
|
|
21
33
|
}
|
|
22
34
|
onInput(event, key, col) {
|
|
23
35
|
if (col?.type === 'boolean') {
|
|
24
|
-
|
|
25
|
-
const checked = event.checked;
|
|
36
|
+
const checked = event.target.checked;
|
|
26
37
|
this.updateNewRow(key, checked);
|
|
27
38
|
}
|
|
28
39
|
else {
|
|
@@ -33,28 +44,15 @@ export class C80TableComponent {
|
|
|
33
44
|
}
|
|
34
45
|
}
|
|
35
46
|
onDelete(row) {
|
|
36
|
-
if (!this.service.delete)
|
|
37
|
-
return;
|
|
38
47
|
const id = row['id'];
|
|
39
48
|
if (typeof id !== 'number') {
|
|
40
49
|
this.errorEvent.emit('No se puede borrar: id inválido');
|
|
41
50
|
return;
|
|
42
51
|
}
|
|
43
52
|
if (confirm('¿Está seguro de que desea borrar este elemento?')) {
|
|
44
|
-
this.
|
|
45
|
-
next: () => this.refresh(),
|
|
46
|
-
error: (err) => this.errorEvent.emit(err?.message || 'Error al borrar')
|
|
47
|
-
});
|
|
53
|
+
this.delete.emit(id);
|
|
48
54
|
}
|
|
49
55
|
}
|
|
50
|
-
refresh() {
|
|
51
|
-
this.service.get().pipe(take(1)).subscribe((items) => {
|
|
52
|
-
this.data.update(() => items);
|
|
53
|
-
// Solo mostrar las columnas visibles
|
|
54
|
-
const visibleColumns = this.columns.filter(col => col?.visible !== false);
|
|
55
|
-
this.keys.update(() => visibleColumns.map(col => col.accessor));
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
56
|
startCreate() {
|
|
59
57
|
this.creating.set(true);
|
|
60
58
|
// Inicializa newRow solo con los accessors de columnas visibles
|
|
@@ -83,17 +81,8 @@ export class C80TableComponent {
|
|
|
83
81
|
acc[col.accessor] = this.convertCellValue(row[col.accessor], col);
|
|
84
82
|
return acc;
|
|
85
83
|
}, {});
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
next: () => {
|
|
89
|
-
this.cancelCreate();
|
|
90
|
-
this.refresh();
|
|
91
|
-
},
|
|
92
|
-
error: (err) => {
|
|
93
|
-
this.errorEvent.emit(err?.message || 'Error al crear');
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
}
|
|
84
|
+
this.create.emit(converted);
|
|
85
|
+
this.cancelCreate();
|
|
97
86
|
}
|
|
98
87
|
/**
|
|
99
88
|
* Converts a cell value based on column type or sample data.
|
|
@@ -179,8 +168,7 @@ export class C80TableComponent {
|
|
|
179
168
|
if (!current)
|
|
180
169
|
return;
|
|
181
170
|
if (col?.type === 'boolean') {
|
|
182
|
-
|
|
183
|
-
const checked = event.checked;
|
|
171
|
+
const checked = event.target.checked;
|
|
184
172
|
this.editRow.set({ ...current, [key]: checked });
|
|
185
173
|
}
|
|
186
174
|
else {
|
|
@@ -199,20 +187,8 @@ export class C80TableComponent {
|
|
|
199
187
|
acc[col.accessor] = this.convertCellValue(this.editRow()[col.accessor], col);
|
|
200
188
|
return acc;
|
|
201
189
|
}, {});
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
if (updateFn) {
|
|
205
|
-
updateFn(id, converted).pipe(take(1)).subscribe({
|
|
206
|
-
next: () => {
|
|
207
|
-
this.cancelEdit();
|
|
208
|
-
this.refresh();
|
|
209
|
-
},
|
|
210
|
-
error: (err) => {
|
|
211
|
-
const message = (typeof err === 'object' && err && 'message' in err) ? err.message : undefined;
|
|
212
|
-
this.errorEvent.emit(message || 'Error al editar');
|
|
213
|
-
}
|
|
214
|
-
});
|
|
215
|
-
}
|
|
190
|
+
this.update.emit({ id, changes: converted });
|
|
191
|
+
this.cancelEdit();
|
|
216
192
|
}
|
|
217
193
|
/**
|
|
218
194
|
* TrackBy function for ngFor to avoid DOM re-creation (NG0956 warning).
|
|
@@ -222,16 +198,22 @@ export class C80TableComponent {
|
|
|
222
198
|
return (typeof id === 'string' || typeof id === 'number') ? id : index;
|
|
223
199
|
}
|
|
224
200
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: C80TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
225
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: C80TableComponent, isStandalone: true, selector: "c80-table", inputs: {
|
|
201
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: C80TableComponent, isStandalone: true, selector: "c80-table", inputs: { data$: "data$", columns: "columns" }, outputs: { create: "create", update: "update", delete: "delete", errorEvent: "errorEvent" }, ngImport: i0, template: "<div class=\"table-responsive\">\n <table class=\"table table-bordered table-hover align-middle\">\n <thead class=\"thead table-light\">\n <tr>\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <th class=\"text-center\">{{ col.label }}</th>\n }\n @else {\n <th>{{ col.label }}</th>\n }\n }\n }\n <th class=\"table-actions-header\">\n <span>Actions</span>\n <c80-icon button icon=\"add\" [disabled]=\"creating()\" title=\"Agregar\" class=\"add-action-btn\"\n (iconClick)=\"startCreate()\"></c80-icon>\n </th>\n </tr>\n </thead>\n <tbody>\n @for (row of data(); track trackById(i, row); let i = $index) {\n <tr>\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <td class=\"text-center\">\n @if (editing() === row['id']) {\n <input type=\"checkbox\" [checked]=\"!!editRow()?.[col.accessor]\"\n (change)=\"onEditInput($event, col.accessor, col)\" [attr.aria-label]=\"col.label\" />\n }\n @else {\n @if (row[col.accessor] === true) {\n <c80-icon icon=\"check\" [size]=\"1\"></c80-icon>\n <br />\n }\n @else if (row[col.accessor] === false) {\n <c80-icon icon=\"cancel\"></c80-icon>\n <br />\n }\n }\n </td>\n }\n @else {\n <td>\n @if (editing() === row['id']) {\n <input class=\"form-control form-control-sm\" [type]=\"col.type === 'number' ? 'number' : 'text'\"\n [value]=\"editRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\"\n (input)=\"onEditInput($event, col.accessor, col)\" />\n }\n @else {\n {{ row[col.accessor] }}\n }\n </td>\n }\n }\n }\n <td class=\"text-center\">\n @if (editing() === row['id']) {\n <c80-icon button icon=\"check\" title=\"Guardar\" (iconClick)=\"saveEdit(row)\"></c80-icon>\n <c80-icon button icon=\"cancel\" color=\"warn\" title=\"Cancelar\" (iconClick)=\"cancelEdit()\"></c80-icon>\n }\n @else {\n <c80-icon button icon=\"edit\" title=\"Editar\" (iconClick)=\"onEdit(row)\"></c80-icon>\n <c80-icon button icon=\"delete\" color=\"warn\" title=\"Borrar\" (iconClick)=\"onDelete(row)\"></c80-icon>\n }\n </td>\n </tr>\n }\n @if (creating()) {\n <tr>\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <td class=\"text-center\">\n <input type=\"checkbox\" [checked]=\"!!newRow()?.[col.accessor]\" (change)=\"onInput($event, col.accessor, col)\"\n [attr.aria-label]=\"col.label\" />\n </td>\n } @else {\n <td>\n <input class=\"form-control form-control-sm\" [type]=\"col.type === 'number' ? 'number' : 'text'\"\n [value]=\"newRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\"\n (input)=\"onInput($event, col.accessor, col)\" />\n </td>\n }\n }\n }\n <td class=\"text-center\">\n <c80-icon button icon=\"check\" title=\"Guardar\" (iconClick)=\"saveCreate()\"></c80-icon>\n <c80-icon button icon=\"cancel\" color=\"warn\" title=\"Cancelar\" (iconClick)=\"cancelCreate()\"></c80-icon>\n </td>\n </tr>\n }\n </tbody>\n </table>\n @if (data().length === 0) {\n <div class=\"text-center text-muted py-3\">\n No hay datos para mostrar.\n </div>\n }\n</div>", styles: ["@charset \"UTF-8\";input[type=checkbox]{width:1.5rem;height:1.5rem;accent-color:#1976d2;border-radius:4px;border:2px solid #bdbdbd;background:#fff;transition:box-shadow .2s,border-color .2s;box-shadow:0 1px 2px #0000000a;margin:0 .25rem;vertical-align:middle;cursor:pointer}.table-responsive{width:100%;overflow-x:auto}.table-responsive .table{min-width:0px}.table-responsive .table .thead .table-actions-header{text-align:center;vertical-align:middle;display:flex;justify-content:center;align-items:center;gap:.5rem}.table-responsive .table .thead .table-actions-header .add-action-btn{margin-bottom:2px}.table-responsive .table .thead th{height:35px!important;min-height:35px!important;max-height:35px!important;vertical-align:middle!important;padding:.2rem .6rem!important}.table-responsive .table tbody td{height:35px!important;min-height:35px!important;max-height:35px!important;vertical-align:middle!important;padding:.2rem .8rem!important}.table-responsive .table tbody tr{height:35px!important;min-height:35px!important;max-height:35px!important;cursor:pointer}.table-responsive .table tbody tr:hover{background-color:#f5f5f5}.table-responsive .table tbody input{border:1px solid rgba(34,0,255,.37);height:35px!important}\n"], dependencies: [{ kind: "component", type: C80IconComponent, selector: "c80-icon", inputs: ["icon", "color", "disabled", "size", "button", "type"], outputs: ["iconClick"] }] });
|
|
226
202
|
}
|
|
227
203
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: C80TableComponent, decorators: [{
|
|
228
204
|
type: Component,
|
|
229
|
-
args: [{ selector: 'c80-table', standalone: true, imports: [
|
|
230
|
-
}], propDecorators: {
|
|
205
|
+
args: [{ selector: 'c80-table', standalone: true, imports: [C80IconComponent], template: "<div class=\"table-responsive\">\n <table class=\"table table-bordered table-hover align-middle\">\n <thead class=\"thead table-light\">\n <tr>\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <th class=\"text-center\">{{ col.label }}</th>\n }\n @else {\n <th>{{ col.label }}</th>\n }\n }\n }\n <th class=\"table-actions-header\">\n <span>Actions</span>\n <c80-icon button icon=\"add\" [disabled]=\"creating()\" title=\"Agregar\" class=\"add-action-btn\"\n (iconClick)=\"startCreate()\"></c80-icon>\n </th>\n </tr>\n </thead>\n <tbody>\n @for (row of data(); track trackById(i, row); let i = $index) {\n <tr>\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <td class=\"text-center\">\n @if (editing() === row['id']) {\n <input type=\"checkbox\" [checked]=\"!!editRow()?.[col.accessor]\"\n (change)=\"onEditInput($event, col.accessor, col)\" [attr.aria-label]=\"col.label\" />\n }\n @else {\n @if (row[col.accessor] === true) {\n <c80-icon icon=\"check\" [size]=\"1\"></c80-icon>\n <br />\n }\n @else if (row[col.accessor] === false) {\n <c80-icon icon=\"cancel\"></c80-icon>\n <br />\n }\n }\n </td>\n }\n @else {\n <td>\n @if (editing() === row['id']) {\n <input class=\"form-control form-control-sm\" [type]=\"col.type === 'number' ? 'number' : 'text'\"\n [value]=\"editRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\"\n (input)=\"onEditInput($event, col.accessor, col)\" />\n }\n @else {\n {{ row[col.accessor] }}\n }\n </td>\n }\n }\n }\n <td class=\"text-center\">\n @if (editing() === row['id']) {\n <c80-icon button icon=\"check\" title=\"Guardar\" (iconClick)=\"saveEdit(row)\"></c80-icon>\n <c80-icon button icon=\"cancel\" color=\"warn\" title=\"Cancelar\" (iconClick)=\"cancelEdit()\"></c80-icon>\n }\n @else {\n <c80-icon button icon=\"edit\" title=\"Editar\" (iconClick)=\"onEdit(row)\"></c80-icon>\n <c80-icon button icon=\"delete\" color=\"warn\" title=\"Borrar\" (iconClick)=\"onDelete(row)\"></c80-icon>\n }\n </td>\n </tr>\n }\n @if (creating()) {\n <tr>\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <td class=\"text-center\">\n <input type=\"checkbox\" [checked]=\"!!newRow()?.[col.accessor]\" (change)=\"onInput($event, col.accessor, col)\"\n [attr.aria-label]=\"col.label\" />\n </td>\n } @else {\n <td>\n <input class=\"form-control form-control-sm\" [type]=\"col.type === 'number' ? 'number' : 'text'\"\n [value]=\"newRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\"\n (input)=\"onInput($event, col.accessor, col)\" />\n </td>\n }\n }\n }\n <td class=\"text-center\">\n <c80-icon button icon=\"check\" title=\"Guardar\" (iconClick)=\"saveCreate()\"></c80-icon>\n <c80-icon button icon=\"cancel\" color=\"warn\" title=\"Cancelar\" (iconClick)=\"cancelCreate()\"></c80-icon>\n </td>\n </tr>\n }\n </tbody>\n </table>\n @if (data().length === 0) {\n <div class=\"text-center text-muted py-3\">\n No hay datos para mostrar.\n </div>\n }\n</div>", styles: ["@charset \"UTF-8\";input[type=checkbox]{width:1.5rem;height:1.5rem;accent-color:#1976d2;border-radius:4px;border:2px solid #bdbdbd;background:#fff;transition:box-shadow .2s,border-color .2s;box-shadow:0 1px 2px #0000000a;margin:0 .25rem;vertical-align:middle;cursor:pointer}.table-responsive{width:100%;overflow-x:auto}.table-responsive .table{min-width:0px}.table-responsive .table .thead .table-actions-header{text-align:center;vertical-align:middle;display:flex;justify-content:center;align-items:center;gap:.5rem}.table-responsive .table .thead .table-actions-header .add-action-btn{margin-bottom:2px}.table-responsive .table .thead th{height:35px!important;min-height:35px!important;max-height:35px!important;vertical-align:middle!important;padding:.2rem .6rem!important}.table-responsive .table tbody td{height:35px!important;min-height:35px!important;max-height:35px!important;vertical-align:middle!important;padding:.2rem .8rem!important}.table-responsive .table tbody tr{height:35px!important;min-height:35px!important;max-height:35px!important;cursor:pointer}.table-responsive .table tbody tr:hover{background-color:#f5f5f5}.table-responsive .table tbody input{border:1px solid rgba(34,0,255,.37);height:35px!important}\n"] }]
|
|
206
|
+
}], propDecorators: { data$: [{
|
|
231
207
|
type: Input
|
|
232
208
|
}], columns: [{
|
|
233
209
|
type: Input
|
|
210
|
+
}], create: [{
|
|
211
|
+
type: Output
|
|
212
|
+
}], update: [{
|
|
213
|
+
type: Output
|
|
214
|
+
}], delete: [{
|
|
215
|
+
type: Output
|
|
234
216
|
}], errorEvent: [{
|
|
235
217
|
type: Output
|
|
236
218
|
}] } });
|
|
237
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy91aS9zcmMvbGliL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMvdWkvc3JjL2xpYi90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RixPQUFPLEVBQWMsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRS9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUF3QjFELE1BQU0sT0FBTyxpQkFBaUI7SUFDbkIsT0FBTyxDQUFzQjtJQUM3QixPQUFPLEdBQXFCLEVBQUUsQ0FBQztJQUM5QixVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQUV6QyxJQUFJLEdBQUcsTUFBTSxDQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZCLElBQUksR0FBRyxNQUFNLENBQVcsRUFBRSxDQUFDLENBQUM7SUFDckMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QixNQUFNLEdBQUcsTUFBTSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUNoQyxPQUFPLEdBQUcsTUFBTSxDQUFnQixJQUFJLENBQUMsQ0FBQyxDQUFDLHlCQUF5QjtJQUNoRSxPQUFPLEdBQUcsTUFBTSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUVuRCxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUMxQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFn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S0FBSyxDQUFDO0lBQ3pFLENBQUM7d0dBck5VLGlCQUFpQjs0RkFBakIsaUJBQWlCLGdLQzVCOUIscXJIQXFHTSx5Z0NEN0VNLGlCQUFpQixxWUFBRSxnQkFBZ0I7OzRGQUlsQyxpQkFBaUI7a0JBUDdCLFNBQVM7K0JBQ0UsV0FBVyxjQUNULElBQUksV0FDUCxDQUFDLGlCQUFpQixFQUFFLGdCQUFnQixDQUFDOzhCQUtyQyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIE91dHB1dCwgc2lnbmFsLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGFrZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHR5cGUgeyBNYXRDaGVja2JveENoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHsgQzgwSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uL2ljb24vaWNvbi5jb21wb25lbnQnO1xyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQzgwVGFibGVTZXJ2aWNlPFQ+IHtcclxuICBnZXQ6ICgpID0+IE9ic2VydmFibGU8VFtdPjtcclxuICBjcmVhdGU6IChyb3c6IFQpID0+IE9ic2VydmFibGU8VD47XHJcbiAgZGVsZXRlOiAoaWQ6IG51bWJlcikgPT4gT2JzZXJ2YWJsZTx2b2lkPjtcclxuICB1cGRhdGU6IChpZDogbnVtYmVyLCByb3c6IFQpID0+IE9ic2VydmFibGU8VD47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQzgwVGFibGVDb2xEZWYge1xyXG4gIGFjY2Vzc29yOiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB2aXNpYmxlPzogYm9vbGVhbjsgLy8gU2kgbm8gc2UgZXNwZWNpZmljYSwgc2UgYXN1bWUgdHJ1ZVxyXG4gIHR5cGU/OiAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2Jvb2xlYW4nOyAvLyBUaXBvIGRlIGRhdG8gcGFyYSBsYSBjb2x1bW5hXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYzgwLXRhYmxlJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtNYXRDaGVja2JveE1vZHVsZSwgQzgwSWNvbkNvbXBvbmVudF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vdGFibGUuY29tcG9uZW50LnNjc3MnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQzgwVGFibGVDb21wb25lbnQ8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgc2VydmljZSE6IEM4MFRhYmxlU2VydmljZTxUPjtcclxuICBASW5wdXQoKSBjb2x1bW5zOiBDODBUYWJsZUNvbERlZltdID0gW107XHJcbiAgQE91dHB1dCgpIGVycm9yRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgcmVhZG9ubHkgZGF0YSA9IHNpZ25hbDxUW10+KFtdKTtcclxuICByZWFkb25seSBrZXlzID0gc2lnbmFsPHN0cmluZ1tdPihbXSk7XHJcbiAgY3JlYXRpbmcgPSBzaWduYWwoZmFsc2UpO1xyXG4gIG5ld1JvdyA9IHNpZ25hbDxQYXJ0aWFsPFQ+IHwgbnVsbD4obnVsbCk7XHJcbiAgcmVhZG9ubHkgZWRpdGluZyA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTsgLy8gaWQgb2Ygcm93IGJlaW5nIGVkaXRlZFxyXG4gIHJlYWRvbmx5IGVkaXRSb3cgPSBzaWduYWw8UGFydGlhbDxUPiB8IG51bGw+KG51bGwpO1xyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICghdGhpcy5zZXJ2aWNlKSByZXR1cm47XHJcbiAgICB0aGlzLnJlZnJlc2goKTtcclxuICB9XHJcblxyXG4gIG9uSW5wdXQoZXZlbnQ6IEV2ZW50IHwgTWF0Q2hlY2tib3hDaGFuZ2UsIGtleTogc3RyaW5nLCBjb2w/OiBDODBUYWJsZUNvbERlZikge1xyXG4gICAgaWYgKGNvbD8udHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgIC8vIE1hdENoZWNrYm94Q2hhbmdlXHJcbiAgICAgIGNvbnN0IGNoZWNrZWQgPSAoZXZlbnQgYXMgTWF0Q2hlY2tib3hDaGFuZ2UpLmNoZWNrZWQ7XHJcbiAgICAgIHRoaXMudXBkYXRlTmV3Um93KGtleSwgY2hlY2tlZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSAoZXZlbnQgYXMgRXZlbnQpLnRhcmdldDtcclxuICAgICAgaWYgKHRhcmdldCAmJiB0eXBlb2YgKHRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZU5ld1JvdyhrZXksICh0YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkRlbGV0ZShyb3c6IFQpIHtcclxuICAgIGlmICghdGhpcy5zZXJ2aWNlLmRlbGV0ZSkgcmV0dXJuO1xyXG4gICAgY29uc3QgaWQgPSByb3dbJ2lkJ107XHJcbiAgICBpZiAodHlwZW9mIGlkICE9PSAnbnVtYmVyJykge1xyXG4gICAgICB0aGlzLmVycm9yRXZlbnQuZW1pdCgnTm8gc2UgcHVlZGUgYm9ycmFyOiBpZCBpbnbDoWxpZG8nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbmZpcm0oJ8K/RXN0w6Egc2VndXJvIGRlIHF1ZSBkZXNlYSBib3JyYXIgZXN0ZSBlbGVtZW50bz8nKSkge1xyXG4gICAgICB0aGlzLnNlcnZpY2UuZGVsZXRlKGlkKS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKCkgPT4gdGhpcy5yZWZyZXNoKCksXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHRoaXMuZXJyb3JFdmVudC5lbWl0KGVycj8ubWVzc2FnZSB8fCAnRXJyb3IgYWwgYm9ycmFyJylcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWZyZXNoKCkge1xyXG4gICAgdGhpcy5zZXJ2aWNlLmdldCgpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKChpdGVtcykgPT4ge1xyXG4gICAgICB0aGlzLmRhdGEudXBkYXRlKCgpID0+IGl0ZW1zKTtcclxuICAgICAgLy8gU29sbyBtb3N0cmFyIGxhcyBjb2x1bW5hcyB2aXNpYmxlc1xyXG4gICAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbD8udmlzaWJsZSAhPT0gZmFsc2UpO1xyXG4gICAgICB0aGlzLmtleXMudXBkYXRlKCgpID0+IHZpc2libGVDb2x1bW5zLm1hcChjb2wgPT4gY29sLmFjY2Vzc29yKSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHN0YXJ0Q3JlYXRlKCkge1xyXG4gICAgdGhpcy5jcmVhdGluZy5zZXQodHJ1ZSk7XHJcbiAgICAvLyBJbmljaWFsaXphIG5ld1JvdyBzb2xvIGNvbiBsb3MgYWNjZXNzb3JzIGRlIGNvbHVtbmFzIHZpc2libGVzXHJcbiAgICBjb25zdCByb3c6IFBhcnRpYWw8VD4gPSB7fTtcclxuICAgIHRoaXMuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC52aXNpYmxlICE9PSBmYWxzZSkuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAocm93IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtjb2wuYWNjZXNzb3JdID0gJyc7XHJcbiAgICB9KTtcclxuICAgIHRoaXMubmV3Um93LnNldChyb3cpO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsQ3JlYXRlKCkge1xyXG4gICAgdGhpcy5jcmVhdGluZy5zZXQoZmFsc2UpO1xyXG4gICAgdGhpcy5uZXdSb3cuc2V0KG51bGwpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlTmV3Um93KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xyXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMubmV3Um93KCk7XHJcbiAgICBpZiAoIWN1cnJlbnQpIHJldHVybjtcclxuICAgIHRoaXMubmV3Um93LnNldCh7IC4uLmN1cnJlbnQsIFtrZXldOiB2YWx1ZSB9KTtcclxuICB9XHJcblxyXG4gIHNhdmVDcmVhdGUoKSB7XHJcbiAgICBjb25zdCByb3cgPSB0aGlzLm5ld1JvdygpO1xyXG4gICAgaWYgKCFyb3cpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC52aXNpYmxlICE9PSBmYWxzZSk7XHJcbiAgICBjb25zdCBjb252ZXJ0ZWQgPSB2aXNpYmxlQ29sdW1ucy5yZWR1Y2UoKGFjYywgY29sKSA9PiB7XHJcbiAgICAgIGFjY1tjb2wuYWNjZXNzb3JdID0gdGhpcy5jb252ZXJ0Q2VsbFZhbHVlKHJvd1tjb2wuYWNjZXNzb3JdLCBjb2wpO1xyXG4gICAgICByZXR1cm4gYWNjO1xyXG4gICAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIGFzIFBhcnRpYWw8VD47XHJcblxyXG4gICAgaWYgKHRoaXMuc2VydmljZS5jcmVhdGUpIHtcclxuICAgICAgKHRoaXMuc2VydmljZS5jcmVhdGUgYXMgKHJvdzogUGFydGlhbDxUPikgPT4gT2JzZXJ2YWJsZTxUPikoY29udmVydGVkKS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jYW5jZWxDcmVhdGUoKTtcclxuICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgIHRoaXMuZXJyb3JFdmVudC5lbWl0KGVycj8ubWVzc2FnZSB8fCAnRXJyb3IgYWwgY3JlYXInKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udmVydHMgYSBjZWxsIHZhbHVlIGJhc2VkIG9uIGNvbHVtbiB0eXBlIG9yIHNhbXBsZSBkYXRhLlxyXG4gICAqIEhhbmRsZXMgc3RyaW5naWZpY2F0aW9uIG9mIG9iamVjdHMgZm9yIHN0cmluZyBjb2x1bW5zLlxyXG4gICAqL1xyXG4gIC8qKlxyXG4gICAqIENvbnZlcnRzIGEgY2VsbCB2YWx1ZSBiYXNlZCBvbiBjb2x1bW4gdHlwZSBvciBzYW1wbGUgZGF0YS5cclxuICAgKiBEZWxlZ2F0ZXMgdG8gdHlwZS1zcGVjaWZpYyBoZWxwZXJzIGZvciBjbGFyaXR5IGFuZCBtYWludGFpbmFiaWxpdHkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjb252ZXJ0Q2VsbFZhbHVlKHZhbHVlOiB1bmtub3duLCBjb2w6IEM4MFRhYmxlQ29sRGVmKTogdW5rbm93biB7XHJcbiAgICBpZiAoY29sLnR5cGUgPT09ICdib29sZWFuJykgcmV0dXJuIHRoaXMudG9Cb29sZWFuKHZhbHVlKTtcclxuICAgIGlmIChjb2wudHlwZSA9PT0gJ251bWJlcicpIHJldHVybiB0aGlzLnRvTnVtYmVyKHZhbHVlKTtcclxuICAgIGlmIChjb2wudHlwZSA9PT0gJ3N0cmluZycpIHJldHVybiB0aGlzLnRvU3RyaW5nVmFsdWUodmFsdWUpO1xyXG5cclxuICAgIC8vIEZhbGxiYWNrOiB1c2Ugc2FtcGxlIGRhdGEgaWYgYXZhaWxhYmxlXHJcbiAgICBjb25zdCBzYW1wbGUgPSB0aGlzLmRhdGEoKVswXTtcclxuICAgIGlmIChzYW1wbGUgJiYgY29sLmFjY2Vzc29yIGluIHNhbXBsZSkge1xyXG4gICAgICBjb25zdCBzYW1wbGVWYWx1ZSA9IHNhbXBsZVtjb2wuYWNjZXNzb3JdO1xyXG4gICAgICBpZiAodHlwZW9mIHNhbXBsZVZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB0aGlzLnRvQm9vbGVhbih2YWx1ZSk7XHJcbiAgICAgIGlmICh0eXBlb2Ygc2FtcGxlVmFsdWUgPT09ICdudW1iZXInKSByZXR1cm4gdGhpcy50b051bWJlcih2YWx1ZSk7XHJcbiAgICAgIGlmICh0eXBlb2Ygc2FtcGxlVmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdGhpcy50b1N0cmluZ1ZhbHVlKHZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKiBDb252ZXJ0cyB2YWx1ZSB0byBib29sZWFuIHVzaW5nIGJlc3QgcHJhY3RpY2VzLiAqL1xyXG4gIHByaXZhdGUgdG9Cb29sZWFuKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB2YWx1ZTtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJyB8fCB2YWx1ZS50cmltKCkgPT09ICcxJztcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSByZXR1cm4gdmFsdWUgPT09IDE7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKiogQ29udmVydHMgdmFsdWUgdG8gbnVtYmVyIHVzaW5nIGJlc3QgcHJhY3RpY2VzLiAqL1xyXG4gIHByaXZhdGUgdG9OdW1iZXIodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiB2YWx1ZTtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWUudHJpbSgpID09PSAnJyA/IHVuZGVmaW5lZCA6IE51bWJlcih2YWx1ZSk7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB2YWx1ZSA/IDEgOiAwO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8qKiBDb252ZXJ0cyB2YWx1ZSB0byBzdHJpbmcgdXNpbmcgYmVzdCBwcmFjdGljZXMsIGFsd2F5cyBzdHJpbmdpZmllcyBvYmplY3RzLiAqL1xyXG4gIHByaXZhdGUgdG9TdHJpbmdWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XHJcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuICcnO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gU3RyaW5nKHZhbHVlKTtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcclxuICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgcmV0dXJuICdbb2JqZWN0IE9iamVjdF0nO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBGb3IgZnVuY3Rpb25zLCBzeW1ib2xzLCB1bmRlZmluZWQsIGV0Yy4sIHJldHVybiBlbXB0eSBzdHJpbmdcclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIG9uRWRpdChyb3c6IFQpIHtcclxuICAgIHRoaXMuZWRpdGluZy5zZXQocm93WydpZCddIGFzIG51bWJlcik7XHJcbiAgICBjb25zdCBlZGl0OiBQYXJ0aWFsPFQ+ID0ge307XHJcbiAgICB0aGlzLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wudmlzaWJsZSAhPT0gZmFsc2UpLmZvckVhY2goY29sID0+IHtcclxuICAgICAgKGVkaXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2NvbC5hY2Nlc3Nvcl0gPSByb3dbY29sLmFjY2Vzc29yXTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5lZGl0Um93LnNldChlZGl0KTtcclxuICB9XHJcblxyXG4gIGNhbmNlbEVkaXQoKSB7XHJcbiAgICB0aGlzLmVkaXRpbmcuc2V0KG51bGwpO1xyXG4gICAgdGhpcy5lZGl0Um93LnNldChudWxsKTtcclxuICB9XHJcblxyXG4gIG9uRWRpdElucHV0KGV2ZW50OiBFdmVudCB8IE1hdENoZWNrYm94Q2hhbmdlLCBrZXk6IHN0cmluZywgY29sPzogQzgwVGFibGVDb2xEZWYpIHtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmVkaXRSb3coKTtcclxuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xyXG4gICAgaWYgKGNvbD8udHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgIC8vIE1hdENoZWNrYm94Q2hhbmdlXHJcbiAgICAgIGNvbnN0IGNoZWNrZWQgPSAoZXZlbnQgYXMgTWF0Q2hlY2tib3hDaGFuZ2UpLmNoZWNrZWQ7XHJcbiAgICAgIHRoaXMuZWRpdFJvdy5zZXQoeyAuLi5jdXJyZW50LCBba2V5XTogY2hlY2tlZCB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRhcmdldCA9IChldmVudCBhcyBFdmVudCkudGFyZ2V0O1xyXG4gICAgICBpZiAodGFyZ2V0ICYmIHR5cGVvZiAodGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHRoaXMuZWRpdFJvdy5zZXQoeyAuLi5jdXJyZW50LCBba2V5XTogKHRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2F2ZUVkaXQocm93OiBUKSB7XHJcbiAgICBjb25zdCBpZCA9IHJvd1snaWQnXTtcclxuICAgIGlmICh0eXBlb2YgaWQgIT09ICdudW1iZXInIHx8ICF0aGlzLmVkaXRSb3coKSkgcmV0dXJuO1xyXG4gICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wudmlzaWJsZSAhPT0gZmFsc2UpO1xyXG4gICAgY29uc3QgY29udmVydGVkID0gdmlzaWJsZUNvbHVtbnMucmVkdWNlKChhY2MsIGNvbCkgPT4ge1xyXG4gICAgICBhY2NbY29sLmFjY2Vzc29yXSA9IHRoaXMuY29udmVydENlbGxWYWx1ZSh0aGlzLmVkaXRSb3coKSFbY29sLmFjY2Vzc29yXSwgY29sKTtcclxuICAgICAgcmV0dXJuIGFjYztcclxuICAgIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSBhcyBQYXJ0aWFsPFQ+O1xyXG4gICAgLy8gVHlwZS1zYWZlIHVwZGF0ZSBtZXRob2QgZGV0ZWN0aW9uXHJcbiAgICBjb25zdCB1cGRhdGVGbiA9ICh0aGlzLnNlcnZpY2UgYXMgeyB1cGRhdGU/OiAoaWQ6IG51bWJlciwgcm93OiBUKSA9PiBPYnNlcnZhYmxlPFQ+IH0pLnVwZGF0ZTtcclxuICAgIGlmICh1cGRhdGVGbikge1xyXG4gICAgICB1cGRhdGVGbihpZCwgY29udmVydGVkIGFzIFQpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNhbmNlbEVkaXQoKTtcclxuICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnI6IHVua25vd24pID0+IHtcclxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAodHlwZW9mIGVyciA9PT0gJ29iamVjdCcgJiYgZXJyICYmICdtZXNzYWdlJyBpbiBlcnIpID8gKGVyciBhcyB7IG1lc3NhZ2U/OiBzdHJpbmcgfSkubWVzc2FnZSA6IHVuZGVmaW5lZDtcclxuICAgICAgICAgIHRoaXMuZXJyb3JFdmVudC5lbWl0KG1lc3NhZ2UgfHwgJ0Vycm9yIGFsIGVkaXRhcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmFja0J5IGZ1bmN0aW9uIGZvciBuZ0ZvciB0byBhdm9pZCBET00gcmUtY3JlYXRpb24gKE5HMDk1NiB3YXJuaW5nKS5cclxuICAgKi9cclxuICB0cmFja0J5SWQoaW5kZXg6IG51bWJlciwgcm93OiBUKTogbnVtYmVyIHwgc3RyaW5nIHtcclxuICAgIGNvbnN0IGlkID0gcm93ICYmIHR5cGVvZiByb3cgPT09ICdvYmplY3QnICYmICdpZCcgaW4gcm93ID8gKHJvdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbJ2lkJ10gOiB1bmRlZmluZWQ7XHJcbiAgICByZXR1cm4gKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGlkID09PSAnbnVtYmVyJykgPyBpZCA6IGluZGV4O1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ib3JkZXJlZCB0YWJsZS1ob3ZlciBhbGlnbi1taWRkbGVcIj5cbiAgICA8dGhlYWQgY2xhc3M9XCJ0aGVhZCB0YWJsZS1saWdodFwiPlxuICAgICAgPHRyPlxuICAgICAgICBAZm9yIChjb2wgb2YgY29sdW1uczsgdHJhY2sgY29sKSB7XG4gICAgICAgIEBpZiAoY29sLnZpc2libGUgIT09IGZhbHNlKSB7XG4gICAgICAgIEBpZiAoY29sLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPnt7IGNvbC5sYWJlbCB9fTwvdGg+XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2Uge1xuICAgICAgICA8dGg+e3sgY29sLmxhYmVsIH19PC90aD5cbiAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgPHRoIGNsYXNzPVwidGFibGUtYWN0aW9ucy1oZWFkZXJcIj5cbiAgICAgICAgICA8c3Bhbj5BY3Rpb25zPC9zcGFuPlxuICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cImFkZFwiIFtkaXNhYmxlZF09XCJjcmVhdGluZygpXCIgdGl0bGU9XCJBZ3JlZ2FyXCIgY2xhc3M9XCJhZGQtYWN0aW9uLWJ0blwiXG4gICAgICAgICAgICAoaWNvbkNsaWNrKT1cInN0YXJ0Q3JlYXRlKClcIj48L2M4MC1pY29uPlxuICAgICAgICA8L3RoPlxuICAgICAgPC90cj5cbiAgICA8L3RoZWFkPlxuICAgIDx0Ym9keT5cbiAgICAgIEBmb3IgKHJvdyBvZiBkYXRhKCk7IHRyYWNrIHRyYWNrQnlJZChpLCByb3cpOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgPHRyPlxuICAgICAgICBAZm9yIChjb2wgb2YgY29sdW1uczsgdHJhY2sgY29sKSB7XG4gICAgICAgIEBpZiAoY29sLnZpc2libGUgIT09IGZhbHNlKSB7XG4gICAgICAgIEBpZiAoY29sLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgIEBpZiAoZWRpdGluZygpID09PSByb3dbJ2lkJ10pIHtcbiAgICAgICAgICA8bWF0LWNoZWNrYm94IFtjaGVja2VkXT1cIiEhZWRpdFJvdygpPy5bY29sLmFjY2Vzc29yXVwiIChjaGFuZ2UpPVwib25FZGl0SW5wdXQoJGV2ZW50LCBjb2wuYWNjZXNzb3IsIGNvbClcIlxuICAgICAgICAgICAgW2FyaWEtbGFiZWxdPVwiY29sLmxhYmVsXCI+PC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICBAaWYgKHJvd1tjb2wuYWNjZXNzb3JdID09PSB0cnVlKSB7XG4gICAgICAgICAgPGM4MC1pY29uIGljb249XCJjaGVja1wiIFtzaXplXT1cIjFcIj48L2M4MC1pY29uPlxuICAgICAgICAgIDxiciAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAZWxzZSBpZiAocm93W2NvbC5hY2Nlc3Nvcl0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgPGM4MC1pY29uIGljb249XCJjYW5jZWxcIj48L2M4MC1pY29uPlxuICAgICAgICAgIDxiciAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2Uge1xuICAgICAgICA8dGQ+XG4gICAgICAgICAgQGlmIChlZGl0aW5nKCkgPT09IHJvd1snaWQnXSkge1xuICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiBbdHlwZV09XCJjb2wudHlwZSA9PT0gJ251bWJlcicgPyAnbnVtYmVyJyA6ICd0ZXh0J1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZWRpdFJvdygpPy5bY29sLmFjY2Vzc29yXSA/PyAnJ1wiIFtwbGFjZWhvbGRlcl09XCJjb2wubGFiZWxcIlxuICAgICAgICAgICAgKGlucHV0KT1cIm9uRWRpdElucHV0KCRldmVudCwgY29sLmFjY2Vzc29yLCBjb2wpXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgIHt7IHJvd1tjb2wuYWNjZXNzb3JdIH19XG4gICAgICAgICAgfVxuICAgICAgICA8L3RkPlxuICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgIEBpZiAoZWRpdGluZygpID09PSByb3dbJ2lkJ10pIHtcbiAgICAgICAgICA8YzgwLWljb24gYnV0dG9uIGljb249XCJjaGVja1wiIHRpdGxlPVwiR3VhcmRhclwiIChpY29uQ2xpY2spPVwic2F2ZUVkaXQocm93KVwiPjwvYzgwLWljb24+XG4gICAgICAgICAgPGM4MC1pY29uIGJ1dHRvbiBpY29uPVwiY2FuY2VsXCIgY29sb3I9XCJ3YXJuXCIgdGl0bGU9XCJDYW5jZWxhclwiIChpY29uQ2xpY2spPVwiY2FuY2VsRWRpdCgpXCI+PC9jODAtaWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cImVkaXRcIiB0aXRsZT1cIkVkaXRhclwiIChpY29uQ2xpY2spPVwib25FZGl0KHJvdylcIj48L2M4MC1pY29uPlxuICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cImRlbGV0ZVwiIGNvbG9yPVwid2FyblwiIHRpdGxlPVwiQm9ycmFyXCIgKGljb25DbGljayk9XCJvbkRlbGV0ZShyb3cpXCI+PC9jODAtaWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgICAgfVxuICAgICAgQGlmIChjcmVhdGluZygpKSB7XG4gICAgICA8dHI+XG4gICAgICAgIEBmb3IgKGNvbCBvZiBjb2x1bW5zOyB0cmFjayBjb2wpIHtcbiAgICAgICAgQGlmIChjb2wudmlzaWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgQGlmIChjb2wudHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIDx0ZCBjbGFzcz1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgPG1hdC1jaGVja2JveCBbY2hlY2tlZF09XCIhIW5ld1JvdygpPy5bY29sLmFjY2Vzc29yXVwiIChjaGFuZ2UpPVwib25JbnB1dCgkZXZlbnQsIGNvbC5hY2Nlc3NvciwgY29sKVwiXG4gICAgICAgICAgICBbYXJpYS1sYWJlbF09XCJjb2wubGFiZWxcIj48L21hdC1jaGVja2JveD5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDx0ZD5cbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgW3R5cGVdPVwiY29sLnR5cGUgPT09ICdudW1iZXInID8gJ251bWJlcicgOiAndGV4dCdcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cIm5ld1JvdygpPy5bY29sLmFjY2Vzc29yXSA/PyAnJ1wiIFtwbGFjZWhvbGRlcl09XCJjb2wubGFiZWxcIlxuICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXQoJGV2ZW50LCBjb2wuYWNjZXNzb3IsIGNvbClcIiAvPlxuICAgICAgICA8L3RkPlxuICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cImNoZWNrXCIgdGl0bGU9XCJHdWFyZGFyXCIgKGljb25DbGljayk9XCJzYXZlQ3JlYXRlKClcIj48L2M4MC1pY29uPlxuICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cImNhbmNlbFwiIGNvbG9yPVwid2FyblwiIHRpdGxlPVwiQ2FuY2VsYXJcIiAoaWNvbkNsaWNrKT1cImNhbmNlbENyZWF0ZSgpXCI+PC9jODAtaWNvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+XG4gICAgICB9XG4gICAgPC90Ym9keT5cbiAgPC90YWJsZT5cbiAgQGlmIChkYXRhKCkubGVuZ3RoID09PSAwKSB7XG4gIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciB0ZXh0LW11dGVkIHB5LTNcIj5cbiAgICBObyBoYXkgZGF0b3MgcGFyYSBtb3N0cmFyLlxuICA8L2Rpdj5cbiAgfVxuPC9kaXY+Il19
|
|
219
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy91aS9zcmMvbGliL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMvdWkvc3JjL2xpYi90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFbEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBZ0IxRCxNQUFNLE9BQU8saUJBQWlCO0lBQ25CLEtBQUssQ0FBbUI7SUFDeEIsT0FBTyxHQUFxQixFQUFFLENBQUM7SUFDOUIsTUFBTSxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7SUFDeEMsTUFBTSxHQUFHLElBQUksWUFBWSxFQUF1QyxDQUFDO0lBQ2pFLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBQ3BDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBRXpDLElBQUksR0FBRyxNQUFNLENBQU0sRUFBRSxDQUFDLENBQUM7SUFDdkIsSUFBSSxHQUFHLE1BQU0sQ0FBVyxFQUFFLENBQUMsQ0FBQztJQUNyQyxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLE1BQU0sR0FBRyxNQUFNLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ2hDLE9BQU8sR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDLENBQUMseUJBQXlCO0lBQ2hFLE9BQU8sR0FBRyxNQUFNLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBRTNDLE9BQU8sQ0FBZ0I7SUFFL0IsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87UUFDeEIsSUFBSSxDQUFDLE9BQU8s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aUJBQWlCOzRGQUFqQixpQkFBaUIsa05DbEI5QiwyckhBcUdNLHl3Q0R2Rk0sZ0JBQWdCOzs0RkFJZixpQkFBaUI7a0JBUDdCLFNBQVM7K0JBQ0UsV0FBVyxjQUNULElBQUksV0FDUCxDQUFDLGdCQUFnQixDQUFDOzhCQUtsQixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNJLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIHNpZ25hbCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQzgwSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uL2ljb24vaWNvbi5jb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDODBUYWJsZUNvbERlZiB7XHJcbiAgYWNjZXNzb3I6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHZpc2libGU/OiBib29sZWFuOyAvLyBTaSBubyBzZSBlc3BlY2lmaWNhLCBzZSBhc3VtZSB0cnVlXHJcbiAgdHlwZT86ICdzdHJpbmcnIHwgJ251bWJlcicgfCAnYm9vbGVhbic7IC8vIFRpcG8gZGUgZGF0byBwYXJhIGxhIGNvbHVtbmFcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjODAtdGFibGUnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0M4MEljb25Db21wb25lbnRdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEM4MFRhYmxlQ29tcG9uZW50PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgZGF0YSQhOiBPYnNlcnZhYmxlPFRbXT47XHJcbiAgQElucHV0KCkgY29sdW1uczogQzgwVGFibGVDb2xEZWZbXSA9IFtdO1xyXG4gIEBPdXRwdXQoKSBjcmVhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPFBhcnRpYWw8VD4+KCk7XHJcbiAgQE91dHB1dCgpIHVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogbnVtYmVyLCBjaGFuZ2VzOiBQYXJ0aWFsPFQ+IH0+KCk7XHJcbiAgQE91dHB1dCgpIGRlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG4gIEBPdXRwdXQoKSBlcnJvckV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gIHJlYWRvbmx5IGRhdGEgPSBzaWduYWw8VFtdPihbXSk7XHJcbiAgcmVhZG9ubHkga2V5cyA9IHNpZ25hbDxzdHJpbmdbXT4oW10pO1xyXG4gIGNyZWF0aW5nID0gc2lnbmFsKGZhbHNlKTtcclxuICBuZXdSb3cgPSBzaWduYWw8UGFydGlhbDxUPiB8IG51bGw+KG51bGwpO1xyXG4gIHJlYWRvbmx5IGVkaXRpbmcgPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7IC8vIGlkIG9mIHJvdyBiZWluZyBlZGl0ZWRcclxuICByZWFkb25seSBlZGl0Um93ID0gc2lnbmFsPFBhcnRpYWw8VD4gfCBudWxsPihudWxsKTtcclxuXHJcbiAgcHJpdmF0ZSBkYXRhU3ViPzogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICghdGhpcy5kYXRhJCkgcmV0dXJuO1xyXG4gICAgdGhpcy5kYXRhU3ViID0gdGhpcy5kYXRhJC5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoaXRlbXMpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGEuc2V0KGl0ZW1zKTtcclxuICAgICAgICAvLyBTb2xvIG1vc3RyYXIgbGFzIGNvbHVtbmFzIHZpc2libGVzXHJcbiAgICAgICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2w/LnZpc2libGUgIT09IGZhbHNlKTtcclxuICAgICAgICB0aGlzLmtleXMuc2V0KHZpc2libGVDb2x1bW5zLm1hcChjb2wgPT4gY29sLmFjY2Vzc29yKSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB0aGlzLmVycm9yRXZlbnQuZW1pdChlcnI/Lm1lc3NhZ2UgfHwgJ0Vycm9yIGFsIGNhcmdhciBkYXRvcycpXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5kYXRhU3ViPy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgb25JbnB1dChldmVudDogRXZlbnQsIGtleTogc3RyaW5nLCBjb2w/OiBDODBUYWJsZUNvbERlZikge1xyXG4gICAgaWYgKGNvbD8udHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgIGNvbnN0IGNoZWNrZWQgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQ7XHJcbiAgICAgIHRoaXMudXBkYXRlTmV3Um93KGtleSwgY2hlY2tlZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpO1xyXG4gICAgICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQudmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVOZXdSb3coa2V5LCB0YXJnZXQudmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkRlbGV0ZShyb3c6IFQpIHtcclxuICAgIGNvbnN0IGlkID0gcm93WydpZCddO1xyXG4gICAgaWYgKHR5cGVvZiBpZCAhPT0gJ251bWJlcicpIHtcclxuICAgICAgdGhpcy5lcnJvckV2ZW50LmVtaXQoJ05vIHNlIHB1ZWRlIGJvcnJhcjogaWQgaW52w6FsaWRvJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChjb25maXJtKCfCv0VzdMOhIHNlZ3VybyBkZSBxdWUgZGVzZWEgYm9ycmFyIGVzdGUgZWxlbWVudG8/JykpIHtcclxuICAgICAgdGhpcy5kZWxldGUuZW1pdChpZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGFydENyZWF0ZSgpIHtcclxuICAgIHRoaXMuY3JlYXRpbmcuc2V0KHRydWUpO1xyXG4gICAgLy8gSW5pY2lhbGl6YSBuZXdSb3cgc29sbyBjb24gbG9zIGFjY2Vzc29ycyBkZSBjb2x1bW5hcyB2aXNpYmxlc1xyXG4gICAgY29uc3Qgcm93OiBQYXJ0aWFsPFQ+ID0ge307XHJcbiAgICB0aGlzLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wudmlzaWJsZSAhPT0gZmFsc2UpLmZvckVhY2goY29sID0+IHtcclxuICAgICAgKHJvdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbY29sLmFjY2Vzc29yXSA9ICcnO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLm5ld1Jvdy5zZXQocm93KTtcclxuICB9XHJcblxyXG4gIGNhbmNlbENyZWF0ZSgpIHtcclxuICAgIHRoaXMuY3JlYXRpbmcuc2V0KGZhbHNlKTtcclxuICAgIHRoaXMubmV3Um93LnNldChudWxsKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZU5ld1JvdyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLm5ld1JvdygpO1xyXG4gICAgaWYgKCFjdXJyZW50KSByZXR1cm47XHJcbiAgICB0aGlzLm5ld1Jvdy5zZXQoeyAuLi5jdXJyZW50LCBba2V5XTogdmFsdWUgfSk7XHJcbiAgfVxyXG5cclxuICBzYXZlQ3JlYXRlKCkge1xyXG4gICAgY29uc3Qgcm93ID0gdGhpcy5uZXdSb3coKTtcclxuICAgIGlmICghcm93KSByZXR1cm47XHJcbiAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC52aXNpYmxlICE9PSBmYWxzZSk7XHJcbiAgICBjb25zdCBjb252ZXJ0ZWQgPSB2aXNpYmxlQ29sdW1ucy5yZWR1Y2UoKGFjYywgY29sKSA9PiB7XHJcbiAgICAgIGFjY1tjb2wuYWNjZXNzb3JdID0gdGhpcy5jb252ZXJ0Q2VsbFZhbHVlKHJvd1tjb2wuYWNjZXNzb3JdLCBjb2wpO1xyXG4gICAgICByZXR1cm4gYWNjO1xyXG4gICAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIGFzIFBhcnRpYWw8VD47XHJcbiAgICB0aGlzLmNyZWF0ZS5lbWl0KGNvbnZlcnRlZCk7XHJcbiAgICB0aGlzLmNhbmNlbENyZWF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udmVydHMgYSBjZWxsIHZhbHVlIGJhc2VkIG9uIGNvbHVtbiB0eXBlIG9yIHNhbXBsZSBkYXRhLlxyXG4gICAqIEhhbmRsZXMgc3RyaW5naWZpY2F0aW9uIG9mIG9iamVjdHMgZm9yIHN0cmluZyBjb2x1bW5zLlxyXG4gICAqL1xyXG4gIC8qKlxyXG4gICAqIENvbnZlcnRzIGEgY2VsbCB2YWx1ZSBiYXNlZCBvbiBjb2x1bW4gdHlwZSBvciBzYW1wbGUgZGF0YS5cclxuICAgKiBEZWxlZ2F0ZXMgdG8gdHlwZS1zcGVjaWZpYyBoZWxwZXJzIGZvciBjbGFyaXR5IGFuZCBtYWludGFpbmFiaWxpdHkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjb252ZXJ0Q2VsbFZhbHVlKHZhbHVlOiB1bmtub3duLCBjb2w6IEM4MFRhYmxlQ29sRGVmKTogdW5rbm93biB7XHJcbiAgICBpZiAoY29sLnR5cGUgPT09ICdib29sZWFuJykgcmV0dXJuIHRoaXMudG9Cb29sZWFuKHZhbHVlKTtcclxuICAgIGlmIChjb2wudHlwZSA9PT0gJ251bWJlcicpIHJldHVybiB0aGlzLnRvTnVtYmVyKHZhbHVlKTtcclxuICAgIGlmIChjb2wudHlwZSA9PT0gJ3N0cmluZycpIHJldHVybiB0aGlzLnRvU3RyaW5nVmFsdWUodmFsdWUpO1xyXG5cclxuICAgIC8vIEZhbGxiYWNrOiB1c2Ugc2FtcGxlIGRhdGEgaWYgYXZhaWxhYmxlXHJcbiAgICBjb25zdCBzYW1wbGUgPSB0aGlzLmRhdGEoKVswXTtcclxuICAgIGlmIChzYW1wbGUgJiYgY29sLmFjY2Vzc29yIGluIHNhbXBsZSkge1xyXG4gICAgICBjb25zdCBzYW1wbGVWYWx1ZSA9IHNhbXBsZVtjb2wuYWNjZXNzb3JdO1xyXG4gICAgICBpZiAodHlwZW9mIHNhbXBsZVZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB0aGlzLnRvQm9vbGVhbih2YWx1ZSk7XHJcbiAgICAgIGlmICh0eXBlb2Ygc2FtcGxlVmFsdWUgPT09ICdudW1iZXInKSByZXR1cm4gdGhpcy50b051bWJlcih2YWx1ZSk7XHJcbiAgICAgIGlmICh0eXBlb2Ygc2FtcGxlVmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdGhpcy50b1N0cmluZ1ZhbHVlKHZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKiBDb252ZXJ0cyB2YWx1ZSB0byBib29sZWFuIHVzaW5nIGJlc3QgcHJhY3RpY2VzLiAqL1xyXG4gIHByaXZhdGUgdG9Cb29sZWFuKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB2YWx1ZTtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJyB8fCB2YWx1ZS50cmltKCkgPT09ICcxJztcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSByZXR1cm4gdmFsdWUgPT09IDE7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKiogQ29udmVydHMgdmFsdWUgdG8gbnVtYmVyIHVzaW5nIGJlc3QgcHJhY3RpY2VzLiAqL1xyXG4gIHByaXZhdGUgdG9OdW1iZXIodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiB2YWx1ZTtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWUudHJpbSgpID09PSAnJyA/IHVuZGVmaW5lZCA6IE51bWJlcih2YWx1ZSk7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB2YWx1ZSA/IDEgOiAwO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8qKiBDb252ZXJ0cyB2YWx1ZSB0byBzdHJpbmcgdXNpbmcgYmVzdCBwcmFjdGljZXMsIGFsd2F5cyBzdHJpbmdpZmllcyBvYmplY3RzLiAqL1xyXG4gIHByaXZhdGUgdG9TdHJpbmdWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XHJcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuICcnO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gU3RyaW5nKHZhbHVlKTtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcclxuICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgcmV0dXJuICdbb2JqZWN0IE9iamVjdF0nO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBGb3IgZnVuY3Rpb25zLCBzeW1ib2xzLCB1bmRlZmluZWQsIGV0Yy4sIHJldHVybiBlbXB0eSBzdHJpbmdcclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIG9uRWRpdChyb3c6IFQpIHtcclxuICAgIHRoaXMuZWRpdGluZy5zZXQocm93WydpZCddIGFzIG51bWJlcik7XHJcbiAgICBjb25zdCBlZGl0OiBQYXJ0aWFsPFQ+ID0ge307XHJcbiAgICB0aGlzLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wudmlzaWJsZSAhPT0gZmFsc2UpLmZvckVhY2goY29sID0+IHtcclxuICAgICAgKGVkaXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2NvbC5hY2Nlc3Nvcl0gPSByb3dbY29sLmFjY2Vzc29yXTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5lZGl0Um93LnNldChlZGl0KTtcclxuICB9XHJcblxyXG4gIGNhbmNlbEVkaXQoKSB7XHJcbiAgICB0aGlzLmVkaXRpbmcuc2V0KG51bGwpO1xyXG4gICAgdGhpcy5lZGl0Um93LnNldChudWxsKTtcclxuICB9XHJcblxyXG4gIG9uRWRpdElucHV0KGV2ZW50OiBFdmVudCwga2V5OiBzdHJpbmcsIGNvbD86IEM4MFRhYmxlQ29sRGVmKSB7XHJcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5lZGl0Um93KCk7XHJcbiAgICBpZiAoIWN1cnJlbnQpIHJldHVybjtcclxuICAgIGlmIChjb2w/LnR5cGUgPT09ICdib29sZWFuJykge1xyXG4gICAgICBjb25zdCBjaGVja2VkID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xyXG4gICAgICB0aGlzLmVkaXRSb3cuc2V0KHsgLi4uY3VycmVudCwgW2tleV06IGNoZWNrZWQgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpO1xyXG4gICAgICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQudmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0Um93LnNldCh7IC4uLmN1cnJlbnQsIFtrZXldOiB0YXJnZXQudmFsdWUgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNhdmVFZGl0KHJvdzogVCkge1xyXG4gICAgY29uc3QgaWQgPSByb3dbJ2lkJ107XHJcbiAgICBpZiAodHlwZW9mIGlkICE9PSAnbnVtYmVyJyB8fCAhdGhpcy5lZGl0Um93KCkpIHJldHVybjtcclxuICAgIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLnZpc2libGUgIT09IGZhbHNlKTtcclxuICAgIGNvbnN0IGNvbnZlcnRlZCA9IHZpc2libGVDb2x1bW5zLnJlZHVjZSgoYWNjLCBjb2wpID0+IHtcclxuICAgICAgYWNjW2NvbC5hY2Nlc3Nvcl0gPSB0aGlzLmNvbnZlcnRDZWxsVmFsdWUodGhpcy5lZGl0Um93KCkhW2NvbC5hY2Nlc3Nvcl0sIGNvbCk7XHJcbiAgICAgIHJldHVybiBhY2M7XHJcbiAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgYXMgUGFydGlhbDxUPjtcclxuICAgIHRoaXMudXBkYXRlLmVtaXQoeyBpZCwgY2hhbmdlczogY29udmVydGVkIH0pO1xyXG4gICAgdGhpcy5jYW5jZWxFZGl0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmFja0J5IGZ1bmN0aW9uIGZvciBuZ0ZvciB0byBhdm9pZCBET00gcmUtY3JlYXRpb24gKE5HMDk1NiB3YXJuaW5nKS5cclxuICAgKi9cclxuICB0cmFja0J5SWQoaW5kZXg6IG51bWJlciwgcm93OiBUKTogbnVtYmVyIHwgc3RyaW5nIHtcclxuICAgIGNvbnN0IGlkID0gcm93ICYmIHR5cGVvZiByb3cgPT09ICdvYmplY3QnICYmICdpZCcgaW4gcm93ID8gKHJvdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbJ2lkJ10gOiB1bmRlZmluZWQ7XHJcbiAgICByZXR1cm4gKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGlkID09PSAnbnVtYmVyJykgPyBpZCA6IGluZGV4O1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ib3JkZXJlZCB0YWJsZS1ob3ZlciBhbGlnbi1taWRkbGVcIj5cbiAgICA8dGhlYWQgY2xhc3M9XCJ0aGVhZCB0YWJsZS1saWdodFwiPlxuICAgICAgPHRyPlxuICAgICAgICBAZm9yIChjb2wgb2YgY29sdW1uczsgdHJhY2sgY29sKSB7XG4gICAgICAgIEBpZiAoY29sLnZpc2libGUgIT09IGZhbHNlKSB7XG4gICAgICAgIEBpZiAoY29sLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPnt7IGNvbC5sYWJlbCB9fTwvdGg+XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2Uge1xuICAgICAgICA8dGg+e3sgY29sLmxhYmVsIH19PC90aD5cbiAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgPHRoIGNsYXNzPVwidGFibGUtYWN0aW9ucy1oZWFkZXJcIj5cbiAgICAgICAgICA8c3Bhbj5BY3Rpb25zPC9zcGFuPlxuICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cImFkZFwiIFtkaXNhYmxlZF09XCJjcmVhdGluZygpXCIgdGl0bGU9XCJBZ3JlZ2FyXCIgY2xhc3M9XCJhZGQtYWN0aW9uLWJ0blwiXG4gICAgICAgICAgICAoaWNvbkNsaWNrKT1cInN0YXJ0Q3JlYXRlKClcIj48L2M4MC1pY29uPlxuICAgICAgICA8L3RoPlxuICAgICAgPC90cj5cbiAgICA8L3RoZWFkPlxuICAgIDx0Ym9keT5cbiAgICAgIEBmb3IgKHJvdyBvZiBkYXRhKCk7IHRyYWNrIHRyYWNrQnlJZChpLCByb3cpOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgPHRyPlxuICAgICAgICBAZm9yIChjb2wgb2YgY29sdW1uczsgdHJhY2sgY29sKSB7XG4gICAgICAgIEBpZiAoY29sLnZpc2libGUgIT09IGZhbHNlKSB7XG4gICAgICAgIEBpZiAoY29sLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgIEBpZiAoZWRpdGluZygpID09PSByb3dbJ2lkJ10pIHtcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiISFlZGl0Um93KCk/Lltjb2wuYWNjZXNzb3JdXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwib25FZGl0SW5wdXQoJGV2ZW50LCBjb2wuYWNjZXNzb3IsIGNvbClcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImNvbC5sYWJlbFwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICBAaWYgKHJvd1tjb2wuYWNjZXNzb3JdID09PSB0cnVlKSB7XG4gICAgICAgICAgPGM4MC1pY29uIGljb249XCJjaGVja1wiIFtzaXplXT1cIjFcIj48L2M4MC1pY29uPlxuICAgICAgICAgIDxiciAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAZWxzZSBpZiAocm93W2NvbC5hY2Nlc3Nvcl0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgPGM4MC1pY29uIGljb249XCJjYW5jZWxcIj48L2M4MC1pY29uPlxuICAgICAgICAgIDxiciAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2Uge1xuICAgICAgICA8dGQ+XG4gICAgICAgICAgQGlmIChlZGl0aW5nKCkgPT09IHJvd1snaWQnXSkge1xuICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiBbdHlwZV09XCJjb2wudHlwZSA9PT0gJ251bWJlcicgPyAnbnVtYmVyJyA6ICd0ZXh0J1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZWRpdFJvdygpPy5bY29sLmFjY2Vzc29yXSA/PyAnJ1wiIFtwbGFjZWhvbGRlcl09XCJjb2wubGFiZWxcIlxuICAgICAgICAgICAgKGlucHV0KT1cIm9uRWRpdElucHV0KCRldmVudCwgY29sLmFjY2Vzc29yLCBjb2wpXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgIHt7IHJvd1tjb2wuYWNjZXNzb3JdIH19XG4gICAgICAgICAgfVxuICAgICAgICA8L3RkPlxuICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgIEBpZiAoZWRpdGluZygpID09PSByb3dbJ2lkJ10pIHtcbiAgICAgICAgICA8YzgwLWljb24gYnV0dG9uIGljb249XCJjaGVja1wiIHRpdGxlPVwiR3VhcmRhclwiIChpY29uQ2xpY2spPVwic2F2ZUVkaXQocm93KVwiPjwvYzgwLWljb24+XG4gICAgICAgICAgPGM4MC1pY29uIGJ1dHRvbiBpY29uPVwiY2FuY2VsXCIgY29sb3I9XCJ3YXJuXCIgdGl0bGU9XCJDYW5jZWxhclwiIChpY29uQ2xpY2spPVwiY2FuY2VsRWRpdCgpXCI+PC9jODAtaWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cImVkaXRcIiB0aXRsZT1cIkVkaXRhclwiIChpY29uQ2xpY2spPVwib25FZGl0KHJvdylcIj48L2M4MC1pY29uPlxuICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cImRlbGV0ZVwiIGNvbG9yPVwid2FyblwiIHRpdGxlPVwiQm9ycmFyXCIgKGljb25DbGljayk9XCJvbkRlbGV0ZShyb3cpXCI+PC9jODAtaWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgICAgfVxuICAgICAgQGlmIChjcmVhdGluZygpKSB7XG4gICAgICA8dHI+XG4gICAgICAgIEBmb3IgKGNvbCBvZiBjb2x1bW5zOyB0cmFjayBjb2wpIHtcbiAgICAgICAgQGlmIChjb2wudmlzaWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgQGlmIChjb2wudHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIDx0ZCBjbGFzcz1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cIiEhbmV3Um93KCk/Lltjb2wuYWNjZXNzb3JdXCIgKGNoYW5nZSk9XCJvbklucHV0KCRldmVudCwgY29sLmFjY2Vzc29yLCBjb2wpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29sLmxhYmVsXCIgLz5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDx0ZD5cbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgW3R5cGVdPVwiY29sLnR5cGUgPT09ICdudW1iZXInID8gJ251bWJlcicgOiAndGV4dCdcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cIm5ld1JvdygpPy5bY29sLmFjY2Vzc29yXSA/PyAnJ1wiIFtwbGFjZWhvbGRlcl09XCJjb2wubGFiZWxcIlxuICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXQoJGV2ZW50LCBjb2wuYWNjZXNzb3IsIGNvbClcIiAvPlxuICAgICAgICA8L3RkPlxuICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cImNoZWNrXCIgdGl0bGU9XCJHdWFyZGFyXCIgKGljb25DbGljayk9XCJzYXZlQ3JlYXRlKClcIj48L2M4MC1pY29uPlxuICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cImNhbmNlbFwiIGNvbG9yPVwid2FyblwiIHRpdGxlPVwiQ2FuY2VsYXJcIiAoaWNvbkNsaWNrKT1cImNhbmNlbENyZWF0ZSgpXCI+PC9jODAtaWNvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+XG4gICAgICB9XG4gICAgPC90Ym9keT5cbiAgPC90YWJsZT5cbiAgQGlmIChkYXRhKCkubGVuZ3RoID09PSAwKSB7XG4gIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciB0ZXh0LW11dGVkIHB5LTNcIj5cbiAgICBObyBoYXkgZGF0b3MgcGFyYSBtb3N0cmFyLlxuICA8L2Rpdj5cbiAgfVxuPC9kaXY+Il19
|
package/index.d.ts
CHANGED
|
@@ -1,22 +1,21 @@
|
|
|
1
|
-
import { OnInit,
|
|
1
|
+
import { EventEmitter, OnInit, OnDestroy } from '@angular/core';
|
|
2
2
|
import { Observable } from 'rxjs';
|
|
3
|
-
import type { MatCheckboxChange } from '@angular/material/checkbox';
|
|
4
3
|
import * as i0 from "@angular/core";
|
|
5
|
-
export interface C80TableService<T> {
|
|
6
|
-
get: () => Observable<T[]>;
|
|
7
|
-
create: (row: T) => Observable<T>;
|
|
8
|
-
delete: (id: number) => Observable<void>;
|
|
9
|
-
update: (id: number, row: T) => Observable<T>;
|
|
10
|
-
}
|
|
11
4
|
export interface C80TableColDef {
|
|
12
5
|
accessor: string;
|
|
13
6
|
label: string;
|
|
14
7
|
visible?: boolean;
|
|
15
8
|
type?: 'string' | 'number' | 'boolean';
|
|
16
9
|
}
|
|
17
|
-
export declare class C80TableComponent<T extends Record<string, unknown>> implements OnInit {
|
|
18
|
-
|
|
10
|
+
export declare class C80TableComponent<T extends Record<string, unknown>> implements OnInit, OnDestroy {
|
|
11
|
+
data$: Observable<T[]>;
|
|
19
12
|
columns: C80TableColDef[];
|
|
13
|
+
create: EventEmitter<Partial<T>>;
|
|
14
|
+
update: EventEmitter<{
|
|
15
|
+
id: number;
|
|
16
|
+
changes: Partial<T>;
|
|
17
|
+
}>;
|
|
18
|
+
delete: EventEmitter<number>;
|
|
20
19
|
errorEvent: EventEmitter<string>;
|
|
21
20
|
readonly data: import("@angular/core").WritableSignal<T[]>;
|
|
22
21
|
readonly keys: import("@angular/core").WritableSignal<string[]>;
|
|
@@ -24,10 +23,11 @@ export declare class C80TableComponent<T extends Record<string, unknown>> implem
|
|
|
24
23
|
newRow: import("@angular/core").WritableSignal<Partial<T> | null>;
|
|
25
24
|
readonly editing: import("@angular/core").WritableSignal<number | null>;
|
|
26
25
|
readonly editRow: import("@angular/core").WritableSignal<Partial<T> | null>;
|
|
26
|
+
private dataSub?;
|
|
27
27
|
ngOnInit(): void;
|
|
28
|
-
|
|
28
|
+
ngOnDestroy(): void;
|
|
29
|
+
onInput(event: Event, key: string, col?: C80TableColDef): void;
|
|
29
30
|
onDelete(row: T): void;
|
|
30
|
-
refresh(): void;
|
|
31
31
|
startCreate(): void;
|
|
32
32
|
cancelCreate(): void;
|
|
33
33
|
updateNewRow(key: string, value: unknown): void;
|
|
@@ -49,12 +49,12 @@ export declare class C80TableComponent<T extends Record<string, unknown>> implem
|
|
|
49
49
|
private toStringValue;
|
|
50
50
|
onEdit(row: T): void;
|
|
51
51
|
cancelEdit(): void;
|
|
52
|
-
onEditInput(event: Event
|
|
52
|
+
onEditInput(event: Event, key: string, col?: C80TableColDef): void;
|
|
53
53
|
saveEdit(row: T): void;
|
|
54
54
|
/**
|
|
55
55
|
* TrackBy function for ngFor to avoid DOM re-creation (NG0956 warning).
|
|
56
56
|
*/
|
|
57
57
|
trackById(index: number, row: T): number | string;
|
|
58
58
|
static ɵfac: i0.ɵɵFactoryDeclaration<C80TableComponent<any>, never>;
|
|
59
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<C80TableComponent<any>, "c80-table", never, { "
|
|
59
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<C80TableComponent<any>, "c80-table", never, { "data$": { "alias": "data$"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; }, { "create": "create"; "update": "update"; "delete": "delete"; "errorEvent": "errorEvent"; }, never, never, true, never>;
|
|
60
60
|
}
|
package/package.json
CHANGED