@dataclouder/ngx-core 0.1.22 → 0.1.24

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,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, Input, Component, output, ChangeDetectionStrategy, inject, HostListener, ChangeDetectorRef, Injectable, Pipe, signal, effect, ViewChild, InjectionToken, Directive, Optional, Inject } from '@angular/core';
2
+ import { input, Input, Component, output, ChangeDetectionStrategy, inject, HostListener, ChangeDetectorRef, Injectable, Pipe, signal, effect, ViewChild, Directive, InjectionToken, Optional, Inject } from '@angular/core';
3
3
  import * as i1 from '@angular/forms';
4
4
  import { FormsModule } from '@angular/forms';
5
5
  import * as i1$1 from 'primeng/button';
@@ -32,9 +32,17 @@ import { TableModule } from 'primeng/table';
32
32
  import { get } from 'lodash';
33
33
  import * as i5$1 from 'primeng/tag';
34
34
  import { TagModule } from 'primeng/tag';
35
- import { firstValueFrom, tap, catchError, lastValueFrom, throwError } from 'rxjs';
35
+ import * as i1$2 from '@angular/common';
36
36
  import { CommonModule } from '@angular/common';
37
- import * as i4$2 from 'primeng/textarea';
37
+ import * as i2$2 from 'primeng/fieldset';
38
+ import { FieldsetModule } from 'primeng/fieldset';
39
+ import * as i4$2 from 'primeng/chip';
40
+ import { ChipModule } from 'primeng/chip';
41
+ import { AvatarModule } from 'primeng/avatar';
42
+ import { toSignal } from '@angular/core/rxjs-interop';
43
+ import { map } from 'rxjs/operators';
44
+ import { firstValueFrom, tap, catchError, lastValueFrom, throwError } from 'rxjs';
45
+ import * as i4$3 from 'primeng/textarea';
38
46
  import { TextareaModule } from 'primeng/textarea';
39
47
  import { HttpClient } from '@angular/common/http';
40
48
 
@@ -446,7 +454,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
446
454
  class GetPathPipe {
447
455
  transform(obj, column) {
448
456
  const value = get(obj, column.field, 'No disponible');
449
- // debugger;
457
+ //
450
458
  if (column.type === 'text') {
451
459
  return value.length > 80 ? value.substring(0, 80) + '...' : value;
452
460
  }
@@ -469,13 +477,13 @@ class QuickTableComponent {
469
477
  this.columns = input([]);
470
478
  this.tableData = input([]); // This is the backup data
471
479
  // Default action is only select
472
- // readonly actions = input<MenuItem[]>();
473
- this.actions = [];
480
+ this.actions = input([]);
474
481
  // Outputs
475
482
  this.onAction = output();
476
483
  // Signals States
477
484
  this._columns = signal([]);
478
485
  this._tableData = signal([]);
486
+ this._actions = signal([]);
479
487
  this.filters = signal({});
480
488
  this.globalFilterFields = signal([]);
481
489
  this.tableColumns = [];
@@ -485,10 +493,13 @@ class QuickTableComponent {
485
493
  this._tableData.set(this.tableData());
486
494
  this.initializeFilters();
487
495
  }
488
- if (!this.actions?.length) {
489
- this.actions = [{ title: 'select', label: 'Select', icon: 'pi pi-check', severity: 'primary' }];
496
+ if (this.actions()?.length > 0) {
497
+ this._actions.set(this.actions());
490
498
  }
491
- console.log('QuickTableComponent', this.actions);
499
+ else {
500
+ this._actions.set([{ title: 'select', label: 'Select', icon: 'pi pi-check', severity: 'primary' }]);
501
+ }
502
+ console.log('QuickTableComponent actions', this._actions());
492
503
  });
493
504
  }
494
505
  initializeTableColumns() {
@@ -585,7 +596,7 @@ class QuickTableComponent {
585
596
  }
586
597
  }
587
598
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: QuickTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
588
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.4", type: QuickTableComponent, isStandalone: true, selector: "app-quick-table", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, tableData: { classPropertyName: "tableData", publicName: "tableData", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { onAction: "onAction" }, viewQueries: [{ propertyName: "tableRef", first: true, predicate: ["tableRef"], descendants: true }], ngImport: i0, template: "<p-table\n [tableStyle]=\"{ 'min-width': '20rem' }\"\n #tableRef\n [value]=\"_tableData()\"\n [columns]=\"_columns()\"\n [globalFilterFields]=\"globalFilterFields()\"\n [filters]=\"filters()\"\n (onFilter)=\"onFilterLocal($event)\">\n <ng-template pTemplate=\"caption\">\n <div class=\"flex justify-content-between align-items-center\">\n <h5 class=\"m-0\">Table Data</h5>\n <span class=\"p-input-icon-left\">\n <i class=\"pi pi-search\"></i>\n <input pInputText type=\"text\" (input)=\"onGlobalFilter($event)\" placeholder=\"Search keyword\" />\n </span>\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n @for (column of columns; track column) {\n <th [pSortableColumn]=\"column.field\">{{ column.header }} <p-sortIcon [field]=\"column.field\"></p-sortIcon></th>\n }\n </tr>\n <tr>\n @for (column of columns; track column) { @if(column.type === 'tags') {\n <th>\n <p-multiselect\n [options]=\"filters()?.[column.field]?.['options']\"\n placeholder=\"Selecciona\"\n (onChange)=\"filterOutsideTable('tags', column.field, $event.value)\"\n [style]=\"{ minWidth: '14rem' }\"\n [panelStyle]=\"{ minWidth: '16rem' }\">\n <ng-template let-option #item>\n <div class=\"flex items-center gap-2\">\n <span>{{ option }}</span>\n </div>\n </ng-template>\n </p-multiselect>\n </th>\n\n } @else {\n <th>\n <p-columnFilter [type]=\"getFilterType(column)\" [field]=\"column.field\" placeholder=\"Search\" [showMenu]=\"false\"></p-columnFilter>\n </th>\n } }\n </tr>\n </ng-template>\n <!-- @if(tableData()){ -->\n <ng-template pTemplate=\"body\" let-item let-columns=\"columns\">\n <tr>\n @for (column of columns; track column) {\n <td>\n @if(column.type === 'image'){\n <div class=\"image-container\">\n <img [src]=\"item | getPath: column\" alt=\"Image\" class=\"image\" />\n </div>\n } @else if(column.type === 'tags') {\n <div class=\"tags-container\">\n @for (tag of item[column.field]; track tag) {\n <p-tag [rounded]=\"true\" [value]=\"tag\"></p-tag>\n }\n </div>\n } @else if(column.type === 'actions') {\n <div style=\"display: flex; gap: 2px\">\n @for (actionBtn of actions; track actionBtn) {\n <p-button (click)=\"selectItem(item, actionBtn)\" [icon]=\"actionBtn.icon\" [severity]=\"actionBtn['severity']\" />\n }\n </div>\n } @else {\n <span>{{ item | getPath: column}} </span>\n }\n </td>\n }\n </tr>\n </ng-template>\n <!-- } -->\n</p-table>\n", styles: [":host{display:block;height:100%;overflow:auto}.generic-list-container{display:flex;flex-direction:column;height:100%}.generic-list-content{margin-top:10px;flex:1;overflow-y:auto;padding-bottom:10px}.card-source{margin-bottom:10px;position:relative}.paginator-container{margin-top:auto;padding-top:10px}.image-container{width:50px;height:50px;border-radius:50%;overflow:hidden;display:flex;justify-content:center;align-items:center}.image-container img{width:100%;height:100%;object-fit:cover}\n"], dependencies: [{ kind: "ngmodule", type: CardModule }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: SpeedDialModule }, { kind: "ngmodule", type: PaginatorModule }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i3$2.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "virtualRowHeight", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i3$2.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i3$2.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i3$2.ColumnFilter, selector: "p-columnFilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "useGrouping", "showButtons", "ariaLabel", "filterButtonProps"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: RouterModule }, { kind: "pipe", type: GetPathPipe, name: "getPath" }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i4$1.InputText, selector: "[pInputText]", inputs: ["variant", "fluid", "pSize"] }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: i5$1.Tag, selector: "p-tag", inputs: ["style", "styleClass", "severity", "value", "icon", "rounded"] }, { kind: "ngmodule", type: SelectModule }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: i6.MultiSelect, selector: "p-multiSelect, p-multiselect, p-multi-select", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "fluid", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "chipIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "size", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
599
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.4", type: QuickTableComponent, isStandalone: true, selector: "app-quick-table", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, tableData: { classPropertyName: "tableData", publicName: "tableData", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onAction: "onAction" }, viewQueries: [{ propertyName: "tableRef", first: true, predicate: ["tableRef"], descendants: true }], ngImport: i0, template: "<p-table\n [tableStyle]=\"{ 'min-width': '20rem' }\"\n #tableRef\n [value]=\"_tableData()\"\n [columns]=\"_columns()\"\n [globalFilterFields]=\"globalFilterFields()\"\n [filters]=\"filters()\"\n (onFilter)=\"onFilterLocal($event)\">\n <ng-template pTemplate=\"caption\">\n <div class=\"flex justify-content-between align-items-center\">\n <h5 class=\"m-0\">Table Data</h5>\n <span class=\"p-input-icon-left\">\n <i class=\"pi pi-search\"></i>\n <input pInputText type=\"text\" (input)=\"onGlobalFilter($event)\" placeholder=\"Search keyword\" />\n </span>\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n @for (column of columns; track column) {\n <th [pSortableColumn]=\"column.field\">{{ column.header }} <p-sortIcon [field]=\"column.field\"></p-sortIcon></th>\n }\n </tr>\n <tr>\n @for (column of columns; track column) { @if(column.type === 'tags') {\n <th>\n <p-multiselect\n [options]=\"filters()?.[column.field]?.['options']\"\n placeholder=\"Selecciona\"\n (onChange)=\"filterOutsideTable('tags', column.field, $event.value)\"\n [style]=\"{ minWidth: '14rem' }\"\n [panelStyle]=\"{ minWidth: '16rem' }\">\n <ng-template let-option #item>\n <div class=\"flex items-center gap-2\">\n <span>{{ option }}</span>\n </div>\n </ng-template>\n </p-multiselect>\n </th>\n\n } @else {\n <th>\n <p-columnFilter [type]=\"getFilterType(column)\" [field]=\"column.field\" placeholder=\"Search\" [showMenu]=\"false\"></p-columnFilter>\n </th>\n } }\n </tr>\n </ng-template>\n <!-- @if(tableData()){ -->\n <ng-template pTemplate=\"body\" let-item let-columns=\"columns\">\n <tr>\n @for (column of columns; track column) {\n <td>\n @if(column.type === 'image'){\n <div class=\"image-container\">\n <img [src]=\"item | getPath: column\" alt=\"Image\" class=\"image\" />\n </div>\n } @else if(column.type === 'tags') {\n <div class=\"tags-container\">\n @for (tag of item[column.field]; track tag) {\n <p-tag [rounded]=\"true\" [value]=\"tag\"></p-tag>\n }\n </div>\n } @else if(column.type === 'actions') {\n <div style=\"display: flex; gap: 2px\">\n @for (actionBtn of _actions(); track actionBtn) {\n <p-button (click)=\"selectItem(item, actionBtn)\" [icon]=\"actionBtn.icon\" [severity]=\"actionBtn['severity']\" />\n }\n </div>\n } @else {\n <span>{{ item | getPath: column}} </span>\n }\n </td>\n }\n </tr>\n </ng-template>\n <!-- } -->\n</p-table>\n", styles: [":host{display:block;height:100%;overflow:auto}.generic-list-container{display:flex;flex-direction:column;height:100%}.generic-list-content{margin-top:10px;flex:1;overflow-y:auto;padding-bottom:10px}.card-source{margin-bottom:10px;position:relative}.paginator-container{margin-top:auto;padding-top:10px}.image-container{width:50px;height:50px;border-radius:50%;overflow:hidden;display:flex;justify-content:center;align-items:center}.image-container img{width:100%;height:100%;object-fit:cover}\n"], dependencies: [{ kind: "ngmodule", type: CardModule }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: SpeedDialModule }, { kind: "ngmodule", type: PaginatorModule }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i3$2.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "virtualRowHeight", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i3$2.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i3$2.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i3$2.ColumnFilter, selector: "p-columnFilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "useGrouping", "showButtons", "ariaLabel", "filterButtonProps"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: RouterModule }, { kind: "pipe", type: GetPathPipe, name: "getPath" }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i4$1.InputText, selector: "[pInputText]", inputs: ["variant", "fluid", "pSize"] }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: i5$1.Tag, selector: "p-tag", inputs: ["style", "styleClass", "severity", "value", "icon", "rounded"] }, { kind: "ngmodule", type: SelectModule }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: i6.MultiSelect, selector: "p-multiSelect, p-multiselect, p-multi-select", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "fluid", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "chipIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "size", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
589
600
  }
