@masterteam/dashboard-builder 0.0.19 → 0.0.20

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.
@@ -62,8 +62,8 @@
62
62
  "categoryCards": "البطاقات",
63
63
  "categoryTables": "الجداول",
64
64
  "categoryLayout": "التخطيط",
65
- "categorySpecial": "خاص",
66
- "categoryCommon": "شائع",
65
+ "categorySpecial": "خاص",
66
+ "categoryCommon": "شائع",
67
67
  "selectedType": "النوع المحدد",
68
68
  "enterTitleEn": "أدخل العنوان بالإنجليزية",
69
69
  "enterTitleAr": "أدخل العنوان بالعربية",
@@ -319,17 +319,17 @@
319
319
  "titleColor": "لون العنوان",
320
320
  "colorPlaceholder": "اختر اللون",
321
321
  "showSubtitle": "إظهار العنوان الفرعي",
322
- "subtitle": "العنوان الفرعي",
323
- "subtitlePlaceholder": "أدخل العنوان الفرعي",
324
- "subtitleFontSize": "حجم خط العنوان الفرعي",
325
- "subtitleColor": "لون العنوان الفرعي",
326
- "icon": "الأيقونة",
327
- "iconColor": "لون الأيقونة",
328
- "iconBackgroundColor": "لون خلفية الأيقونة",
329
- "backgroundColor": "لون الخلفية",
330
- "borderColor": "لون الحدود",
331
- "borderRadius": "نصف قطر الحدود",
332
- "padding": "الحشو",
322
+ "subtitle": "العنوان الفرعي",
323
+ "subtitlePlaceholder": "أدخل العنوان الفرعي",
324
+ "subtitleFontSize": "حجم خط العنوان الفرعي",
325
+ "subtitleColor": "لون العنوان الفرعي",
326
+ "icon": "الأيقونة",
327
+ "iconColor": "لون الأيقونة",
328
+ "iconBackgroundColor": "لون خلفية الأيقونة",
329
+ "backgroundColor": "لون الخلفية",
330
+ "borderColor": "لون الحدود",
331
+ "borderRadius": "نصف قطر الحدود",
332
+ "padding": "الحشو",
333
333
 
