tuain-ng-forms-lib 17.3.7 → 19.0.1
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 +280 -335
- package/fesm2022/tuain-ng-forms-lib.mjs +297 -103
- package/fesm2022/tuain-ng-forms-lib.mjs.map +1 -1
- package/lib/classes/forms/action.d.ts +3 -2
- package/lib/classes/forms/element.d.ts +2 -1
- package/lib/classes/forms/field.d.ts +5 -4
- package/lib/classes/forms/form.d.ts +4 -2
- package/lib/classes/forms/piece-propagate.d.ts +2 -1
- package/lib/classes/forms/piece.d.ts +4 -3
- package/lib/classes/forms/section.d.ts +3 -2
- package/lib/classes/forms/subsection.d.ts +2 -1
- package/lib/classes/forms/table/action.d.ts +2 -1
- package/lib/classes/forms/table/column.d.ts +2 -1
- package/lib/classes/forms/table/row-data.d.ts +3 -2
- package/lib/classes/forms/table/table.d.ts +3 -1
- package/lib/components/elements/layout/piece.component.d.ts +2 -2
- package/lib/components/forms/basic-form.d.ts +4 -4
- package/lib/interfaces/action.interface.d.ts +23 -0
- package/lib/interfaces/field.interface.d.ts +70 -0
- package/lib/interfaces/form-config.interface.d.ts +24 -16
- package/lib/interfaces/form.interface.d.ts +106 -0
- package/lib/interfaces/index.d.ts +7 -0
- package/lib/interfaces/piece.interface.d.ts +67 -0
- package/lib/interfaces/section.interface.d.ts +56 -0
- package/lib/interfaces/sse-live-connection.interface.d.ts +67 -0
- package/lib/interfaces/table.interface.d.ts +139 -0
- package/lib/services/file-manager.service.d.ts +4 -4
- package/lib/services/form-manager.service.d.ts +3 -3
- package/lib/services/icon-dictionary.service.d.ts +1 -1
- package/lib/services/sse-live-connection.service.d.ts +56 -0
- package/lib/tokens/sse-live-connection.token.d.ts +7 -0
- package/package.json +6 -7
- package/public-api.d.ts +2 -0
- package/esm2022/lib/classes/forms/action.mjs +0 -112
- package/esm2022/lib/classes/forms/element.mjs +0 -25
- package/esm2022/lib/classes/forms/field.mjs +0 -484
- package/esm2022/lib/classes/forms/form.constants.mjs +0 -55
- package/esm2022/lib/classes/forms/form.mjs +0 -589
- package/esm2022/lib/classes/forms/piece-propagate.mjs +0 -36
- package/esm2022/lib/classes/forms/piece.mjs +0 -139
- package/esm2022/lib/classes/forms/section.mjs +0 -150
- package/esm2022/lib/classes/forms/subsection.mjs +0 -96
- package/esm2022/lib/classes/forms/table/action.mjs +0 -49
- package/esm2022/lib/classes/forms/table/column.mjs +0 -74
- package/esm2022/lib/classes/forms/table/row-data.mjs +0 -116
- package/esm2022/lib/classes/forms/table/table.mjs +0 -537
- package/esm2022/lib/components/elements/action.component.mjs +0 -71
- package/esm2022/lib/components/elements/field.component.mjs +0 -113
- package/esm2022/lib/components/elements/layout/element.component.mjs +0 -23
- package/esm2022/lib/components/elements/layout/form-error.component.mjs +0 -25
- package/esm2022/lib/components/elements/layout/form-header.component.mjs +0 -25
- package/esm2022/lib/components/elements/layout/piece.component.mjs +0 -59
- package/esm2022/lib/components/elements/layout/section.component.mjs +0 -57
- package/esm2022/lib/components/elements/layout/sub-section.component.mjs +0 -57
- package/esm2022/lib/components/elements/tables/table-record-action.component.mjs +0 -71
- package/esm2022/lib/components/elements/tables/table-record-field.component.mjs +0 -32
- package/esm2022/lib/components/elements/tables/table.component.mjs +0 -109
- package/esm2022/lib/components/forms/basic-form.mjs +0 -1408
- package/esm2022/lib/components/shared/constants.mjs +0 -2
- package/esm2022/lib/interfaces/form-config.interface.mjs +0 -2
- package/esm2022/lib/interfaces/icon-resolver.interface.mjs +0 -2
- package/esm2022/lib/interfaces/index.mjs +0 -3
- package/esm2022/lib/services/base-icon-resolver.service.mjs +0 -40
- package/esm2022/lib/services/event-manager.service.mjs +0 -55
- package/esm2022/lib/services/file-manager.service.mjs +0 -14
- package/esm2022/lib/services/form-manager.service.mjs +0 -88
- package/esm2022/lib/services/icon-dictionary.service.mjs +0 -162
- package/esm2022/lib/tokens/icon-resolver.token.mjs +0 -3
- package/esm2022/lib/tuain-ng-forms-lib.module.mjs +0 -54
- package/esm2022/public-api.mjs +0 -43
- package/esm2022/tuain-ng-forms-lib.mjs +0 -5
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Observable } from 'rxjs';
|
|
2
|
+
import type { IFormPropagate, IFormElement } from './piece.interface';
|
|
3
|
+
import type { IField } from './field.interface';
|
|
4
|
+
import type { IAction } from './action.interface';
|
|
5
|
+
import type { ITable } from './table.interface';
|
|
6
|
+
/**
|
|
7
|
+
* Contrato público de una subsección de formulario, que agrupa los elementos
|
|
8
|
+
* (campos, tablas, acciones) que se renderizan juntos.
|
|
9
|
+
* Implementado por {@link RecordFormSubSection}.
|
|
10
|
+
*/
|
|
11
|
+
export interface ISubSection extends IFormPropagate {
|
|
12
|
+
customRender: string | null;
|
|
13
|
+
subsectionId: string | null;
|
|
14
|
+
subsectionCode: string | null;
|
|
15
|
+
subsectionTitle: string | null;
|
|
16
|
+
readonly subSectionElements: IFormElement[];
|
|
17
|
+
readonly subSectionFields: IField[];
|
|
18
|
+
readonly subSectionTables: ITable[];
|
|
19
|
+
readonly subSectionActions: IAction[];
|
|
20
|
+
readonly elementsArray: Record<string, IFormElement>;
|
|
21
|
+
active: boolean;
|
|
22
|
+
getField(name: string): IField | undefined;
|
|
23
|
+
getFields(): IField[];
|
|
24
|
+
getFieldNames(): string[];
|
|
25
|
+
getActions(): IAction[];
|
|
26
|
+
getActionNames(): string[];
|
|
27
|
+
activate(): void;
|
|
28
|
+
inactivate(): void;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Contrato público de una sección de formulario, contenedora de subsecciones
|
|
32
|
+
* y con gestión de activación/inactivación (navegación entre secciones).
|
|
33
|
+
* Implementado por {@link RecordFormSection}.
|
|
34
|
+
*/
|
|
35
|
+
export interface ISection extends IFormPropagate {
|
|
36
|
+
readonly code: string | null;
|
|
37
|
+
readonly activation: Observable<string>;
|
|
38
|
+
readonly inactivation: Observable<string>;
|
|
39
|
+
active: boolean;
|
|
40
|
+
sectionId: string | null;
|
|
41
|
+
sectionCode: string | null;
|
|
42
|
+
sectionTitle: string | null;
|
|
43
|
+
title: string | null;
|
|
44
|
+
readonly subSections: ISubSection[];
|
|
45
|
+
readonly subSectionsObj: Record<string, ISubSection>;
|
|
46
|
+
activate(): void;
|
|
47
|
+
inactivate(): void;
|
|
48
|
+
getVisibleSubsections(state?: string): ISubSection[];
|
|
49
|
+
getSubsection(subSectionCode: string): ISubSection | null;
|
|
50
|
+
activateSubSection(subSectionCode: string): void;
|
|
51
|
+
getFields(): IField[];
|
|
52
|
+
getActions(): IAction[];
|
|
53
|
+
getActionNames(): string[];
|
|
54
|
+
getFieldNames(): string[];
|
|
55
|
+
getField(name: string): IField | null;
|
|
56
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evento recibido del servidor a través del stream SSE.
|
|
3
|
+
* El backend envía un objeto JSON por mensaje; `eventClass` identifica el tipo.
|
|
4
|
+
*/
|
|
5
|
+
export interface SseServerEvent {
|
|
6
|
+
eventClass?: string;
|
|
7
|
+
eventType?: string;
|
|
8
|
+
eventDetail?: any;
|
|
9
|
+
[key: string]: any;
|
|
10
|
+
}
|
|
11
|
+
/** Logger mínimo opcional; cada app puede inyectar el suyo. */
|
|
12
|
+
export interface SseLogger {
|
|
13
|
+
debug?(message: string, ...args: any[]): void;
|
|
14
|
+
warn?(message: string, ...args: any[]): void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Configuración que cada app provee mediante el token `SSE_LIVE_CONNECTION_CONFIG`.
|
|
18
|
+
*
|
|
19
|
+
* Desacopla el servicio de la librería del `EventManager`, el logger y la
|
|
20
|
+
* configuración concretos de cada app (la lib no puede importar el
|
|
21
|
+
* `defaultConfig`, `AppLoggerService` ni el `EventManagerService` de cada app).
|
|
22
|
+
*/
|
|
23
|
+
export interface SseLiveConnectionConfig {
|
|
24
|
+
/** URL base del gateway, p. ej. `"https://host:puerto"`. */
|
|
25
|
+
buildUrl(): string;
|
|
26
|
+
/** Path del endpoint del stream. Default: `"/liveconnect/stream"`. */
|
|
27
|
+
streamPath?: string;
|
|
28
|
+
/**
|
|
29
|
+
* Credencial a enviar en el header `Authorization` al abrir el stream.
|
|
30
|
+
* Normalmente el `sessionId`; el gateway resuelve `userId`/grupos server-side
|
|
31
|
+
* (a diferencia del Socket.IO anterior, el cliente ya no auto-asigna esos campos).
|
|
32
|
+
* Puede ser asíncrona por si hay que refrescar un token.
|
|
33
|
+
*/
|
|
34
|
+
getAuthToken(sessionData: any): string | Promise<string>;
|
|
35
|
+
/**
|
|
36
|
+
* Esquema del header de autenticación. Default: `"Bearer"`.
|
|
37
|
+
* Se envía como `Authorization: <scheme> <token>`. Si es `""`, se envía el token crudo.
|
|
38
|
+
*/
|
|
39
|
+
authScheme?: string;
|
|
40
|
+
/** Allow-list de `eventClass` que pueden re-emitirse al bus de eventos. */
|
|
41
|
+
allowedEvents: ReadonlySet<string> | string[];
|
|
42
|
+
/** Re-emite al bus de la app un evento ya validado (o el evento de fin de sesión). */
|
|
43
|
+
emit(eventClass: string, eventData: SseServerEvent | null): void;
|
|
44
|
+
/**
|
|
45
|
+
* Nombre del evento de fin de sesión, emitido ante un `sessionReplaced` ajeno.
|
|
46
|
+
* Default: `"sessionEnded"`.
|
|
47
|
+
*/
|
|
48
|
+
sessionEndedEventName?: string;
|
|
49
|
+
/**
|
|
50
|
+
* Nombre del evento a emitir ante un `sessionClosed` del servidor (el gateway ordenó cerrar ESTA
|
|
51
|
+
* sesión porque expiró/dejó de ser válida). Permite mostrar un mensaje propio antes del logout.
|
|
52
|
+
* Default: `sessionEndedEventName` (o `"sessionEnded"`).
|
|
53
|
+
*/
|
|
54
|
+
sessionClosedEventName?: string;
|
|
55
|
+
/** Habilita el manejo del evento de lifecycle `sessionReplaced`. Default: `true`. */
|
|
56
|
+
handleSessionReplaced?: boolean;
|
|
57
|
+
/** Habilita el manejo del evento de control `sessionClosed` (cierre ordenado por el servidor). Default: `true`. */
|
|
58
|
+
handleSessionClosed?: boolean;
|
|
59
|
+
/** Logger opcional. */
|
|
60
|
+
logger?: SseLogger;
|
|
61
|
+
/**
|
|
62
|
+
* Mantener el stream abierto aunque el documento esté oculto. Default: `true`
|
|
63
|
+
* (la app controla el ciclo de vida explícitamente; en móvil vía `appStateChange`).
|
|
64
|
+
* Si es `false`, el stream se cierra al ocultarse la vista y se reabre al volver.
|
|
65
|
+
*/
|
|
66
|
+
keepOpenWhenHidden?: boolean;
|
|
67
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type { Observable } from 'rxjs';
|
|
2
|
+
import type { IFormPiece, IFormElement } from './piece.interface';
|
|
3
|
+
import type { TableSorting } from './form-config.interface';
|
|
4
|
+
import type { FilterDef, FilterSetup } from '../classes/forms/table/column';
|
|
5
|
+
import type { TableEvent, TableActionEvent } from '../classes/forms/table/table';
|
|
6
|
+
/**
|
|
7
|
+
* Contrato público de una columna de tabla.
|
|
8
|
+
* Implementado por {@link RecordTableColumn}.
|
|
9
|
+
*/
|
|
10
|
+
export interface ITableColumn extends IFormPiece {
|
|
11
|
+
fieldCode: string;
|
|
12
|
+
fieldTitle: string;
|
|
13
|
+
fieldType: string;
|
|
14
|
+
fieldAlignment: string;
|
|
15
|
+
fieldFormat: string;
|
|
16
|
+
sortable: boolean;
|
|
17
|
+
searchable: boolean;
|
|
18
|
+
sortDirections: string[];
|
|
19
|
+
filterVisible: boolean;
|
|
20
|
+
filterDef: FilterDef | null;
|
|
21
|
+
filterSetup: FilterSetup | null;
|
|
22
|
+
readonly filterDefinition: FilterDef | null;
|
|
23
|
+
readonly filter: FilterSetup | null;
|
|
24
|
+
readonly options: any[] | null;
|
|
25
|
+
setSearchable(searchable?: boolean): void;
|
|
26
|
+
hideFilter(): void;
|
|
27
|
+
addFilterDefinition(filterDefinition: any): void;
|
|
28
|
+
addFilter(columnValues: any, operator: string | null): void;
|
|
29
|
+
removeFilter(): void;
|
|
30
|
+
setSortDirections(ascend: boolean, descend: boolean): void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Contrato público de una acción de tabla (inline, global o de selección).
|
|
34
|
+
* Implementado por {@link TableAction}.
|
|
35
|
+
*/
|
|
36
|
+
export interface ITableAction extends IFormPiece {
|
|
37
|
+
readonly actionCode: string;
|
|
38
|
+
readonly actionTitle: string;
|
|
39
|
+
readonly iconName: string;
|
|
40
|
+
readonly actionType: string;
|
|
41
|
+
readonly actionClass: string;
|
|
42
|
+
readonly stateField: string;
|
|
43
|
+
readonly newState: string;
|
|
44
|
+
readonly backend: boolean;
|
|
45
|
+
readonly restrictedOnField: string | null;
|
|
46
|
+
readonly restrictedOnValue: string | null;
|
|
47
|
+
readonly restrictedOnOperator: string | null;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Contrato público de un registro de tabla.
|
|
51
|
+
* Implementado por {@link TableRecordData}.
|
|
52
|
+
*/
|
|
53
|
+
export interface ITableRecord {
|
|
54
|
+
recordId: string | null;
|
|
55
|
+
selected: boolean;
|
|
56
|
+
recordData: Record<string, any>;
|
|
57
|
+
readonly recordIdKey: string | null;
|
|
58
|
+
toggleSelect(): void;
|
|
59
|
+
select(): void;
|
|
60
|
+
unselect(): void;
|
|
61
|
+
getFieldValue(fieldCode: string): any;
|
|
62
|
+
hasPattern(words: string[], columnObj: any): boolean;
|
|
63
|
+
hasCondition(columnFilters: any[]): boolean;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Contrato público de una tabla de registros, con acceso a sus columnas,
|
|
67
|
+
* acciones de tabla y registros.
|
|
68
|
+
* Implementado por {@link RecordTable}.
|
|
69
|
+
*/
|
|
70
|
+
export interface ITable extends IFormElement {
|
|
71
|
+
readonly tableCode: string;
|
|
72
|
+
readonly code: string;
|
|
73
|
+
tableTitle: string;
|
|
74
|
+
readonly columns: ITableColumn[];
|
|
75
|
+
readonly columnNames: string[];
|
|
76
|
+
readonly tableRecords: ITableRecord[];
|
|
77
|
+
readonly visibleRecords: ITableRecord[];
|
|
78
|
+
readonly tableRecordObj: Record<string, ITableRecord>;
|
|
79
|
+
selectable: boolean;
|
|
80
|
+
selectionBackend: boolean;
|
|
81
|
+
selectionField: string;
|
|
82
|
+
allSelected: boolean;
|
|
83
|
+
currentPage: number;
|
|
84
|
+
totalPages: number;
|
|
85
|
+
requestedPage: number;
|
|
86
|
+
recordsPerPage: number;
|
|
87
|
+
totalRecordsNumber: number;
|
|
88
|
+
recordsNumber: number;
|
|
89
|
+
sorting: TableSorting;
|
|
90
|
+
waiting: boolean;
|
|
91
|
+
clientPaging: boolean;
|
|
92
|
+
sortable: boolean;
|
|
93
|
+
globalSearch: boolean;
|
|
94
|
+
globalFilterString: string;
|
|
95
|
+
restrictedId: any;
|
|
96
|
+
readonly currentFilter: any;
|
|
97
|
+
readonly inlineActionTrigger: Observable<TableEvent>;
|
|
98
|
+
readonly globalActionTrigger: Observable<TableEvent>;
|
|
99
|
+
readonly selectionActionTrigger: Observable<TableEvent>;
|
|
100
|
+
readonly recordSelectionTrigger: Observable<TableEvent>;
|
|
101
|
+
readonly getDataTrigger: Observable<TableEvent>;
|
|
102
|
+
getLayout(): string | null;
|
|
103
|
+
setLayout(layout: string): void;
|
|
104
|
+
hasActions(): boolean;
|
|
105
|
+
getSelectedRecords(): (string | null)[];
|
|
106
|
+
activateGlobalSearch(): void;
|
|
107
|
+
inactivateGlobalSearch(): void;
|
|
108
|
+
columnDefinition(fieldCode: string): ITableColumn;
|
|
109
|
+
putOnWait(): void;
|
|
110
|
+
freeWaiting(): void;
|
|
111
|
+
setWidget(widget: any): void;
|
|
112
|
+
notifyGlobalAction(actionCode: string): void;
|
|
113
|
+
notifyInlineAction(tableActionEvent: TableActionEvent): void;
|
|
114
|
+
notifyRecordSelection(recordId: any): void;
|
|
115
|
+
notifySelectionAction(actionCode: string): void;
|
|
116
|
+
notifyGetDataAction(requestedPage?: number | null): null;
|
|
117
|
+
clean(): void;
|
|
118
|
+
selectAll(): boolean;
|
|
119
|
+
unSelectAll(): boolean;
|
|
120
|
+
setTableRecords(tableRecords: any[], append?: boolean, prepend?: boolean): void;
|
|
121
|
+
appendRecords(records: any[]): void;
|
|
122
|
+
prependRecords(records: any[]): void;
|
|
123
|
+
replaceRecords(records: any[]): void;
|
|
124
|
+
setTableAppend(append: boolean): void;
|
|
125
|
+
changePage(requestedPage: number): void;
|
|
126
|
+
updateFromServer(tableReceived: any): void;
|
|
127
|
+
getTableRecord(recordId: any): ITableRecord | null;
|
|
128
|
+
getAction(actionCode: string): ITableAction | null;
|
|
129
|
+
getActions(actionClass?: string, actionTypes?: string[] | null): ITableAction[];
|
|
130
|
+
setFilterById(id: any): void;
|
|
131
|
+
cleanIdFilter(): void;
|
|
132
|
+
setGlobalFilterString(text: string, notifyComponent?: boolean): void;
|
|
133
|
+
addFilterDefinition(columnName: string, filterDefinition: any): void;
|
|
134
|
+
getFilteredRecords(): ITableRecord[];
|
|
135
|
+
getColumnFilter(columnName: string): FilterSetup | null;
|
|
136
|
+
addColumnFilter(columnName: string, columnValues: any | any[], operator?: string | null): void;
|
|
137
|
+
removeColumnFilter(columnName: string): void;
|
|
138
|
+
sort(columnName: string, direction: string): void;
|
|
139
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as i0 from "@angular/core";
|
|
2
2
|
export declare class LibFileManagementService {
|
|
3
|
-
openFile(
|
|
4
|
-
saveFileFromURL(
|
|
5
|
-
saveFile(
|
|
6
|
-
printPdfFile(
|
|
3
|
+
openFile(_fileBase64Data: string, _fileName: string, _fileType: string): void;
|
|
4
|
+
saveFileFromURL(_fileUrl: string, _fileName?: string | null, _fileType?: string | null): void;
|
|
5
|
+
saveFile(_fileBase64Data: string | Blob, _fileName: string, _fileType: string): void;
|
|
6
|
+
printPdfFile(_pdfBufferData: ArrayBuffer | Blob): void;
|
|
7
7
|
static ɵfac: i0.ɵɵFactoryDeclaration<LibFileManagementService, never>;
|
|
8
8
|
static ɵprov: i0.ɵɵInjectableDeclaration<LibFileManagementService>;
|
|
9
9
|
}
|
|
@@ -12,9 +12,9 @@ export interface FormStackItem {
|
|
|
12
12
|
export declare class LibFormManagerService {
|
|
13
13
|
pageStack: FormStackItem[];
|
|
14
14
|
constructor();
|
|
15
|
-
getFormDefinition(
|
|
16
|
-
execServerAction(
|
|
17
|
-
goToForm(
|
|
15
|
+
getFormDefinition(_formCode: string): any;
|
|
16
|
+
execServerAction(_actionDetail: any): any;
|
|
17
|
+
goToForm(_formCode: string, _token: string, _subject: string | null): void;
|
|
18
18
|
loadStack(): Promise<void>;
|
|
19
19
|
saveStack(): void;
|
|
20
20
|
cleanStack(): void;
|
|
@@ -156,5 +156,5 @@ export declare const iconDictionary: {
|
|
|
156
156
|
* @deprecated Since v17. Use BaseIconResolverService with ICON_RESOLVER token instead. Will be removed in v19.
|
|
157
157
|
*/
|
|
158
158
|
export declare class IconDictionaryService {
|
|
159
|
-
mapIcon: (iconName: string) => string;
|
|
159
|
+
mapIcon: (iconName: string) => string | null;
|
|
160
160
|
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { fetchEventSource } from '@microsoft/fetch-event-source';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Canal de eventos servidor→cliente sobre Server-Sent Events (SSE).
|
|
5
|
+
*
|
|
6
|
+
* Reemplaza al `LiveConnectionService` basado en Socket.IO que vivía duplicado
|
|
7
|
+
* en cada app. El uso siempre fue unidireccional (un único handshake y luego
|
|
8
|
+
* solo recepción), así que SSE encaja sin perder funcionalidad y además gana
|
|
9
|
+
* reconexión automática nativa.
|
|
10
|
+
*
|
|
11
|
+
* El servicio es agnóstico de la app: toda la integración (URL, token de auth,
|
|
12
|
+
* allow-list, re-emisión al bus, logger) llega por `SSE_LIVE_CONNECTION_CONFIG`.
|
|
13
|
+
* El ciclo de vida (cuándo abrir/cerrar) lo controla cada app llamando
|
|
14
|
+
* `open()`/`close()` — típicamente atado a `sessionEstablished`/`sessionEnded`,
|
|
15
|
+
* y en móvil además al `appStateChange` de Capacitor.
|
|
16
|
+
*/
|
|
17
|
+
export declare class SseLiveConnectionService {
|
|
18
|
+
private readonly _config;
|
|
19
|
+
private _abort;
|
|
20
|
+
private _currentSessionId;
|
|
21
|
+
private _connected;
|
|
22
|
+
isConnected(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Abre el stream SSE para la sesión dada (cierra cualquier stream anterior).
|
|
25
|
+
* El handshake viaja en el header `Authorization`, no en la URL.
|
|
26
|
+
*/
|
|
27
|
+
open(sessionData: any): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Punto de indirección (seam) sobre `fetchEventSource`: permite sustituirlo en
|
|
30
|
+
* tests (`fetchEventSource` es un binding ESM de solo lectura, no espiable).
|
|
31
|
+
* En producción delega directamente en la librería.
|
|
32
|
+
*/
|
|
33
|
+
protected openEventSource(url: Parameters<typeof fetchEventSource>[0], options: Parameters<typeof fetchEventSource>[1]): Promise<void>;
|
|
34
|
+
/** Cierra el stream actual (idempotente). */
|
|
35
|
+
close(): void;
|
|
36
|
+
private _buildStreamUrl;
|
|
37
|
+
private _allowedSet;
|
|
38
|
+
/**
|
|
39
|
+
* Maneja el evento de lifecycle `sessionReplaced` (otra apertura de sesión
|
|
40
|
+
* para el mismo usuario). Si el `newSessionId` difiere de la sesión local,
|
|
41
|
+
* emite el evento de fin de sesión para forzar logout. Se ejecuta antes del
|
|
42
|
+
* filtro de allow-list porque no se re-emite al bus genérico.
|
|
43
|
+
* Devuelve `true` cuando consume el evento.
|
|
44
|
+
*/
|
|
45
|
+
private _handleSessionReplaced;
|
|
46
|
+
/**
|
|
47
|
+
* Maneja el evento de control `sessionClosed` dirigido a ESTA sesión (el gateway lo envía con
|
|
48
|
+
* recipientType 'session' al detectar que la sesión expiró/dejó de ser válida). Ordena cerrar la
|
|
49
|
+
* sesión en el navegador. Se ejecuta antes del allow-list porque no se re-emite al bus genérico.
|
|
50
|
+
* Emite `sessionClosedEventName` (o, en su defecto, el de fin de sesión) para que la app muestre
|
|
51
|
+
* su propio mensaje antes del logout. Devuelve `true` cuando consume el evento.
|
|
52
|
+
*/
|
|
53
|
+
private _handleSessionClosed;
|
|
54
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SseLiveConnectionService, never>;
|
|
55
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<SseLiveConnectionService>;
|
|
56
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
import { SseLiveConnectionConfig } from '../interfaces/sse-live-connection.interface';
|
|
3
|
+
/**
|
|
4
|
+
* Token con el que cada app provee su configuración del stream SSE.
|
|
5
|
+
* Sigue el mismo patrón que `ICON_RESOLVER`.
|
|
6
|
+
*/
|
|
7
|
+
export declare const SSE_LIVE_CONNECTION_CONFIG: InjectionToken<SseLiveConnectionConfig>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tuain-ng-forms-lib",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "19.0.1",
|
|
4
4
|
"description": "Componentes y Clases Angular para la gestión de formularios TUAIN",
|
|
5
5
|
"author": "Mauricio Méndez, Imix Consulting",
|
|
6
6
|
"license": "MIT",
|
|
@@ -15,13 +15,14 @@
|
|
|
15
15
|
"Angular"
|
|
16
16
|
],
|
|
17
17
|
"peerDependencies": {
|
|
18
|
-
"@angular/common": "^
|
|
19
|
-
"@angular/core": "^
|
|
20
|
-
"@angular/forms": "^
|
|
21
|
-
"@angular/router": "^
|
|
18
|
+
"@angular/common": "^19.0.0",
|
|
19
|
+
"@angular/core": "^19.0.0",
|
|
20
|
+
"@angular/forms": "^19.0.0",
|
|
21
|
+
"@angular/router": "^19.0.0",
|
|
22
22
|
"rxjs": "^7.5.0"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
+
"@microsoft/fetch-event-source": "^2.0.1",
|
|
25
26
|
"nanoid": "^4.0.0",
|
|
26
27
|
"tslib": "^2.4.0",
|
|
27
28
|
"yn": "^5.0.0"
|
|
@@ -34,8 +35,6 @@
|
|
|
34
35
|
},
|
|
35
36
|
".": {
|
|
36
37
|
"types": "./index.d.ts",
|
|
37
|
-
"esm2022": "./esm2022/tuain-ng-forms-lib.mjs",
|
|
38
|
-
"esm": "./esm2022/tuain-ng-forms-lib.mjs",
|
|
39
38
|
"default": "./fesm2022/tuain-ng-forms-lib.mjs"
|
|
40
39
|
}
|
|
41
40
|
},
|
package/public-api.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export * from './lib/interfaces/index';
|
|
2
2
|
export * from './lib/tokens/icon-resolver.token';
|
|
3
|
+
export * from './lib/tokens/sse-live-connection.token';
|
|
3
4
|
export * from './lib/classes/forms/piece';
|
|
4
5
|
export * from './lib/classes/forms/piece-propagate';
|
|
5
6
|
export * from './lib/classes/forms/element';
|
|
@@ -30,4 +31,5 @@ export * from './lib/services/form-manager.service';
|
|
|
30
31
|
export * from './lib/services/file-manager.service';
|
|
31
32
|
export * from './lib/services/icon-dictionary.service';
|
|
32
33
|
export * from './lib/services/base-icon-resolver.service';
|
|
34
|
+
export * from './lib/services/sse-live-connection.service';
|
|
33
35
|
export * from './lib/tuain-ng-forms-lib.module';
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import { Subject, takeUntil } from 'rxjs';
|
|
2
|
-
import { ElementType, HEADER } from './form.constants';
|
|
3
|
-
import { FormElement } from './element';
|
|
4
|
-
const attrs = {
|
|
5
|
-
actionCode: { name: '_actionCode', propagate: 'actionCode' },
|
|
6
|
-
actionName: { name: '_actionName', propagate: 'actionName' },
|
|
7
|
-
iconName: { name: '_iconName', propagate: 'iconName' },
|
|
8
|
-
inProgress: { name: '_inProgress', propagate: 'inProgress' },
|
|
9
|
-
restrictedOnField: { name: '_restrictedOnField', propagate: 'restrictedOnField' },
|
|
10
|
-
restrictedOnOperator: { name: '_restrictedOnOperator', propagate: 'restrictedOnOperator' },
|
|
11
|
-
restrictedOnValue: { name: '_restrictedOnValue', propagate: 'restrictedOnValue' },
|
|
12
|
-
};
|
|
13
|
-
export class FormAction extends FormElement {
|
|
14
|
-
_actionActivated = new Subject();
|
|
15
|
-
_actionCode = '';
|
|
16
|
-
_actionName = '';
|
|
17
|
-
_iconName = '';
|
|
18
|
-
_inProgress = false;
|
|
19
|
-
_newState;
|
|
20
|
-
_backend;
|
|
21
|
-
_restrictedOnField = null;
|
|
22
|
-
_restrictedOnOperator = null;
|
|
23
|
-
_restrictedOnValue = null;
|
|
24
|
-
constructor(actionDefinition, formConfig) {
|
|
25
|
-
super(actionDefinition, formConfig);
|
|
26
|
-
this.elementType = ElementType.Action;
|
|
27
|
-
this.setAttr(attrs.actionCode, actionDefinition.actionCode ? actionDefinition.actionCode.toString() : '');
|
|
28
|
-
this.setAttr(attrs.actionName, actionDefinition.actionTitle);
|
|
29
|
-
this.setAttr(attrs.iconName, actionDefinition.iconName || '');
|
|
30
|
-
this.setAttr(attrs.restrictedOnField, actionDefinition.fieldRestrictedCode?.toString() ?? null);
|
|
31
|
-
if (this._restrictedOnField) {
|
|
32
|
-
this.setAttr(attrs.restrictedOnOperator, actionDefinition.operatorRestricted || '');
|
|
33
|
-
this.setAttr(attrs.restrictedOnValue, actionDefinition.valueRestricted ?? '');
|
|
34
|
-
}
|
|
35
|
-
this._backend = actionDefinition?.serverAction ?? false;
|
|
36
|
-
this._newState = actionDefinition?.newState;
|
|
37
|
-
this.setCustomAttribute('location', actionDefinition.position || HEADER);
|
|
38
|
-
}
|
|
39
|
-
get actionCode() { return this._actionCode; }
|
|
40
|
-
get actionName() { return this._actionName; }
|
|
41
|
-
get iconName() { return this._iconName; }
|
|
42
|
-
get inProgress() { return this._inProgress; }
|
|
43
|
-
get newState() { return this._newState; }
|
|
44
|
-
get backend() { return this._backend; }
|
|
45
|
-
get restrictedOnField() { return this._restrictedOnField; }
|
|
46
|
-
get restrictedOnOperator() { return this._restrictedOnOperator; }
|
|
47
|
-
get restrictedOnValue() { return this._restrictedOnValue; }
|
|
48
|
-
set actionCode(actionCode) { this.setAttr(attrs.actionCode, actionCode); }
|
|
49
|
-
set actionName(actionName) { this.setAttr(attrs.actionName, actionName); }
|
|
50
|
-
set iconName(iconName) { this.setAttr(attrs.iconName, iconName); }
|
|
51
|
-
set inProgress(inProgress) { this.setAttr(attrs.inProgress, inProgress); }
|
|
52
|
-
set newState(newState) { this._newState = newState; }
|
|
53
|
-
set backend(backend) { this._backend = backend; }
|
|
54
|
-
set restrictedOnField(restrictedOnField) { this.setAttr(attrs.restrictedOnField, restrictedOnField); }
|
|
55
|
-
set restrictedOnOperator(restrictedOnOperator) { this.setAttr(attrs.restrictedOnOperator, restrictedOnOperator); }
|
|
56
|
-
set restrictedOnValue(restrictedOnValue) { this.setAttr(attrs.restrictedOnValue, restrictedOnValue); }
|
|
57
|
-
start() { this.inProgress = true; }
|
|
58
|
-
stop() { this.inProgress = false; }
|
|
59
|
-
connectWithParentForm(form, formChangeSubject) {
|
|
60
|
-
super.connectWithParentForm(form, formChangeSubject);
|
|
61
|
-
if (this._restrictedOnField) {
|
|
62
|
-
const relatedField = this._form.fields?.[this._restrictedOnField];
|
|
63
|
-
if (relatedField) {
|
|
64
|
-
relatedField.editionFinish
|
|
65
|
-
.pipe(takeUntil(this.destroy$))
|
|
66
|
-
.subscribe({
|
|
67
|
-
next: (event) => this.updateRestrictedVisibility(event),
|
|
68
|
-
error: (err) => console.error(`Error en restricted visibility subscription: ${err}`)
|
|
69
|
-
});
|
|
70
|
-
relatedField.editionPartial
|
|
71
|
-
.pipe(takeUntil(this.destroy$))
|
|
72
|
-
.subscribe({
|
|
73
|
-
next: (event) => this.updateRestrictedVisibility(event),
|
|
74
|
-
error: (err) => console.error(`Error en restricted visibility subscription: ${err}`)
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
updateRestrictedVisibility(event) {
|
|
80
|
-
const newVisible = this._absoluteVisible && this.viewOnState(this._formState);
|
|
81
|
-
(this._visible !== newVisible) && this.setVisibility(newVisible);
|
|
82
|
-
}
|
|
83
|
-
viewOnState(state) {
|
|
84
|
-
const actionVisible = (this.visibleStates && state) ? this.visibleStates.includes(state) : false;
|
|
85
|
-
if (actionVisible && this._form && this._restrictedOnField) {
|
|
86
|
-
const relatedField = this._form.fields?.[this._restrictedOnField];
|
|
87
|
-
if (relatedField) {
|
|
88
|
-
const fieldValue = relatedField.value;
|
|
89
|
-
if ((this._restrictedOnOperator === '==' && fieldValue !== this._restrictedOnValue)
|
|
90
|
-
|| (this._restrictedOnOperator === '!=' && fieldValue === this._restrictedOnValue)) {
|
|
91
|
-
return false;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
return actionVisible;
|
|
96
|
-
}
|
|
97
|
-
get actionActivated() { return this._actionActivated.asObservable(); }
|
|
98
|
-
notifyActivation() { this._actionActivated.next(this._actionCode); }
|
|
99
|
-
updateFromServer(receivedAction) {
|
|
100
|
-
for (const propertyName in receivedAction) {
|
|
101
|
-
if (propertyName !== 'actionCode' && propertyName !== 'actionId') {
|
|
102
|
-
try {
|
|
103
|
-
this[propertyName] = receivedAction[propertyName];
|
|
104
|
-
}
|
|
105
|
-
catch (e) {
|
|
106
|
-
console.log(`Error actualizando la propiedad ${propertyName} de la acción ${this.actionCode}. ${e}`);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVhaW4tbmctZm9ybXMtbGliL3NyYy9saWIvY2xhc3Nlcy9mb3Jtcy9hY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBR3hDLE1BQU0sS0FBSyxHQUFHO0lBQ1osVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFO0lBQzVELFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRTtJQUM1RCxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUU7SUFDdEQsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFO0lBQzVELGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRTtJQUNqRixvQkFBb0IsRUFBRSxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQUU7SUFDMUYsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFO0NBQ2xGLENBQUE7QUFFRCxNQUFNLE9BQU8sVUFBVyxTQUFRLFdBQVc7SUFDeEIsZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztJQUNsRCxXQUFXLEdBQVcsRUFBRSxDQUFDO0lBQ3pCLFdBQVcsR0FBVyxFQUFFLENB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LENBQUMsWUFBWSxDQUFDLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM3RCxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQ0FBbUMsWUFBWSxpQkFBaUIsSUFBSSxDQUFDLFVBQVUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlLCBIRUFERVIgfSBmcm9tICcuL2Zvcm0uY29uc3RhbnRzJztcbmltcG9ydCB7IEZvcm1FbGVtZW50IH0gZnJvbSAnLi9lbGVtZW50JztcbmltcG9ydCB7IEFjdGlvbkRlZmluaXRpb24sIElGb3JtQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9mb3JtLWNvbmZpZy5pbnRlcmZhY2UnO1xuXG5jb25zdCBhdHRycyA9IHtcbiAgYWN0aW9uQ29kZTogeyBuYW1lOiAnX2FjdGlvbkNvZGUnLCBwcm9wYWdhdGU6ICdhY3Rpb25Db2RlJyB9LFxuICBhY3Rpb25OYW1lOiB7IG5hbWU6ICdfYWN0aW9uTmFtZScsIHByb3BhZ2F0ZTogJ2FjdGlvbk5hbWUnIH0sXG4gIGljb25OYW1lOiB7IG5hbWU6ICdfaWNvbk5hbWUnLCBwcm9wYWdhdGU6ICdpY29uTmFtZScgfSxcbiAgaW5Qcm9ncmVzczogeyBuYW1lOiAnX2luUHJvZ3Jlc3MnLCBwcm9wYWdhdGU6ICdpblByb2dyZXNzJyB9LFxuICByZXN0cmljdGVkT25GaWVsZDogeyBuYW1lOiAnX3Jlc3RyaWN0ZWRPbkZpZWxkJywgcHJvcGFnYXRlOiAncmVzdHJpY3RlZE9uRmllbGQnIH0sXG4gIHJlc3RyaWN0ZWRPbk9wZXJhdG9yOiB7IG5hbWU6ICdfcmVzdHJpY3RlZE9uT3BlcmF0b3InLCBwcm9wYWdhdGU6ICdyZXN0cmljdGVkT25PcGVyYXRvcicgfSxcbiAgcmVzdHJpY3RlZE9uVmFsdWU6IHsgbmFtZTogJ19yZXN0cmljdGVkT25WYWx1ZScsIHByb3BhZ2F0ZTogJ3Jlc3RyaWN0ZWRPblZhbHVlJyB9LFxufVxuXG5leHBvcnQgY2xhc3MgRm9ybUFjdGlvbiBleHRlbmRzIEZvcm1FbGVtZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWN0aW9uQWN0aXZhdGVkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICBwcml2YXRlIF9hY3Rpb25Db2RlOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfYWN0aW9uTmFtZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX2ljb25OYW1lOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfaW5Qcm9ncmVzcyA9IGZhbHNlO1xuICBwcml2YXRlIF9uZXdTdGF0ZTogc3RyaW5nO1xuICBwcml2YXRlIF9iYWNrZW5kOiBib29sZWFuO1xuICBwcml2YXRlIF9yZXN0cmljdGVkT25GaWVsZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3Jlc3RyaWN0ZWRPbk9wZXJhdG9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfcmVzdHJpY3RlZE9uVmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGFjdGlvbkRlZmluaXRpb246IEFjdGlvbkRlZmluaXRpb24sIGZvcm1Db25maWc6IElGb3JtQ29uZmlnKSB7XG4gICAgc3VwZXIoYWN0aW9uRGVmaW5pdGlvbiwgZm9ybUNvbmZpZyk7XG4gICAgdGhpcy5lbGVtZW50VHlwZSA9IEVsZW1lbnRUeXBlLkFjdGlvbjtcbiAgICB0aGlzLnNldEF0dHIoYXR0cnMuYWN0aW9uQ29kZSwgYWN0aW9uRGVmaW5pdGlvbi5hY3Rpb25Db2RlID8gYWN0aW9uRGVmaW5pdGlvbi5hY3Rpb25Db2RlLnRvU3RyaW5nKCkgOiAnJyk7XG4gICAgdGhpcy5zZXRBdHRyKGF0dHJzLmFjdGlvbk5hbWUsIGFjdGlvbkRlZmluaXRpb24uYWN0aW9uVGl0bGUpO1xuICAgIHRoaXMuc2V0QXR0cihhdHRycy5pY29uTmFtZSwgYWN0aW9uRGVmaW5pdGlvbi5pY29uTmFtZSB8fCAnJyk7XG4gICAgdGhpcy5zZXRBdHRyKGF0dHJzLnJlc3RyaWN0ZWRPbkZpZWxkLCBhY3Rpb25EZWZpbml0aW9uLmZpZWxkUmVzdHJpY3RlZENvZGU/LnRvU3RyaW5nKCkgPz8gbnVsbCk7XG4gICAgaWYgKHRoaXMuX3Jlc3RyaWN0ZWRPbkZpZWxkKSB7XG4gICAgICB0aGlzLnNldEF0dHIoYXR0cnMucmVzdHJpY3RlZE9uT3BlcmF0b3IsIGFjdGlvbkRlZmluaXRpb24ub3BlcmF0b3JSZXN0cmljdGVkIHx8ICcnKTtcbiAgICAgIHRoaXMuc2V0QXR0cihhdHRycy5yZXN0cmljdGVkT25WYWx1ZSwgYWN0aW9uRGVmaW5pdGlvbi52YWx1ZVJlc3RyaWN0ZWQgPz8gJycpO1xuICAgIH1cbiAgICB0aGlzLl9iYWNrZW5kID0gYWN0aW9uRGVmaW5pdGlvbj8uc2VydmVyQWN0aW9uID8/IGZhbHNlO1xuICAgIHRoaXMuX25ld1N0YXRlID0gYWN0aW9uRGVmaW5pdGlvbj8ubmV3U3RhdGU7XG4gICAgdGhpcy5zZXRDdXN0b21BdHRyaWJ1dGUoJ2xvY2F0aW9uJywgYWN0aW9uRGVmaW5pdGlvbi5wb3NpdGlvbiB8fCBIRUFERVIpO1xuICB9XG5cbiAgZ2V0IGFjdGlvbkNvZGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2FjdGlvbkNvZGU7IH1cbiAgZ2V0IGFjdGlvbk5hbWUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2FjdGlvbk5hbWU7IH1cbiAgZ2V0IGljb25OYW1lKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9pY29uTmFtZTsgfVxuICBnZXQgaW5Qcm9ncmVzcygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2luUHJvZ3Jlc3M7IH1cbiAgZ2V0IG5ld1N0YXRlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9uZXdTdGF0ZTsgfVxuICBnZXQgYmFja2VuZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2JhY2tlbmQ7IH1cbiAgZ2V0IHJlc3RyaWN0ZWRPbkZpZWxkKCk6IHN0cmluZyB8IG51bGwgeyByZXR1cm4gdGhpcy5fcmVzdHJpY3RlZE9uRmllbGQ7IH1cbiAgZ2V0IHJlc3RyaWN0ZWRPbk9wZXJhdG9yKCk6IHN0cmluZyB8IG51bGwgeyByZXR1cm4gdGhpcy5fcmVzdHJpY3RlZE9uT3BlcmF0b3I7IH1cbiAgZ2V0IHJlc3RyaWN0ZWRPblZhbHVlKCk6IHN0cmluZyB8IG51bGwgeyByZXR1cm4gdGhpcy5fcmVzdHJpY3RlZE9uVmFsdWU7IH1cblxuICBzZXQgYWN0aW9uQ29kZShhY3Rpb25Db2RlKSB7IHRoaXMuc2V0QXR0cihhdHRycy5hY3Rpb25Db2RlLCBhY3Rpb25Db2RlKTsgfVxuICBzZXQgYWN0aW9uTmFtZShhY3Rpb25OYW1lKSB7IHRoaXMuc2V0QXR0cihhdHRycy5hY3Rpb25OYW1lLCBhY3Rpb25OYW1lKTsgfVxuICBzZXQgaWNvbk5hbWUoaWNvbk5hbWUpIHsgdGhpcy5zZXRBdHRyKGF0dHJzLmljb25OYW1lLCBpY29uTmFtZSk7IH1cbiAgc2V0IGluUHJvZ3Jlc3MoaW5Qcm9ncmVzcykgeyB0aGlzLnNldEF0dHIoYXR0cnMuaW5Qcm9ncmVzcywgaW5Qcm9ncmVzcyk7IH1cbiAgc2V0IG5ld1N0YXRlKG5ld1N0YXRlKSB7IHRoaXMuX25ld1N0YXRlID0gbmV3U3RhdGU7IH1cbiAgc2V0IGJhY2tlbmQoYmFja2VuZCkgeyB0aGlzLl9iYWNrZW5kID0gYmFja2VuZDsgfVxuICBzZXQgcmVzdHJpY3RlZE9uRmllbGQocmVzdHJpY3RlZE9uRmllbGQpIHsgdGhpcy5zZXRBdHRyKGF0dHJzLnJlc3RyaWN0ZWRPbkZpZWxkLCByZXN0cmljdGVkT25GaWVsZCk7IH1cbiAgc2V0IHJlc3RyaWN0ZWRPbk9wZXJhdG9yKHJlc3RyaWN0ZWRPbk9wZXJhdG9yKSB7IHRoaXMuc2V0QXR0cihhdHRycy5yZXN0cmljdGVkT25PcGVyYXRvciwgcmVzdHJpY3RlZE9uT3BlcmF0b3IpOyB9XG4gIHNldCByZXN0cmljdGVkT25WYWx1ZShyZXN0cmljdGVkT25WYWx1ZSkgeyB0aGlzLnNldEF0dHIoYXR0cnMucmVzdHJpY3RlZE9uVmFsdWUsIHJlc3RyaWN0ZWRPblZhbHVlKTsgfVxuXG4gIHN0YXJ0KCk6IHZvaWQgeyB0aGlzLmluUHJvZ3Jlc3MgPSB0cnVlOyB9XG4gIHN0b3AoKTogdm9pZCB7IHRoaXMuaW5Qcm9ncmVzcyA9IGZhbHNlOyB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdFdpdGhQYXJlbnRGb3JtKGZvcm06IGFueSwgZm9ybUNoYW5nZVN1YmplY3Q6IGFueSk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RXaXRoUGFyZW50Rm9ybShmb3JtLCBmb3JtQ2hhbmdlU3ViamVjdCk7XG4gICAgaWYgKHRoaXMuX3Jlc3RyaWN0ZWRPbkZpZWxkKSB7XG4gICAgICBjb25zdCByZWxhdGVkRmllbGQgPSB0aGlzLl9mb3JtLmZpZWxkcz8uW3RoaXMuX3Jlc3RyaWN0ZWRPbkZpZWxkXTtcbiAgICAgIGlmIChyZWxhdGVkRmllbGQpIHtcbiAgICAgICAgcmVsYXRlZEZpZWxkLmVkaXRpb25GaW5pc2hcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAoZXZlbnQ6IGFueSkgPT4gdGhpcy51cGRhdGVSZXN0cmljdGVkVmlzaWJpbGl0eShldmVudCksXG4gICAgICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiBjb25zb2xlLmVycm9yKGBFcnJvciBlbiByZXN0cmljdGVkIHZpc2liaWxpdHkgc3Vic2NyaXB0aW9uOiAke2Vycn1gKVxuICAgICAgICAgIH0pO1xuICAgICAgICByZWxhdGVkRmllbGQuZWRpdGlvblBhcnRpYWxcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAoZXZlbnQ6IGFueSkgPT4gdGhpcy51cGRhdGVSZXN0cmljdGVkVmlzaWJpbGl0eShldmVudCksXG4gICAgICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiBjb25zb2xlLmVycm9yKGBFcnJvciBlbiByZXN0cmljdGVkIHZpc2liaWxpdHkgc3Vic2NyaXB0aW9uOiAke2Vycn1gKVxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVJlc3RyaWN0ZWRWaXNpYmlsaXR5KGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBuZXdWaXNpYmxlID0gdGhpcy5fYWJzb2x1dGVWaXNpYmxlICYmIHRoaXMudmlld09uU3RhdGUodGhpcy5fZm9ybVN0YXRlKTtcbiAgICAodGhpcy5fdmlzaWJsZSAhPT0gbmV3VmlzaWJsZSkgJiYgdGhpcy5zZXRWaXNpYmlsaXR5KG5ld1Zpc2libGUpO1xuICB9XG5cbiAgb3ZlcnJpZGUgdmlld09uU3RhdGUoc3RhdGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFjdGlvblZpc2libGUgPSAodGhpcy52aXNpYmxlU3RhdGVzICYmIHN0YXRlKSA/IHRoaXMudmlzaWJsZVN0YXRlcy5pbmNsdWRlcyhzdGF0ZSkgOiBmYWxzZTtcbiAgICBpZiAoYWN0aW9uVmlzaWJsZSAmJiB0aGlzLl9mb3JtICYmIHRoaXMuX3Jlc3RyaWN0ZWRPbkZpZWxkKSB7XG4gICAgICBjb25zdCByZWxhdGVkRmllbGQgPSB0aGlzLl9mb3JtLmZpZWxkcz8uW3RoaXMuX3Jlc3RyaWN0ZWRPbkZpZWxkXTtcbiAgICAgIGlmIChyZWxhdGVkRmllbGQpIHtcbiAgICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IHJlbGF0ZWRGaWVsZC52YWx1ZTtcbiAgICAgICAgaWYgKCh0aGlzLl9yZXN0cmljdGVkT25PcGVyYXRvciA9PT0gJz09JyAmJiBmaWVsZFZhbHVlICE9PSB0aGlzLl9yZXN0cmljdGVkT25WYWx1ZSlcbiAgICAgICAgICB8fCAodGhpcy5fcmVzdHJpY3RlZE9uT3BlcmF0b3IgPT09ICchPScgJiYgZmllbGRWYWx1ZSA9PT0gdGhpcy5fcmVzdHJpY3RlZE9uVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhY3Rpb25WaXNpYmxlO1xuICB9XG5cbiAgZ2V0IGFjdGlvbkFjdGl2YXRlZCgpOiBPYnNlcnZhYmxlPHN0cmluZz4geyByZXR1cm4gdGhpcy5fYWN0aW9uQWN0aXZhdGVkLmFzT2JzZXJ2YWJsZSgpOyB9XG5cbiAgbm90aWZ5QWN0aXZhdGlvbigpOiB2b2lkIHsgdGhpcy5fYWN0aW9uQWN0aXZhdGVkLm5leHQodGhpcy5fYWN0aW9uQ29kZSk7IH1cblxuICB1cGRhdGVGcm9tU2VydmVyKHJlY2VpdmVkQWN0aW9uOiBhbnkpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBpbiByZWNlaXZlZEFjdGlvbikge1xuICAgICAgaWYgKHByb3BlcnR5TmFtZSAhPT0gJ2FjdGlvbkNvZGUnICYmIHByb3BlcnR5TmFtZSAhPT0gJ2FjdGlvbklkJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICh0aGlzIGFzIGFueSlbcHJvcGVydHlOYW1lXSA9IHJlY2VpdmVkQWN0aW9uW3Byb3BlcnR5TmFtZV07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgRXJyb3IgYWN0dWFsaXphbmRvIGxhIHByb3BpZWRhZCAke3Byb3BlcnR5TmFtZX0gZGUgbGEgYWNjacOzbiAke3RoaXMuYWN0aW9uQ29kZX0uICR7ZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { FormPiecePropagate } from './piece-propagate';
|
|
2
|
-
import { ElementType } from './form.constants';
|
|
3
|
-
export class FormElement extends FormPiecePropagate {
|
|
4
|
-
elementType = null;
|
|
5
|
-
constructor(elementDefinition, formConfig) {
|
|
6
|
-
super(elementDefinition, formConfig);
|
|
7
|
-
}
|
|
8
|
-
setAttr(attr, value) {
|
|
9
|
-
const { name: attrName, propagate: name } = attr;
|
|
10
|
-
try {
|
|
11
|
-
const currentValue = this[attrName];
|
|
12
|
-
if (currentValue !== value) {
|
|
13
|
-
this[attrName] = value;
|
|
14
|
-
name && this.propagateAttribute(name, value);
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
catch (e) {
|
|
18
|
-
console.log(`Atributo ${attrName} no presente o valor ${value} inconsistente. ${e}`);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
isField() { return this.elementType === ElementType.Field; }
|
|
22
|
-
isAction() { return this.elementType === ElementType.Action; }
|
|
23
|
-
isTable() { return this.elementType === ElementType.Table; }
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1YWluLW5nLWZvcm1zLWxpYi9zcmMvbGliL2NsYXNzZXMvZm9ybXMvZWxlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHL0MsTUFBTSxPQUFnQixXQUFZLFNBQVEsa0JBQWtCO0lBQzFELFdBQVcsR0FBa0IsSUFBSSxDQUFDO0lBRWxDLFlBQVksaUJBQWtDLEVBQUUsVUFBdUI7UUFDckUsS0FBSyxDQUFDLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxPQUFPLENBQUMsSUFBc0IsRUFBRSxLQUFVO1FBQ3hDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDakQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxZQUFZLEdBQUksSUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdDLElBQUksWUFBWSxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUMxQixJQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUNoQyxJQUFJLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMvQyxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksUUFBUSx3QkFBd0IsS0FBSyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2RixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sS0FBYyxPQUFPLElBQUksQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDckUsUUFBUSxLQUFjLE9BQU8sSUFBSSxDQUFDLFdBQVcsS0FBSyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN2RSxPQUFPLEtBQWMsT0FBTyxJQUFJLENBQUMsV0FBVyxLQUFLLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0NBQ3RFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm9ybVBpZWNlUHJvcGFnYXRlIH0gZnJvbSAnLi9waWVjZS1wcm9wYWdhdGUnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuL2Zvcm0uY29uc3RhbnRzJztcbmltcG9ydCB7IEVsZW1lbnRBdHRyaWJ1dGUsIElGb3JtQ29uZmlnLCBQaWVjZURlZmluaXRpb24gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2Zvcm0tY29uZmlnLmludGVyZmFjZSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb3JtRWxlbWVudCBleHRlbmRzIEZvcm1QaWVjZVByb3BhZ2F0ZSB7XG4gIGVsZW1lbnRUeXBlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihlbGVtZW50RGVmaW5pdGlvbjogUGllY2VEZWZpbml0aW9uLCBmb3JtQ29uZmlnOiBJRm9ybUNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnREZWZpbml0aW9uLCBmb3JtQ29uZmlnKTtcbiAgfVxuXG4gIHNldEF0dHIoYXR0cjogRWxlbWVudEF0dHJpYnV0ZSwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHsgbmFtZTogYXR0ck5hbWUsIHByb3BhZ2F0ZTogbmFtZSB9ID0gYXR0cjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gKHRoaXMgYXMgYW55KVthdHRyTmFtZV07XG4gICAgICBpZiAoY3VycmVudFZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICAodGhpcyBhcyBhbnkpW2F0dHJOYW1lXSA9IHZhbHVlO1xuICAgICAgICBuYW1lICYmIHRoaXMucHJvcGFnYXRlQXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmxvZyhgQXRyaWJ1dG8gJHthdHRyTmFtZX0gbm8gcHJlc2VudGUgbyB2YWxvciAke3ZhbHVlfSBpbmNvbnNpc3RlbnRlLiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgaXNGaWVsZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUgPT09IEVsZW1lbnRUeXBlLkZpZWxkOyB9XG4gIGlzQWN0aW9uKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5lbGVtZW50VHlwZSA9PT0gRWxlbWVudFR5cGUuQWN0aW9uOyB9XG4gIGlzVGFibGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmVsZW1lbnRUeXBlID09PSBFbGVtZW50VHlwZS5UYWJsZTsgfVxufVxuIl19
|