590
601
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: QuickTableComponent, decorators: [{
591
602
  type: Component,
@@ -601,46 +612,188 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
601
612
  TagModule,
602
613
  SelectModule,
603
614
  MultiSelectModule,
604
- ], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<p-table\n [tableStyle]=\"{ 'min-width': '20rem' }\"\n #tableRef\n [value]=\"_tableData()\"\n [columns]=\"_columns()\"\n [globalFilterFields]=\"globalFilterFields()\"\n [filters]=\"filters()\"\n (onFilter)=\"onFilterLocal($event)\">\n <ng-template pTemplate=\"caption\">\n <div class=\"flex justify-content-between align-items-center\">\n <h5 class=\"m-0\">Table Data</h5>\n <span class=\"p-input-icon-left\">\n <i class=\"pi pi-search\"></i>\n <input pInputText type=\"text\" (input)=\"onGlobalFilter($event)\" placeholder=\"Search keyword\" />\n </span>\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n @for (column of columns; track column) {\n <th [pSortableColumn]=\"column.field\">{{ column.header }} <p-sortIcon [field]=\"column.field\"></p-sortIcon></th>\n }\n </tr>\n <tr>\n @for (column of columns; track column) { @if(column.type === 'tags') {\n <th>\n <p-multiselect\n [options]=\"filters()?.[column.field]?.['options']\"\n placeholder=\"Selecciona\"\n (onChange)=\"filterOutsideTable('tags', column.field, $event.value)\"\n [style]=\"{ minWidth: '14rem' }\"\n [panelStyle]=\"{ minWidth: '16rem' }\">\n <ng-template let-option #item>\n <div class=\"flex items-center gap-2\">\n <span>{{ option }}</span>\n </div>\n </ng-template>\n </p-multiselect>\n </th>\n\n } @else {\n <th>\n <p-columnFilter [type]=\"getFilterType(column)\" [field]=\"column.field\" placeholder=\"Search\" [showMenu]=\"false\"></p-columnFilter>\n </th>\n } }\n </tr>\n </ng-template>\n <!-- @if(tableData()){ -->\n <ng-template pTemplate=\"body\" let-item let-columns=\"columns\">\n <tr>\n @for (column of columns; track column) {\n <td>\n @if(column.type === 'image'){\n <div class=\"image-container\">\n <img [src]=\"item | getPath: column\" alt=\"Image\" class=\"image\" />\n </div>\n } @else if(column.type === 'tags') {\n <div class=\"tags-container\">\n @for (tag of item[column.field]; track tag) {\n <p-tag [rounded]=\"true\" [value]=\"tag\"></p-tag>\n }\n </div>\n } @else if(column.type === 'actions') {\n <div style=\"display: flex; gap: 2px\">\n @for (actionBtn of actions; track actionBtn) {\n <p-button (click)=\"selectItem(item, actionBtn)\" [icon]=\"actionBtn.icon\" [severity]=\"actionBtn['severity']\" />\n }\n </div>\n } @else {\n <span>{{ item | getPath: column}} </span>\n }\n </td>\n }\n </tr>\n </ng-template>\n <!-- } -->\n</p-table>\n", styles: [":host{display:block;height:100%;overflow:auto}.generic-list-container{display:flex;flex-direction:column;height:100%}.generic-list-content{margin-top:10px;flex:1;overflow-y:auto;padding-bottom:10px}.card-source{margin-bottom:10px;position:relative}.paginator-container{margin-top:auto;padding-top:10px}.image-container{width:50px;height:50px;border-radius:50%;overflow:hidden;display:flex;justify-content:center;align-items:center}.image-container img{width:100%;height:100%;object-fit:cover}\n"] }]
605
- }], ctorParameters: () => [], propDecorators: { actions: [{
606
- type: Input
607
- }], tableRef: [{
615
+ ], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<p-table\n [tableStyle]=\"{ 'min-width': '20rem' }\"\n #tableRef\n [value]=\"_tableData()\"\n [columns]=\"_columns()\"\n [globalFilterFields]=\"globalFilterFields()\"\n [filters]=\"filters()\"\n (onFilter)=\"onFilterLocal($event)\">\n <ng-template pTemplate=\"caption\">\n <div class=\"flex justify-content-between align-items-center\">\n <h5 class=\"m-0\">Table Data</h5>\n <span class=\"p-input-icon-left\">\n <i class=\"pi pi-search\"></i>\n <input pInputText type=\"text\" (input)=\"onGlobalFilter($event)\" placeholder=\"Search keyword\" />\n </span>\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n @for (column of columns; track column) {\n <th [pSortableColumn]=\"column.field\">{{ column.header }} <p-sortIcon [field]=\"column.field\"></p-sortIcon></th>\n }\n </tr>\n <tr>\n @for (column of columns; track column) { @if(column.type === 'tags') {\n <th>\n <p-multiselect\n [options]=\"filters()?.[column.field]?.['options']\"\n placeholder=\"Selecciona\"\n (onChange)=\"filterOutsideTable('tags', column.field, $event.value)\"\n [style]=\"{ minWidth: '14rem' }\"\n [panelStyle]=\"{ minWidth: '16rem' }\">\n <ng-template let-option #item>\n <div class=\"flex items-center gap-2\">\n <span>{{ option }}</span>\n </div>\n </ng-template>\n </p-multiselect>\n </th>\n\n } @else {\n <th>\n <p-columnFilter [type]=\"getFilterType(column)\" [field]=\"column.field\" placeholder=\"Search\" [showMenu]=\"false\"></p-columnFilter>\n </th>\n } }\n </tr>\n </ng-template>\n <!-- @if(tableData()){ -->\n <ng-template pTemplate=\"body\" let-item let-columns=\"columns\">\n <tr>\n @for (column of columns; track column) {\n <td>\n @if(column.type === 'image'){\n <div class=\"image-container\">\n <img [src]=\"item | getPath: column\" alt=\"Image\" class=\"image\" />\n </div>\n } @else if(column.type === 'tags') {\n <div class=\"tags-container\">\n @for (tag of item[column.field]; track tag) {\n <p-tag [rounded]=\"true\" [value]=\"tag\"></p-tag>\n }\n </div>\n } @else if(column.type === 'actions') {\n <div style=\"display: flex; gap: 2px\">\n @for (actionBtn of _actions(); track actionBtn) {\n <p-button (click)=\"selectItem(item, actionBtn)\" [icon]=\"actionBtn.icon\" [severity]=\"actionBtn['severity']\" />\n }\n </div>\n } @else {\n <span>{{ item | getPath: column}} </span>\n }\n </td>\n }\n </tr>\n </ng-template>\n <!-- } -->\n</p-table>\n", styles: [":host{display:block;height:100%;overflow:auto}.generic-list-container{display:flex;flex-direction:column;height:100%}.generic-list-content{margin-top:10px;flex:1;overflow-y:auto;padding-bottom:10px}.card-source{margin-bottom:10px;position:relative}.paginator-container{margin-top:auto;padding-top:10px}.image-container{width:50px;height:50px;border-radius:50%;overflow:hidden;display:flex;justify-content:center;align-items:center}.image-container img{width:100%;height:100%;object-fit:cover}\n"] }]
616
+ }], ctorParameters: () => [], propDecorators: { tableRef: [{
608
617
  type: ViewChild,
609
618
  args: ['tableRef']
610
619
  }] } });