334
334
  "pie": {
335
335
  "titleSection": "إعدادات العنوان",
@@ -656,40 +656,40 @@
656
656
  "hideProperties": "إخفاء الخصائص",
657
657
  "selectPropertiesToHide": "اختر الخصائص للإخفاء",
658
658
 
659
- "entityPreviewSettings": "إعدادات عرض الخصائص",
659
+ "entityPreviewSettings": "إعدادات عرض الخصائص",
660
660
  "usePropsConfigAsIndex": "استخدام تكوين الخصائص كفهرس",
661
- "bar": "شريط",
662
- "x": "س",
663
- "y": "ص",
664
- "positionTitle": "موضع العنوان",
665
- "centerProperty": "خاصية المركز",
666
- "statusProperty": "خاصية الحالة",
667
- "hiddenProperties": "الخصائص المخفية",
668
- "orderBy": "الترتيب حسب",
669
- "width": "العرض",
670
- "colorProperty": "خاصية اللون",
671
- "border": "الحدود",
672
- "hidden": "مخفي",
673
- "propertyColors": "ألوان الخصائص",
674
- "selectColorProperty": "اختر خاصية اللون",
675
- "noPropertyColors": "لا توجد ألوان خصائص مُعدّة",
676
- "noPropertyTranslations": "لا توجد ترجمات خصائص مُعدّة",
677
- "selectPropertiesFirst": "حدد الخصائص أولاً من مصدر البيانات.",
678
- "enterArabicLabel": "أدخل التسمية العربية",
679
- "enterEnglishLabel": "أدخل التسمية الإنجليزية",
680
- "enterLabelAr": "أدخل التسمية بالعربية",
681
- "enterLabelEn": "أدخل التسمية بالإنجليزية",
682
- "condition": "الشرط",
683
- "toggleAssociation": "ربط التبديل",
684
- "enableToggleAssociation": "تفعيل ربط التبديل",
685
- "extraColumnFromLookup": "عمود إضافي من المرجع",
686
- "enableExtraColumnFromLookup": "تفعيل عمود إضافي من المرجع",
687
- "lookup": "المرجع",
688
- "selectLookup": "اختر المرجع",
689
- "groupedBy": "تجميع حسب",
690
- "propertyValue": "قيمة الخاصية",
691
- "formatXAxisConfiguration": "إعدادات تنسيق المحور X",
692
- "shortFormat": "تنسيق مختصر",
661
+ "bar": "شريط",
662
+ "x": "س",
663
+ "y": "ص",
664
+ "positionTitle": "موضع العنوان",
665
+ "centerProperty": "خاصية المركز",
666
+ "statusProperty": "خاصية الحالة",
667
+ "hiddenProperties": "الخصائص المخفية",
668
+ "orderBy": "الترتيب حسب",
669
+ "width": "العرض",
670
+ "colorProperty": "خاصية اللون",
671
+ "border": "الحدود",
672
+ "hidden": "مخفي",
673
+ "propertyColors": "ألوان الخصائص",
674
+ "selectColorProperty": "اختر خاصية اللون",
675
+ "noPropertyColors": "لا توجد ألوان خصائص مُعدّة",
676
+ "noPropertyTranslations": "لا توجد ترجمات خصائص مُعدّة",
677
+ "selectPropertiesFirst": "حدد الخصائص أولاً من مصدر البيانات.",
678
+ "enterArabicLabel": "أدخل التسمية العربية",
679
+ "enterEnglishLabel": "أدخل التسمية الإنجليزية",
680
+ "enterLabelAr": "أدخل التسمية بالعربية",
681
+ "enterLabelEn": "أدخل التسمية بالإنجليزية",
682
+ "condition": "الشرط",
683
+ "toggleAssociation": "ربط التبديل",
684
+ "enableToggleAssociation": "تفعيل ربط التبديل",
685
+ "extraColumnFromLookup": "عمود إضافي من المرجع",
686
+ "enableExtraColumnFromLookup": "تفعيل عمود إضافي من المرجع",
687
+ "lookup": "المرجع",
688
+ "selectLookup": "اختر المرجع",
689
+ "groupedBy": "تجميع حسب",
690
+ "propertyValue": "قيمة الخاصية",
691
+ "formatXAxisConfiguration": "إعدادات تنسيق المحور X",
692
+ "shortFormat": "تنسيق مختصر",
693
693
 
694
694
  "dynamicKeys": "المفاتيح الديناميكية",
695
695
  "staticKeys": "المفاتيح الثابتة",
@@ -439,7 +439,9 @@ class DashboardStoreService {
439
439
  /** Dynamic key-value store */
440
440
  dynamicStore = signal({}, ...(ngDevMode ? [{ debugName: "dynamicStore" }] : /* istanbul ignore next */ []));
441
441
  /** Language code */
442
- languageCode = signal(localStorage.getItem('langCode') || 'en', ...(ngDevMode ? [{ debugName: "languageCode" }] : /* istanbul ignore next */ []));
442
+ languageCode = signal(localStorage.getItem('langCode') ||
443
+ JSON.parse(localStorage.getItem('language') ?? 'null')?.langKey ||
444
+ 'en', ...(ngDevMode ? [{ debugName: "languageCode" }] : /* istanbul ignore next */ []));
443
445
  /** Direction */
444
446
  direction = signal(document.dir || 'ltr', ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
445
447
  /** Inside Report Viewer flag - controls text truncation in charts */
@@ -18727,7 +18729,7 @@ class PropertiesCardComponent {
18727
18729
  return '';
18728
18730
  }
18729
18731
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: PropertiesCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
18730
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: PropertiesCardComponent, isStandalone: true, selector: "mt-properties-card, mt-entities-preview-card", inputs: { dashboardId: { classPropertyName: "dashboardId", publicName: "dashboardId", isSignal: true, isRequired: true, transformFunction: null }, inGroup: { classPropertyName: "inGroup", publicName: "inGroup", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onAction: "onAction" }, ngImport: i0, template: "<ng-container *transloco=\"let t; prefix: 'dashboardBuilder'\">\n @if (showTabs()) {\n <div class=\"mb-3\">\n <mt-tabs [(active)]=\"tabSelected\" [options]=\"tabOptions()\" size=\"small\" />\n </div>\n }\n\n <div\n class=\"overflow-y-auto overflow-x-hidden\"\n [style.max-height]=\"inGroup() ? '500px' : '90%'\"\n >\n @if (currentTabCards().length === 0) {\n <div class=\"py-6 text-center text-sm text-gray-400\">\n {{ t(\"noData\") }}\n </div>\n } @else {\n <div class=\"flex flex-wrap\">\n @for (cardView of currentTabCards(); track cardView.trackId) {\n <div\n class=\"mb-2 p-2\"\n [class.card-col]=\"!galleryMode()\"\n [class.gallery-card-col]=\"galleryMode()\"\n [class.w-full]=\"!galleryMode()\"\n [class.md:w-1/2]=\"!galleryMode()\"\n [class.lg:w-1/3]=\"!galleryMode()\"\n >\n @if (isPropertiesCard()) {\n <div\n class=\"h-full cursor-pointer rounded-lg bg-white p-3 shadow-sm transition-all hover:shadow-md\"\n (click)=\"onCardClick(cardView.card)\"\n >\n @if (cardView.entities.length > 0) {\n <mt-entities-preview [entities]=\"cardView.entities\" />\n } @else {\n <div class=\"py-6 text-center text-sm text-gray-400\">\n {{ t(\"noData\") }}\n </div>\n }\n </div>\n } @else {\n <div\n class=\"h-full cursor-pointer rounded-lg bg-white shadow-sm transition-all hover:shadow-md\"\n (click)=\"onCardClick(cardView.card)\"\n >\n <div\n class=\"flex items-center justify-between border-b p-3\"\n [style.border-left-color]=\"\n cardView.card.status?.value?.details?.color || '#64b735'\n \"\n [style.border-left-width]=\"'4px'\"\n >\n <div class=\"min-w-0 flex-1\">\n <h6 class=\"truncate text-sm font-semibold text-gray-800\">\n {{ cardView.card.name }}\n </h6>\n </div>\n <div class=\"ml-2 flex items-center gap-2\">\n @if (cardView.card.status?.value?.name) {\n <span\n class=\"whitespace-nowrap rounded-full px-2 py-0.5 text-xs font-medium text-white\"\n [style.background-color]=\"\n cardView.card.status?.value?.details?.color ||\n '#64b735'\n \"\n [pTooltip]=\"\n cardView.card.status?.value?.details?.description\n \"\n >\n {{ cardView.card.status?.value?.name }}\n </span>\n }\n @if (cardView.card.currentPhase) {\n <span\n class=\"rounded-full bg-gray-200 px-2 py-0.5 text-xs text-gray-600\"\n >\n {{ cardView.card.currentPhase }}\n </span>\n }\n </div>\n </div>\n\n <div class=\"p-3\">\n @for (prop of cardView.bodyProps; track prop.key) {\n <div class=\"mb-2 flex items-start text-sm\">\n <span class=\"mr-2 font-medium text-gray-500\">\n {{ prop.key }}:\n </span>\n <span class=\"flex-1 text-gray-700\">\n <mt-entity-info\n [viewType]=\"prop.viewType\"\n [value]=\"prop.value\"\n [langCode]=\"langCode()\"\n />\n </span>\n </div>\n }\n </div>\n\n @if (galleryMode() && cardView.attachments.length > 0) {\n <div class=\"flex gap-2 overflow-x-auto p-3 pt-0\">\n @for (attachment of cardView.attachments; track $index) {\n <img\n [src]=\"'api/Uploader/' + attachment['path']\"\n alt=\"Attachment\"\n class=\"h-16 w-16 flex-shrink-0 rounded object-cover\"\n />\n }\n </div>\n }\n\n @if (cardView.hasCounters) {\n <div class=\"flex justify-around border-t p-2 text-xs\">\n @if (cardView.card.issuesCounts) {\n <div class=\"text-center\">\n <div class=\"font-medium text-red-500\">\n {{ cardView.card.issuesCounts.value }}\n </div>\n <div class=\"text-gray-400\">{{ t(\"issues\") }}</div>\n </div>\n }\n @if (cardView.card.risksCounts) {\n <div class=\"text-center\">\n <div class=\"font-medium text-orange-500\">\n {{ cardView.card.risksCounts.value }}\n </div>\n <div class=\"text-gray-400\">{{ t(\"risks\") }}</div>\n </div>\n }\n @if (cardView.card.milestonesCounts) {\n <div class=\"text-center\">\n <div class=\"font-medium text-blue-500\">\n {{ cardView.card.milestonesCounts.value }}\n </div>\n <div class=\"text-gray-400\">{{ t(\"milestones\") }}</div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-container>\n", styles: [":host{display:block;height:100%}.card-col{flex:0 0 100%}@media(min-width:768px){.card-col{flex:0 0 50%}}@media(min-width:1024px){.card-col{flex:0 0 33.333%}}.gallery-card-col{flex:0 0 100%}@media(min-width:640px){.gallery-card-col{flex:0 0 50%}}@media(min-width:1024px){.gallery-card-col{flex:0 0 25%}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i2$1.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "showOnEllipsis", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip", "pTooltipPT", "pTooltipUnstyled"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: Tabs, selector: "mt-tabs", inputs: ["options", "optionLabel", "optionValue", "active", "size", "fluid", "disabled"], outputs: ["activeChange", "onChange"] }, { kind: "component", type: EntitiesPreview, selector: "mt-entities-preview", inputs: ["entities", "attachmentShape"] }, { kind: "component", type: EntityInfoComponent, selector: "mt-entity-info", inputs: ["data", "displayType", "extraInfoData", "limitWords", "customClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
18732
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: PropertiesCardComponent, isStandalone: true, selector: "mt-properties-card, mt-entities-preview-card", inputs: { dashboardId: { classPropertyName: "dashboardId", publicName: "dashboardId", isSignal: true, isRequired: true, transformFunction: null }, inGroup: { classPropertyName: "inGroup", publicName: "inGroup", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onAction: "onAction" }, ngImport: i0, template: "<ng-container *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n @if (showTabs()) {\r\n <div class=\"mb-3\">\r\n <mt-tabs [(active)]=\"tabSelected\" [options]=\"tabOptions()\" size=\"small\" />\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"overflow-y-auto overflow-x-hidden\"\r\n [style.max-height]=\"inGroup() ? '500px' : '90%'\"\r\n >\r\n @if (currentTabCards().length === 0) {\r\n <div class=\"py-6 text-center text-sm text-gray-400\">\r\n {{ t(\"noData\") }}\r\n </div>\r\n } @else {\r\n <div class=\"flex flex-wrap\">\r\n @for (cardView of currentTabCards(); track cardView.trackId) {\r\n <div\r\n class=\"mb-2 p-2\"\r\n [class.card-col]=\"!galleryMode()\"\r\n [class.gallery-card-col]=\"galleryMode()\"\r\n [class.w-full]=\"!galleryMode()\"\r\n [class.md:w-1/2]=\"!galleryMode()\"\r\n [class.lg:w-1/3]=\"!galleryMode()\"\r\n >\r\n @if (isPropertiesCard()) {\r\n <div\r\n class=\"h-full cursor-pointer rounded-lg bg-white p-3 shadow-sm transition-all hover:shadow-md\"\r\n (click)=\"onCardClick(cardView.card)\"\r\n >\r\n @if (cardView.entities.length > 0) {\r\n <mt-entities-preview [entities]=\"cardView.entities\" />\r\n } @else {\r\n <div class=\"py-6 text-center text-sm text-gray-400\">\r\n {{ t(\"noData\") }}\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <div\r\n class=\"h-full cursor-pointer rounded-lg bg-white shadow-sm transition-all hover:shadow-md\"\r\n (click)=\"onCardClick(cardView.card)\"\r\n >\r\n <div\r\n class=\"flex items-center justify-between border-b p-3\"\r\n [style.border-left-color]=\"\r\n cardView.card.status?.value?.details?.color || '#64b735'\r\n \"\r\n [style.border-left-width]=\"'4px'\"\r\n >\r\n <div class=\"min-w-0 flex-1\">\r\n <h6 class=\"truncate text-sm font-semibold text-gray-800\">\r\n {{ cardView.card.name }}\r\n </h6>\r\n </div>\r\n <div class=\"ml-2 flex items-center gap-2\">\r\n @if (cardView.card.status?.value?.name) {\r\n <span\r\n class=\"whitespace-nowrap rounded-full px-2 py-0.5 text-xs font-medium text-white\"\r\n [style.background-color]=\"\r\n cardView.card.status?.value?.details?.color ||\r\n '#64b735'\r\n \"\r\n [pTooltip]=\"\r\n cardView.card.status?.value?.details?.description\r\n \"\r\n >\r\n {{ cardView.card.status?.value?.name }}\r\n </span>\r\n }\r\n @if (cardView.card.currentPhase) {\r\n <span\r\n class=\"rounded-full bg-gray-200 px-2 py-0.5 text-xs text-gray-600\"\r\n >\r\n {{ cardView.card.currentPhase }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"p-3\">\r\n @for (prop of cardView.bodyProps; track prop.key) {\r\n <div class=\"mb-2 flex items-start text-sm\">\r\n <span class=\"mr-2 font-medium text-gray-500\">\r\n {{ prop.key }}:\r\n </span>\r\n <span class=\"flex-1 text-gray-700\">\r\n <mt-entity-info\r\n [viewType]=\"prop.viewType\"\r\n [value]=\"prop.value\"\r\n [langCode]=\"langCode()\"\r\n />\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (galleryMode() && cardView.attachments.length > 0) {\r\n <div class=\"flex gap-2 overflow-x-auto p-3 pt-0\">\r\n @for (attachment of cardView.attachments; track $index) {\r\n <img\r\n [src]=\"'api/Uploader/' + attachment['path']\"\r\n alt=\"Attachment\"\r\n class=\"h-16 w-16 flex-shrink-0 rounded object-cover\"\r\n />\r\n }\r\n </div>\r\n }\r\n\r\n @if (cardView.hasCounters) {\r\n <div class=\"flex justify-around border-t p-2 text-xs\">\r\n @if (cardView.card.issuesCounts) {\r\n <div class=\"text-center\">\r\n <div class=\"font-medium text-red-500\">\r\n {{ cardView.card.issuesCounts.value }}\r\n </div>\r\n <div class=\"text-gray-400\">{{ t(\"issues\") }}</div>\r\n </div>\r\n }\r\n @if (cardView.card.risksCounts) {\r\n <div class=\"text-center\">\r\n <div class=\"font-medium text-orange-500\">\r\n {{ cardView.card.risksCounts.value }}\r\n </div>\r\n <div class=\"text-gray-400\">{{ t(\"risks\") }}</div>\r\n </div>\r\n }\r\n @if (cardView.card.milestonesCounts) {\r\n <div class=\"text-center\">\r\n <div class=\"font-medium text-blue-500\">\r\n {{ cardView.card.milestonesCounts.value }}\r\n </div>\r\n <div class=\"text-gray-400\">{{ t(\"milestones\") }}</div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n</ng-container>\r\n", styles: [":host{display:block;height:100%}.card-col{flex:0 0 100%}@media(min-width:768px){.card-col{flex:0 0 50%}}@media(min-width:1024px){.card-col{flex:0 0 33.333%}}.gallery-card-col{flex:0 0 100%}@media(min-width:640px){.gallery-card-col{flex:0 0 50%}}@media(min-width:1024px){.gallery-card-col{flex:0 0 25%}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i2$1.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "showOnEllipsis", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip", "pTooltipPT", "pTooltipUnstyled"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: Tabs, selector: "mt-tabs", inputs: ["options", "optionLabel", "optionValue", "active", "size", "fluid", "disabled"], outputs: ["activeChange", "onChange"] }, { kind: "component", type: EntitiesPreview, selector: "mt-entities-preview", inputs: ["entities", "attachmentShape"] }, { kind: "component", type: EntityInfoComponent, selector: "mt-entity-info", inputs: ["data", "displayType", "extraInfoData", "limitWords", "customClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
18731
18733
  }
18732
18734
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: PropertiesCardComponent, decorators: [{
18733
18735
  type: Component,
@@ -18738,7 +18740,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
18738
18740
  Tabs,
18739
18741
  EntitiesPreview,
18740
18742
  EntityInfoComponent,
18741
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t; prefix: 'dashboardBuilder'\">\n @if (showTabs()) {\n <div class=\"mb-3\">\n <mt-tabs [(active)]=\"tabSelected\" [options]=\"tabOptions()\" size=\"small\" />\n </div>\n }\n\n <div\n class=\"overflow-y-auto overflow-x-hidden\"\n [style.max-height]=\"inGroup() ? '500px' : '90%'\"\n >\n @if (currentTabCards().length === 0) {\n <div class=\"py-6 text-center text-sm text-gray-400\">\n {{ t(\"noData\") }}\n </div>\n } @else {\n <div class=\"flex flex-wrap\">\n @for (cardView of currentTabCards(); track cardView.trackId) {\n <div\n class=\"mb-2 p-2\"\n [class.card-col]=\"!galleryMode()\"\n [class.gallery-card-col]=\"galleryMode()\"\n [class.w-full]=\"!galleryMode()\"\n [class.md:w-1/2]=\"!galleryMode()\"\n [class.lg:w-1/3]=\"!galleryMode()\"\n >\n @if (isPropertiesCard()) {\n <div\n class=\"h-full cursor-pointer rounded-lg bg-white p-3 shadow-sm transition-all hover:shadow-md\"\n (click)=\"onCardClick(cardView.card)\"\n >\n @if (cardView.entities.length > 0) {\n <mt-entities-preview [entities]=\"cardView.entities\" />\n } @else {\n <div class=\"py-6 text-center text-sm text-gray-400\">\n {{ t(\"noData\") }}\n </div>\n }\n </div>\n } @else {\n <div\n class=\"h-full cursor-pointer rounded-lg bg-white shadow-sm transition-all hover:shadow-md\"\n (click)=\"onCardClick(cardView.card)\"\n >\n <div\n class=\"flex items-center justify-between border-b p-3\"\n [style.border-left-color]=\"\n cardView.card.status?.value?.details?.color || '#64b735'\n \"\n [style.border-left-width]=\"'4px'\"\n >\n <div class=\"min-w-0 flex-1\">\n <h6 class=\"truncate text-sm font-semibold text-gray-800\">\n {{ cardView.card.name }}\n </h6>\n </div>\n <div class=\"ml-2 flex items-center gap-2\">\n @if (cardView.card.status?.value?.name) {\n <span\n class=\"whitespace-nowrap rounded-full px-2 py-0.5 text-xs font-medium text-white\"\n [style.background-color]=\"\n cardView.card.status?.value?.details?.color ||\n '#64b735'\n \"\n [pTooltip]=\"\n cardView.card.status?.value?.details?.description\n \"\n >\n {{ cardView.card.status?.value?.name }}\n </span>\n }\n @if (cardView.card.currentPhase) {\n <span\n class=\"rounded-full bg-gray-200 px-2 py-0.5 text-xs text-gray-600\"\n >\n {{ cardView.card.currentPhase }}\n </span>\n }\n </div>\n </div>\n\n <div class=\"p-3\">\n @for (prop of cardView.bodyProps; track prop.key) {\n <div class=\"mb-2 flex items-start text-sm\">\n <span class=\"mr-2 font-medium text-gray-500\">\n {{ prop.key }}:\n </span>\n <span class=\"flex-1 text-gray-700\">\n <mt-entity-info\n [viewType]=\"prop.viewType\"\n [value]=\"prop.value\"\n [langCode]=\"langCode()\"\n />\n </span>\n </div>\n }\n </div>\n\n @if (galleryMode() && cardView.attachments.length > 0) {\n <div class=\"flex gap-2 overflow-x-auto p-3 pt-0\">\n @for (attachment of cardView.attachments; track $index) {\n <img\n [src]=\"'api/Uploader/' + attachment['path']\"\n alt=\"Attachment\"\n class=\"h-16 w-16 flex-shrink-0 rounded object-cover\"\n />\n }\n </div>\n }\n\n @if (cardView.hasCounters) {\n <div class=\"flex justify-around border-t p-2 text-xs\">\n @if (cardView.card.issuesCounts) {\n <div class=\"text-center\">\n <div class=\"font-medium text-red-500\">\n {{ cardView.card.issuesCounts.value }}\n </div>\n <div class=\"text-gray-400\">{{ t(\"issues\") }}</div>\n </div>\n }\n @if (cardView.card.risksCounts) {\n <div class=\"text-center\">\n <div class=\"font-medium text-orange-500\">\n {{ cardView.card.risksCounts.value }}\n </div>\n <div class=\"text-gray-400\">{{ t(\"risks\") }}</div>\n </div>\n }\n @if (cardView.card.milestonesCounts) {\n <div class=\"text-center\">\n <div class=\"font-medium text-blue-500\">\n {{ cardView.card.milestonesCounts.value }}\n </div>\n <div class=\"text-gray-400\">{{ t(\"milestones\") }}</div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-container>\n", styles: [":host{display:block;height:100%}.card-col{flex:0 0 100%}@media(min-width:768px){.card-col{flex:0 0 50%}}@media(min-width:1024px){.card-col{flex:0 0 33.333%}}.gallery-card-col{flex:0 0 100%}@media(min-width:640px){.gallery-card-col{flex:0 0 50%}}@media(min-width:1024px){.gallery-card-col{flex:0 0 25%}}\n"] }]
18743
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t; prefix: 'dashboardBuilder'\">\r\n @if (showTabs()) {\r\n <div class=\"mb-3\">\r\n <mt-tabs [(active)]=\"tabSelected\" [options]=\"tabOptions()\" size=\"small\" />\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"overflow-y-auto overflow-x-hidden\"\r\n [style.max-height]=\"inGroup() ? '500px' : '90%'\"\r\n >\r\n @if (currentTabCards().length === 0) {\r\n <div class=\"py-6 text-center text-sm text-gray-400\">\r\n {{ t(\"noData\") }}\r\n </div>\r\n } @else {\r\n <div class=\"flex flex-wrap\">\r\n @for (cardView of currentTabCards(); track cardView.trackId) {\r\n <div\r\n class=\"mb-2 p-2\"\r\n [class.card-col]=\"!galleryMode()\"\r\n [class.gallery-card-col]=\"galleryMode()\"\r\n [class.w-full]=\"!galleryMode()\"\r\n [class.md:w-1/2]=\"!galleryMode()\"\r\n [class.lg:w-1/3]=\"!galleryMode()\"\r\n >\r\n @if (isPropertiesCard()) {\r\n <div\r\n class=\"h-full cursor-pointer rounded-lg bg-white p-3 shadow-sm transition-all hover:shadow-md\"\r\n (click)=\"onCardClick(cardView.card)\"\r\n >\r\n @if (cardView.entities.length > 0) {\r\n <mt-entities-preview [entities]=\"cardView.entities\" />\r\n } @else {\r\n <div class=\"py-6 text-center text-sm text-gray-400\">\r\n {{ t(\"noData\") }}\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <div\r\n class=\"h-full cursor-pointer rounded-lg bg-white shadow-sm transition-all hover:shadow-md\"\r\n (click)=\"onCardClick(cardView.card)\"\r\n >\r\n <div\r\n class=\"flex items-center justify-between border-b p-3\"\r\n [style.border-left-color]=\"\r\n cardView.card.status?.value?.details?.color || '#64b735'\r\n \"\r\n [style.border-left-width]=\"'4px'\"\r\n >\r\n <div class=\"min-w-0 flex-1\">\r\n <h6 class=\"truncate text-sm font-semibold text-gray-800\">\r\n {{ cardView.card.name }}\r\n </h6>\r\n </div>\r\n <div class=\"ml-2 flex items-center gap-2\">\r\n @if (cardView.card.status?.value?.name) {\r\n <span\r\n class=\"whitespace-nowrap rounded-full px-2 py-0.5 text-xs font-medium text-white\"\r\n [style.background-color]=\"\r\n cardView.card.status?.value?.details?.color ||\r\n '#64b735'\r\n \"\r\n [pTooltip]=\"\r\n cardView.card.status?.value?.details?.description\r\n \"\r\n >\r\n {{ cardView.card.status?.value?.name }}\r\n </span>\r\n }\r\n @if (cardView.card.currentPhase) {\r\n <span\r\n class=\"rounded-full bg-gray-200 px-2 py-0.5 text-xs text-gray-600\"\r\n >\r\n {{ cardView.card.currentPhase }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"p-3\">\r\n @for (prop of cardView.bodyProps; track prop.key) {\r\n <div class=\"mb-2 flex items-start text-sm\">\r\n <span class=\"mr-2 font-medium text-gray-500\">\r\n {{ prop.key }}:\r\n </span>\r\n <span class=\"flex-1 text-gray-700\">\r\n <mt-entity-info\r\n [viewType]=\"prop.viewType\"\r\n [value]=\"prop.value\"\r\n [langCode]=\"langCode()\"\r\n />\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (galleryMode() && cardView.attachments.length > 0) {\r\n <div class=\"flex gap-2 overflow-x-auto p-3 pt-0\">\r\n @for (attachment of cardView.attachments; track $index) {\r\n <img\r\n [src]=\"'api/Uploader/' + attachment['path']\"\r\n alt=\"Attachment\"\r\n class=\"h-16 w-16 flex-shrink-0 rounded object-cover\"\r\n />\r\n }\r\n </div>\r\n }\r\n\r\n @if (cardView.hasCounters) {\r\n <div class=\"flex justify-around border-t p-2 text-xs\">\r\n @if (cardView.card.issuesCounts) {\r\n <div class=\"text-center\">\r\n <div class=\"font-medium text-red-500\">\r\n {{ cardView.card.issuesCounts.value }}\r\n </div>\r\n <div class=\"text-gray-400\">{{ t(\"issues\") }}</div>\r\n </div>\r\n }\r\n @if (cardView.card.risksCounts) {\r\n <div class=\"text-center\">\r\n <div class=\"font-medium text-orange-500\">\r\n {{ cardView.card.risksCounts.value }}\r\n </div>\r\n <div class=\"text-gray-400\">{{ t(\"risks\") }}</div>\r\n </div>\r\n }\r\n @if (cardView.card.milestonesCounts) {\r\n <div class=\"text-center\">\r\n <div class=\"font-medium text-blue-500\">\r\n {{ cardView.card.milestonesCounts.value }}\r\n </div>\r\n <div class=\"text-gray-400\">{{ t(\"milestones\") }}</div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n</ng-container>\r\n", styles: [":host{display:block;height:100%}.card-col{flex:0 0 100%}@media(min-width:768px){.card-col{flex:0 0 50%}}@media(min-width:1024px){.card-col{flex:0 0 33.333%}}.gallery-card-col{flex:0 0 100%}@media(min-width:640px){.gallery-card-col{flex:0 0 50%}}@media(min-width:1024px){.gallery-card-col{flex:0 0 25%}}\n"] }]
18742
18744
  }], ctorParameters: () => [], propDecorators: { dashboardId: [{ type: i0.Input, args: [{ isSignal: true, alias: "dashboardId", required: true }] }], inGroup: [{ type: i0.Input, args: [{ isSignal: true, alias: "inGroup", required: false }] }], onAction: [{ type: i0.Output, args: ["onAction"] }] } });
18743
18745
 
18744
18746
  /**
@@ -19015,11 +19017,11 @@ class TopbarCardComponent {
19015
19017
  return /^https?:\/\//i.test(link);
19016
19018
  }
19017
19019
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: TopbarCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
19018
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: TopbarCardComponent, isStandalone: true, selector: "mt-topbar-card", inputs: { dashboardId: { classPropertyName: "dashboardId", publicName: "dashboardId", isSignal: true, isRequired: true, transformFunction: null }, defaultBreadcrumbLabel: { classPropertyName: "defaultBreadcrumbLabel", publicName: "defaultBreadcrumbLabel", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\n class=\"flex h-full flex-col gap-3 md:flex-row md:items-center md:justify-between\"\n [style.background-color]=\"\n cardStyleConfig()['backgroundColor'] || styleConfig()['background-color']\n \"\n [style.border-radius.px]=\"cardStyleConfig()['borderRadius']\"\n [style.border-color]=\"borderColor()\"\n [style.border-style]=\"borderWidth() ? 'solid' : null\"\n [style.border-width.px]=\"borderWidth()\"\n [style.color]=\"styleConfig()['color'] || 'inherit'\"\n [style.padding.px]=\"padding()\"\n>\n <div class=\"flex min-w-0 flex-1 items-center gap-3\">\n @if (icon()) {\n <mt-avatar\n [icon]=\"icon()\"\n size=\"normal\"\n shape=\"square\"\n [style.--p-avatar-background]=\"iconBackgroundColor()\"\n [style.--p-avatar-color]=\"iconColor()\"\n />\n }\n\n <div class=\"min-w-0\">\n @if (title()) {\n <h3\n class=\"m-0 truncate font-semibold leading-tight\"\n [style.font-size.px]=\"titleFontSize()\"\n >\n {{ title() }}\n </h3>\n }\n\n @if (showSubtitle()) {\n <p\n class=\"m-0 truncate leading-tight\"\n [style.font-size.px]=\"subtitleFontSize()\"\n [style.color]=\"subtitleColor()\"\n >\n {{ subtitleText() }}\n </p>\n }\n </div>\n </div>\n\n @if (breadcrumbs().length > 0) {\n <nav class=\"min-w-0 md:max-w-[60%]\">\n <ol class=\"flex flex-wrap items-center gap-2 text-sm\">\n @for (\n breadcrumb of breadcrumbs();\n track breadcrumb.label + $index;\n let last = $last\n ) {\n <li class=\"flex min-w-0 items-center gap-2\">\n @if (breadcrumb.link) {\n <a\n class=\"max-w-[12rem] truncate text-muted-color transition-colors hover:text-primary\"\n [href]=\"breadcrumb.link\"\n [target]=\"isExternalLink(breadcrumb.link) ? '_blank' : null\"\n [rel]=\"isExternalLink(breadcrumb.link) ? 'noreferrer' : null\"\n >\n {{ breadcrumb.label }}\n </a>\n } @else {\n <span class=\"max-w-[12rem] truncate text-muted-color\">\n {{ breadcrumb.label }}\n </span>\n }\n\n @if (!last) {\n <i class=\"mti mti-chevron-right text-xs text-muted-color\"></i>\n }\n </li>\n }\n </ol>\n </nav>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: Avatar, selector: "mt-avatar", inputs: ["label", "icon", "image", "styleClass", "size", "shape", "badge", "badgeSize", "badgeSeverity"], outputs: ["onImageError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
19020
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: TopbarCardComponent, isStandalone: true, selector: "mt-topbar-card", inputs: { dashboardId: { classPropertyName: "dashboardId", publicName: "dashboardId", isSignal: true, isRequired: true, transformFunction: null }, defaultBreadcrumbLabel: { classPropertyName: "defaultBreadcrumbLabel", publicName: "defaultBreadcrumbLabel", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\r\n class=\"flex h-full flex-col gap-3 md:flex-row md:items-center md:justify-between\"\r\n [style.background-color]=\"\r\n cardStyleConfig()['backgroundColor'] || styleConfig()['background-color']\r\n \"\r\n [style.border-radius.px]=\"cardStyleConfig()['borderRadius']\"\r\n [style.border-color]=\"borderColor()\"\r\n [style.border-style]=\"borderWidth() ? 'solid' : null\"\r\n [style.border-width.px]=\"borderWidth()\"\r\n [style.color]=\"styleConfig()['color'] || 'inherit'\"\r\n [style.padding.px]=\"padding()\"\r\n>\r\n <div class=\"flex min-w-0 flex-1 items-center gap-3\">\r\n @if (icon()) {\r\n <mt-avatar\r\n [icon]=\"icon()\"\r\n size=\"normal\"\r\n shape=\"square\"\r\n [style.--p-avatar-background]=\"iconBackgroundColor()\"\r\n [style.--p-avatar-color]=\"iconColor()\"\r\n />\r\n }\r\n\r\n <div class=\"min-w-0\">\r\n @if (title()) {\r\n <h3\r\n class=\"m-0 truncate font-semibold leading-tight\"\r\n [style.font-size.px]=\"titleFontSize()\"\r\n >\r\n {{ title() }}\r\n </h3>\r\n }\r\n\r\n @if (showSubtitle()) {\r\n <p\r\n class=\"m-0 truncate leading-tight\"\r\n [style.font-size.px]=\"subtitleFontSize()\"\r\n [style.color]=\"subtitleColor()\"\r\n >\r\n {{ subtitleText() }}\r\n </p>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (breadcrumbs().length > 0) {\r\n <nav class=\"min-w-0 md:max-w-[60%]\">\r\n <ol class=\"flex flex-wrap items-center gap-2 text-sm\">\r\n @for (\r\n breadcrumb of breadcrumbs();\r\n track breadcrumb.label + $index;\r\n let last = $last\r\n ) {\r\n <li class=\"flex min-w-0 items-center gap-2\">\r\n @if (breadcrumb.link) {\r\n <a\r\n class=\"max-w-[12rem] truncate text-muted-color transition-colors hover:text-primary\"\r\n [href]=\"breadcrumb.link\"\r\n [target]=\"isExternalLink(breadcrumb.link) ? '_blank' : null\"\r\n [rel]=\"isExternalLink(breadcrumb.link) ? 'noreferrer' : null\"\r\n >\r\n {{ breadcrumb.label }}\r\n </a>\r\n } @else {\r\n <span class=\"max-w-[12rem] truncate text-muted-color\">\r\n {{ breadcrumb.label }}\r\n </span>\r\n }\r\n\r\n @if (!last) {\r\n <i class=\"mti mti-chevron-right text-xs text-muted-color\"></i>\r\n }\r\n </li>\r\n }\r\n </ol>\r\n </nav>\r\n }\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: Avatar, selector: "mt-avatar", inputs: ["label", "icon", "image", "styleClass", "size", "shape", "badge", "badgeSize", "badgeSeverity"], outputs: ["onImageError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
19019
19021
  }
19020
19022
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: TopbarCardComponent, decorators: [{
19021
19023
  type: Component,
19022
- args: [{ selector: 'mt-topbar-card', standalone: true, imports: [CommonModule, Avatar], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"flex h-full flex-col gap-3 md:flex-row md:items-center md:justify-between\"\n [style.background-color]=\"\n cardStyleConfig()['backgroundColor'] || styleConfig()['background-color']\n \"\n [style.border-radius.px]=\"cardStyleConfig()['borderRadius']\"\n [style.border-color]=\"borderColor()\"\n [style.border-style]=\"borderWidth() ? 'solid' : null\"\n [style.border-width.px]=\"borderWidth()\"\n [style.color]=\"styleConfig()['color'] || 'inherit'\"\n [style.padding.px]=\"padding()\"\n>\n <div class=\"flex min-w-0 flex-1 items-center gap-3\">\n @if (icon()) {\n <mt-avatar\n [icon]=\"icon()\"\n size=\"normal\"\n shape=\"square\"\n [style.--p-avatar-background]=\"iconBackgroundColor()\"\n [style.--p-avatar-color]=\"iconColor()\"\n />\n }\n\n <div class=\"min-w-0\">\n @if (title()) {\n <h3\n class=\"m-0 truncate font-semibold leading-tight\"\n [style.font-size.px]=\"titleFontSize()\"\n >\n {{ title() }}\n </h3>\n }\n\n @if (showSubtitle()) {\n <p\n class=\"m-0 truncate leading-tight\"\n [style.font-size.px]=\"subtitleFontSize()\"\n [style.color]=\"subtitleColor()\"\n >\n {{ subtitleText() }}\n </p>\n }\n </div>\n </div>\n\n @if (breadcrumbs().length > 0) {\n <nav class=\"min-w-0 md:max-w-[60%]\">\n <ol class=\"flex flex-wrap items-center gap-2 text-sm\">\n @for (\n breadcrumb of breadcrumbs();\n track breadcrumb.label + $index;\n let last = $last\n ) {\n <li class=\"flex min-w-0 items-center gap-2\">\n @if (breadcrumb.link) {\n <a\n class=\"max-w-[12rem] truncate text-muted-color transition-colors hover:text-primary\"\n [href]=\"breadcrumb.link\"\n [target]=\"isExternalLink(breadcrumb.link) ? '_blank' : null\"\n [rel]=\"isExternalLink(breadcrumb.link) ? 'noreferrer' : null\"\n >\n {{ breadcrumb.label }}\n </a>\n } @else {\n <span class=\"max-w-[12rem] truncate text-muted-color\">\n {{ breadcrumb.label }}\n </span>\n }\n\n @if (!last) {\n <i class=\"mti mti-chevron-right text-xs text-muted-color\"></i>\n }\n </li>\n }\n </ol>\n </nav>\n }\n</div>\n" }]
19024
+ args: [{ selector: 'mt-topbar-card', standalone: true, imports: [CommonModule, Avatar], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\r\n class=\"flex h-full flex-col gap-3 md:flex-row md:items-center md:justify-between\"\r\n [style.background-color]=\"\r\n cardStyleConfig()['backgroundColor'] || styleConfig()['background-color']\r\n \"\r\n [style.border-radius.px]=\"cardStyleConfig()['borderRadius']\"\r\n [style.border-color]=\"borderColor()\"\r\n [style.border-style]=\"borderWidth() ? 'solid' : null\"\r\n [style.border-width.px]=\"borderWidth()\"\r\n [style.color]=\"styleConfig()['color'] || 'inherit'\"\r\n [style.padding.px]=\"padding()\"\r\n>\r\n <div class=\"flex min-w-0 flex-1 items-center gap-3\">\r\n @if (icon()) {\r\n <mt-avatar\r\n [icon]=\"icon()\"\r\n size=\"normal\"\r\n shape=\"square\"\r\n [style.--p-avatar-background]=\"iconBackgroundColor()\"\r\n [style.--p-avatar-color]=\"iconColor()\"\r\n />\r\n }\r\n\r\n <div class=\"min-w-0\">\r\n @if (title()) {\r\n <h3\r\n class=\"m-0 truncate font-semibold leading-tight\"\r\n [style.font-size.px]=\"titleFontSize()\"\r\n >\r\n {{ title() }}\r\n </h3>\r\n }\r\n\r\n @if (showSubtitle()) {\r\n <p\r\n class=\"m-0 truncate leading-tight\"\r\n [style.font-size.px]=\"subtitleFontSize()\"\r\n [style.color]=\"subtitleColor()\"\r\n >\r\n {{ subtitleText() }}\r\n </p>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (breadcrumbs().length > 0) {\r\n <nav class=\"min-w-0 md:max-w-[60%]\">\r\n <ol class=\"flex flex-wrap items-center gap-2 text-sm\">\r\n @for (\r\n breadcrumb of breadcrumbs();\r\n track breadcrumb.label + $index;\r\n let last = $last\r\n ) {\r\n <li class=\"flex min-w-0 items-center gap-2\">\r\n @if (breadcrumb.link) {\r\n <a\r\n class=\"max-w-[12rem] truncate text-muted-color transition-colors hover:text-primary\"\r\n [href]=\"breadcrumb.link\"\r\n [target]=\"isExternalLink(breadcrumb.link) ? '_blank' : null\"\r\n [rel]=\"isExternalLink(breadcrumb.link) ? 'noreferrer' : null\"\r\n >\r\n {{ breadcrumb.label }}\r\n </a>\r\n } @else {\r\n <span class=\"max-w-[12rem] truncate text-muted-color\">\r\n {{ breadcrumb.label }}\r\n </span>\r\n }\r\n\r\n @if (!last) {\r\n <i class=\"mti mti-chevron-right text-xs text-muted-color\"></i>\r\n }\r\n </li>\r\n }\r\n </ol>\r\n </nav>\r\n }\r\n</div>\r\n" }]
19023
19025
  }], propDecorators: { dashboardId: [{ type: i0.Input, args: [{ isSignal: true, alias: "dashboardId", required: true }] }], defaultBreadcrumbLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultBreadcrumbLabel", required: false }] }] } });
19024
19026
 
19025
19027
  class DashboardItem {
@@ -21479,7 +21481,7 @@ class DashboardList {
21479
21481
  this.dashboards.reload();
21480
21482
  }
21481
21483
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DashboardList, deps: [], target: i0.ɵɵFactoryTarget.Component });
21482
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: DashboardList, isStandalone: true, selector: "mt-dashboard-list", inputs: { isPage: { classPropertyName: "isPage", publicName: "isPage", isSignal: true, isRequired: false, transformFunction: null }, pageTitle: { classPropertyName: "pageTitle", publicName: "pageTitle", isSignal: true, isRequired: false, transformFunction: null }, baseRoute: { classPropertyName: "baseRoute", publicName: "baseRoute", isSignal: true, isRequired: false, transformFunction: null }, showCreateButton: { classPropertyName: "showCreateButton", publicName: "showCreateButton", isSignal: true, isRequired: false, transformFunction: null }, showViewButton: { classPropertyName: "showViewButton", publicName: "showViewButton", isSignal: true, isRequired: false, transformFunction: null }, showEditButton: { classPropertyName: "showEditButton", publicName: "showEditButton", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dashboardAction: "dashboardAction", dashboardCreated: "dashboardCreated" }, viewQueries: [{ propertyName: "nameTpl", first: true, predicate: ["nameTpl"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-container *transloco=\"let t; prefix: 'dashboardBuilder.dashboard'\">\r\n <!-- Page mode -->\r\n @if (isPage()) {\r\n <mt-page [title]=\"pageTitle() || t('dashboards')\">\r\n <!-- Header actions -->\r\n <ng-template #headerEnd>\r\n @if (showCreateButton()) {\r\n <mt-button\r\n [label]=\"t('createDashboard')\"\r\n icon=\"general.plus\"\r\n (onClick)=\"openCreateModal()\"\r\n severity=\"primary\"\r\n size=\"small\"\r\n />\r\n }\r\n </ng-template>\r\n\r\n <!-- Content -->\r\n <ng-container *ngTemplateOutlet=\"tableContent\" />\r\n </mt-page>\r\n } @else {\r\n <!-- Non-page mode -->\r\n <div class=\"dashboard-list space-y-3\">\r\n <!-- Header -->\r\n <div class=\"flex justify-between items-center gap-4\">\r\n <h2 class=\"text-2xl font-semibold text-surface-900 dark:text-surface-0\">\r\n {{ t(\"dashboards\") }}\r\n </h2>\r\n\r\n @if (showCreateButton()) {\r\n <mt-button\r\n [label]=\"t('createDashboard')\"\r\n icon=\"general.plus\"\r\n (onClick)=\"openCreateModal()\"\r\n severity=\"primary\"\r\n />\r\n }\r\n </div>\r\n\r\n <!-- Content -->\r\n <ng-container *ngTemplateOutlet=\"tableContent\" />\r\n </div>\r\n }\r\n\r\n <!-- Reusable table content template -->\r\n <ng-template #tableContent>\r\n <!-- Custom cell templates -->\r\n <ng-template #nameTpl let-row>\r\n <span class=\"font-semibold text-surface-900 dark:text-surface-0\">\r\n {{ getDashboardName(row) }}\r\n </span>\r\n </ng-template>\r\n\r\n <!-- Dashboard Table -->\r\n <mt-table\r\n [data]=\"dashboardList()\"\r\n [columns]=\"tableColumns()\"\r\n [rowActions]=\"rowActions()\"\r\n [loading]=\"isLoading()\"\r\n [showFilters]=\"true\"\r\n [generalSearch]=\"true\"\r\n dataKey=\"id\"\r\n storageKey=\"dashboard-list-table\"\r\n />\r\n </ng-template>\r\n</ng-container>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Table, selector: "mt-table", inputs: ["filters", "data", "columns", "rowActions", "size", "showGridlines", "stripedRows", "selectableRows", "clickableRows", "generalSearch", "lazyLocalSearch", "showFilters", "loading", "updating", "lazy", "lazyLocalSort", "lazyTotalRecords", "reorderableColumns", "reorderableRows", "dataKey", "storageKey", "storageMode", "exportable", "exportFilename", "actionShape", "tableLayout", "tabs", "tabsOptionLabel", "tabsOptionValue", "activeTab", "actions", "paginatorPosition", "alwaysShowPaginator", "rowsPerPageOptions", "pageSize", "currentPage", "first", "filterTerm"], outputs: ["selectionChange", "cellChange", "lazyLoad", "columnReorder", "rowReorder", "rowClick", "filtersChange", "activeTabChange", "onTabChange", "pageSizeChange", "currentPageChange", "firstChange", "filterTermChange"] }, { kind: "component", type: Page, selector: "mt-page", inputs: ["backButton", "backButtonIcon", "avatarIcon", "avatarStyle", "avatarShape", "title", "tabs", "activeTab", "contentClass", "contentId"], outputs: ["backButtonClick", "tabChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
21484
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: DashboardList, isStandalone: true, selector: "mt-dashboard-list", inputs: { isPage: { classPropertyName: "isPage", publicName: "isPage", isSignal: true, isRequired: false, transformFunction: null }, pageTitle: { classPropertyName: "pageTitle", publicName: "pageTitle", isSignal: true, isRequired: false, transformFunction: null }, baseRoute: { classPropertyName: "baseRoute", publicName: "baseRoute", isSignal: true, isRequired: false, transformFunction: null }, showCreateButton: { classPropertyName: "showCreateButton", publicName: "showCreateButton", isSignal: true, isRequired: false, transformFunction: null }, showViewButton: { classPropertyName: "showViewButton", publicName: "showViewButton", isSignal: true, isRequired: false, transformFunction: null }, showEditButton: { classPropertyName: "showEditButton", publicName: "showEditButton", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dashboardAction: "dashboardAction", dashboardCreated: "dashboardCreated" }, viewQueries: [{ propertyName: "nameTpl", first: true, predicate: ["nameTpl"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-container *transloco=\"let t; prefix: 'dashboardBuilder.dashboard'\">\r\n <!-- Page mode -->\r\n @if (isPage()) {\r\n <mt-page [title]=\"pageTitle() || t('dashboards')\">\r\n <!-- Header actions -->\r\n <ng-template #headerEnd>\r\n @if (showCreateButton()) {\r\n <mt-button\r\n [label]=\"t('createDashboard')\"\r\n icon=\"general.plus\"\r\n (onClick)=\"openCreateModal()\"\r\n severity=\"primary\"\r\n size=\"small\"\r\n />\r\n }\r\n </ng-template>\r\n\r\n <!-- Content -->\r\n <ng-container *ngTemplateOutlet=\"tableContent\" />\r\n </mt-page>\r\n } @else {\r\n <!-- Non-page mode -->\r\n <div class=\"dashboard-list space-y-3\">\r\n <!-- Header -->\r\n <div class=\"flex justify-between items-center gap-4\">\r\n <h2 class=\"text-2xl font-semibold text-surface-900 dark:text-surface-0\">\r\n {{ t(\"dashboards\") }}\r\n </h2>\r\n\r\n @if (showCreateButton()) {\r\n <mt-button\r\n [label]=\"t('createDashboard')\"\r\n icon=\"general.plus\"\r\n (onClick)=\"openCreateModal()\"\r\n severity=\"primary\"\r\n />\r\n }\r\n </div>\r\n\r\n <!-- Content -->\r\n <ng-container *ngTemplateOutlet=\"tableContent\" />\r\n </div>\r\n }\r\n\r\n <!-- Reusable table content template -->\r\n <ng-template #tableContent>\r\n <!-- Custom cell templates -->\r\n <ng-template #nameTpl let-row>\r\n <span class=\"font-semibold text-surface-900 dark:text-surface-0\">\r\n {{ getDashboardName(row) }}\r\n </span>\r\n </ng-template>\r\n\r\n <!-- Dashboard Table -->\r\n <mt-table\r\n [data]=\"dashboardList()\"\r\n [columns]=\"tableColumns()\"\r\n [rowActions]=\"rowActions()\"\r\n [loading]=\"isLoading()\"\r\n [showFilters]=\"true\"\r\n [generalSearch]=\"true\"\r\n dataKey=\"id\"\r\n storageKey=\"dashboard-list-table\"\r\n />\r\n </ng-template>\r\n</ng-container>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Table, selector: "mt-table", inputs: ["filters", "data", "columns", "rowActions", "size", "showGridlines", "stripedRows", "selectableRows", "clickableRows", "generalSearch", "lazyLocalSearch", "showFilters", "loading", "updating", "lazy", "lazyLocalSort", "lazyTotalRecords", "reorderableColumns", "reorderableRows", "dataKey", "storageKey", "storageMode", "exportable", "exportFilename", "actionShape", "tableLayout", "noCard", "tabs", "tabsOptionLabel", "tabsOptionValue", "activeTab", "actions", "paginatorPosition", "alwaysShowPaginator", "rowsPerPageOptions", "pageSize", "currentPage", "first", "filterTerm"], outputs: ["selectionChange", "cellChange", "lazyLoad", "columnReorder", "rowReorder", "rowClick", "filtersChange", "activeTabChange", "onTabChange", "pageSizeChange", "currentPageChange", "firstChange", "filterTermChange"] }, { kind: "component", type: Page, selector: "mt-page", inputs: ["backButton", "backButtonIcon", "avatarIcon", "avatarStyle", "avatarShape", "title", "tabs", "activeTab", "contentClass", "contentId"], outputs: ["backButtonClick", "tabChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
21483
21485
  }
21484
21486
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DashboardList, decorators: [{
21485
21487
  type: Component,