ngx-dsxlibrary 2.21.29 → 2.21.31

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.
@@ -1,14 +1,16 @@
1
- import { DecimalPipe } from '@angular/common';
1
+ import * as i1$1 from '@angular/common';
2
+ import { DecimalPipe, CommonModule } from '@angular/common';
2
3
  import * as i0 from '@angular/core';
3
- import { Input, Component, forwardRef, viewChild, input, signal, effect, EventEmitter, Output, model } from '@angular/core';
4
+ import { Input, Component, forwardRef, viewChild, input, signal, EventEmitter, effect, Output, model } from '@angular/core';
4
5
  import * as i1 from 'primeng/tag';
5
6
  import { TagModule } from 'primeng/tag';
6
7
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
7
8
  import { FileUpload } from 'primeng/fileupload';
8
- import * as i1$1 from 'primeng/tree';
9
+ import * as i2 from 'primeng/tree';
9
10
  import { TreeModule } from 'primeng/tree';
11
+ import * as i3 from 'primeng/api';
10
12
  import { CountUpDirective } from 'ngx-countup';
11
- import * as i2 from 'primeng/avatar';
13
+ import * as i2$1 from 'primeng/avatar';
12
14
  import { AvatarModule } from 'primeng/avatar';
13
15
  import * as i1$2 from 'primeng/dialog';
14
16
  import { DialogModule } from 'primeng/dialog';
@@ -198,28 +200,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImpo
198
200
 