611
620
 
612
- const TOAST_ALERTS_TOKEN = new InjectionToken('Toast alerts Service');
613
- class ToastAlertsAbstractService {
621
+ class DcAuditableViewerComponent {
622
+ constructor() {
623
+ this.data = input.required();
624
+ }
625
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: DcAuditableViewerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
626
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.4", type: DcAuditableViewerComponent, isStandalone: true, selector: "dc-auditable-viewer", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
627
+ @if (data(); as audit) {
628
+ <p-fieldset legend="Audit Information" [toggleable]="true" [collapsed]="true">
629
+ <div class="grid text-sm">
630
+ <div class="col-12 md:col-6 flex flex-column gap-2">
631
+ <label class="font-semibold">Author</label>
632
+ <p-chip [label]="audit.authorEmail" [image]="'https://i.pravatar.cc/40?u=' + audit.createdBy" />
633
+ </div>
634
+
635
+ <div class="col-12 md:col-6 flex flex-column gap-2">
636
+ <label class="font-semibold">Last update by</label>
637
+ <p-chip [label]="audit.updatedBy" [image]="'https://i.pravatar.cc/40?u=' + audit.updatedBy" />
638
+ </div>
639
+
640
+ <div class="col-12 md:col-6 flex flex-column gap-2">
641
+ <label class="font-semibold">Creation date</label>
642
+ <span>{{ audit.createdAt | date : 'medium' }}</span>
643
+ </div>
644
+
645
+ <div class="col-12 md:col-6 flex flex-column gap-2">
646
+ <label class="font-semibold">Last update date</label>
647
+ <span>{{ audit.updatedAt | date : 'medium' }}</span>
648
+ </div>
649
+
650
+ @if(audit.generatedByIA) {
651
+ <div class="col-12 mt-2">
652
+ <p-tag severity="info">
653
+ <div class="flex align-items-center gap-2">
654
+ <i class="pi pi-sparkles"></i>
655
+ <span>Generated by AI</span>
656
+ </div>
657
+ </p-tag>
658
+ </div>
659
+ @if(audit.prompt) {
660
+ <div class="col-12 mt-2">
661
+ <div class="flex flex-column gap-2">
662
+ <label class="font-semibold">Prompt</label>
663
+ <p class="m-0 surface-100 p-2 border-round" style="white-space: pre-wrap;">
664
+ {{ audit.prompt }}
665
+ </p>
666
+ </div>
667
+ </div>
668
+ } }
669
+ </div>
670
+ </p-fieldset>
671
+ }
672
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$2.DatePipe, name: "date" }, { kind: "ngmodule", type: FieldsetModule }, { kind: "component", type: i2$2.Fieldset, selector: "p-fieldset", inputs: ["legend", "toggleable", "collapsed", "style", "styleClass", "transitionOptions"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: i5$1.Tag, selector: "p-tag", inputs: ["style", "styleClass", "severity", "value", "icon", "rounded"] }, { kind: "ngmodule", type: ChipModule }, { kind: "component", type: i4$2.Chip, selector: "p-chip", inputs: ["label", "icon", "image", "alt", "style", "styleClass", "removable", "removeIcon", "chipProps"], outputs: ["onRemove", "onImageError"] }, { kind: "ngmodule", type: AvatarModule }] }); }
614
673
  }
615
- function provideToastAlert(serviceImplementation) {
616
- return [
617
- {
618
- provide: TOAST_ALERTS_TOKEN,
619
- useExisting: serviceImplementation,
620
- },
621
- ];
674
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: DcAuditableViewerComponent, decorators: [{
675
+ type: Component,
676
+ args: [{
677
+ selector: 'dc-auditable-viewer',
678
+ template: `
679
+ @if (data(); as audit) {
680
+ <p-fieldset legend="Audit Information" [toggleable]="true" [collapsed]="true">
681
+ <div class="grid text-sm">
682
+ <div class="col-12 md:col-6 flex flex-column gap-2">
683
+ <label class="font-semibold">Author</label>
684
+ <p-chip [label]="audit.authorEmail" [image]="'https://i.pravatar.cc/40?u=' + audit.createdBy" />
685
+ </div>
686
+
687
+ <div class="col-12 md:col-6 flex flex-column gap-2">
688
+ <label class="font-semibold">Last update by</label>
689
+ <p-chip [label]="audit.updatedBy" [image]="'https://i.pravatar.cc/40?u=' + audit.updatedBy" />
690
+ </div>
691
+
692
+ <div class="col-12 md:col-6 flex flex-column gap-2">
693
+ <label class="font-semibold">Creation date</label>
694
+ <span>{{ audit.createdAt | date : 'medium' }}</span>
695
+ </div>
696
+
697
+ <div class="col-12 md:col-6 flex flex-column gap-2">
698
+ <label class="font-semibold">Last update date</label>
699
+ <span>{{ audit.updatedAt | date : 'medium' }}</span>
700
+ </div>
701
+
702
+ @if(audit.generatedByIA) {
703
+ <div class="col-12 mt-2">
704
+ <p-tag severity="info">
705
+ <div class="flex align-items-center gap-2">
706
+ <i class="pi pi-sparkles"></i>
707
+ <span>Generated by AI</span>
708
+ </div>
709
+ </p-tag>
710
+ </div>
711
+ @if(audit.prompt) {
712
+ <div class="col-12 mt-2">
713
+ <div class="flex flex-column gap-2">
714
+ <label class="font-semibold">Prompt</label>
715
+ <p class="m-0 surface-100 p-2 border-round" style="white-space: pre-wrap;">
716
+ {{ audit.prompt }}
717
+ </p>
718
+ </div>
719
+ </div>
720
+ } }
721
+ </div>
722
+ </p-fieldset>
723
+ }
724
+ `,
725
+ standalone: true,
726
+ imports: [CommonModule, FieldsetModule, TagModule, ChipModule, AvatarModule],
727
+ }]
728
+ }] });
729
+
730
+ class DcExtensionsViewerComponent {
731
+ constructor() {
732
+ this.data = input.required();
733
+ }
734
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: DcExtensionsViewerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
735
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.4", type: DcExtensionsViewerComponent, isStandalone: true, selector: "dc-extensions-viewer", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `<pre>{{ data() | json }}</pre>`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$2.JsonPipe, name: "json" }] }); }
622
736
  }
623
- // @deprecated, moved to ngx-tts
624
- var AudioSpeed;
625
- (function (AudioSpeed) {
626
- AudioSpeed["VerySlow"] = "verySlow";
627
- AudioSpeed["Slow"] = "slow";
628
- AudioSpeed["Regular"] = "regular";
629
- AudioSpeed["Fast"] = "fast";
630
- AudioSpeed["VeryFast"] = "veryFast";
631
- })(AudioSpeed || (AudioSpeed = {}));
632
- const AudioSpeedReverse = {
633
- [AudioSpeed.VerySlow]: 1,
634
- [AudioSpeed.Slow]: 2,
635
- [AudioSpeed.Regular]: 3,
636
- [AudioSpeed.Fast]: 4,
637
- [AudioSpeed.VeryFast]: 5,
638
- };
639
- class IAIModel {
737
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: DcExtensionsViewerComponent, decorators: [{
738
+ type: Component,
739
+ args: [{
740
+ selector: 'dc-extensions-viewer',
741
+ template: `<pre>{{ data() | json }}</pre>`,
742
+ standalone: true,
743
+ imports: [CommonModule],
744
+ }]
745
+ }] });
746
+
747
+ class DcLearnableViewerComponent {
748
+ constructor() {
749
+ this.data = input.required();
750
+ }
751
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: DcLearnableViewerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
752
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.4", type: DcLearnableViewerComponent, isStandalone: true, selector: "dc-learnable-viewer", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `<pre>{{ data() | json }}</pre>`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$2.JsonPipe, name: "json" }] }); }
640
753
  }
