@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.
- package/fesm2022/dataclouder-ngx-core.mjs +1168 -50
- package/fesm2022/dataclouder-ngx-core.mjs.map +1 -1
- package/lib/components/base-form/entity-base-form.d.ts +19 -0
- package/lib/components/base-list/entity-base-list.component.d.ts +29 -0
- package/lib/components/forms/dc-auditable-viewer.component.d.ts +7 -0
- package/lib/components/forms/dc-extensions-viewer.component.d.ts +7 -0
- package/lib/components/forms/dc-learnable-viewer.component.d.ts +7 -0
- package/lib/components/forms/dc-manageable-viewer.component.d.ts +7 -0
- package/lib/components/forms/dc-reactions-viewer.component.d.ts +7 -0
- package/lib/components/quick-table/quick-table.d.ts +3 -2
- package/lib/models/extension.model.d.ts +29 -0
- package/lib/models/languages.model.d.ts +10 -0
- package/lib/models/pagination.abstract.d.ts +2 -2
- package/lib/services/entity-cominication.service.d.ts +17 -0
- package/package.json +1 -1
- package/public-api.d.ts +10 -0
|
@@ -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,
|
|
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
|
|
35
|
+
import * as i1$2 from '@angular/common';
|
|
36
36
|
import { CommonModule } from '@angular/common';
|
|
37
|
-
import * as
|
|
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
|
-
//
|
|
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
|
-
|
|
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 (
|
|
489
|
-
this.actions
|
|
496
|
+
if (this.actions()?.length > 0) {
|
|
497
|
+
this._actions.set(this.actions());
|
|
490
498
|
}
|
|
491
|
-
|
|
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:
|
|
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
|
|
605
|
-
}], ctorParameters: () => [], propDecorators: {
|
|
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
|
-
|
|
613
|
-
|
|
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
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
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
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
[
|
|
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
|
-
|
|
642
|
-
|
|
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.
|
|
821
|
+
this.first = 0;
|
|
669
822
|
/** Number of rows to display per page */
|
|
670
|
-
this.
|
|
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.
|
|
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.
|
|
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.
|
|
859
|
+
this.rows = pageEvent.rows;
|
|
707
860
|
this.filterConfig = {
|
|
708
861
|
...this.filterConfig,
|
|
709
862
|
page: pageEvent.page,
|
|
710
|
-
rowsPerPage: this.
|
|
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$
|
|
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
|