199
201
  class JsonViewerComponent {
200
202
  data = input(null, ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
203
+ mode = input('view', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
204
+ textKey = input('Texto', ...(ngDevMode ? [{ debugName: "textKey" }] : /* istanbul ignore next */ []));
205
+ activeKey = input('Activo', ...(ngDevMode ? [{ debugName: "activeKey" }] : /* istanbul ignore next */ []));
206
+ itemsKey = input('Items', ...(ngDevMode ? [{ debugName: "itemsKey" }] : /* istanbul ignore next */ []));
207
+ showStatusAsSymbol = input(true, ...(ngDevMode ? [{ debugName: "showStatusAsSymbol" }] : /* istanbul ignore next */ []));
208
+ valueChange = new EventEmitter();
201
209
  nodes = [];
202
210
  selectedNode = null;
211
+ disabled = false;
203
212
  controlValue = null;
213
+ normalizedValue = {};
214
+ maxNormalizationDepth = 20;
215
+ onChange = () => undefined;
216
+ onTouched = () => undefined;
204
217
  constructor() {
205
218
  effect(() => {
206
219
  if (this.controlValue === null || this.controlValue === undefined) {
207
- this.updateNodes(this.data());
220
+ this.updateNodes(this.data(), false);
208
221
  }
209
222
  });
210
223
  }
211
224
  writeValue(value) {
212
225
  this.controlValue = value;
213
- this.updateNodes(value);
226
+ this.updateNodes(value, false);
214
227
  }
215
228
  registerOnChange(fn) {
216
- void fn;
229
+ this.onChange = fn;
217
230
  }
218
231
  registerOnTouched(fn) {
219
- void fn;
232
+ this.onTouched = fn;
220
233
  }
221
234
  setDisabledState(isDisabled) {
222
- void isDisabled;
235
+ this.disabled = isDisabled;
223
236
  }
224
237
  onNodeSelect(event) {
225
238
  const node = event?.node;
@@ -229,57 +242,225 @@ class JsonViewerComponent {
229
242
  this.selectedNode = null;
230
243
  this.nodes = [...this.nodes];
231
244
  }
232
- updateNodes(value) {
233
- this.nodes = this.buildTree(this.parseIfNeeded(value));
245
+ isEditMode() {
246
+ const modeValue = this.mode();
247
+ const editEnabled = typeof modeValue === 'boolean' ? modeValue : modeValue === 'edit';
248
+ return editEnabled && !this.disabled;
249
+ }
250
+ getNodeMeta(node) {
251
+ const nodeData = node.data;
252
+ if (!nodeData || typeof nodeData !== 'object')
253
+ return null;
254
+ const kind = nodeData.kind;
255
+ if (!kind)
256
+ return null;
257
+ return nodeData;
258
+ }
259
+ onTextEdit(path, value, nodeMeta) {
260
+ if (!this.isEditMode())
261
+ return;
262
+ this.setValueAtPath(path, value);
263
+ // Actualiza solo el meta del nodo para reflejar el cambio sin reconstruir el árbol.
264
+ if (nodeMeta.kind === 'compact-item') {
265
+ nodeMeta.text = value;
266
+ }
267
+ else if (nodeMeta.kind === 'text-primitive') {
268
+ nodeMeta.value = value;
269
+ }
270
+ this.emitCurrentValue();
271
+ }
272
+ onTextBlur() {
273
+ this.onTouched();
274
+ }
275
+ onActiveToggle(path, checked, nodeMeta) {
276
+ if (!this.isEditMode())
277
+ return;
278
+ this.setValueAtPath(path, checked);
279
+ // Actualiza el meta del nodo y recalcula el visual del símbolo.
280
+ nodeMeta.activeBoolean = checked;
281
+ nodeMeta.activeVisual = checked
282
+ ? this.showStatusAsSymbol()
283
+ ? '✓'
284
+ : 'true'
285
+ : this.showStatusAsSymbol()
286
+ ? '✗'
287
+ : 'false';
288
+ // Fuerza detección de cambio en el array sin reconstruir el árbol.
289
+ this.nodes = [...this.nodes];
290
+ this.emitCurrentValue();
291
+ this.onTouched();
292
+ }
293
+ updateNodes(value, emit) {
294
+ this.normalizedValue = this.parseIfNeeded(value);
295
+ this.nodes = this.buildTree(this.normalizedValue);
296
+ if (emit) {
297
+ this.emitCurrentValue();
298
+ }
234
299
  }
235
300
  parseIfNeeded(data) {
236
- if (!data)
301
+ if (data === null || data === undefined || data === '')
237
302
  return {};
303
+ return this.normalizeData(data, 0);
304
+ }
305
+ normalizeData(data, depth) {
306
+ if (depth > this.maxNormalizationDepth)
307
+ return data;
238
308
  if (typeof data === 'string') {
239
- try {
240
- return JSON.parse(data);
241
- }
242
- catch {
243
- return {};
309
+ const parsed = this.tryParseJsonString(data);
310
+ if (parsed.parsed) {
311
+ return this.normalizeData(parsed.value, depth + 1);
244
312
  }
313
+ return data;
314
+ }
315
+ if (Array.isArray(data)) {
316
+ return data.map((item) => this.normalizeData(item, depth + 1));
317
+ }
318
+ if (typeof data === 'object' && data !== null) {
319
+ return Object.entries(data).reduce((acc, [key, value]) => {
320
+ acc[key] = this.normalizeData(value, depth + 1);
321
+ return acc;
322
+ }, {});
245
323
  }
246
324
  return data;
247
325
  }
248
- buildTree(data, parentKey = '0') {
326
+ tryParseJsonString(value) {
327
+ const trimmed = value.trim();
328
+ // Solo intentamos parsear si parece JSON para evitar costo innecesario
329
+ // en strings de texto común.
330
+ const looksLikeJson = (trimmed.startsWith('{') && trimmed.endsWith('}')) ||
331
+ (trimmed.startsWith('[') && trimmed.endsWith(']'));
332
+ if (!looksLikeJson) {
333
+ return { parsed: false, value };
334
+ }
335
+ try {
336
+ return { parsed: true, value: JSON.parse(trimmed) };
337
+ }
338
+ catch {
339
+ return { parsed: false, value };
340
+ }
341
+ }
342
+ buildTree(data, parentKey = '0', path = []) {
249
343
  if (Array.isArray(data)) {
250
344
  return data.map((item, index) => {
251
345
  const key = `${parentKey}-${index}`;
346
+ const itemPath = [...path, index];
347
+ const compactItem = this.toCompactTextAndActive(item, itemPath, `[${String(index).padStart(2, '0')}]`);
348
+ if (compactItem) {
349
+ return {
350
+ key,
351
+ label: `${compactItem.indexLabel} Texto: ${compactItem.text} | ${compactItem.activeVisual}`,
352
+ icon: 'pi pi-file',
353
+ data: compactItem,
354
+ };
355
+ }
252
356
  if (this.isComplex(item)) {
253
357
  return {
254
358
  key,
255
359
  label: `[${index}]`,
256
- //icon: this.getIcon(item),
257
- children: this.buildTree(item, key),
360
+ icon: this.getIcon(item),
361
+ children: this.buildTree(item, key, itemPath),
258
362
  };
259
363
  }
260
364
  return {
261
365
  key,
262
366
  label: `[${index}]: ${this.formatPrimitive(item)}`,
263
- //icon: 'pi pi-file',
367
+ icon: 'pi pi-file',
264
368
  };
265
369
  });
266
370
  }
267
371
  if (typeof data === 'object' && data !== null) {
268
- return Object.keys(data).map((key, index) => {
269
- const value = data[key];
372
+ const objectData = data;
373
+ return Object.keys(objectData).flatMap((key, index) => {
374
+ const value = objectData[key];
270
375
  const nodeKey = `${parentKey}-${index}`;
376
+ const childPath = [...path, key];
377
+ const activeKeyName = this.activeKey();
378
+ const itemsKeyName = this.itemsKey();
379
+ const textKeyName = this.textKey();
380
+ if (key === itemsKeyName && Array.isArray(value)) {
381
+ return this.buildTree(value, nodeKey, childPath);
382
+ }
383
+ if (this.isItemsContainer(value)) {
384
+ const container = value;
385
+ const hasActive = Object.prototype.hasOwnProperty.call(container, activeKeyName);
386
+ const label = hasActive
387
+ ? `${key} | ${this.formatActiveSymbol(container[activeKeyName])}`
388
+ : key;
389
+ const itemsChildren = this.buildTree(container[itemsKeyName], `${nodeKey}-0`, [...childPath, itemsKeyName]);
390
+ const additionalChildren = Object.keys(container)
391
+ .filter((childKey) => childKey !== itemsKeyName && childKey !== activeKeyName)
392
+ .flatMap((childKey, childIndex) => {
393
+ return this.buildTree({ [childKey]: container[childKey] }, `${nodeKey}-${childIndex + 1}`, childPath);
394
+ });
395
+ const nodeMeta = hasActive
396
+ ? {
397
+ kind: 'group-active',
398
+ title: key,
399
+ activeVisual: this.formatActiveSymbol(container[activeKeyName]),
400
+ activeBoolean: this.toBooleanLike(container[activeKeyName]),
401
+ activePath: [...childPath, activeKeyName],
402
+ }
403
+ : undefined;
404
+ return {
405
+ key: nodeKey,
406
+ label,
407
+ icon: 'pi pi-folder',
408
+ children: [...itemsChildren, ...additionalChildren],
409
+ data: nodeMeta,
410
+ };
411
+ }
412
+ const compactValue = this.toCompactTextAndActive(value, childPath, key);
413
+ if (compactValue) {
414
+ return {
415
+ key: nodeKey,
416
+ label: `${key}: Texto: ${compactValue.text} | ${compactValue.activeVisual}`,
417
+ icon: 'pi pi-file',
418
+ data: compactValue,
419
+ };
420
+ }
421
+ const groupedValue = this.toGroupWithActive(value);
422
+ if (groupedValue) {
423
+ groupedValue.meta.title = key;
424
+ groupedValue.meta.activePath = [...childPath, activeKeyName];
425
+ return {
426
+ key: nodeKey,
427
+ label: `${key} | ${groupedValue.activeSymbol}`,
428
+ icon: 'pi pi-folder',
429
+ children: this.buildTree(groupedValue.children, nodeKey, childPath),
430
+ data: groupedValue.meta,
431
+ };
432
+ }
271
433
  if (this.isComplex(value)) {
272
434
  return {
273
435
  key: nodeKey,
274
436
  label: key,
275
- //icon: this.getIcon(value),
276
- children: this.buildTree(value, nodeKey),
437
+ icon: this.getIcon(value),
438
+ children: this.buildTree(value, nodeKey, childPath),
277
439
  };
278
440
  }
441
+ const primitiveMeta = key === textKeyName
442
+ ? {
443
+ kind: 'text-primitive',
444
+ key,
445
+ value: this.formatPrimitive(value),
446
+ path: childPath,
447
+ }
448
+ : key === activeKeyName
449
+ ? {
450
+ kind: 'active-primitive',
451
+ key,
452
+ activeVisual: this.formatActiveSymbol(value),
453
+ activeBoolean: this.toBooleanLike(value),
454
+ path: childPath,
455
+ }
456
+ : undefined;
279
457
  return {
280
458
  key: nodeKey,
281
- label: `${key}: ${this.formatPrimitive(value)}`,
459
+ label: key === activeKeyName
460
+ ? `${key}: ${this.formatActiveSymbol(value)}`
461
+ : `${key}: ${this.formatPrimitive(value)}`,
282
462
  icon: 'pi pi-file',
463
+ data: primitiveMeta,
283
464
  };
284
465
  });
285
466
  }
@@ -301,6 +482,87 @@ class JsonViewerComponent {
301
482
  return value;
302
483
  return String(value);
303
484
  }
485
+ toCompactTextAndActive(value, basePath, indexLabel) {
486
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
487
+ return null;
488
+ }
489
+ const record = value;
490
+ const textKeyName = this.textKey();
491
+ const activeKeyName = this.activeKey();
492
+ const hasText = Object.prototype.hasOwnProperty.call(record, textKeyName);
493
+ const hasActive = Object.prototype.hasOwnProperty.call(record, activeKeyName);
494
+ if (!hasText || !hasActive)
495
+ return null;
496
+ const activeValue = record[activeKeyName];
497
+ return {
498
+ kind: 'compact-item',
499
+ indexLabel,
500
+ text: this.formatPrimitive(record[textKeyName]),
501
+ activeVisual: this.formatActiveSymbol(activeValue),
502
+ activeBoolean: this.toBooleanLike(activeValue),
503
+ textPath: [...basePath, textKeyName],
504
+ activePath: [...basePath, activeKeyName],
505
+ };
506
+ }
507
+ isItemsContainer(value) {
508
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
509
+ return false;
510
+ }
511
+ return Array.isArray(value[this.itemsKey()]);
512
+ }
513
+ toGroupWithActive(value) {
514
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
515
+ return null;
516
+ }
517
+ const record = value;
518
+ const activeKeyName = this.activeKey();
519
+ const hasActive = Object.prototype.hasOwnProperty.call(record, activeKeyName);
520
+ if (!hasActive)
521
+ return null;
522
+ const childEntries = Object.entries(record).filter(([childKey]) => childKey !== activeKeyName);
523
+ if (childEntries.length === 0)
524
+ return null;
525
+ const hasComplexChildren = childEntries.some(([, childValue]) => this.isComplex(childValue));
526
+ if (!hasComplexChildren)
527
+ return null;
528
+ return {
529
+ activeSymbol: this.formatActiveSymbol(record[activeKeyName]),
530
+ children: Object.fromEntries(childEntries),
531
+ meta: {
532
+ kind: 'group-active',
533
+ title: '',
534
+ activeVisual: this.formatActiveSymbol(record[activeKeyName]),
535
+ activeBoolean: this.toBooleanLike(record[activeKeyName]),
536
+ },
537
+ };
538
+ }
539
+ formatActiveSymbol(value) {
540
+ const boolLike = this.toBooleanLike(value);
541
+ if (boolLike === true)
542
+ return this.showStatusAsSymbol() ? '✓' : 'true';
543
+ if (boolLike === false)
544
+ return this.showStatusAsSymbol() ? '✗' : 'false';
545
+ return this.formatPrimitive(value);
546
+ }
547
+ toBooleanLike(value) {
548
+ if (typeof value === 'boolean')
549
+ return value;
550
+ if (typeof value === 'number') {
551
+ if (value === 1)
552
+ return true;
553
+ if (value === 0)
554
+ return false;
555
+ return null;
556
+ }
557
+ if (typeof value === 'string') {
558
+ const normalized = value.trim().toLowerCase();
559
+ if (normalized === 'true' || normalized === '1')
560
+ return true;
561
+ if (normalized === 'false' || normalized === '0')
562
+ return false;
563
+ }
564
+ return null;
565
+ }
304
566
  getIcon(value) {
305
567
  if (Array.isArray(value))
306
568
  return 'pi pi-list';
@@ -308,25 +570,64 @@ class JsonViewerComponent {
308
570
  return 'pi pi-folder';
309
571
  return 'pi pi-file';
310
572
  }
573
+ setValueAtPath(path, value) {
574
+ if (!path.length ||
575
+ typeof this.normalizedValue !== 'object' ||
576
+ this.normalizedValue === null) {
577
+ return;
578
+ }
579
+ let target = this.normalizedValue;
580
+ for (let index = 0; index < path.length - 1; index += 1) {
581
+ const segment = path[index];
582
+ if (target === null || target === undefined)
583
+ return;
584
+ target = target[segment];
585
+ }
586
+ const lastSegment = path[path.length - 1];
587
+ if (target !== null && target !== undefined) {
588
+ target[lastSegment] = value;
589
+ }
590
+ }
591
+ emitUpdatedValue() {
592
+ this.nodes = this.buildTree(this.normalizedValue);
593
+ this.emitCurrentValue();
594
+ this.onTouched();
595
+ }
596
+ emitCurrentValue() {
597
+ const payload = this.cloneValue(this.normalizedValue);
598
+ this.controlValue = payload;
599
+ this.onChange(payload);
600
+ this.valueChange.emit(payload);
601
+ }
602
+ cloneValue(value) {
603
+ try {
604
+ return JSON.parse(JSON.stringify(value));
605
+ }
606
+ catch {
607
+ return value;
608
+ }
609
+ }
311
610
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: JsonViewerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
312
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.11", type: JsonViewerComponent, isStandalone: true, selector: "app-json-viewer", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
611
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.11", type: JsonViewerComponent, isStandalone: true, selector: "app-json-viewer", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, textKey: { classPropertyName: "textKey", publicName: "textKey", isSignal: true, isRequired: false, transformFunction: null }, activeKey: { classPropertyName: "activeKey", publicName: "activeKey", isSignal: true, isRequired: false, transformFunction: null }, itemsKey: { classPropertyName: "itemsKey", publicName: "itemsKey", isSignal: true, isRequired: false, transformFunction: null }, showStatusAsSymbol: { classPropertyName: "showStatusAsSymbol", publicName: "showStatusAsSymbol", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange" }, providers: [
313
612
  {
314
613
  provide: NG_VALUE_ACCESSOR,
315
614
  useExisting: forwardRef(() => JsonViewerComponent),
316
615
  multi: true,
317
616
  },
318
- ], ngImport: i0, template: "<p-tree\r\n\t[value]=\"nodes\"\r\n\tclass=\"json-tree w-full\"\r\n\tselectionMode=\"single\"\r\n\t[(selection)]=\"selectedNode\"\r\n\t[highlightOnSelect]=\"false\"\r\n\t(onNodeSelect)=\"onNodeSelect($event)\"\r\n>\r\n</p-tree>\r\n", styles: [":host ::ng-deep .json-tree .p-tree-node-content,:host ::ng-deep .json-tree .p-treenode-content{padding:.02rem .15rem!important}\n"], dependencies: [{ kind: "ngmodule", type: TreeModule }, { kind: "component", type: i1$1.Tree, selector: "p-tree", inputs: ["value", "selectionMode", "loadingMode", "selection", "styleClass", "contextMenu", "contextMenuSelectionMode", "contextMenuSelection", "draggableScope", "droppableScope", "draggableNodes", "droppableNodes", "metaKeySelection", "propagateSelectionUp", "propagateSelectionDown", "loading", "loadingIcon", "emptyMessage", "ariaLabel", "togglerAriaLabel", "ariaLabelledBy", "validateDrop", "filter", "filterInputAutoFocus", "filterBy", "filterMode", "filterOptions", "filterPlaceholder", "filteredNodes", "filterLocale", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "indentation", "_templateMap", "trackBy", "highlightOnSelect"], outputs: ["selectionChange", "contextMenuSelectionChange", "onNodeSelect", "onNodeUnselect", "onNodeExpand", "onNodeCollapse", "onNodeContextMenuSelect", "onNodeDoubleClick", "onNodeDrop", "onLazyLoad", "onScroll", "onScrollIndexChange", "onFilter"] }] });
617
+ ], ngImport: i0, template: "<p-tree\r\n [value]=\"nodes\"\r\n class=\"json-tree w-full\"\r\n selectionMode=\"single\"\r\n [(selection)]=\"selectedNode\"\r\n [highlightOnSelect]=\"false\"\r\n (onNodeSelect)=\"onNodeSelect($event)\"\r\n>\r\n <ng-template let-node pTemplate=\"default\">\r\n <div class=\"json-node\">\r\n <ng-container *ngIf=\"getNodeMeta(node) as meta; else defaultLabel\">\r\n <ng-container [ngSwitch]=\"meta.kind\">\r\n <ng-container *ngSwitchCase=\"'compact-item'\">\r\n <span class=\"json-prefix\">{{ meta.indexLabel || \"\" }}</span>\r\n <span class=\"json-key\"> Texto: </span>\r\n <ng-container *ngIf=\"isEditMode(); else compactTextView\">\r\n <input\r\n type=\"text\"\r\n class=\"json-text-input\"\r\n [class.json-text-inactive]=\"meta.activeBoolean === false\"\r\n [value]=\"meta.text || ''\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (keydown)=\"$event.stopPropagation()\"\r\n (input)=\"\r\n onTextEdit(\r\n $any(meta.textPath),\r\n $any($event.target).value,\r\n meta\r\n )\r\n \"\r\n (blur)=\"onTextBlur()\"\r\n />\r\n </ng-container>\r\n <ng-template #compactTextView>\r\n <span [class.json-text-inactive]=\"meta.activeBoolean === false\">{{\r\n meta.text || \"\"\r\n }}</span>\r\n </ng-template>\r\n <span class=\"json-separator\"> | </span>\r\n <span class=\"json-status\">{{ meta.activeVisual || \"\" }}</span>\r\n <input\r\n *ngIf=\"isEditMode()\"\r\n type=\"checkbox\"\r\n class=\"json-checkbox\"\r\n [checked]=\"meta.activeBoolean === true\"\r\n [disabled]=\"meta.activeBoolean === null\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"\r\n onActiveToggle(\r\n $any(meta.activePath),\r\n $any($event.target).checked,\r\n meta\r\n )\r\n \"\r\n />\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'group-active'\">\r\n <span>{{ meta.title || \"\" }}</span>\r\n <span class=\"json-separator\"> | </span>\r\n <span class=\"json-status\">{{ meta.activeVisual || \"\" }}</span>\r\n <input\r\n *ngIf=\"isEditMode() && meta.activePath\"\r\n type=\"checkbox\"\r\n class=\"json-checkbox\"\r\n [checked]=\"meta.activeBoolean === true\"\r\n [disabled]=\"meta.activeBoolean === null\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"\r\n onActiveToggle(\r\n $any(meta.activePath),\r\n $any($event.target).checked,\r\n meta\r\n )\r\n \"\r\n />\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'text-primitive'\">\r\n <span>{{ meta.key || \"\" }}:</span>\r\n <ng-container *ngIf=\"isEditMode(); else textPrimitiveView\">\r\n <input\r\n type=\"text\"\r\n class=\"json-text-input\"\r\n [value]=\"meta.value || ''\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (keydown)=\"$event.stopPropagation()\"\r\n (input)=\"\r\n onTextEdit($any(meta.path), $any($event.target).value, meta)\r\n \"\r\n (blur)=\"onTextBlur()\"\r\n />\r\n </ng-container>\r\n <ng-template #textPrimitiveView>\r\n <span>{{ meta.value || \"\" }}</span>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'active-primitive'\">\r\n <span>{{ meta.key || \"\" }}:</span>\r\n <span class=\"json-status\">{{ meta.activeVisual || \"\" }}</span>\r\n <input\r\n *ngIf=\"isEditMode()\"\r\n type=\"checkbox\"\r\n class=\"json-checkbox\"\r\n [checked]=\"meta.activeBoolean === true\"\r\n [disabled]=\"meta.activeBoolean === null\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"\r\n onActiveToggle(\r\n $any(meta.path),\r\n $any($event.target).checked,\r\n meta\r\n )\r\n \"\r\n />\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n {{ node.label }}\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultLabel>\r\n {{ node.label }}\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n</p-tree>\r\n", styles: [":host ::ng-deep .json-tree .p-tree-node-content,:host ::ng-deep .json-tree .p-treenode-content{padding:.02rem .15rem!important;display:flex;align-items:center;width:100%;min-width:0}:host ::ng-deep .json-tree .p-tree-node-label,:host ::ng-deep .json-tree .p-tree-node-label>span{flex:1 1 0;min-width:0;display:flex}:host ::ng-deep .json-tree .json-node{display:flex;align-items:center;gap:.25rem;width:100%;min-width:0}:host ::ng-deep .json-tree .json-prefix,:host ::ng-deep .json-tree .json-key,:host ::ng-deep .json-tree .json-separator,:host ::ng-deep .json-tree .json-status{white-space:nowrap;flex-shrink:0}:host ::ng-deep .json-tree .json-text-input{flex:1 1 0;min-width:0;border:1px solid #cbd5e1;border-radius:.25rem;padding:.15rem .5rem;font-size:.875rem}:host ::ng-deep .json-tree .json-text-inactive{color:#8b5e61}:host ::ng-deep .json-tree input.json-text-input.json-text-inactive{background-color:#f9f2f2;border-color:#e5c8cb}:host ::ng-deep .json-tree .json-checkbox{width:.9rem;height:.9rem;cursor:pointer;flex-shrink:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1$1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "ngmodule", type: TreeModule }, { kind: "component", type: i2.Tree, selector: "p-tree", inputs: ["value", "selectionMode", "loadingMode", "selection", "styleClass", "contextMenu", "contextMenuSelectionMode", "contextMenuSelection", "draggableScope", "droppableScope", "draggableNodes", "droppableNodes", "metaKeySelection", "propagateSelectionUp", "propagateSelectionDown", "loading", "loadingIcon", "emptyMessage", "ariaLabel", "togglerAriaLabel", "ariaLabelledBy", "validateDrop", "filter", "filterInputAutoFocus", "filterBy", "filterMode", "filterOptions", "filterPlaceholder", "filteredNodes", "filterLocale", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "indentation", "_templateMap", "trackBy", "highlightOnSelect"], outputs: ["selectionChange", "contextMenuSelectionChange", "onNodeSelect", "onNodeUnselect", "onNodeExpand", "onNodeCollapse", "onNodeContextMenuSelect", "onNodeDoubleClick", "onNodeDrop", "onLazyLoad", "onScroll", "onScrollIndexChange", "onFilter"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }] });
319
618
  }
320
619
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: JsonViewerComponent, decorators: [{
321
620
  type: Component,
322
- args: [{ selector: 'app-json-viewer', standalone: true, imports: [TreeModule], providers: [
621
+ args: [{ selector: 'app-json-viewer', standalone: true, imports: [CommonModule, TreeModule], providers: [
323
622
  {
324
623
  provide: NG_VALUE_ACCESSOR,
325
624
  useExisting: forwardRef(() => JsonViewerComponent),
326
625
  multi: true,
327
626
  },
328
- ], template: "<p-tree\r\n\t[value]=\"nodes\"\r\n\tclass=\"json-tree w-full\"\r\n\tselectionMode=\"single\"\r\n\t[(selection)]=\"selectedNode\"\r\n\t[highlightOnSelect]=\"false\"\r\n\t(onNodeSelect)=\"onNodeSelect($event)\"\r\n>\r\n</p-tree>\r\n", styles: [":host ::ng-deep .json-tree .p-tree-node-content,:host ::ng-deep .json-tree .p-treenode-content{padding:.02rem .15rem!important}\n"] }]
329
- }], ctorParameters: () => [], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }] } });
627
+ ], template: "<p-tree\r\n [value]=\"nodes\"\r\n class=\"json-tree w-full\"\r\n selectionMode=\"single\"\r\n [(selection)]=\"selectedNode\"\r\n [highlightOnSelect]=\"false\"\r\n (onNodeSelect)=\"onNodeSelect($event)\"\r\n>\r\n <ng-template let-node pTemplate=\"default\">\r\n <div class=\"json-node\">\r\n <ng-container *ngIf=\"getNodeMeta(node) as meta; else defaultLabel\">\r\n <ng-container [ngSwitch]=\"meta.kind\">\r\n <ng-container *ngSwitchCase=\"'compact-item'\">\r\n <span class=\"json-prefix\">{{ meta.indexLabel || \"\" }}</span>\r\n <span class=\"json-key\"> Texto: </span>\r\n <ng-container *ngIf=\"isEditMode(); else compactTextView\">\r\n <input\r\n type=\"text\"\r\n class=\"json-text-input\"\r\n [class.json-text-inactive]=\"meta.activeBoolean === false\"\r\n [value]=\"meta.text || ''\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (keydown)=\"$event.stopPropagation()\"\r\n (input)=\"\r\n onTextEdit(\r\n $any(meta.textPath),\r\n $any($event.target).value,\r\n meta\r\n )\r\n \"\r\n (blur)=\"onTextBlur()\"\r\n />\r\n </ng-container>\r\n <ng-template #compactTextView>\r\n <span [class.json-text-inactive]=\"meta.activeBoolean === false\">{{\r\n meta.text || \"\"\r\n }}</span>\r\n </ng-template>\r\n <span class=\"json-separator\"> | </span>\r\n <span class=\"json-status\">{{ meta.activeVisual || \"\" }}</span>\r\n <input\r\n *ngIf=\"isEditMode()\"\r\n type=\"checkbox\"\r\n class=\"json-checkbox\"\r\n [checked]=\"meta.activeBoolean === true\"\r\n [disabled]=\"meta.activeBoolean === null\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"\r\n onActiveToggle(\r\n $any(meta.activePath),\r\n $any($event.target).checked,\r\n meta\r\n )\r\n \"\r\n />\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'group-active'\">\r\n <span>{{ meta.title || \"\" }}</span>\r\n <span class=\"json-separator\"> | </span>\r\n <span class=\"json-status\">{{ meta.activeVisual || \"\" }}</span>\r\n <input\r\n *ngIf=\"isEditMode() && meta.activePath\"\r\n type=\"checkbox\"\r\n class=\"json-checkbox\"\r\n [checked]=\"meta.activeBoolean === true\"\r\n [disabled]=\"meta.activeBoolean === null\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"\r\n onActiveToggle(\r\n $any(meta.activePath),\r\n $any($event.target).checked,\r\n meta\r\n )\r\n \"\r\n />\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'text-primitive'\">\r\n <span>{{ meta.key || \"\" }}:</span>\r\n <ng-container *ngIf=\"isEditMode(); else textPrimitiveView\">\r\n <input\r\n type=\"text\"\r\n class=\"json-text-input\"\r\n [value]=\"meta.value || ''\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (keydown)=\"$event.stopPropagation()\"\r\n (input)=\"\r\n onTextEdit($any(meta.path), $any($event.target).value, meta)\r\n \"\r\n (blur)=\"onTextBlur()\"\r\n />\r\n </ng-container>\r\n <ng-template #textPrimitiveView>\r\n <span>{{ meta.value || \"\" }}</span>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'active-primitive'\">\r\n <span>{{ meta.key || \"\" }}:</span>\r\n <span class=\"json-status\">{{ meta.activeVisual || \"\" }}</span>\r\n <input\r\n *ngIf=\"isEditMode()\"\r\n type=\"checkbox\"\r\n class=\"json-checkbox\"\r\n [checked]=\"meta.activeBoolean === true\"\r\n [disabled]=\"meta.activeBoolean === null\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"\r\n onActiveToggle(\r\n $any(meta.path),\r\n $any($event.target).checked,\r\n meta\r\n )\r\n \"\r\n />\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n {{ node.label }}\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultLabel>\r\n {{ node.label }}\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n</p-tree>\r\n", styles: [":host ::ng-deep .json-tree .p-tree-node-content,:host ::ng-deep .json-tree .p-treenode-content{padding:.02rem .15rem!important;display:flex;align-items:center;width:100%;min-width:0}:host ::ng-deep .json-tree .p-tree-node-label,:host ::ng-deep .json-tree .p-tree-node-label>span{flex:1 1 0;min-width:0;display:flex}:host ::ng-deep .json-tree .json-node{display:flex;align-items:center;gap:.25rem;width:100%;min-width:0}:host ::ng-deep .json-tree .json-prefix,:host ::ng-deep .json-tree .json-key,:host ::ng-deep .json-tree .json-separator,:host ::ng-deep .json-tree .json-status{white-space:nowrap;flex-shrink:0}:host ::ng-deep .json-tree .json-text-input{flex:1 1 0;min-width:0;border:1px solid #cbd5e1;border-radius:.25rem;padding:.15rem .5rem;font-size:.875rem}:host ::ng-deep .json-tree .json-text-inactive{color:#8b5e61}:host ::ng-deep .json-tree input.json-text-input.json-text-inactive{background-color:#f9f2f2;border-color:#e5c8cb}:host ::ng-deep .json-tree .json-checkbox{width:.9rem;height:.9rem;cursor:pointer;flex-shrink:0}\n"] }]
628
+ }], ctorParameters: () => [], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], textKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "textKey", required: false }] }], activeKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeKey", required: false }] }], itemsKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemsKey", required: false }] }], showStatusAsSymbol: [{ type: i0.Input, args: [{ isSignal: true, alias: "showStatusAsSymbol", required: false }] }], valueChange: [{
629
+ type: Output
630
+ }] } });
330
631
 