641
- // Since it not clear if this bellows to chat AI Or user i put here.
642
- class ChatUserSettings {
754
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: DcLearnableViewerComponent, decorators: [{
755
+ type: Component,
756
+ args: [{
757
+ selector: 'dc-learnable-viewer',
758
+ template: `<pre>{{ data() | json }}</pre>`,
759
+ standalone: true,
760
+ imports: [CommonModule],
761
+ }]
762
+ }] });
763
+
764
+ class DcManageableViewerComponent {
765
+ constructor() {
766
+ this.data = input.required();
767
+ }
768
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: DcManageableViewerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
769
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.4", type: DcManageableViewerComponent, isStandalone: true, selector: "dc-manageable-viewer", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `<pre>{{ data() | json }}</pre>`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$2.JsonPipe, name: "json" }] }); }
643
770
  }
771
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: DcManageableViewerComponent, decorators: [{
772
+ type: Component,
773
+ args: [{
774
+ selector: 'dc-manageable-viewer',
775
+ template: `<pre>{{ data() | json }}</pre>`,
776
+ standalone: true,
777
+ imports: [CommonModule],
778
+ }]
779
+ }] });
780
+
781
+ class DcReactionsViewerComponent {
782
+ constructor() {
783
+ this.data = input.required();
784
+ }
785
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: DcReactionsViewerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
786
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.4", type: DcReactionsViewerComponent, isStandalone: true, selector: "dc-reactions-viewer", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `<pre>{{ data() | json }}</pre>`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$2.JsonPipe, name: "json" }] }); }
787
+ }
788
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: DcReactionsViewerComponent, decorators: [{
789
+ type: Component,
790
+ args: [{
791
+ selector: 'dc-reactions-viewer',
792
+ template: `<pre>{{ data() | json }}</pre>`,
793
+ standalone: true,
794
+ imports: [CommonModule],
795
+ }]
796
+ }] });
644
797
 
645
798
  /**
646
799
  * Abstract base class for implementing pagination functionality.
@@ -665,9 +818,9 @@ class PaginationBase {
665
818
  */
666
819
  this.onAction = output();
667
820
  /** Current first record index for the paginator */
668
- this.paginatorFirst = 0;
821
+ this.first = 0;
669
822
  /** Number of rows to display per page */
670
- this.paginatorRows = 10;
823
+ this.rows = 10;
671
824
  /** Total number of records available */
672
825
  this.totalRecords = 0;
673
826
  /** Current view mode, either cards or table */
@@ -680,7 +833,7 @@ class PaginationBase {
680
833
  * Configuration for filtering, sorting, and pagination.
681
834
  * Includes current page, rows per page, sorting criteria, and applied filters.
682
835
  */
683
- this.filterConfig = { page: 0, rowsPerPage: this.paginatorRows, sort: { _id: -1 }, filters: {} };
836
+ this.filterConfig = { page: 0, rowsPerPage: this.rows, sort: { _id: -1 }, filters: {} };
684
837
  this.route = inject(ActivatedRoute);
685
838
  this.router = inject(Router);
686
839
  this.initializePagination();
@@ -694,7 +847,7 @@ class PaginationBase {
694
847
  const page = this.route.snapshot.queryParamMap.get('page');
695
848
  if (page) {
696
849
  this.filterConfig.page = +page - 1;
697
- this.paginatorFirst = this.filterConfig.page * this.paginatorRows;
850
+ this.first = this.filterConfig.page * this.rows;
698
851
  }
699
852
  }
700
853
  /**
@@ -703,11 +856,11 @@ class PaginationBase {
703
856
  * @param pageEvent - The page event containing page number and rows per page
704
857
  */
705
858
  async onPageChange(pageEvent) {
706
- this.paginatorRows = pageEvent.rows;
859
+ this.rows = pageEvent.rows;
707
860
  this.filterConfig = {
708
861
  ...this.filterConfig,
709
862
  page: pageEvent.page,
710
- rowsPerPage: this.paginatorRows,
863
+ rowsPerPage: this.rows,
711
864
  };
712
865
  await this.loadData();
713
866
  this.updatePageParam(pageEvent.page + 1);
@@ -740,6 +893,181 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
740
893
  type: Directive
741
894
  }], ctorParameters: () => [] });
742
895
 
896
+ class EntityBaseListComponent extends PaginationBase {
897
+ constructor() {
898
+ super();
899
+ // Services
900
+ this.router = inject(Router);
901
+ this.route = inject(ActivatedRoute);
902
+ // Inputs & Outputs
903
+ this.initialViewType = input('card');
904
+ this.onlyView = input(false);
905
+ // Outputs
906
+ this.onSelect = output();
907
+ // Writable Signals for component state
908
+ this.items = signal([]);
909
+ this.totalRecordsSignal = signal(0);
910
+ // Public properties for configuration
911
+ this.filterBarOptions = { showActions: true, showCreateButton: true, showViewButton: true };
912
+ this.columns = [];
913
+ this.viewType = signal(this.initialViewType());
914
+ effect(() => {
915
+ // Keep the parent's totalRecords in sync with our signal
916
+ this.totalRecords = this.totalRecordsSignal();
917
+ });
918
+ }
919
+ async ngOnInit() {
920
+ await this.loadData();
921
+ }
922
+ async loadData() {
923
+ try {
924
+ this.isLoading = true;
925
+ const response = await this.entityCommunicationService.query(this.filterConfig);
926
+ this.items.set(response.rows);
927
+ this.totalRecordsSignal.set(response.count);
928
+ }
929
+ catch (error) {
930
+ console.error('Error loading data', error);
931
+ }
932
+ finally {
933
+ this.isLoading = false;
934
+ }
935
+ }
936
+ onNew() {
937
+ this.router.navigate(['./edit'], { relativeTo: this.route });
938
+ }
939
+ toggleView() {
940
+ this.viewType.update((v) => (v === 'card' ? 'table' : 'card'));
941
+ }
942
+ async doAction(actionEvent) {
943
+ const { item, action } = actionEvent;
944
+ if (!item) {
945
+ return;
946
+ }
947
+ switch (action) {
948
+ case 'view':
949
+ this.router.navigate(['./details', item._id], { relativeTo: this.route });
950
+ break;
951
+ case 'edit':
952
+ this.router.navigate(['./edit', item._id], { relativeTo: this.route });
953
+ break;
954
+ case 'delete':
955
+ const confirmed = confirm(`Are you sure you want to delete this item?`);
956
+ if (confirmed) {
957
+ try {
958
+ await this.entityCommunicationService.remove(item._id);
959
+ }
960
+ catch (error) {
961
+ console.error('Error deleting item', error);
962
+ }
963
+ finally {
964
+ await this.loadData(); // Refresh list
965
+ }
966
+ }
967
+ break;
968
+ case 'clone':
969
+ await this.entityCommunicationService.clone(item._id);
970
+ await this.loadData(); // Refresh list
971
+ break;
972
+ default:
973
+ // this.handleCustomAction(actionEvent);
974
+ }
975
+ }
976
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: EntityBaseListComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
977
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.4", type: EntityBaseListComponent, isStandalone: true, inputs: { initialViewType: { classPropertyName: "initialViewType", publicName: "initialViewType", isSignal: true, isRequired: false, transformFunction: null }, onlyView: { classPropertyName: "onlyView", publicName: "onlyView", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onSelect: "onSelect" }, usesInheritance: true, ngImport: i0 }); }
978
+ }
979
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: EntityBaseListComponent, decorators: [{
980
+ type: Directive
981
+ }], ctorParameters: () => [] });
982
+
983
+ class EntityBaseFormComponent {
984
+ constructor() {
985
+ this.route = inject(ActivatedRoute);
986
+ this.router = inject(Router);
987
+ this.entity = signal(undefined);
988
+ this.entityId = toSignal(this.route.paramMap.pipe(map((params) => params.get('id'))));
989
+ this.loadEntityEffect = effect(async () => {
990
+ const id = this.entityId();
991
+ if (id) {
992
+ try {
993
+ const entity = await this.entityCommunicationService.findOne(id);
994
+ if (entity) {
995
+ this.entity.set(entity);
996
+ this.patchForm(entity);
997
+ }
998
+ }
999
+ catch (err) {
1000
+ console.error('Error loading entity', err);
1001
+ // TODO: Consider adding a generic error toast message
1002
+ }
1003
+ }
1004
+ else {
1005
+ // if there is no id, we create a new entity
1006
+ try {
1007
+ const newEntity = await this.entityCommunicationService.createOrUpdate({});
1008
+ if (newEntity?._id) {
1009
+ // we replace the url to avoid creating a new entity when the user goes back
1010
+ this.router.navigate([newEntity._id], { relativeTo: this.route, replaceUrl: true });
1011
+ }
1012
+ }
1013
+ catch (err) {
1014
+ console.error('Error creating new entity', err);
1015
+ // TODO: Consider adding a generic error toast message
1016
+ }
1017
+ }
1018
+ }, { allowSignalWrites: true });
1019
+ }
1020
+ async save() {
1021
+ if (this.form.invalid) {
1022
+ // TODO: add toast notification
1023
+ console.error('Form is invalid');
1024
+ }
1025
+ const entityData = { ...this.form.value, _id: this.entityId() };
1026
+ const result = await this.entityCommunicationService.createOrUpdate(entityData);
1027
+ this.entity.set(result);
1028
+ this.patchForm(result);
1029
+ return result;
1030
+ }
1031
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: EntityBaseFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1032
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.4", type: EntityBaseFormComponent, isStandalone: true, ngImport: i0 }); }
1033
+ }
1034
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: EntityBaseFormComponent, decorators: [{
1035
+ type: Directive
1036
+ }] });
1037
+
1038
+ const TOAST_ALERTS_TOKEN = new InjectionToken('Toast alerts Service');
1039
+ class ToastAlertsAbstractService {
1040
+ }
1041
+ function provideToastAlert(serviceImplementation) {
1042
+ return [
1043
+ {
1044
+ provide: TOAST_ALERTS_TOKEN,
1045
+ useExisting: serviceImplementation,
1046
+ },
1047
+ ];
1048
+ }
1049
+ // @deprecated, moved to ngx-vertex
1050
+ var AudioSpeed;
1051
+ (function (AudioSpeed) {
1052
+ AudioSpeed["VerySlow"] = "verySlow";
1053
+ AudioSpeed["Slow"] = "slow";
1054
+ AudioSpeed["Regular"] = "regular";
1055
+ AudioSpeed["Fast"] = "fast";
1056
+ AudioSpeed["VeryFast"] = "veryFast";
1057
+ })(AudioSpeed || (AudioSpeed = {}));
1058
+ const AudioSpeedReverse = {
1059
+ [AudioSpeed.VerySlow]: 1,
1060
+ [AudioSpeed.Slow]: 2,
1061
+ [AudioSpeed.Regular]: 3,
1062
+ [AudioSpeed.Fast]: 4,
1063
+ [AudioSpeed.VeryFast]: 5,
1064
+ };
1065
+ class IAIModel {
1066
+ }
1067
+ // Since it not clear if this bellows to chat AI Or user i put here.
1068
+ class ChatUserSettings {
1069
+ }
1070
+
743
1071
  var EModelQuality;
