infodocviewdoc 1.0.0

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 ADDED
@@ -0,0 +1,355 @@
1
+ # @infodocnpm/ui-components
2
+
3
+ Biblioteca de componentes UI para SGDEA (Sistema de Gestión Documental Electrónico de Archivo).
4
+
5
+ ## Instalación
6
+
7
+ ```bash
8
+ npm install @infodocnpm/ui-components
9
+ ```
10
+
11
+ ## Documentación Completa
12
+
13
+ Para la documentación completa de instalación e integración de metadatos, consulta el archivo:
14
+
15
+ **`MANUAL_INSTALACION_METADATOS.md`** en la raíz del repositorio `sgdea-component-library`.
16
+
17
+ Este manual contiene:
18
+ - Guía paso a paso de instalación
19
+ - Configuración de rutas y secciones
20
+ - Integración en modo inline (recomendado)
21
+ - Ejemplos de código completos
22
+ - Validación de campos obligatorios
23
+ - Vinculación de metadatos con registros
24
+
25
+ ## Componente: Metadata Crosscutting
26
+
27
+ Componente para gestionar y mostrar formularios de metadatos de manera inline o en modal.
28
+
29
+ **IMPORTANTE:** Consulta el `MANUAL_INSTALACION_METADATOS.md` para ver la documentación completa y actualizada.
30
+
31
+ ### Modo Inline (Recomendado)
32
+
33
+ El componente puede renderizarse directamente dentro de un formulario sin necesidad de un modal.
34
+
35
+ #### 1. Importar el componente
36
+
37
+ ```typescript
38
+ import { MetadataCrosscuttingComponent } from '@infodocnpm/ui-components';
39
+
40
+ @Component({
41
+ selector: 'app-my-component',
42
+ standalone: true,
43
+ imports: [
44
+ MetadataCrosscuttingComponent,
45
+ // ... otros imports
46
+ ],
47
+ // ...
48
+ })
49
+ export class MyComponent {
50
+ // ...
51
+ }
52
+ ```
53
+
54
+ #### 2. Usar en el template
55
+
56
+ ```html
57
+ <sgdea-metadata-crosscutting
58
+ #metadataComponent
59
+ [inlineMode]="true"
60
+ [autoLoad]="true"
61
+ [sectionFormId]="sectionFormId"
62
+ [apiUrl]="metadataApiUrl"
63
+ [createApiUrl]="metadataCreateApiUrl"
64
+ [registerId]="null"
65
+ [initialFormData]="initialMetadataData || null"
66
+ (saveModal)="onMetadataSave($event)">
67
+ </sgdea-metadata-crosscutting>
68
+ ```
69
+
70
+ #### 3. Configurar en el componente TypeScript
71
+
72
+ ```typescript
73
+ import { ViewChild } from '@angular/core';
74
+ import { MetadataCrosscuttingComponent, MetadataFormData, MetadataModalFormStructure } from '@infodocnpm/ui-components';
75
+
76
+ export class MyComponent {
77
+ @ViewChild('metadataComponent') metadataComponent?: MetadataCrosscuttingComponent;
78
+
79
+ sectionFormId = 'your-section-form-id';
80
+ metadataApiUrl = 'https://your-api.com/api/v1/metadata/template/get-all-metadata-for-modal';
81
+ metadataCreateApiUrl = 'https://your-api.com/api/v1/metadata/value-metadata/create';
82
+ initialMetadataData: MetadataFormData[] | null = null;
83
+
84
+ // Obtener datos actuales del formulario
85
+ getCurrentMetadataData(): MetadataFormData[] {
86
+ if (this.metadataComponent) {
87
+ return this.metadataComponent.getCurrentFormData();
88
+ }
89
+ return [];
90
+ }
91
+
92
+ // Guardar datos (opcional, si quieres guardar localmente)
93
+ onMetadataSave(data: { formData: MetadataFormData[], formStructure: MetadataModalFormStructure | null }): void {
94
+ // Guardar localmente si es necesario
95
+ console.log('Metadata saved:', data);
96
+ }
97
+ }
98
+ ```
99
+
100
+ #### 4. Vincular metadatos después de crear un registro
101
+
102
+ ```typescript
103
+ import { ValueMetadataCreateMapper, ValueMetadataCreateRequestDto } from '@infodocnpm/ui-components';
104
+ import { HttpClient } from '@angular/common/http';
105
+ import { forkJoin, Observable, of } from 'rxjs';
106
+ import { catchError, map } from 'rxjs/operators';
107
+
108
+ export class MyComponent {
109
+ constructor(private http: HttpClient) {}
110
+
111
+ // Después de crear tu registro (ej: préstamo, expediente, etc.)
112
+ linkMetadataToRegister(registerId: string): void {
113
+ const metadataData = this.metadataComponent?.getCurrentFormData() || [];
114
+
115
+ if (metadataData.length === 0) {
116
+ return; // No hay datos para vincular
117
+ }
118
+
119
+ const apiUrl = 'https://your-api.com/api/v1/metadata/value-metadata/create';
120
+ const sectionFormId = this.sectionFormId;
121
+
122
+ // Construir el request usando el mapper
123
+ const requestPayload: ValueMetadataCreateRequestDto = ValueMetadataCreateMapper.toRequestDto(
124
+ metadataData,
125
+ sectionFormId,
126
+ registerId,
127
+ null // formStructure - opcional
128
+ );
129
+
130
+ // Enviar al backend
131
+ this.http.post(apiUrl, requestPayload).subscribe({
132
+ next: (response) => {
133
+ console.log('Metadata vinculado exitosamente:', response);
134
+ },
135
+ error: (error) => {
136
+ console.error('Error al vincular metadata:', error);
137
+ }
138
+ });
139
+ }
140
+ }
141
+ ```
142
+
143
+ ### Modo Modal (Legacy)
144
+
145
+ El componente también puede mostrarse en un modal (modo legacy).
146
+
147
+ ```html
148
+ <sgdea-metadata-crosscutting
149
+ [isVisible]="isModalVisible"
150
+ [modalTitle]="'Metadatos del Documento'"
151
+ [sectionFormId]="sectionFormId"
152
+ [apiUrl]="metadataApiUrl"
153
+ [createApiUrl]="metadataCreateApiUrl"
154
+ [registerId]="registerId"
155
+ [initialFormData]="initialMetadataData"
156
+ (closeModal)="closeModal()"
157
+ (saveModal)="onMetadataSave($event)">
158
+ </sgdea-metadata-crosscutting>
159
+ ```
160
+
161
+ ### Propiedades del Componente
162
+
163
+ | Propiedad | Tipo | Descripción |
164
+ |-----------|------|-------------|
165
+ | `inlineMode` | `boolean` | Si es `true`, muestra el formulario inline (sin modal). Por defecto: `false` |
166
+ | `autoLoad` | `boolean` | Si es `true`, carga automáticamente los metadatos al inicializar. Por defecto: `false` |
167
+ | `sectionFormId` | `string \| null` | ID de la sección de formulario de metadatos |
168
+ | `apiUrl` | `string \| null` | URL completa del endpoint para obtener la estructura de metadatos |
169
+ | `createApiUrl` | `string \| null` | URL completa del endpoint para crear/vincular metadatos |
170
+ | `registerId` | `string \| null` | ID del registro al que se vincularán los metadatos (usado en modo modal) |
171
+ | `initialFormData` | `MetadataFormData[] \| null` | Datos iniciales para poblar el formulario |
172
+ | `isVisible` | `boolean` | Muestra/oculta el modal (solo en modo modal). Por defecto: `false` |
173
+ | `modalTitle` | `string` | Título del modal (solo en modo modal). Por defecto: `'Metadatos del Documento'` |
174
+
175
+ ### Eventos
176
+
177
+ | Evento | Tipo | Descripción |
178
+ |--------|------|-------------|
179
+ | `saveModal` | `EventEmitter<{ formData: MetadataFormData[], formStructure: MetadataModalFormStructure \| null }>` | Se emite cuando se guarda el formulario |
180
+ | `closeModal` | `EventEmitter<void>` | Se emite cuando se cierra el modal (solo modo modal) |
181
+
182
+ ### Métodos Públicos
183
+
184
+ #### `getCurrentFormData(): MetadataFormData[]`
185
+
186
+ Obtiene los datos actuales del formulario sin validar ni guardar. Útil para obtener los valores actuales antes de vincular al registro.
187
+
188
+ ```typescript
189
+ const currentData = this.metadataComponent?.getCurrentFormData();
190
+ ```
191
+
192
+ ### Validación de Campos Obligatorios
193
+
194
+ Para validar que todos los campos obligatorios estén diligenciados antes de crear un registro:
195
+
196
+ ```typescript
197
+ import { MetadataValidationService, ValidateMissingFieldsResponseDto } from '@infodocnpm/ui-components';
198
+
199
+ export class MyComponent {
200
+ constructor(private metadataValidationService: MetadataValidationService) {}
201
+
202
+ validateRequiredFields(): boolean {
203
+ const currentData = this.metadataComponent?.getCurrentFormData() || [];
204
+ const sectionFormId = this.sectionFormId;
205
+
206
+ // Obtener secciones con campos obligatorios
207
+ const apiUrl = 'https://your-api.com/api/v1/metadata/template/get-all-metadata-for-modal';
208
+
209
+ this.metadataValidationService.validateRequiredFields(apiUrl, [sectionFormId])
210
+ .subscribe({
211
+ next: (response) => {
212
+ if (response.sectionsWithRequiredFields.length > 0) {
213
+ // Hay campos obligatorios, validar que estén diligenciados
214
+ const metadataDataMap = new Map();
215
+ metadataDataMap.set(sectionFormId, {
216
+ formData: currentData,
217
+ formStructure: null // Obtener de la estructura cargada
218
+ });
219
+
220
+ const validationResult = this.metadataValidationService.validateMissingRequiredFields(
221
+ response.sectionsWithRequiredFields,
222
+ metadataDataMap
223
+ );
224
+
225
+ if (validationResult.hasMissingFields) {
226
+ console.error('Faltan campos obligatorios:', validationResult.missingSections);
227
+ return false;
228
+ }
229
+ }
230
+ return true;
231
+ }
232
+ });
233
+
234
+ return false;
235
+ }
236
+ }
237
+ ```
238
+
239
+ ### Ejemplo Completo de Integración
240
+
241
+ ```typescript
242
+ import { Component, ViewChild } from '@angular/core';
243
+ import { MetadataCrosscuttingComponent, MetadataFormData, MetadataModalFormStructure, ValueMetadataCreateMapper, ValueMetadataCreateRequestDto } from '@infodocnpm/ui-components';
244
+ import { HttpClient } from '@angular/common/http';
245
+
246
+ @Component({
247
+ selector: 'app-loan-form',
248
+ standalone: true,
249
+ imports: [MetadataCrosscuttingComponent],
250
+ template: `
251
+ <form>
252
+ <!-- Campos del formulario principal -->
253
+
254
+ <!-- Metadatos inline -->
255
+ <sgdea-metadata-crosscutting
256
+ #metadataComponent
257
+ [inlineMode]="true"
258
+ [autoLoad]="true"
259
+ [sectionFormId]="'DETAIL_SECTION'"
260
+ [apiUrl]="metadataApiUrl"
261
+ [createApiUrl]="metadataCreateApiUrl"
262
+ (saveModal)="onMetadataSave($event)">
263
+ </sgdea-metadata-crosscutting>
264
+
265
+ <button (click)="createLoan()">Crear Préstamo</button>
266
+ </form>
267
+ `
268
+ })
269
+ export class LoanFormComponent {
270
+ @ViewChild('metadataComponent') metadataComponent?: MetadataCrosscuttingComponent;
271
+
272
+ metadataApiUrl = 'https://api.example.com/api/v1/metadata/template/get-all-metadata-for-modal';
273
+ metadataCreateApiUrl = 'https://api.example.com/api/v1/metadata/value-metadata/create';
274
+
275
+ constructor(private http: HttpClient) {}
276
+
277
+ onMetadataSave(data: { formData: MetadataFormData[], formStructure: MetadataModalFormStructure | null }): void {
278
+ // Guardar localmente si es necesario
279
+ console.log('Metadata guardado:', data);
280
+ }
281
+
282
+ createLoan(): void {
283
+ // 1. Crear el préstamo
284
+ this.http.post('https://api.example.com/api/v1/loans', loanData)
285
+ .subscribe({
286
+ next: (response: any) => {
287
+ const loanId = response.idPrestamo;
288
+
289
+ // 2. Vincular metadatos al préstamo
290
+ this.linkMetadataToLoan(loanId);
291
+ }
292
+ });
293
+ }
294
+
295
+ linkMetadataToLoan(loanId: string): void {
296
+ const metadataData = this.metadataComponent?.getCurrentFormData() || [];
297
+
298
+ if (metadataData.length === 0) {
299
+ return;
300
+ }
301
+
302
+ const requestPayload: ValueMetadataCreateRequestDto = ValueMetadataCreateMapper.toRequestDto(
303
+ metadataData,
304
+ 'DETAIL_SECTION',
305
+ loanId,
306
+ null
307
+ );
308
+
309
+ this.http.post(this.metadataCreateApiUrl, requestPayload).subscribe({
310
+ next: () => {
311
+ console.log('Metadatos vinculados exitosamente');
312
+ },
313
+ error: (error) => {
314
+ console.error('Error al vincular metadatos:', error);
315
+ }
316
+ });
317
+ }
318
+ }
319
+ ```
320
+
321
+ ## Building
322
+
323
+ Para construir la librería localmente:
324
+
325
+ ```bash
326
+ npm run build:lib
327
+ ```
328
+
329
+ Los artefactos de compilación se guardarán en el directorio `dist/`.
330
+
331
+ ### Publicar la Librería
332
+
333
+ Una vez construida la librería:
334
+
335
+ 1. Navegar al directorio `dist`:
336
+ ```bash
337
+ cd dist/ui-components
338
+ ```
339
+
340
+ 2. Ejecutar `npm publish` para publicar la librería en el registro de npm:
341
+ ```bash
342
+ npm publish
343
+ ```
344
+
345
+ ## Running unit tests
346
+
347
+ Para ejecutar las pruebas unitarias:
348
+
349
+ ```bash
350
+ npm test
351
+ ```
352
+
353
+ ## Recursos Adicionales
354
+
355
+ Para más información sobre Angular CLI, visita [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli).
@@ -0,0 +1,206 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Injectable, Component, EventEmitter, Output, Input, signal } from '@angular/core';
3
+ import * as i4 from '@angular/common';
4
+ import { CommonModule } from '@angular/common';
5
+ import * as i3 from 'ngx-extended-pdf-viewer';
6
+ import { NgxExtendedPdfViewerModule, NgxExtendedPdfViewerService } from 'ngx-extended-pdf-viewer';
7
+ import * as i1$1 from '@angular/router';
8
+ import * as i1 from '@angular/common/http';
9
+ import { HttpHeaders } from '@angular/common/http';
10
+ import { throwError } from 'rxjs';
11
+ import { catchError } from 'rxjs/operators';
12
+
13
+ class UiComponentsService {
14
+ constructor() { }
15
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: UiComponentsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
16
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: UiComponentsService, providedIn: 'root' });
17
+ }
18
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: UiComponentsService, decorators: [{
19
+ type: Injectable,
20
+ args: [{
21
+ providedIn: 'root'
22
+ }]
23
+ }], ctorParameters: () => [] });
24
+
25
+ class UiComponentsComponent {
26
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: UiComponentsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
27
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.4", type: UiComponentsComponent, isStandalone: true, selector: "sgdea-ui-components", ngImport: i0, template: `
28
+ <p>
29
+ ui-components works!
30
+ </p>
31
+ `, isInline: true, styles: [""] });
32
+ }
33
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: UiComponentsComponent, decorators: [{
34
+ type: Component,
35
+ args: [{ selector: 'sgdea-ui-components', imports: [], template: `
36
+ <p>
37
+ ui-components works!
38
+ </p>
39
+ ` }]
40
+ }] });
41
+
42
+ class ButtonComponent {
43
+ label = 'Click me';
44
+ type = 'primary';
45
+ disabled = false;
46
+ size = 'medium';
47
+ clicked = new EventEmitter();
48
+ onClick() {
49
+ if (!this.disabled) {
50
+ this.clicked.emit();
51
+ }
52
+ }
53
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
54
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.4", type: ButtonComponent, isStandalone: true, selector: "sgdea-button", inputs: { label: "label", type: "type", disabled: "disabled", size: "size" }, outputs: { clicked: "clicked" }, ngImport: i0, template: "<button \r\n class=\"sgdea-btn sgdea-btn--{{ type }} sgdea-btn--{{ size }}\"\r\n [disabled]=\"disabled\"\r\n (click)=\"onClick()\">\r\n {{ label }}\r\n</button>\r\n", styles: [".sgdea-btn{font-family:Arial,sans-serif;font-weight:500;border:none;border-radius:4px;cursor:pointer;transition:all .3s ease;padding:.5rem 1rem}.sgdea-btn:hover:not(:disabled){transform:translateY(-2px);box-shadow:0 4px 8px #0003}.sgdea-btn:disabled{opacity:.6;cursor:not-allowed}.sgdea-btn--primary{background-color:#007bff;color:#fff}.sgdea-btn--primary:hover:not(:disabled){background-color:#0056b3}.sgdea-btn--secondary{background-color:#6c757d;color:#fff}.sgdea-btn--secondary:hover:not(:disabled){background-color:#545b62}.sgdea-btn--danger{background-color:#dc3545;color:#fff}.sgdea-btn--danger:hover:not(:disabled){background-color:#c82333}.sgdea-btn--small{padding:.25rem .5rem;font-size:.875rem}.sgdea-btn--medium{padding:.5rem 1rem;font-size:1rem}.sgdea-btn--large{padding:.75rem 1.5rem;font-size:1.25rem}\n"] });
55
+ }
56
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: ButtonComponent, decorators: [{
57
+ type: Component,
58
+ args: [{ selector: 'sgdea-button', imports: [], template: "<button \r\n class=\"sgdea-btn sgdea-btn--{{ type }} sgdea-btn--{{ size }}\"\r\n [disabled]=\"disabled\"\r\n (click)=\"onClick()\">\r\n {{ label }}\r\n</button>\r\n", styles: [".sgdea-btn{font-family:Arial,sans-serif;font-weight:500;border:none;border-radius:4px;cursor:pointer;transition:all .3s ease;padding:.5rem 1rem}.sgdea-btn:hover:not(:disabled){transform:translateY(-2px);box-shadow:0 4px 8px #0003}.sgdea-btn:disabled{opacity:.6;cursor:not-allowed}.sgdea-btn--primary{background-color:#007bff;color:#fff}.sgdea-btn--primary:hover:not(:disabled){background-color:#0056b3}.sgdea-btn--secondary{background-color:#6c757d;color:#fff}.sgdea-btn--secondary:hover:not(:disabled){background-color:#545b62}.sgdea-btn--danger{background-color:#dc3545;color:#fff}.sgdea-btn--danger:hover:not(:disabled){background-color:#c82333}.sgdea-btn--small{padding:.25rem .5rem;font-size:.875rem}.sgdea-btn--medium{padding:.5rem 1rem;font-size:1rem}.sgdea-btn--large{padding:.75rem 1.5rem;font-size:1.25rem}\n"] }]
59
+ }], propDecorators: { label: [{
60
+ type: Input
61
+ }], type: [{
62
+ type: Input
63
+ }], disabled: [{
64
+ type: Input
65
+ }], size: [{
66
+ type: Input
67
+ }], clicked: [{
68
+ type: Output
69
+ }] } });
70
+
71
+ class DocumentViewerFileService {
72
+ http;
73
+ constructor(http) {
74
+ this.http = http;
75
+ }
76
+ getFileByParams(params) {
77
+ const endpoint = `${params.url}/api/v1/file/download?objectName=${encodeURIComponent(params.nameFile)}&bucketName=${params.nameBucket}`;
78
+ const headers = new HttpHeaders({
79
+ 'Content-Type': 'application/json',
80
+ Authorization: `Bearer ${params.token}`
81
+ });
82
+ return this.http
83
+ .post(endpoint, {}, { headers, responseType: 'blob' })
84
+ .pipe(catchError((error) => {
85
+ const errorMessages = {
86
+ 0: 'No hay conexión con el servidor',
87
+ 400: 'Solicitud inválida',
88
+ 401: 'No autorizado. Token inválido o expirado',
89
+ 403: 'Acceso denegado',
90
+ 404: 'Archivo no encontrado',
91
+ 500: 'Error interno del servidor'
92
+ };
93
+ const message = errorMessages[error.status] ??
94
+ 'Error inesperado al descargar el archivo';
95
+ return throwError(() => new Error(message));
96
+ }));
97
+ }
98
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: DocumentViewerFileService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
99
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: DocumentViewerFileService, providedIn: 'root' });
100
+ }
101
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: DocumentViewerFileService, decorators: [{
102
+ type: Injectable,
103
+ args: [{
104
+ providedIn: 'root'
105
+ }]
106
+ }], ctorParameters: () => [{ type: i1.HttpClient }] });
107
+
108
+ class PdfViewerComponent {
109
+ route;
110
+ fileService;
111
+ pdfService;
112
+ nameFile;
113
+ nameBucket;
114
+ nameSpaceBucket;
115
+ url;
116
+ token = '';
117
+ pdfSrc;
118
+ loading = signal(false);
119
+ errorMessage = signal(null);
120
+ constructor(route, fileService, pdfService) {
121
+ this.route = route;
122
+ this.fileService = fileService;
123
+ this.pdfService = pdfService;
124
+ }
125
+ ngOnInit() {
126
+ // 1) Si el host ya pasó valores por @Input, usarlos directamente
127
+ if (this.url ||
128
+ this.nameFile ||
129
+ this.nameBucket ||
130
+ this.nameSpaceBucket ||
131
+ this.token) {
132
+ this.loadPdf();
133
+ return;
134
+ }
135
+ // 2) Si no hay @Input, intentar leer desde query params (modo microfront original)
136
+ this.route.queryParams.subscribe((params) => {
137
+ this.nameFile = this.nameFile ?? params['nameFile'];
138
+ this.nameBucket = this.nameBucket ?? params['nameBucket'];
139
+ this.nameSpaceBucket = this.nameSpaceBucket ?? params['nameSpaceBucket'];
140
+ this.token = this.token || params['token'];
141
+ this.url = this.url ?? params['url'];
142
+ if (this.url ||
143
+ this.nameFile ||
144
+ this.nameBucket ||
145
+ this.nameSpaceBucket ||
146
+ this.token) {
147
+ this.loadPdf();
148
+ }
149
+ else {
150
+ this.errorMessage.set(`No se han proporcionado los parámetros necesarios {url: ${this.url} nameFile: ${this.nameFile} nameBucket: ${this.nameBucket} nameSpaceBucket: ${this.nameSpaceBucket} token: ${this.token}}`);
151
+ this.loading.set(false);
152
+ this.errorMessage.set(null);
153
+ }
154
+ });
155
+ }
156
+ loadPdf() {
157
+ this.loading.set(true);
158
+ this.errorMessage.set(null);
159
+ this.fileService
160
+ .getFileByParams({
161
+ nameFile: this.nameFile,
162
+ nameBucket: this.nameBucket,
163
+ nameSpaceBucket: this.nameSpaceBucket,
164
+ url: this.url,
165
+ token: this.token,
166
+ })
167
+ .subscribe({
168
+ next: (blob) => {
169
+ this.pdfSrc = URL.createObjectURL(blob);
170
+ this.loading.set(false);
171
+ this.errorMessage.set(null);
172
+ },
173
+ error: (err) => {
174
+ this.loading.set(false);
175
+ this.errorMessage.set(err.message || 'Error al cargar el documento');
176
+ },
177
+ });
178
+ }
179
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: PdfViewerComponent, deps: [{ token: i1$1.ActivatedRoute }, { token: DocumentViewerFileService }, { token: i3.NgxExtendedPdfViewerService }], target: i0.ɵɵFactoryTarget.Component });
180
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.4", type: PdfViewerComponent, isStandalone: true, selector: "sgdea-document-viewer", inputs: { nameFile: "nameFile", nameBucket: "nameBucket", nameSpaceBucket: "nameSpaceBucket", url: "url", token: "token" }, providers: [NgxExtendedPdfViewerService], ngImport: i0, template: "<div *ngIf=\"loading()\" class=\"loader\">\r\n Cargando documento...\r\n</div>\r\n\r\n<div *ngIf=\"errorMessage() && !loading()\" class=\"error-message\">\r\n {{ errorMessage() }}\r\n</div>\r\n\r\n<div class=\"pdf-viewer-container\">\r\n <ngx-extended-pdf-viewer\r\n *ngIf=\"pdfSrc && !loading()\"\r\n [src]=\"pdfSrc\"\r\n height=\"auto\"\r\n useBrowserLocale=\"false\"\r\n [showDownloadButton]=\"false\"\r\n [showPrintButton]=\"false\"\r\n [showOpenFileButton]=\"false\"\r\n [showSecondaryToolbarButton]=\"false\"\r\n [showFirstAndLastPageButtons]=\"false\"\r\n [showPagingButtons]=\"false\"\r\n [showZoomButtons]=\"false\"\r\n [showDrawEditor]=\"false\"\r\n [showTextEditor]=\"false\"\r\n [showStampEditor]=\"false\"\r\n [showHighlightEditor]=\"false\"\r\n >\r\n </ngx-extended-pdf-viewer>\r\n</div>\r\n\r\n", styles: [".loader,.error-message{padding:1rem;text-align:center}.error-message{color:#b71c1c;background-color:#ffebee;border:1px solid #ef5350;border-radius:4px;margin:1rem 0}.pdf-viewer-container{flex:1;min-height:0;width:100%;display:flex;flex-direction:column}.pdf-viewer-container ngx-extended-pdf-viewer{flex:1;min-height:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: NgxExtendedPdfViewerModule }, { kind: "component", type: i3.NgxExtendedPdfViewerComponent, selector: "ngx-extended-pdf-viewer", inputs: ["customFindbarInputArea", "customToolbar", "customFindbar", "customFindbarButtons", "customPdfViewer", "customSecondaryToolbar", "customSidebar", "customThumbnail", "customFreeFloatingBar", "showFreeFloatingBar", "enableDragAndDrop", "forceUsingLegacyES5", "formData", "disableForms", "pageViewMode", "scrollMode", "authorization", "httpHeaders", "contextMenuAllowed", "enablePrint", "enablePrintAutoRotate", "forceFullReloadOfJavaScriptCode", "showTextEditor", "showStampEditor", "showCommentEditor", "showDrawEditor", "showHighlightEditor", "showSignatureEditor", "logLevel", "minifiedJSLibraries", "printResolution", "rotation", "src", "base64Src", "minHeight", "height", "backgroundColor", "pdfBackgroundColor", "filenameForDownload", "ignoreKeyboard", "ignoreKeys", "acceptKeys", "imageResourcesPath", "localeFolderPath", "language", "listenToURL", "nameddest", "password", "replaceBrowserPrint", "useInlineScripts", "showUnverifiedSignatures", "startTabindex", "showSidebarButton", "sidebarVisible", "activeSidebarView", "findbarVisible", "propertiesDialogVisible", "showFindButton", "showFindHighlightAll", "showFindMatchCase", "showFindMultiple", "showFindRegexp", "showFindEntireWord", "showFindMatchDiacritics", "showFindResultsCount", "showFindMessages", "showMovePageButton", "showPagingButtons", "showFirstAndLastPageButtons", "showPreviousAndNextPageButtons", "showPageNumber", "showPageLabel", "showZoomButtons", "showZoomDropdown", "showPresentationModeButton", "showOpenFileButton", "showPrintButton", "showDownloadButton", "theme", "showToolbar", "showSecondaryToolbarButton", "showSinglePageModeButton", "showVerticalScrollButton", "showHorizontalScrollButton", "showWrappedScrollButton", "showInfiniteScrollButton", "showBookModeButton", "showRotateButton", "showRotateCwButton", "showRotateCcwButton", "handTool", "showHandToolButton", "showSpreadButton", "showPropertiesButton", "showBorders", "spread", "showScrollingButtons", "page", "pageLabel", "textLayer", "zoom", "zoomLevels", "maxZoom", "minZoom", "mobileFriendlyZoom"], outputs: ["annotationEditorEvent", "formDataChange", "pageViewModeChange", "progress", "srcChange", "scrollModeChange", "afterPrint", "beforePrint", "currentZoomFactor", "rotationChange", "annotationLayerRendered", "annotationEditorLayerRendered", "xfaLayerRendered", "outlineLoaded", "attachmentsloaded", "layersloaded", "sidebarVisibleChange", "activeSidebarViewChange", "findbarVisibleChange", "propertiesDialogVisibleChange", "handToolChange", "spreadChange", "thumbnailDrawn", "pageChange", "pageLabelChange", "pagesLoaded", "pageRender", "pageRendered", "pdfDownloaded", "pdfLoaded", "pdfLoadingStarts", "pdfLoadingFailed", "textLayerRendered", "annotationEditorModeChanged", "updateFindMatchesCount", "updateFindState", "zoomChange"] }] });
181
+ }
182
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: PdfViewerComponent, decorators: [{
183
+ type: Component,
184
+ args: [{ selector: 'sgdea-document-viewer', standalone: true, imports: [CommonModule, NgxExtendedPdfViewerModule], providers: [NgxExtendedPdfViewerService], template: "<div *ngIf=\"loading()\" class=\"loader\">\r\n Cargando documento...\r\n</div>\r\n\r\n<div *ngIf=\"errorMessage() && !loading()\" class=\"error-message\">\r\n {{ errorMessage() }}\r\n</div>\r\n\r\n<div class=\"pdf-viewer-container\">\r\n <ngx-extended-pdf-viewer\r\n *ngIf=\"pdfSrc && !loading()\"\r\n [src]=\"pdfSrc\"\r\n height=\"auto\"\r\n useBrowserLocale=\"false\"\r\n [showDownloadButton]=\"false\"\r\n [showPrintButton]=\"false\"\r\n [showOpenFileButton]=\"false\"\r\n [showSecondaryToolbarButton]=\"false\"\r\n [showFirstAndLastPageButtons]=\"false\"\r\n [showPagingButtons]=\"false\"\r\n [showZoomButtons]=\"false\"\r\n [showDrawEditor]=\"false\"\r\n [showTextEditor]=\"false\"\r\n [showStampEditor]=\"false\"\r\n [showHighlightEditor]=\"false\"\r\n >\r\n </ngx-extended-pdf-viewer>\r\n</div>\r\n\r\n", styles: [".loader,.error-message{padding:1rem;text-align:center}.error-message{color:#b71c1c;background-color:#ffebee;border:1px solid #ef5350;border-radius:4px;margin:1rem 0}.pdf-viewer-container{flex:1;min-height:0;width:100%;display:flex;flex-direction:column}.pdf-viewer-container ngx-extended-pdf-viewer{flex:1;min-height:0}\n"] }]
185
+ }], ctorParameters: () => [{ type: i1$1.ActivatedRoute }, { type: DocumentViewerFileService }, { type: i3.NgxExtendedPdfViewerService }], propDecorators: { nameFile: [{
186
+ type: Input
187
+ }], nameBucket: [{
188
+ type: Input
189
+ }], nameSpaceBucket: [{
190
+ type: Input
191
+ }], url: [{
192
+ type: Input
193
+ }], token: [{
194
+ type: Input
195
+ }] } });
196
+
197
+ /*
198
+ * Public API Surface of ui-components
199
+ */
200
+
201
+ /**
202
+ * Generated bundle index. Do not edit.
203
+ */
204
+
205
+ export { ButtonComponent, PdfViewerComponent, UiComponentsComponent, UiComponentsService };
206
+ //# sourceMappingURL=infodocviewdoc.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infodocviewdoc.mjs","sources":["../../../projects/ui-components/src/lib/ui-components.service.ts","../../../projects/ui-components/src/lib/ui-components.component.ts","../../../projects/ui-components/src/lib/button/button.component.ts","../../../projects/ui-components/src/lib/button/button.component.html","../../../projects/ui-components/src/lib/document-viewer/services/file.service.ts","../../../projects/ui-components/src/lib/document-viewer/pages/pdf-viewer-page/pdf-viewer.component.ts","../../../projects/ui-components/src/lib/document-viewer/pages/pdf-viewer-page/pdf-viewer.component.html","../../../projects/ui-components/src/public-api.ts","../../../projects/ui-components/src/infodocviewdoc.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UiComponentsService {\r\n\r\n constructor() { }\r\n}\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'sgdea-ui-components',\r\n imports: [],\r\n template: `\r\n <p>\r\n ui-components works!\r\n </p>\r\n `,\r\n styles: ``\r\n})\r\nexport class UiComponentsComponent {\r\n\r\n}\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'sgdea-button',\r\n imports: [],\r\n templateUrl: './button.component.html',\r\n styleUrl: './button.component.css'\r\n})\r\nexport class ButtonComponent {\r\n @Input() label: string = 'Click me';\r\n @Input() type: 'primary' | 'secondary' | 'danger' = 'primary';\r\n @Input() disabled: boolean = false;\r\n @Input() size: 'small' | 'medium' | 'large' = 'medium';\r\n @Output() clicked = new EventEmitter<void>();\r\n\r\n onClick() {\r\n if (!this.disabled) {\r\n this.clicked.emit();\r\n }\r\n }\r\n}\r\n","<button \r\n class=\"sgdea-btn sgdea-btn--{{ type }} sgdea-btn--{{ size }}\"\r\n [disabled]=\"disabled\"\r\n (click)=\"onClick()\">\r\n {{ label }}\r\n</button>\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n HttpClient,\r\n HttpErrorResponse,\r\n HttpHeaders\r\n} from '@angular/common/http';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { catchError } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentViewerFileService {\r\n constructor(private http: HttpClient) {}\r\n\r\n getFileByParams(params: {\r\n nameFile: string;\r\n nameBucket: string;\r\n nameSpaceBucket: string;\r\n url: string;\r\n token: string;\r\n }): Observable<Blob> {\r\n const endpoint = `${params.url}/api/v1/file/download?objectName=${encodeURIComponent(\r\n params.nameFile\r\n )}&bucketName=${params.nameBucket}`;\r\n\r\n const headers = new HttpHeaders({\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${params.token}`\r\n });\r\n\r\n return this.http\r\n .post(endpoint, {}, { headers, responseType: 'blob' })\r\n .pipe(\r\n catchError((error: HttpErrorResponse) => {\r\n const errorMessages: Record<number, string> = {\r\n 0: 'No hay conexión con el servidor',\r\n 400: 'Solicitud inválida',\r\n 401: 'No autorizado. Token inválido o expirado',\r\n 403: 'Acceso denegado',\r\n 404: 'Archivo no encontrado',\r\n 500: 'Error interno del servidor'\r\n };\r\n\r\n const message =\r\n errorMessages[error.status] ??\r\n 'Error inesperado al descargar el archivo';\r\n\r\n return throwError(() => new Error(message));\r\n })\r\n );\r\n }\r\n}\r\n\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, OnInit, signal } from '@angular/core';\r\nimport { ActivatedRoute, Params } from '@angular/router';\r\nimport { NgxExtendedPdfViewerModule, NgxExtendedPdfViewerService } from 'ngx-extended-pdf-viewer';\r\nimport { DocumentViewerFileService } from '../../services/file.service';\r\n\r\n@Component({\r\n selector: 'sgdea-document-viewer',\r\n standalone: true,\r\n imports: [CommonModule, NgxExtendedPdfViewerModule],\r\n templateUrl: './pdf-viewer.component.html',\r\n styleUrls: ['./pdf-viewer.component.css'],\r\n providers: [NgxExtendedPdfViewerService]\r\n})\r\nexport class PdfViewerComponent implements OnInit {\r\n @Input() nameFile?: string;\r\n @Input() nameBucket?: string;\r\n @Input() nameSpaceBucket?: string;\r\n @Input() url?: string;\r\n @Input() token: string = '';\r\n\r\n pdfSrc?: string;\r\n loading = signal<boolean>(false);\r\n errorMessage = signal<string | null>(null);\r\n\r\n constructor(\r\n private route: ActivatedRoute,\r\n private fileService: DocumentViewerFileService,\r\n private pdfService: NgxExtendedPdfViewerService\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n // 1) Si el host ya pasó valores por @Input, usarlos directamente\r\n if (\r\n this.url ||\r\n this.nameFile ||\r\n this.nameBucket ||\r\n this.nameSpaceBucket ||\r\n this.token\r\n ) {\r\n this.loadPdf();\r\n return;\r\n }\r\n\r\n // 2) Si no hay @Input, intentar leer desde query params (modo microfront original)\r\n this.route.queryParams.subscribe((params: Params) => {\r\n this.nameFile = this.nameFile ?? params['nameFile'];\r\n this.nameBucket = this.nameBucket ?? params['nameBucket'];\r\n this.nameSpaceBucket = this.nameSpaceBucket ?? params['nameSpaceBucket'];\r\n this.token = this.token || params['token'];\r\n this.url = this.url ?? params['url'];\r\n\r\n if (\r\n this.url ||\r\n this.nameFile ||\r\n this.nameBucket ||\r\n this.nameSpaceBucket ||\r\n this.token\r\n ) {\r\n this.loadPdf();\r\n } else {\r\n this.errorMessage.set(\r\n `No se han proporcionado los parámetros necesarios {url: ${this.url} nameFile: ${this.nameFile} nameBucket: ${this.nameBucket} nameSpaceBucket: ${this.nameSpaceBucket} token: ${this.token}}`\r\n );\r\n this.loading.set(false);\r\n this.errorMessage.set(null);\r\n }\r\n });\r\n }\r\n\r\n private loadPdf() {\r\n this.loading.set(true);\r\n this.errorMessage.set(null);\r\n\r\n this.fileService\r\n .getFileByParams({\r\n nameFile: this.nameFile!,\r\n nameBucket: this.nameBucket!,\r\n nameSpaceBucket: this.nameSpaceBucket!,\r\n url: this.url!,\r\n token: this.token!,\r\n })\r\n .subscribe({\r\n next: (blob) => {\r\n this.pdfSrc = URL.createObjectURL(blob);\r\n this.loading.set(false);\r\n this.errorMessage.set(null);\r\n },\r\n error: (err: Error) => {\r\n this.loading.set(false);\r\n this.errorMessage.set(err.message || 'Error al cargar el documento');\r\n },\r\n });\r\n }\r\n}\r\n\r\n","<div *ngIf=\"loading()\" class=\"loader\">\r\n Cargando documento...\r\n</div>\r\n\r\n<div *ngIf=\"errorMessage() && !loading()\" class=\"error-message\">\r\n {{ errorMessage() }}\r\n</div>\r\n\r\n<div class=\"pdf-viewer-container\">\r\n <ngx-extended-pdf-viewer\r\n *ngIf=\"pdfSrc && !loading()\"\r\n [src]=\"pdfSrc\"\r\n height=\"auto\"\r\n useBrowserLocale=\"false\"\r\n [showDownloadButton]=\"false\"\r\n [showPrintButton]=\"false\"\r\n [showOpenFileButton]=\"false\"\r\n [showSecondaryToolbarButton]=\"false\"\r\n [showFirstAndLastPageButtons]=\"false\"\r\n [showPagingButtons]=\"false\"\r\n [showZoomButtons]=\"false\"\r\n [showDrawEditor]=\"false\"\r\n [showTextEditor]=\"false\"\r\n [showStampEditor]=\"false\"\r\n [showHighlightEditor]=\"false\"\r\n >\r\n </ngx-extended-pdf-viewer>\r\n</div>\r\n\r\n","/*\r\n * Public API Surface of ui-components\r\n */\r\n\r\nexport * from './lib/ui-components.service';\r\nexport * from './lib/ui-components.component';\r\nexport * from './lib/button/button.component';\r\nexport * from './lib/document-viewer/pages/pdf-viewer-page/pdf-viewer.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2.DocumentViewerFileService"],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="infodocviewdoc" />
5
+ export * from './public-api';
@@ -0,0 +1,12 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export declare class ButtonComponent {
4
+ label: string;
5
+ type: 'primary' | 'secondary' | 'danger';
6
+ disabled: boolean;
7
+ size: 'small' | 'medium' | 'large';
8
+ clicked: EventEmitter<void>;
9
+ onClick(): void;
10
+ static ɵfac: i0.ɵɵFactoryDeclaration<ButtonComponent, never>;
11
+ static ɵcmp: i0.ɵɵComponentDeclaration<ButtonComponent, "sgdea-button", never, { "label": { "alias": "label"; "required": false; }; "type": { "alias": "type"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "size": { "alias": "size"; "required": false; }; }, { "clicked": "clicked"; }, never, never, true, never>;
12
+ }
@@ -0,0 +1,23 @@
1
+ import { OnInit } from '@angular/core';
2
+ import { ActivatedRoute } from '@angular/router';
3
+ import { NgxExtendedPdfViewerService } from 'ngx-extended-pdf-viewer';
4
+ import { DocumentViewerFileService } from '../../services/file.service';
5
+ import * as i0 from "@angular/core";
6
+ export declare class PdfViewerComponent implements OnInit {
7
+ private route;
8
+ private fileService;
9
+ private pdfService;
10
+ nameFile?: string;
11
+ nameBucket?: string;
12
+ nameSpaceBucket?: string;
13
+ url?: string;
14
+ token: string;
15
+ pdfSrc?: string;
16
+ loading: import("@angular/core").WritableSignal<boolean>;
17
+ errorMessage: import("@angular/core").WritableSignal<string | null>;
18
+ constructor(route: ActivatedRoute, fileService: DocumentViewerFileService, pdfService: NgxExtendedPdfViewerService);
19
+ ngOnInit(): void;
20
+ private loadPdf;
21
+ static ɵfac: i0.ɵɵFactoryDeclaration<PdfViewerComponent, never>;
22
+ static ɵcmp: i0.ɵɵComponentDeclaration<PdfViewerComponent, "sgdea-document-viewer", never, { "nameFile": { "alias": "nameFile"; "required": false; }; "nameBucket": { "alias": "nameBucket"; "required": false; }; "nameSpaceBucket": { "alias": "nameSpaceBucket"; "required": false; }; "url": { "alias": "url"; "required": false; }; "token": { "alias": "token"; "required": false; }; }, {}, never, never, true, never>;
23
+ }
@@ -0,0 +1,16 @@
1
+ import { HttpClient } from '@angular/common/http';
2
+ import { Observable } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ export declare class DocumentViewerFileService {
5
+ private http;
6
+ constructor(http: HttpClient);
7
+ getFileByParams(params: {
8
+ nameFile: string;
9
+ nameBucket: string;
10
+ nameSpaceBucket: string;
11
+ url: string;
12
+ token: string;
13
+ }): Observable<Blob>;
14
+ static ɵfac: i0.ɵɵFactoryDeclaration<DocumentViewerFileService, never>;
15
+ static ɵprov: i0.ɵɵInjectableDeclaration<DocumentViewerFileService>;
16
+ }
@@ -0,0 +1,5 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class UiComponentsComponent {
3
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiComponentsComponent, never>;
4
+ static ɵcmp: i0.ɵɵComponentDeclaration<UiComponentsComponent, "sgdea-ui-components", never, {}, {}, never, never, true, never>;
5
+ }
@@ -0,0 +1,6 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class UiComponentsService {
3
+ constructor();
4
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiComponentsService, never>;
5
+ static ɵprov: i0.ɵɵInjectableDeclaration<UiComponentsService>;
6
+ }
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "infodocviewdoc",
3
+ "version": "1.0.0",
4
+ "peerDependencies": {
5
+ "@angular/animations": "19.2.4",
6
+ "@angular/cdk": "^19.2.9",
7
+ "@angular/common": "19.2.4",
8
+ "@angular/compiler": "19.2.4",
9
+ "@angular/core": "19.2.4",
10
+ "@angular/forms": "19.2.4",
11
+ "@angular/material": "^19.2.9",
12
+ "@angular/platform-browser": "19.2.4",
13
+ "@angular/platform-browser-dynamic": "19.2.4",
14
+ "@angular/router": "19.2.4",
15
+ "@ngxs/devtools-plugin": "^19.0.0",
16
+ "@ngxs/storage-plugin": "^19.0.0",
17
+ "@ngxs/store": "^19.0.0",
18
+ "@softarc/native-federation-node": "^2.0.10",
19
+ "@swimlane/ngx-datatable": "^21.0.0-alpha.1",
20
+ "es-module-shims": "1.5.12",
21
+ "ngx-extended-pdf-viewer": "^25.6.4",
22
+ "ngx-skeleton-loader": "^11.0.0",
23
+ "permission-info-lib": "^0.0.2",
24
+ "rxjs": "~7.8.0",
25
+ "sweetalert2": "^11.19.1",
26
+ "zone.js": "~0.15.0"
27
+ },
28
+ "dependencies": {
29
+ "tslib": "2.3.0"
30
+ },
31
+ "sideEffects": false,
32
+ "module": "fesm2022/infodocviewdoc.mjs",
33
+ "typings": "index.d.ts",
34
+ "exports": {
35
+ "./package.json": {
36
+ "default": "./package.json"
37
+ },
38
+ ".": {
39
+ "types": "./index.d.ts",
40
+ "default": "./fesm2022/infodocviewdoc.mjs"
41
+ }
42
+ }
43
+ }
@@ -0,0 +1,4 @@
1
+ export * from './lib/ui-components.service';
2
+ export * from './lib/ui-components.component';
3
+ export * from './lib/button/button.component';
4
+ export * from './lib/document-viewer/pages/pdf-viewer-page/pdf-viewer.component';