331
632
  class KpicardComponent {
332
633
  //type = input.required<string>();
@@ -464,7 +765,7 @@ class DocxPreviewComponent {
464
765
  this.visibleChange.emit(false);
465
766
  }
466
767
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: DocxPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
467
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.11", type: DocxPreviewComponent, isStandalone: true, selector: "app-docx-preview", inputs: { visible: { classPropertyName: "visible", publicName: "visible", isSignal: false, isRequired: false, transformFunction: null }, blob: { classPropertyName: "blob", publicName: "blob", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visibleChange: "visibleChange" }, viewQueries: [{ propertyName: "view", first: true, predicate: ["viewer"], descendants: true, isSignal: true }], ngImport: i0, template: "<p-dialog\r\n [visible]=\"visible\"\r\n (onHide)=\"onHide()\"\r\n [modal]=\"true\"\r\n [breakpoints]=\"{ '1199px': '75vw', '575px': '90vw' }\"\r\n [style]=\"{ width: '80vw' }\"\r\n [draggable]=\"false\"\r\n [resizable]=\"false\"\r\n [closable]=\"true\"\r\n [maximizable]=\"true\"\r\n>\r\n <ng-template #header>\r\n <div class=\"flex justify-content-center align-items-center gap-2 px-2\">\r\n <p-avatar image=\"icon2/word-2019.png\" />\r\n <span class=\"font-bold\">Vista preliminar del documento</span>\r\n </div>\r\n </ng-template>\r\n <div #viewer></div>\r\n</p-dialog>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: DialogModule }, { kind: "component", type: i1$2.Dialog, selector: "p-dialog", inputs: ["hostName", "header", "draggable", "resizable", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "maskMotionOptions", "motionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: AvatarModule }, { kind: "component", type: i2.Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }] });
768
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.11", type: DocxPreviewComponent, isStandalone: true, selector: "app-docx-preview", inputs: { visible: { classPropertyName: "visible", publicName: "visible", isSignal: false, isRequired: false, transformFunction: null }, blob: { classPropertyName: "blob", publicName: "blob", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visibleChange: "visibleChange" }, viewQueries: [{ propertyName: "view", first: true, predicate: ["viewer"], descendants: true, isSignal: true }], ngImport: i0, template: "<p-dialog\r\n [visible]=\"visible\"\r\n (onHide)=\"onHide()\"\r\n [modal]=\"true\"\r\n [breakpoints]=\"{ '1199px': '75vw', '575px': '90vw' }\"\r\n [style]=\"{ width: '80vw' }\"\r\n [draggable]=\"false\"\r\n [resizable]=\"false\"\r\n [closable]=\"true\"\r\n [maximizable]=\"true\"\r\n>\r\n <ng-template #header>\r\n <div class=\"flex justify-content-center align-items-center gap-2 px-2\">\r\n <p-avatar image=\"icon2/word-2019.png\" />\r\n <span class=\"font-bold\">Vista preliminar del documento</span>\r\n </div>\r\n </ng-template>\r\n <div #viewer></div>\r\n</p-dialog>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: DialogModule }, { kind: "component", type: i1$2.Dialog, selector: "p-dialog", inputs: ["hostName", "header", "draggable", "resizable", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "maskMotionOptions", "motionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: AvatarModule }, { kind: "component", type: i2$1.Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }] });
468
769
  }
469
770
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: DocxPreviewComponent, decorators: [{
470
771
  type: Component,