744
1072
  (function (EModelQuality) {
745
1073
  EModelQuality["FAST"] = "fast";
@@ -825,6 +1153,14 @@ function formatCamelCaseString(input) {
825
1153
  .join(' ');
826
1154
  }
827
1155
 
1156
+ // Entity extension that add extra features to the entity
1157
+ // * Auditable: Ability to track who created and updated the entity
1158
+ // * Learnable: Ability to track who created and updated the entity
1159
+ // * IManageable: Ability to say is the entity is public or private, or published or draft
1160
+ // * IReactable: Ability to give likes, dislikes, etc. hearts etc.
1161
+ // * Extensionable: Ability to add extra features to the entity
1162
+ // * ❗️ PENDING IMediable: this add media songs and videos and more only thinking for lessons or content interactions.
1163
+
828
1164
  class ConfirmService {
829
1165
  constructor() {
830
1166
  this.pdialogService = inject(DialogService);
@@ -892,7 +1228,7 @@ class PromptComponent {
892
1228
  this.ref.close(null);
893
1229
  }
894
1230
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: PromptComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
895
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.4", type: PromptComponent, isStandalone: true, selector: "dc-prompt", ngImport: i0, template: "<div class=\"form-input-card p-4\">\n <p-message severity=\"secondary\"> {{ title() }}</p-message>\n\n <div class=\"my-4\">{{ message() }}</div>\n\n <div class=\"p-field mb-4\">\n <textarea rows=\"5\" cols=\"30\" pTextarea [(ngModel)]=\"inputValue\" class=\"w-full\"></textarea>\n </div>\n\n <div class=\"flex justify-content-end gap-2\">\n <p-button [label]=\"cancelText()\" (click)=\"cancel()\" severity=\"secondary\"></p-button>\n <p-button [label]=\"acceptText()\" (click)=\"accept()\"></p-button>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MessageModule }, { kind: "component", type: i2.Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }, { kind: "ngmodule", type: TextareaModule }, { kind: "directive", type: i4$2.Textarea, selector: "[pTextarea]", inputs: ["autoResize", "variant", "fluid", "pSize"], outputs: ["onResize"] }] }); }
1231
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.4", type: PromptComponent, isStandalone: true, selector: "dc-prompt", ngImport: i0, template: "<div class=\"form-input-card p-4\">\n <p-message severity=\"secondary\"> {{ title() }}</p-message>\n\n <div class=\"my-4\">{{ message() }}</div>\n\n <div class=\"p-field mb-4\">\n <textarea rows=\"5\" cols=\"30\" pTextarea [(ngModel)]=\"inputValue\" class=\"w-full\"></textarea>\n </div>\n\n <div class=\"flex justify-content-end gap-2\">\n <p-button [label]=\"cancelText()\" (click)=\"cancel()\" severity=\"secondary\"></p-button>\n <p-button [label]=\"acceptText()\" (click)=\"accept()\"></p-button>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MessageModule }, { kind: "component", type: i2.Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }, { kind: "ngmodule", type: TextareaModule }, { kind: "directive", type: i4$3.Textarea, selector: "[pTextarea]", inputs: ["autoResize", "variant", "fluid", "pSize"], outputs: ["onResize"] }] }); }
896
1232
  }
897
1233
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: PromptComponent, decorators: [{
898
1234
  type: Component,
@@ -1413,6 +1749,788 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
1413
1749
  args: [HTTP_CORE_CONFIG]
1414
1750
  }] }] });
1415
1751
 
1752
+ class EntityCommunicationService {
1753
+ constructor(serviceName) {
1754
+ this.serviceName = serviceName;
1755
+ this.httpService = inject(HttpCoreService);
1756
+ }
1757
+ findAll() {
1758
+ return this.httpService.get(`api/${this.serviceName}`);
1759
+ }
1760
+ findOne(id) {
1761
+ return this.httpService.get(`api/${this.serviceName}/${id}`);
1762
+ }
1763
+ createOrUpdate(entity) {
1764
+ // if Id is present then in object, then Update all props in the object
1765
+ return this.httpService.post(`api/${this.serviceName}`, entity);
1766
+ }
1767
+ query(filterConfig) {
1768
+ return this.httpService.post(`api/${this.serviceName}/query`, filterConfig);
1769
+ }
1770
+ partialUpdate(id, partialUpdates) {
1771
+ // In backend object is flattened, so Convert nested objects to dot notation eg. { "video.captions.remotion": captions.captions }
1772
+ return this.httpService.put(`api/${this.serviceName}/${id}`, partialUpdates);
1773
+ }
1774
+ async remove(id) {
1775
+ await this.httpService.delete(`api/${this.serviceName}/${id}`);
1776
+ }
1777
+ clone(id, overrides = {}) {
1778
+ return this.httpService.post(`api/${this.serviceName}/${id}/clone`, overrides);
1779
+ }
1780
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: EntityCommunicationService, deps: "invalid", target: i0.ɵɵFactoryTarget.Injectable }); }
1781
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: EntityCommunicationService }); }
1782
+ }
1783
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: EntityCommunicationService, decorators: [{
1784
+ type: Injectable
1785
+ }], ctorParameters: () => [{ type: undefined }] });
1786
+
1787
+ const LANGUAGES = {
1788
+ en: {
1789
+ nativeName: 'English',
1790
+ flag: '🇺🇸', // Using US flag as a primary example
1791
+ code: 'en',
1792
+ i: 1,
1793
+ llmKnowledge: 100,
1794
+ countries: ['United Kingdom', 'United States', 'Canada', 'Australia', 'New Zealand', 'Ireland', 'South Africa', 'India', 'and many others.'],
1795
+ translations: {
1796
+ en: 'English',
1797
+ es: 'Inglés',
1798
+ },
1799
+ },
1800
+ es: {
1801
+ nativeName: 'Español',
1802
+ flag: '🇪🇸', // Using Spain flag as a primary example
1803
+ code: 'es',
1804
+ i: 2,
1805
+ llmKnowledge: 99,
1806
+ countries: [
1807
+ 'Spain',
1808
+ 'Mexico',
1809
+ 'Argentina',
1810
+ 'Colombia',
1811
+ 'Peru',
1812
+ 'Chile',
1813
+ 'Venezuela',
1814
+ 'Ecuador',
1815
+ 'Guatemala',
1816
+ 'Cuba',
1817
+ 'Bolivia',
1818
+ 'Dominican Republic',
1819
+ 'Honduras',
1820
+ 'El Salvador',
1821
+ 'Nicaragua',
1822
+ 'Paraguay',
1823
+ 'Costa Rica',
1824
+ 'Puerto Rico',
1825
+ 'Uruguay',
1826
+ 'Equatorial Guinea.',
1827
+ ],
1828
+ translations: {
1829
+ en: 'Spanish',
1830
+ es: 'Español',
1831
+ },
1832
+ },
1833
+ de: {
1834
+ nativeName: 'Deutsch',
1835
+ flag: '🇩🇪',
1836
+ code: 'de',
1837
+ i: 3,
1838
+ llmKnowledge: 97,
1839
+ countries: ['Germany', 'Austria', 'Switzerland', 'Belgium', 'Luxembourg', 'Liechtenstein.'],
1840
+ translations: {
1841
+ en: 'German',
1842
+ es: 'Alemán',
1843
+ },
1844
+ },
1845
+ fr: {
1846
+ nativeName: 'Français',
1847
+ flag: '🇫🇷',
1848
+ code: 'fr',
1849
+ i: 4,
1850
+ llmKnowledge: 96,
1851
+ countries: ['France', 'Canada', 'Belgium', 'Switzerland', 'Haiti', 'Ivory Coast', 'Senegal', 'Cameroon', 'Madagascar', 'and many others.'],
1852
+ translations: {
1853
+ en: 'French',
1854
+ es: 'Francés',
1855
+ },
1856
+ },
1857
+ zh: {
1858
+ nativeName: '中文 (Zhōngwén)',
1859
+ flag: '🇨🇳',
1860
+ code: 'zh',
1861
+ i: 5,
1862
+ llmKnowledge: 94,
1863
+ countries: ['China', 'Singapore', 'Taiwan.'],
1864
+ translations: {
1865
+ en: 'Chinese (Mandarin)',
1866
+ es: 'Chino (Mandarín)',
1867
+ },
1868
+ },
1869
+ it: {
1870
+ nativeName: 'Italiano',
1871
+ flag: '🇮🇹',
1872
+ code: 'it',
1873
+ i: 6,
1874
+ llmKnowledge: 93,
1875
+ countries: ['Italy', 'Switzerland', 'San Marino', 'Vatican City.'],
1876
+ translations: {
1877
+ en: 'Italian',
1878
+ es: 'Italiano',
1879
+ },
1880
+ },
1881
+ pt: {
1882
+ nativeName: 'Português',
1883
+ flag: '🇧🇷',
1884
+ code: 'pt',
1885
+ i: 7,
1886
+ llmKnowledge: 92,
1887
+ countries: ['Portugal', 'Brazil', 'Angola', 'Mozambique', 'Cape Verde', 'Guinea-Bissau', 'Sao Tome and Principe', 'East Timor', 'Macau.'],
1888
+ translations: {
1889
+ en: 'Portuguese',
1890
+ es: 'Portugués',
1891
+ },
1892
+ },
1893
+ ja: {
1894
+ nativeName: '日本語 (Nihongo)',
1895
+ flag: '🇯🇵',
1896
+ code: 'ja',
1897
+ i: 8,
1898
+ llmKnowledge: 91,
1899
+ countries: ['Japan.'],
1900
+ translations: {
1901
+ en: 'Japanese',
1902
+ es: 'Japonés',
1903
+ },
1904
+ },
1905
+ nl: {
1906
+ nativeName: 'Nederlands',
1907
+ flag: '🇳🇱',
1908
+ code: 'nl',
1909
+ i: 9,
1910
+ llmKnowledge: 90,
1911
+ countries: ['Netherlands', 'Belgium', 'Suriname', 'Aruba', 'Curaçao', 'Sint Maarten.'],
1912
+ translations: {
1913
+ en: 'Dutch',
1914
+ es: 'Neerlandés',
1915
+ },
1916
+ },
1917
+ ru: {
1918
+ nativeName: 'Русский (Russkiy)',
1919
+ flag: '🇷🇺',
1920
+ code: 'ru',
1921
+ i: 10, // Adjusted index
1922
+ llmKnowledge: 89,
1923
+ countries: ['Russia', 'Belarus', 'Kazakhstan', 'Kyrgyzstan', 'Tajikistan (co-official)', 'Abkhazia', 'South Ossetia', 'Transnistria.'],
1924
+ translations: {
1925
+ en: 'Russian',
1926
+ es: 'Ruso',
1927
+ },
1928
+ },
1929
+ ko: {
1930
+ nativeName: '한국어 (Hangugeo)',
1931
+ flag: '🇰🇷',
1932
+ code: 'ko',
1933
+ i: 11,
1934
+ llmKnowledge: 87,
1935
+ countries: ['South Korea', 'North Korea.'],
1936
+ translations: {
1937
+ en: 'Korean',
1938
+ es: 'Coreano',
1939
+ },
1940
+ },
1941
+ pl: {
1942
+ nativeName: 'Polski',
1943
+ flag: '🇵🇱',
1944
+ code: 'pl',
1945
+ i: 12,
1946
+ llmKnowledge: 86,
1947
+ countries: ['Poland.'],
1948
+ translations: {
1949
+ en: 'Polish',
1950
+ es: 'Polaco',
1951
+ },
1952
+ },
1953
+ sv: {
1954
+ nativeName: 'Svenska',
1955
+ flag: '🇸🇪',
1956
+ code: 'sv',
1957
+ i: 13,
1958
+ llmKnowledge: 85,
1959
+ countries: ['Sweden', 'Finland (co-official).'],
1960
+ translations: {
1961
+ en: 'Swedish',
1962
+ es: 'Sueco',
1963
+ },
1964
+ },
1965
+ tr: {
1966
+ nativeName: 'Türkçe',
1967
+ flag: '🇹🇷',
1968
+ code: 'tr',
1969
+ i: 14,
1970
+ llmKnowledge: 84,
1971
+ countries: ['Turkey', 'Cyprus (North).'],
1972
+ translations: {
1973
+ en: 'Turkish',
1974
+ es: 'Turco',
1975
+ },
1976
+ },
1977
+ ar: {
1978
+ nativeName: 'العربية (Al-Arabiyyah)',
1979
+ flag: '🇸🇦',
1980
+ code: 'ar',
1981
+ i: 15,
1982
+ llmKnowledge: 83,
1983
+ countries: [
1984
+ 'Saudi Arabia',
1985
+ 'Egypt',
1986
+ 'Algeria',
1987
+ 'Morocco',
1988
+ 'Iraq',
1989
+ 'Sudan',
1990
+ 'Yemen',
1991
+ 'Syria',
1992
+ 'Tunisia',
1993
+ 'Jordan',
1994
+ 'United Arab Emirates',
1995
+ 'Lebanon',
1996
+ 'Libya',
1997
+ 'Oman',
1998
+ 'Kuwait',
1999
+ 'Mauritania',
2000
+ 'Qatar',
2001
+ 'Bahrain',
2002
+ 'Comoros',
2003
+ 'Djibouti',
2004
+ 'Somalia',
2005
+ 'Eritrea',
2006
+ 'Chad',
2007
+ 'Western Sahara',
2008
+ 'Palestine.',
2009
+ ],
2010
+ translations: {
2011
+ en: 'Arabic',
2012
+ es: 'Árabe',
2013
+ },
2014
+ },
2015
+ vi: {
2016
+ nativeName: 'Tiếng Việt',
2017
+ flag: '🇻🇳',
2018
+ code: 'vi',
2019
+ i: 16,
2020
+ llmKnowledge: 82,
2021
+ countries: ['Vietnam.'],
2022
+ translations: {
2023
+ en: 'Vietnamese',
2024
+ es: 'Vietnamita',
2025
+ },
2026
+ },
2027
+ id: {
2028
+ nativeName: 'Bahasa Indonesia',
2029
+ flag: '🇮🇩',
2030
+ code: 'id',
2031
+ i: 17,
2032
+ llmKnowledge: 81,
2033
+ countries: ['Indonesia.'],
2034
+ translations: {
2035
+ en: 'Indonesian',
2036
+ es: 'Indonesio',
2037
+ },
2038
+ },
2039
+ da: {
2040
+ nativeName: 'Dansk',
2041
+ flag: '🇩🇰',
2042
+ code: 'da',
2043
+ i: 18,
2044
+ llmKnowledge: 80,
2045
+ countries: ['Denmark', 'Faroe Islands (co-official)', 'Greenland (co-official).'],
2046
+ translations: {
2047
+ en: 'Danish',
2048
+ es: 'Danés',
2049
+ },
2050
+ },
2051
+ no: {
2052
+ nativeName: 'Norsk',
2053
+ flag: '🇳🇴',
2054
+ code: 'no',
2055
+ i: 19,
2056
+ llmKnowledge: 79,
2057
+ countries: ['Norway.'],
2058
+ translations: {
2059
+ en: 'Norwegian',
2060
+ es: 'Noruego',
2061
+ },
2062
+ },
2063
+ fi: {
2064
+ nativeName: 'Suomi',
2065
+ flag: '🇫🇮',
2066
+ code: 'fi',
2067
+ i: 20,
2068
+ llmKnowledge: 78,
2069
+ countries: ['Finland.'],
2070
+ translations: {
2071
+ en: 'Finnish',
2072
+ es: 'Finlandés',
2073
+ },
2074
+ },
2075
+ cs: {
2076
+ nativeName: 'Čeština',
2077
+ flag: '🇨🇿',
2078
+ code: 'cs',
2079
+ i: 21,
2080
+ llmKnowledge: 77,
2081
+ countries: ['Czech Republic.'],
2082
+ translations: {
2083
+ en: 'Czech',
2084
+ es: 'Checo',
2085
+ },
2086
+ },
2087
+ el: {
2088
+ nativeName: 'Ελληνικά (Elliniká)',
2089
+ flag: '🇬🇷',
2090
+ code: 'el',
2091
+ i: 22,
2092
+ llmKnowledge: 76,
2093
+ countries: ['Greece', 'Cyprus.'],
2094
+ translations: {
2095
+ en: 'Greek',
2096
+ es: 'Griego',
2097
+ },
2098
+ },
2099
+ hu: {
2100
+ nativeName: 'Magyar',
2101
+ flag: '🇭🇺',
2102
+ code: 'hu',
2103
+ i: 23,
2104
+ llmKnowledge: 75,
2105
+ countries: ['Hungary.'],
2106
+ translations: {
2107
+ en: 'Hungarian',
2108
+ es: 'Húngaro',
2109
+ },
2110
+ },
2111
+ ro: {
2112
+ nativeName: 'Română',
2113
+ flag: '🇷🇴',
2114
+ code: 'ro',
2115
+ i: 24,
2116
+ llmKnowledge: 74,
2117
+ countries: ['Romania', 'Moldova (as Moldovan).'],
2118
+ translations: {
2119
+ en: 'Romanian',
2120
+ es: 'Rumano',
2121
+ },
2122
+ },
2123
+ uk: {
2124
+ nativeName: 'Українська (Ukrainska)',
2125
+ flag: '🇺🇦',
2126
+ code: 'uk',
2127
+ i: 25,
2128
+ llmKnowledge: 73,
2129
+ countries: ['Ukraine.'],
2130
+ translations: {
2131
+ en: 'Ukrainian',
2132
+ es: 'Ucraniano',
2133
+ },
2134
+ },
2135
+ he: {
2136
+ nativeName: 'עברית (Ivrit)',
2137
+ flag: '🇮🇱',
2138
+ code: 'he',
2139
+ i: 26,
2140
+ llmKnowledge: 72,
2141
+ countries: ['Israel.'],
2142
+ translations: {
2143
+ en: 'Hebrew',
2144
+ es: 'Hebreo',
2145
+ },
2146
+ },
2147
+ th: {
2148
+ nativeName: 'ภาษาไทย (Phasa Thai)',
2149
+ flag: '🇹🇭',
2150
+ code: 'th',
2151
+ i: 27,
2152
+ llmKnowledge: 71,
2153
+ countries: ['Thailand.'],
2154
+ translations: {
2155
+ en: 'Thai',
2156
+ es: 'Tailandés',
2157
+ },
2158
+ },
2159
+ hi: {
2160
+ nativeName: 'हिन्दी (Hindī)',
2161
+ flag: '🇮🇳',
2162
+ code: 'hi',
2163
+ i: 28,
2164
+ llmKnowledge: 70,
2165
+ countries: ['India (co-official)', 'Fiji (co-official).'],
2166
+ translations: {
2167
+ en: 'Hindi',
2168
+ es: 'Hindi',
2169
+ },
2170
+ },
2171
+ ca: {
2172
+ nativeName: 'Català',
2173
+ flag: '🇪🇸',
2174
+ code: 'ca',
2175
+ i: 29,
2176
+ llmKnowledge: 69,
2177
+ countries: ['Spain (Catalonia, Valencia, Balearic Islands)', 'Andorra.'],
2178
+ translations: {
2179
+ en: 'Catalan',
2180
+ es: 'Catalán',
2181
+ },
2182
+ },
2183
+ bg: {
2184
+ nativeName: 'Български (Balgarski)',
2185
+ flag: '🇧🇬',
2186
+ code: 'bg',
2187
+ i: 30,
2188
+ llmKnowledge: 68,
2189
+ countries: ['Bulgaria.'],
2190
+ translations: {
2191
+ en: 'Bulgarian',
2192
+ es: 'Búlgaro',
2193
+ },
2194
+ },
2195
+ hr: {
2196
+ nativeName: 'Hrvatski',
2197
+ flag: '🇭🇷',
2198
+ code: 'hr',
2199
+ i: 31,
2200
+ llmKnowledge: 67,
2201
+ countries: ['Croatia', 'Bosnia and Herzegovina (co-official)', 'Serbia (Vojvodina).'],
2202
+ translations: {
2203
+ en: 'Croatian',
2204
+ es: 'Croata',
2205
+ },
2206
+ },
2207
+ sk: {
2208
+ nativeName: 'Slovenčina',
2209
+ flag: '🇸🇰',
2210
+ code: 'sk',
2211
+ i: 32,
2212
+ llmKnowledge: 66,
2213
+ countries: ['Slovakia.'],
2214
+ translations: {
2215
+ en: 'Slovak',
2216
+ es: 'Eslovaco',
2217
+ },
2218
+ },
2219
+ fil: {
2220
+ nativeName: 'Filipino',
2221
+ flag: '🇵🇭',
2222
+ code: 'fil',
2223
+ i: 33,
2224
+ llmKnowledge: 65,
2225
+ countries: ['Philippines (co-official).'],
2226
+ translations: {
2227
+ en: 'Filipino',
2228
+ es: 'Filipino',
2229
+ },
2230
+ },
2231
+ tl: {
2232
+ // Tagalog often used as base for Filipino, but distinct ISO code
2233
+ nativeName: 'Tagalog',
2234
+ flag: '🇵🇭',
2235
+ code: 'tl',
2236
+ i: 34,
2237
+ llmKnowledge: 64,
2238
+ countries: ['Philippines (base of Filipino).'],
2239
+ translations: {
2240
+ en: 'Tagalog',
2241
+ es: 'Tagalo',
2242
+ },
2243
+ },
2244
+ lt: {
2245
+ nativeName: 'Lietuvių',
2246
+ flag: '🇱🇹',
2247
+ code: 'lt',
2248
+ i: 35,
2249
+ llmKnowledge: 63,
2250
+ countries: ['Lithuania.'],
2251
+ translations: {
2252
+ en: 'Lithuanian',
2253
+ es: 'Lituano',
2254
+ },
2255
+ },
2256
+ lv: {
2257
+ nativeName: 'Latviešu',
2258
+ flag: '🇱🇻',
2259
+ code: 'lv',
2260
+ i: 36,
2261
+ llmKnowledge: 62,
2262
+ countries: ['Latvia.'],
2263
+ translations: {
2264
+ en: 'Latvian',
2265
+ es: 'Letón',
2266
+ },
2267
+ },
2268
+ sl: {
2269
+ nativeName: 'Slovenščina',
2270
+ flag: '🇸🇮',
2271
+ code: 'sl',
2272
+ i: 37,
2273
+ llmKnowledge: 61,
2274
+ countries: ['Slovenia.'],
2275
+ translations: {
2276
+ en: 'Slovenian',
2277
+ es: 'Esloveno',
2278
+ },
2279
+ },
2280
+ et: {
2281
+ nativeName: 'Eesti',
2282
+ flag: '🇪🇪',
2283
+ code: 'et',
2284
+ i: 38,
2285
+ llmKnowledge: 60,
2286
+ countries: ['Estonia.'],
2287
+ translations: {
2288
+ en: 'Estonian',
2289
+ es: 'Estonio',
2290
+ },
2291
+ },
2292
+ ms: {
2293
+ nativeName: 'Bahasa Melayu',
2294
+ flag: '🇲🇾',
2295
+ code: 'ms',
2296
+ i: 39,
2297
+ llmKnowledge: 59,
2298
+ countries: ['Malaysia', 'Brunei', 'Singapore (co-official).'],
2299
+ translations: {
2300
+ en: 'Malay',
2301
+ es: 'Malayo',
2302
+ },
2303
+ },
2304
+ sw: {
2305
+ nativeName: 'Kiswahili',
2306
+ flag: '🇹🇿',
2307
+ code: 'sw',
2308
+ i: 40,
2309
+ llmKnowledge: 58,
2310
+ countries: ['Tanzania', 'Kenya', 'Uganda', 'Rwanda', 'Democratic Republic of the Congo (national language).'],
2311
+ translations: {
2312
+ en: 'Swahili',
2313
+ es: 'Suajili',
2314
+ },
2315
+ },
2316
+ fa: {
2317
+ nativeName: 'فارسی (Fārsī)',
2318
+ flag: '🇮🇷',
2319
+ code: 'fa',
2320
+ i: 41,
2321
+ llmKnowledge: 57,
2322
+ countries: ['Iran', 'Afghanistan (as Dari)', 'Tajikistan (as Tajik).'],
2323
+ translations: {
2324
+ en: 'Persian/Farsi',
2325
+ es: 'Persa',
2326
+ },
2327
+ },
2328
+ bn: {
2329
+ nativeName: 'বাংলা (Bangla)',
2330
+ flag: '🇧🇩',
2331
+ code: 'bn',
2332
+ i: 42,
2333
+ llmKnowledge: 56,
2334
+ countries: ['Bangladesh', 'India (West Bengal, Tripura).'],
2335
+ translations: {
2336
+ en: 'Bengali',
2337
+ es: 'Bengalí',
2338
+ },
2339
+ },
2340
+ ur: {
2341
+ nativeName: 'اردو (Urdū)',
2342
+ flag: '🇵🇰',
2343
+ code: 'ur',
2344
+ i: 43,
2345
+ llmKnowledge: 55,
2346
+ countries: ['Pakistan (co-official)', 'India (recognized).'],
2347
+ translations: {
2348
+ en: 'Urdu',
2349
+ es: 'Urdu',
2350
+ },
2351
+ },
2352
+ sr: {
2353
+ nativeName: 'Српски (Srpski)',
2354
+ flag: '🇷🇸',
2355
+ code: 'sr',
2356
+ i: 44,
2357
+ llmKnowledge: 54,
2358
+ countries: ['Serbia', 'Bosnia and Herzegovina (co-official)', 'Montenegro (co-official)', 'Kosovo (co-official).'],
2359
+ translations: {
2360
+ en: 'Serbian',
2361
+ es: 'Serbio',
2362
+ },
2363
+ },
2364
+ is: {
2365
+ nativeName: 'Íslenska',
2366
+ flag: '🇮🇸',
2367
+ code: 'is',
2368
+ i: 45,
2369
+ llmKnowledge: 53,
2370
+ countries: ['Iceland.'],
2371
+ translations: {
2372
+ en: 'Icelandic',
2373
+ es: 'Islandés',
2374
+ },
2375
+ },
2376
+ ta: {
2377
+ nativeName: 'தமிழ் (Tamiḻ)',
2378
+ flag: '🇱🇰',
2379
+ code: 'ta',
2380
+ i: 46,
2381
+ llmKnowledge: 52,
2382
+ countries: ['Sri Lanka', 'Singapore', 'India (Tamil Nadu, Puducherry).'],
2383
+ translations: {
2384
+ en: 'Tamil',
2385
+ es: 'Tamil',
2386
+ },
2387
+ },
2388
+ mr: {
2389
+ nativeName: 'मराठी (Marāṭhī)',
2390
+ flag: '🇮🇳',
2391
+ code: 'mr',
2392
+ i: 47,
2393
+ llmKnowledge: 51,
2394
+ countries: ['India (Maharashtra).'],
2395
+ translations: {
2396
+ en: 'Marathi',
2397
+ es: 'Maratí',
2398
+ },
2399
+ },
2400
+ my: {
2401
+ nativeName: 'မြန်မာဘာသာ (Myanmar)',
2402
+ flag: '🇲🇲',
2403
+ code: 'my',
2404
+ i: 48,
2405
+ llmKnowledge: 50,
2406
+ countries: ['Myanmar.'],
2407
+ translations: {
2408
+ en: 'Burmese',
2409
+ es: 'Birmano',
2410
+ },
2411
+ },
2412
+ cy: {
2413
+ nativeName: 'Cymraeg',
2414
+ flag: '🏴󠁧󠁢󠁷󠁬󠁳󠁿',
2415
+ code: 'cy',
2416
+ i: 49,
2417
+ llmKnowledge: 49,
2418
+ countries: ['United Kingdom (Wales).'],
2419
+ translations: {
2420
+ en: 'Welsh',
2421
+ es: 'Galés',
2422
+ },
2423
+ },
2424
+ ha: {
2425
+ nativeName: 'Hausa',
2426
+ flag: '🇳🇬',
2427
+ code: 'ha',
2428
+ i: 50,
2429
+ llmKnowledge: 48,
2430
+ countries: ['Nigeria (major language)', 'Niger', 'Ghana', 'Cameroon', 'Benin', 'Chad', 'Sudan.'],
2431
+ translations: {
2432
+ en: 'Hausa',
2433
+ es: 'Hausa',
2434
+ },
2435
+ },
2436
+ eu: {
2437
+ nativeName: 'Euskara',
2438
+ flag: '🇪🇸',
2439
+ code: 'eu',
2440
+ i: 51,
2441
+ llmKnowledge: 47,
2442
+ countries: ['Spain (Basque Country, Navarre)', 'France (French Basque Country).'],
2443
+ translations: {
2444
+ en: 'Basque',
2445
+ es: 'Vasco',
2446
+ },
2447
+ },
2448
+ ga: {
2449
+ nativeName: 'Gaeilge',
2450
+ flag: '🇮🇪',
2451
+ code: 'ga',
2452
+ i: 52,
2453
+ llmKnowledge: 46,
2454
+ countries: ['Ireland', 'United Kingdom (Northern Ireland).'],
2455
+ translations: {
2456
+ en: 'Irish',
2457
+ es: 'Irlandés',
2458
+ },
2459
+ },
2460
+ sd: {
2461
+ nativeName: 'سنڌي (Sindhī)',
2462
+ flag: '🇵🇰',
2463
+ code: 'sd',
2464
+ i: 53,
2465
+ llmKnowledge: 45,
2466
+ countries: ['Pakistan (Sindh)', 'India (recognized).'],
2467
+ translations: {
2468
+ en: 'Sindhi',
2469
+ es: 'Sindi',
2470
+ },
2471
+ },
2472
+ am: {
2473
+ nativeName: 'አማርኛ (Amarəñña)',
2474
+ flag: '🇪🇹',
2475
+ code: 'am',
2476
+ i: 54,
2477
+ llmKnowledge: 44,
2478
+ countries: ['Ethiopia.'],
2479
+ translations: {
2480
+ en: 'Amharic',
2481
+ es: 'Amárico',
2482
+ },
2483
+ },
2484
+ jv: {
2485
+ nativeName: 'Basa Jawa',
2486
+ flag: '🇮🇩',
2487
+ code: 'jv',
2488
+ i: 55,
2489
+ llmKnowledge: 43,
2490
+ countries: ['Indonesia (important regional language).'],
2491
+ translations: {
2492
+ en: 'Javanese',
2493
+ es: 'Javanés',
2494
+ },
2495
+ },
2496
+ km: {
2497
+ nativeName: 'ភាសាខ្មែរ (Phéasa Khmér)',
2498
+ flag: '🇰🇭',
2499
+ code: 'km',
2500
+ i: 56,
2501
+ llmKnowledge: 42,
2502
+ countries: ['Cambodia.'],
2503
+ translations: {
2504
+ en: 'Khmer',
2505
+ es: 'Jemer',
2506
+ },
2507
+ },
2508
+ yo: {
2509
+ nativeName: 'Yorùbá',
2510
+ flag: '🇳🇬',
2511
+ code: 'yo',
2512
+ i: 57,
2513
+ llmKnowledge: 41,
2514
+ countries: ['Nigeria', 'Benin', 'Togo.'],
2515
+ translations: {
2516
+ en: 'Yoruba',
2517
+ es: 'Yoruba',
2518
+ },
2519
+ },
2520
+ gl: {
2521
+ nativeName: 'Galego',
2522
+ flag: '🇪🇸',
2523
+ code: 'gl',
2524
+ i: 58,
2525
+ llmKnowledge: 40,
2526
+ countries: ['Spain (Galicia).'],
2527
+ translations: {
2528
+ en: 'Galician',
2529
+ es: 'Gallego',
2530
+ },
2531
+ },
2532
+ };
2533
+
1416
2534
  /*
1417
2535
  * Public API Surface of core-components
1418
2536
  */
@@ -1422,5 +2540,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
1422
2540
  * Generated bundle index. Do not edit.
1423
2541
  */
1424
2542
 
1425
- export { AudioSpeed, AudioSpeedReverse, ChatUserSettings, ConfirmComponent, ConfirmService, DCFilterBarComponent, DCProgressToastComponent, EModelQuality, EmptyStateComponent, GetPathPipe, HTTP_CORE_CONFIG, HttpCoreService, IAIModel, LoadingBarComponent, LoadingBarService, ModelQualityOptions, OptionValue, PaginationBase, PromptService, QuickTableComponent, TOAST_ALERTS_TOKEN, ToastAlertsAbstractService, availibleFilters, extractJsonFromString, formatCamelCaseString, provideToastAlert, sortOptions, sortTypes };
2543
+ export { AudioSpeed, AudioSpeedReverse, ChatUserSettings, ConfirmComponent, ConfirmService, DCFilterBarComponent, DCProgressToastComponent, DcAuditableViewerComponent, DcExtensionsViewerComponent, DcLearnableViewerComponent, DcManageableViewerComponent, DcReactionsViewerComponent, EModelQuality, EmptyStateComponent, EntityBaseFormComponent, EntityBaseListComponent, EntityCommunicationService, GetPathPipe, HTTP_CORE_CONFIG, HttpCoreService, IAIModel, LANGUAGES, LoadingBarComponent, LoadingBarService, ModelQualityOptions, OptionValue, PaginationBase, PromptService, QuickTableComponent, TOAST_ALERTS_TOKEN, ToastAlertsAbstractService, availibleFilters, extractJsonFromString, formatCamelCaseString, provideToastAlert, sortOptions, sortTypes };
1426
2544
  //# sourceMappingURL=dataclouder-ngx-core.mjs.map