@masterteam/home-page 0.0.3 → 0.0.5
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/assets/home-page.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-200:oklch(88.5% .062 18.334);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-white:#fff;--spacing:.25rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-semibold:600;--radius-
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-200:oklch(88.5% .062 18.334);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-white:#fff;--spacing:.25rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-semibold:600;--radius-lg:.5rem;--radius-xl:.75rem;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.start{inset-inline-start:var(--spacing)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-auto{margin-top:auto}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.block{display:block}.flex{display:flex}.grid{display:grid}.h-3{height:calc(var(--spacing) * 3)}.h-5{height:calc(var(--spacing) * 5)}.h-10{height:calc(var(--spacing) * 10)}.h-full{height:100%}.min-h-40{min-height:calc(var(--spacing) * 40)}.min-h-\[28rem\]{min-height:28rem}.\!w-\[32rem\]{width:32rem!important}.\!w-\[58rem\]{width:58rem!important}.w-3{width:calc(var(--spacing) * 3)}.w-5{width:calc(var(--spacing) * 5)}.w-10{width:calc(var(--spacing) * 10)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-start{justify-content:flex-start}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-red-200{border-color:var(--color-red-200)}.border-surface{border-color:var(--p-content-border-color)}.bg-red-50{background-color:var(--color-red-50)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-3{padding-block:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.text-primary{color:var(--p-primary-color)}@supports (color:color-mix(in lab, red, red)){.text-primary{color:color-mix(in srgb, var(--p-primary-color) calc(100% * 1), transparent)}}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-surface-500{color:var(--p-surface-500)}@supports (color:color-mix(in lab, red, red)){.text-surface-500{color:color-mix(in srgb, var(--p-surface-500) calc(100% * 1), transparent)}}.text-surface-900{color:var(--p-surface-900)}@supports (color:color-mix(in lab, red, red)){.text-surface-900{color:color-mix(in srgb, var(--p-surface-900) calc(100% * 1), transparent)}}.text-white{color:var(--color-white)}@media (min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.md\:items-center{align-items:center}.md\:justify-end{justify-content:flex-end}.md\:p-5{padding:calc(var(--spacing) * 5)}.md\:px-5{padding-inline:calc(var(--spacing) * 5)}.md\:py-4{padding-block:calc(var(--spacing) * 4)}.md\:pb-5{padding-bottom:calc(var(--spacing) * 5)}.md\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}}@keyframes enter{0%{opacity:var(--p-enter-opacity,1);transform:translate3d(var(--p-enter-translate-x,0), var(--p-enter-translate-y,0), 0) scale3d(var(--p-enter-scale,1), var(--p-enter-scale,1), var(--p-enter-scale,1)) rotate(var(--p-enter-rotate,0))}}@keyframes leave{to{opacity:var(--p-leave-opacity,1);transform:translate3d(var(--p-leave-translate-x,0), var(--p-leave-translate-y,0), 0) scale3d(var(--p-leave-scale,1), var(--p-leave-scale,1), var(--p-leave-scale,1)) rotate(var(--p-leave-rotate,0))}}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}
|
|
@@ -34,10 +34,10 @@ class HomePageApi {
|
|
|
34
34
|
}
|
|
35
35
|
return response.data;
|
|
36
36
|
}
|
|
37
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
38
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
37
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: HomePageApi, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
38
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: HomePageApi, providedIn: 'root' });
|
|
39
39
|
}
|
|
40
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
40
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: HomePageApi, decorators: [{
|
|
41
41
|
type: Injectable,
|
|
42
42
|
args: [{ providedIn: 'root' }]
|
|
43
43
|
}] });
|
|
@@ -92,15 +92,15 @@ const AVAILABLE_WIDGETS = [
|
|
|
92
92
|
];
|
|
93
93
|
class HomePageService {
|
|
94
94
|
api = inject(HomePageApi);
|
|
95
|
-
page = signal(null, ...(ngDevMode ? [{ debugName: "page" }] : []));
|
|
96
|
-
availableWidgets = signal(AVAILABLE_WIDGETS, ...(ngDevMode ? [{ debugName: "availableWidgets" }] : []));
|
|
97
|
-
loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
|
|
98
|
-
saving = signal(false, ...(ngDevMode ? [{ debugName: "saving" }] : []));
|
|
99
|
-
loadingAvailableWidgets = signal(false, ...(ngDevMode ? [{ debugName: "loadingAvailableWidgets" }] : []));
|
|
100
|
-
error = signal(null, ...(ngDevMode ? [{ debugName: "error" }] : []));
|
|
101
|
-
widgetCatalogError = signal(null, ...(ngDevMode ? [{ debugName: "widgetCatalogError" }] : []));
|
|
102
|
-
selectedPage = computed(() => this.page(), ...(ngDevMode ? [{ debugName: "selectedPage" }] : []));
|
|
103
|
-
selectedWidgets = computed(() => this.toWidgets(this.page()?.schema.cards ?? []).sort((a, b) => a.y !== b.y ? a.y - b.y : a.x - b.x), ...(ngDevMode ? [{ debugName: "selectedWidgets" }] : []));
|
|
95
|
+
page = signal(null, ...(ngDevMode ? [{ debugName: "page" }] : /* istanbul ignore next */ []));
|
|
96
|
+
availableWidgets = signal(AVAILABLE_WIDGETS, ...(ngDevMode ? [{ debugName: "availableWidgets" }] : /* istanbul ignore next */ []));
|
|
97
|
+
loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
98
|
+
saving = signal(false, ...(ngDevMode ? [{ debugName: "saving" }] : /* istanbul ignore next */ []));
|
|
99
|
+
loadingAvailableWidgets = signal(false, ...(ngDevMode ? [{ debugName: "loadingAvailableWidgets" }] : /* istanbul ignore next */ []));
|
|
100
|
+
error = signal(null, ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
|
|
101
|
+
widgetCatalogError = signal(null, ...(ngDevMode ? [{ debugName: "widgetCatalogError" }] : /* istanbul ignore next */ []));
|
|
102
|
+
selectedPage = computed(() => this.page(), ...(ngDevMode ? [{ debugName: "selectedPage" }] : /* istanbul ignore next */ []));
|
|
103
|
+
selectedWidgets = computed(() => this.toWidgets(this.page()?.schema.cards ?? []).sort((a, b) => a.y !== b.y ? a.y - b.y : a.x - b.x), ...(ngDevMode ? [{ debugName: "selectedWidgets" }] : /* istanbul ignore next */ []));
|
|
104
104
|
constructor() {
|
|
105
105
|
this.load();
|
|
106
106
|
}
|
|
@@ -302,10 +302,10 @@ class HomePageService {
|
|
|
302
302
|
error?.message ||
|
|
303
303
|
fallbackMessage);
|
|
304
304
|
}
|
|
305
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
306
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
305
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: HomePageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
306
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: HomePageService, providedIn: 'root' });
|
|
307
307
|
}
|
|
308
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
308
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: HomePageService, decorators: [{
|
|
309
309
|
type: Injectable,
|
|
310
310
|
args: [{ providedIn: 'root' }]
|
|
311
311
|
}], ctorParameters: () => [] });
|
|
@@ -372,10 +372,10 @@ class HomePagePageDialog {
|
|
|
372
372
|
close() {
|
|
373
373
|
this.ref.close(false);
|
|
374
374
|
}
|
|
375
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
376
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.
|
|
375
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: HomePagePageDialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
376
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.8", type: HomePagePageDialog, isStandalone: true, selector: "mt-home-page-page-dialog", ngImport: i0, template: "<div [class]=\"[modalService.contentClass, 'p-4']\">\r\n <mt-dynamic-form [formConfig]=\"formConfig\" [formControl]=\"formControl\" />\r\n</div>\r\n\r\n<div [class]=\"modalService.footerClass\">\r\n <mt-button\r\n label=\"Cancel\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"homePageService.saving()\"\r\n (onClick)=\"close()\"\r\n />\r\n <mt-button\r\n label=\"Save\"\r\n severity=\"primary\"\r\n [disabled]=\"formControl.invalid || homePageService.saving()\"\r\n (onClick)=\"save()\"\r\n />\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: DynamicForm, selector: "mt-dynamic-form", inputs: ["formConfig", "forcedHiddenFieldKeys", "preserveForcedHiddenValues", "visibleSectionKeys"], outputs: ["runtimeMessagesChange"] }, { 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
377
377
|
}
|
|
378
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
378
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: HomePagePageDialog, decorators: [{
|
|
379
379
|
type: Component,
|
|
380
380
|
args: [{ selector: 'mt-home-page-page-dialog', standalone: true, imports: [CommonModule, ReactiveFormsModule, DynamicForm, Button], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"[modalService.contentClass, 'p-4']\">\r\n <mt-dynamic-form [formConfig]=\"formConfig\" [formControl]=\"formControl\" />\r\n</div>\r\n\r\n<div [class]=\"modalService.footerClass\">\r\n <mt-button\r\n label=\"Cancel\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"homePageService.saving()\"\r\n (onClick)=\"close()\"\r\n />\r\n <mt-button\r\n label=\"Save\"\r\n severity=\"primary\"\r\n [disabled]=\"formControl.invalid || homePageService.saving()\"\r\n (onClick)=\"save()\"\r\n />\r\n</div>\r\n" }]
|
|
381
381
|
}], ctorParameters: () => [] });
|
|
@@ -400,10 +400,10 @@ class HomePageWidgetDialog {
|
|
|
400
400
|
close() {
|
|
401
401
|
this.ref.close(true);
|
|
402
402
|
}
|
|
403
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
404
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.
|
|
403
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: HomePageWidgetDialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
404
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: HomePageWidgetDialog, isStandalone: true, selector: "mt-home-page-widget-dialog", ngImport: i0, template: "<div [class]=\"[modalService.contentClass, 'p-5']\">\r\n <mt-card>\r\n <ng-template #headless>\r\n <div class=\"grid gap-4 p-4\">\r\n <div class=\"flex flex-wrap items-center justify-between gap-3\">\r\n <p class=\"text-sm text-surface-500\">\r\n Toggle widgets for\r\n <strong class=\"text-surface-900\">{{ pageLabel() }}</strong>\r\n </p>\r\n </div>\r\n\r\n @if (isLoading()) {\r\n <div\r\n class=\"flex min-h-40 items-center justify-center text-sm text-surface-500\"\r\n >\r\n Loading available widgets...\r\n </div>\r\n } @else if (errorMessage()) {\r\n <div\r\n class=\"rounded-xl border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-600\"\r\n >\r\n {{ errorMessage() }}\r\n </div>\r\n } @else if (availableWidgets().length) {\r\n <div class=\"grid gap-3 md:grid-cols-2\">\r\n @for (widget of availableWidgets(); track widget.id) {\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n [label]=\"widget.name\"\r\n [descriptionCard]=\"widget.description\"\r\n [icon]=\"widget.icon || 'chart.bar-chart-01'\"\r\n [ngModel]=\"isEnabled(widget.id)\"\r\n (ngModelChange)=\"onToggle(widget, $event)\"\r\n >\r\n <ng-template #toggleCardBottom>\r\n <div\r\n class=\"mt-4 flex items-center justify-between gap-3 border-t border-surface pt-4 text-xs text-surface-500\"\r\n >\r\n <div class=\"flex items-center gap-2\">\r\n <span\r\n class=\"h-3 w-3 rounded-full\"\r\n [style.background]=\"\r\n widget.color || 'var(--p-primary-color)'\r\n \"\r\n ></span>\r\n <span>{{ widget.category }}</span>\r\n </div>\r\n <span\r\n >{{ widget.chartComponentId }} | {{ widget.layout.w }} x\r\n {{ widget.layout.h }}</span\r\n >\r\n </div>\r\n </ng-template>\r\n </mt-toggle-field>\r\n }\r\n </div>\r\n } @else {\r\n <div\r\n class=\"flex min-h-40 items-center justify-center text-sm text-surface-500\"\r\n >\r\n No widgets are available for this page.\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n</div>\r\n\r\n<div [class]=\"modalService.footerClass\">\r\n <div class=\"text-sm text-surface-500\">\r\n Changes are applied immediately to the selected page.\r\n </div>\r\n\r\n <mt-button label=\"Close\" severity=\"primary\" (onClick)=\"close()\" />\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { 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: "component", type: ToggleField, selector: "mt-toggle-field", inputs: ["label", "inputId", "labelPosition", "placeholder", "readonly", "pInputs", "required", "toggleShape", "size", "icon", "descriptionCard"], outputs: ["onChange"] }, { 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: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
405
405
|
}
|
|
406
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
406
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: HomePageWidgetDialog, decorators: [{
|
|
407
407
|
type: Component,
|
|
408
408
|
args: [{ selector: 'mt-home-page-widget-dialog', standalone: true, imports: [CommonModule, FormsModule, ToggleField, Button, Card], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"[modalService.contentClass, 'p-5']\">\r\n <mt-card>\r\n <ng-template #headless>\r\n <div class=\"grid gap-4 p-4\">\r\n <div class=\"flex flex-wrap items-center justify-between gap-3\">\r\n <p class=\"text-sm text-surface-500\">\r\n Toggle widgets for\r\n <strong class=\"text-surface-900\">{{ pageLabel() }}</strong>\r\n </p>\r\n </div>\r\n\r\n @if (isLoading()) {\r\n <div\r\n class=\"flex min-h-40 items-center justify-center text-sm text-surface-500\"\r\n >\r\n Loading available widgets...\r\n </div>\r\n } @else if (errorMessage()) {\r\n <div\r\n class=\"rounded-xl border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-600\"\r\n >\r\n {{ errorMessage() }}\r\n </div>\r\n } @else if (availableWidgets().length) {\r\n <div class=\"grid gap-3 md:grid-cols-2\">\r\n @for (widget of availableWidgets(); track widget.id) {\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n [label]=\"widget.name\"\r\n [descriptionCard]=\"widget.description\"\r\n [icon]=\"widget.icon || 'chart.bar-chart-01'\"\r\n [ngModel]=\"isEnabled(widget.id)\"\r\n (ngModelChange)=\"onToggle(widget, $event)\"\r\n >\r\n <ng-template #toggleCardBottom>\r\n <div\r\n class=\"mt-4 flex items-center justify-between gap-3 border-t border-surface pt-4 text-xs text-surface-500\"\r\n >\r\n <div class=\"flex items-center gap-2\">\r\n <span\r\n class=\"h-3 w-3 rounded-full\"\r\n [style.background]=\"\r\n widget.color || 'var(--p-primary-color)'\r\n \"\r\n ></span>\r\n <span>{{ widget.category }}</span>\r\n </div>\r\n <span\r\n >{{ widget.chartComponentId }} | {{ widget.layout.w }} x\r\n {{ widget.layout.h }}</span\r\n >\r\n </div>\r\n </ng-template>\r\n </mt-toggle-field>\r\n }\r\n </div>\r\n } @else {\r\n <div\r\n class=\"flex min-h-40 items-center justify-center text-sm text-surface-500\"\r\n >\r\n No widgets are available for this page.\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n</div>\r\n\r\n<div [class]=\"modalService.footerClass\">\r\n <div class=\"text-sm text-surface-500\">\r\n Changes are applied immediately to the selected page.\r\n </div>\r\n\r\n <mt-button label=\"Close\" severity=\"primary\" (onClick)=\"close()\" />\r\n</div>\r\n" }]
|
|
409
409
|
}], ctorParameters: () => [] });
|
|
@@ -413,9 +413,9 @@ const HOME_PAGE_GRID_ROW_HEIGHT = 60;
|
|
|
413
413
|
const HOME_PAGE_GRID_GAP = 10;
|
|
414
414
|
const HOME_PAGE_GRID_MIN_HEIGHT = 500;
|
|
415
415
|
class HomePage {
|
|
416
|
-
welcomeName = input.required(...(ngDevMode ? [{ debugName: "welcomeName" }] : []));
|
|
417
|
-
subtitle = input('Quickly access your workspace essentials.', ...(ngDevMode ? [{ debugName: "subtitle" }] : []));
|
|
418
|
-
isCustomizing = signal(false, ...(ngDevMode ? [{ debugName: "isCustomizing" }] : []));
|
|
416
|
+
welcomeName = input.required(...(ngDevMode ? [{ debugName: "welcomeName" }] : /* istanbul ignore next */ []));
|
|
417
|
+
subtitle = input('Quickly access your workspace essentials.', ...(ngDevMode ? [{ debugName: "subtitle" }] : /* istanbul ignore next */ []));
|
|
418
|
+
isCustomizing = signal(false, ...(ngDevMode ? [{ debugName: "isCustomizing" }] : /* istanbul ignore next */ []));
|
|
419
419
|
modalService = inject(ModalService);
|
|
420
420
|
homePageService = inject(HomePageService);
|
|
421
421
|
gridColumns = HOME_PAGE_GRID_COLUMNS;
|
|
@@ -426,7 +426,7 @@ class HomePage {
|
|
|
426
426
|
errorMessage = this.homePageService.error;
|
|
427
427
|
selectedPage = this.homePageService.selectedPage;
|
|
428
428
|
widgets = this.homePageService.selectedWidgets;
|
|
429
|
-
hasWidgets = computed(() => this.widgets().length > 0, ...(ngDevMode ? [{ debugName: "hasWidgets" }] : []));
|
|
429
|
+
hasWidgets = computed(() => this.widgets().length > 0, ...(ngDevMode ? [{ debugName: "hasWidgets" }] : /* istanbul ignore next */ []));
|
|
430
430
|
previewLayoutHeight = computed(() => {
|
|
431
431
|
const items = this.widgets();
|
|
432
432
|
if (!items.length) {
|
|
@@ -434,7 +434,7 @@ class HomePage {
|
|
|
434
434
|
}
|
|
435
435
|
const maxRow = Math.max(...items.map((item) => item.y + item.rows));
|
|
436
436
|
return `${Math.max(maxRow * HOME_PAGE_GRID_ROW_HEIGHT, HOME_PAGE_GRID_MIN_HEIGHT)}px`;
|
|
437
|
-
}, ...(ngDevMode ? [{ debugName: "previewLayoutHeight" }] : []));
|
|
437
|
+
}, ...(ngDevMode ? [{ debugName: "previewLayoutHeight" }] : /* istanbul ignore next */ []));
|
|
438
438
|
gridOptions = {
|
|
439
439
|
gridType: 'verticalFixed',
|
|
440
440
|
compactType: 'none',
|
|
@@ -510,14 +510,14 @@ class HomePage {
|
|
|
510
510
|
rows: widget.rows ?? 1,
|
|
511
511
|
});
|
|
512
512
|
}
|
|
513
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
514
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: HomePage, isStandalone: true, selector: "mt-home-page", inputs: { welcomeName: { classPropertyName: "welcomeName", publicName: "welcomeName", isSignal: true, isRequired: true, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "block h-full w-full" }, ngImport: i0, template: "<section class=\"h-full w-full p-4 md:p-5\">\r\n <mt-card class=\"block h-full w-full\">\r\n <ng-template #headless>\r\n <div class=\"flex h-full flex-col\">\r\n <div\r\n class=\"grid gap-3 p-4 md:grid-cols-[minmax(0,1fr)_auto] md:items-center md:px-5 md:py-4\"\r\n >\r\n <div class=\"min-w-0 space-y-1\">\r\n <h2 class=\"text-base font-semibold text-surface-900 md:text-lg\">\r\n Welcome,\r\n <span class=\"text-primary\">{{ welcomeName() }}</span>\r\n </h2>\r\n <p class=\"max-w-2xl text-sm text-surface-500\">\r\n {{ subtitle() }}\r\n </p>\r\n </div>\r\n\r\n @if (isCustomizing()) {\r\n <div class=\"flex flex-wrap justify-start gap-2 md:justify-end\">\r\n <mt-button\r\n icon=\"general.edit-03\"\r\n label=\"Edit Page\"\r\n size=\"small\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"isLoading() || isSaving() || !selectedPage()\"\r\n (onClick)=\"openEditPage()\"\r\n />\r\n <mt-button\r\n icon=\"layout.layout-grid-01\"\r\n label=\"Add Widget\"\r\n size=\"small\"\r\n severity=\"primary\"\r\n [disabled]=\"isLoading() || isSaving() || !selectedPage()\"\r\n (onClick)=\"openAddWidget()\"\r\n />\r\n <mt-button\r\n icon=\"general.x-close\"\r\n label=\"Stop Customize\"\r\n size=\"small\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"isSaving()\"\r\n (onClick)=\"stopCustomize()\"\r\n />\r\n </div>\r\n } @else {\r\n <div class=\"flex justify-start md:justify-end\">\r\n <mt-button\r\n icon=\"layout.layout-grid-01\"\r\n label=\"Customize\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"isLoading() || !selectedPage()\"\r\n (onClick)=\"startCustomize()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"flex-1 border-t border-surface px-4 pb-4 pt-4 md:px-5 md:pb-5\"\r\n >\r\n @if (errorMessage() && selectedPage()) {\r\n <div\r\n class=\"mb-4 rounded-xl border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-600\"\r\n >\r\n {{ errorMessage() }}\r\n </div>\r\n }\r\n\r\n @if (isSaving()) {\r\n <div class=\"mb-4 text-sm text-surface-500\">\r\n Saving home page changes...\r\n </div>\r\n }\r\n\r\n @if (isLoading() && !selectedPage()) {\r\n <div\r\n class=\"flex min-h-[28rem] items-center justify-center text-sm text-surface-500\"\r\n >\r\n Loading home page...\r\n </div>\r\n } @else if (errorMessage() && !selectedPage()) {\r\n <div\r\n class=\"flex min-h-[28rem] flex-col items-center justify-center gap-3 text-center\"\r\n >\r\n <p class=\"text-sm text-red-500\">{{ errorMessage() }}</p>\r\n <mt-button\r\n label=\"Retry\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n (onClick)=\"reload()\"\r\n />\r\n </div>\r\n } @else if (hasWidgets()) {\r\n @if (isCustomizing()) {\r\n <gridster\r\n [options]=\"gridOptions\"\r\n class=\"block w-full\"\r\n [style.min-height]=\"previewLayoutHeight()\"\r\n >\r\n @for (widget of widgets(); track widget.key) {\r\n <gridster-item [item]=\"widget\">\r\n <mt-card class=\"block h-full w-full\">\r\n <ng-template #headless>\r\n <div class=\"grid h-full gap-4 p-4\">\r\n <div class=\"flex items-start justify-between gap-3\">\r\n <div class=\"flex items-start gap-3\">\r\n <span\r\n class=\"flex h-10 w-10 items-center justify-center rounded-2xl text-white\"\r\n [style.background]=\"\r\n widget.props.color || 'var(--p-primary-color)'\r\n \"\r\n >\r\n <mt-icon\r\n [icon]=\"\r\n widget.props.icon || 'chart.bar-chart-01'\r\n \"\r\n class=\"h-5 w-5\"\r\n />\r\n </span>\r\n\r\n <div class=\"min-w-0 space-y-1\">\r\n <h3\r\n class=\"truncate text-base font-semibold text-surface-900\"\r\n >\r\n {{ widget.props.name }}\r\n </h3>\r\n <p class=\"text-sm text-surface-500\">\r\n {{ widget.props.description }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n (onClick)=\"removeWidget(widget.widgetId)\"\r\n />\r\n </div>\r\n\r\n <div class=\"grid gap-1 text-sm text-surface-500\">\r\n <span>Type: {{ widget.type }}</span>\r\n <span>\r\n Report:\r\n {{\r\n widget.props.dashboardId ||\r\n widget.props.reportId ||\r\n \"-\"\r\n }}\r\n </span>\r\n <span>\r\n Component:\r\n {{ widget.props.chartComponentId || widget.key }}\r\n </span>\r\n </div>\r\n\r\n <div\r\n class=\"mt-auto flex flex-wrap gap-4 text-sm text-surface-500\"\r\n >\r\n <span\r\n >Position: {{ widget.x }}, {{ widget.y }}</span\r\n >\r\n <span\r\n >Size: {{ widget.cols }} x {{ widget.rows }}</span\r\n >\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n </gridster-item>\r\n }\r\n </gridster>\r\n } @else {\r\n <div\r\n class=\"grid\"\r\n [style.min-height]=\"previewLayoutHeight()\"\r\n [style.grid-template-columns]=\"\r\n 'repeat(' + gridColumns + ', minmax(0, 1fr))'\r\n \"\r\n [style.grid-auto-rows]=\"gridRowHeight + 'px'\"\r\n [style.gap.px]=\"gridGap\"\r\n >\r\n @for (widget of widgets(); track widget.key) {\r\n <div\r\n class=\"h-full\"\r\n [style.grid-column]=\"getPreviewColumn(widget)\"\r\n [style.grid-row]=\"getPreviewRow(widget)\"\r\n >\r\n <mt-card class=\"block h-full w-full\">\r\n <ng-template #headless>\r\n <div class=\"grid h-full gap-4 p-4\">\r\n <div class=\"flex items-start gap-3\">\r\n <span\r\n class=\"flex h-10 w-10 items-center justify-center rounded-2xl text-white\"\r\n [style.background]=\"\r\n widget.props.color || 'var(--p-primary-color)'\r\n \"\r\n >\r\n <mt-icon\r\n [icon]=\"\r\n widget.props.icon || 'chart.bar-chart-01'\r\n \"\r\n class=\"h-5 w-5\"\r\n />\r\n </span>\r\n\r\n <div class=\"min-w-0 space-y-1\">\r\n <h3\r\n class=\"truncate text-base font-semibold text-surface-900\"\r\n >\r\n {{ widget.props.name }}\r\n </h3>\r\n <p class=\"text-sm text-surface-500\">\r\n {{ widget.props.description }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"grid gap-1 text-sm text-surface-500\">\r\n <span>Type: {{ widget.type }}</span>\r\n <span>\r\n Report:\r\n {{\r\n widget.props.dashboardId ||\r\n widget.props.reportId ||\r\n \"-\"\r\n }}\r\n </span>\r\n <span>\r\n Component:\r\n {{ widget.props.chartComponentId || widget.key }}\r\n </span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n </div>\r\n }\r\n </div>\r\n }\r\n } @else {\r\n <div\r\n class=\"flex min-h-[28rem] items-center justify-center text-sm text-surface-500\"\r\n >\r\n @if (isCustomizing()) {\r\n Use Add Widget to place charts in the grid builder.\r\n } @else {\r\n No widgets on this page.\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n</section>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: GridsterModule }, { kind: "component", type: i1$1.GridsterComponent, selector: "gridster", inputs: ["options"] }, { kind: "component", type: i1$1.GridsterItemComponent, selector: "gridster-item", inputs: ["item"], outputs: ["itemInit", "itemChange", "itemResize"] }, { 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: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
513
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: HomePage, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
514
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: HomePage, isStandalone: true, selector: "mt-home-page", inputs: { welcomeName: { classPropertyName: "welcomeName", publicName: "welcomeName", isSignal: true, isRequired: true, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "block h-full w-full" }, ngImport: i0, template: "<section class=\"h-full w-full p-4 md:p-5\">\r\n <mt-card class=\"block h-full w-full\">\r\n <ng-template #headless>\r\n <div class=\"flex h-full flex-col\">\r\n <div\r\n class=\"grid gap-3 p-4 md:grid-cols-[minmax(0,1fr)_auto] md:items-center md:px-5 md:py-4\"\r\n >\r\n <div class=\"min-w-0 space-y-1\">\r\n <h2 class=\"text-base font-semibold text-surface-900 md:text-lg\">\r\n Welcome,\r\n <span class=\"text-primary\">{{ welcomeName() }}</span>\r\n </h2>\r\n <p class=\"max-w-2xl text-sm text-surface-500\">\r\n {{ subtitle() }}\r\n </p>\r\n </div>\r\n\r\n @if (isCustomizing()) {\r\n <div class=\"flex flex-wrap justify-start gap-2 md:justify-end\">\r\n <mt-button\r\n icon=\"general.edit-03\"\r\n label=\"Edit Page\"\r\n size=\"small\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"isLoading() || isSaving() || !selectedPage()\"\r\n (onClick)=\"openEditPage()\"\r\n />\r\n <mt-button\r\n icon=\"layout.layout-grid-01\"\r\n label=\"Add Widget\"\r\n size=\"small\"\r\n severity=\"primary\"\r\n [disabled]=\"isLoading() || isSaving() || !selectedPage()\"\r\n (onClick)=\"openAddWidget()\"\r\n />\r\n <mt-button\r\n icon=\"general.x-close\"\r\n label=\"Stop Customize\"\r\n size=\"small\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"isSaving()\"\r\n (onClick)=\"stopCustomize()\"\r\n />\r\n </div>\r\n } @else {\r\n <div class=\"flex justify-start md:justify-end\">\r\n <mt-button\r\n icon=\"layout.layout-grid-01\"\r\n label=\"Customize\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"isLoading() || !selectedPage()\"\r\n (onClick)=\"startCustomize()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"flex-1 border-t border-surface px-4 pb-4 pt-4 md:px-5 md:pb-5\"\r\n >\r\n @if (errorMessage() && selectedPage()) {\r\n <div\r\n class=\"mb-4 rounded-xl border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-600\"\r\n >\r\n {{ errorMessage() }}\r\n </div>\r\n }\r\n\r\n @if (isSaving()) {\r\n <div class=\"mb-4 text-sm text-surface-500\">\r\n Saving home page changes...\r\n </div>\r\n }\r\n\r\n @if (isLoading() && !selectedPage()) {\r\n <div\r\n class=\"flex min-h-[28rem] items-center justify-center text-sm text-surface-500\"\r\n >\r\n Loading home page...\r\n </div>\r\n } @else if (errorMessage() && !selectedPage()) {\r\n <div\r\n class=\"flex min-h-[28rem] flex-col items-center justify-center gap-3 text-center\"\r\n >\r\n <p class=\"text-sm text-red-500\">{{ errorMessage() }}</p>\r\n <mt-button\r\n label=\"Retry\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n (onClick)=\"reload()\"\r\n />\r\n </div>\r\n } @else if (hasWidgets()) {\r\n @if (isCustomizing()) {\r\n <gridster\r\n [options]=\"gridOptions\"\r\n class=\"block w-full\"\r\n [style.min-height]=\"previewLayoutHeight()\"\r\n >\r\n @for (widget of widgets(); track widget.key) {\r\n <gridster-item [item]=\"widget\">\r\n <mt-card class=\"block h-full w-full\">\r\n <ng-template #headless>\r\n <div class=\"grid h-full gap-4 p-4\">\r\n <div class=\"flex items-start justify-between gap-3\">\r\n <div class=\"flex items-start gap-3\">\r\n <span\r\n class=\"flex h-10 w-10 items-center justify-center rounded-lg text-white\"\r\n [style.background]=\"\r\n widget.props.color || 'var(--p-primary-color)'\r\n \"\r\n >\r\n <mt-icon\r\n [icon]=\"\r\n widget.props.icon || 'chart.bar-chart-01'\r\n \"\r\n class=\"h-5 w-5\"\r\n />\r\n </span>\r\n\r\n <div class=\"min-w-0 space-y-1\">\r\n <h3\r\n class=\"truncate text-base font-semibold text-surface-900\"\r\n >\r\n {{ widget.props.name }}\r\n </h3>\r\n <p class=\"text-sm text-surface-500\">\r\n {{ widget.props.description }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n (onClick)=\"removeWidget(widget.widgetId)\"\r\n />\r\n </div>\r\n\r\n <div class=\"grid gap-1 text-sm text-surface-500\">\r\n <span>Type: {{ widget.type }}</span>\r\n <span>\r\n Report:\r\n {{\r\n widget.props.dashboardId ||\r\n widget.props.reportId ||\r\n \"-\"\r\n }}\r\n </span>\r\n <span>\r\n Component:\r\n {{ widget.props.chartComponentId || widget.key }}\r\n </span>\r\n </div>\r\n\r\n <div\r\n class=\"mt-auto flex flex-wrap gap-4 text-sm text-surface-500\"\r\n >\r\n <span\r\n >Position: {{ widget.x }}, {{ widget.y }}</span\r\n >\r\n <span\r\n >Size: {{ widget.cols }} x {{ widget.rows }}</span\r\n >\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n </gridster-item>\r\n }\r\n </gridster>\r\n } @else {\r\n <div\r\n class=\"grid\"\r\n [style.min-height]=\"previewLayoutHeight()\"\r\n [style.grid-template-columns]=\"\r\n 'repeat(' + gridColumns + ', minmax(0, 1fr))'\r\n \"\r\n [style.grid-auto-rows]=\"gridRowHeight + 'px'\"\r\n [style.gap.px]=\"gridGap\"\r\n >\r\n @for (widget of widgets(); track widget.key) {\r\n <div\r\n class=\"h-full\"\r\n [style.grid-column]=\"getPreviewColumn(widget)\"\r\n [style.grid-row]=\"getPreviewRow(widget)\"\r\n >\r\n <mt-card class=\"block h-full w-full\">\r\n <ng-template #headless>\r\n <div class=\"grid h-full gap-4 p-4\">\r\n <div class=\"flex items-start gap-3\">\r\n <span\r\n class=\"flex h-10 w-10 items-center justify-center rounded-lg text-white\"\r\n [style.background]=\"\r\n widget.props.color || 'var(--p-primary-color)'\r\n \"\r\n >\r\n <mt-icon\r\n [icon]=\"\r\n widget.props.icon || 'chart.bar-chart-01'\r\n \"\r\n class=\"h-5 w-5\"\r\n />\r\n </span>\r\n\r\n <div class=\"min-w-0 space-y-1\">\r\n <h3\r\n class=\"truncate text-base font-semibold text-surface-900\"\r\n >\r\n {{ widget.props.name }}\r\n </h3>\r\n <p class=\"text-sm text-surface-500\">\r\n {{ widget.props.description }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"grid gap-1 text-sm text-surface-500\">\r\n <span>Type: {{ widget.type }}</span>\r\n <span>\r\n Report:\r\n {{\r\n widget.props.dashboardId ||\r\n widget.props.reportId ||\r\n \"-\"\r\n }}\r\n </span>\r\n <span>\r\n Component:\r\n {{ widget.props.chartComponentId || widget.key }}\r\n </span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n </div>\r\n }\r\n </div>\r\n }\r\n } @else {\r\n <div\r\n class=\"flex min-h-[28rem] items-center justify-center text-sm text-surface-500\"\r\n >\r\n @if (isCustomizing()) {\r\n Use Add Widget to place charts in the grid builder.\r\n } @else {\r\n No widgets on this page.\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n</section>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: GridsterModule }, { kind: "component", type: i1$1.GridsterComponent, selector: "gridster", inputs: ["options"] }, { kind: "component", type: i1$1.GridsterItemComponent, selector: "gridster-item", inputs: ["item"], outputs: ["itemInit", "itemChange", "itemResize"] }, { 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: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
515
515
|
}
|
|
516
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
516
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: HomePage, decorators: [{
|
|
517
517
|
type: Component,
|
|
518
518
|
args: [{ selector: 'mt-home-page', standalone: true, imports: [CommonModule, GridsterModule, Button, Card, Icon], changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
519
519
|
class: 'block h-full w-full',
|
|
520
|
-
}, template: "<section class=\"h-full w-full p-4 md:p-5\">\r\n <mt-card class=\"block h-full w-full\">\r\n <ng-template #headless>\r\n <div class=\"flex h-full flex-col\">\r\n <div\r\n class=\"grid gap-3 p-4 md:grid-cols-[minmax(0,1fr)_auto] md:items-center md:px-5 md:py-4\"\r\n >\r\n <div class=\"min-w-0 space-y-1\">\r\n <h2 class=\"text-base font-semibold text-surface-900 md:text-lg\">\r\n Welcome,\r\n <span class=\"text-primary\">{{ welcomeName() }}</span>\r\n </h2>\r\n <p class=\"max-w-2xl text-sm text-surface-500\">\r\n {{ subtitle() }}\r\n </p>\r\n </div>\r\n\r\n @if (isCustomizing()) {\r\n <div class=\"flex flex-wrap justify-start gap-2 md:justify-end\">\r\n <mt-button\r\n icon=\"general.edit-03\"\r\n label=\"Edit Page\"\r\n size=\"small\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"isLoading() || isSaving() || !selectedPage()\"\r\n (onClick)=\"openEditPage()\"\r\n />\r\n <mt-button\r\n icon=\"layout.layout-grid-01\"\r\n label=\"Add Widget\"\r\n size=\"small\"\r\n severity=\"primary\"\r\n [disabled]=\"isLoading() || isSaving() || !selectedPage()\"\r\n (onClick)=\"openAddWidget()\"\r\n />\r\n <mt-button\r\n icon=\"general.x-close\"\r\n label=\"Stop Customize\"\r\n size=\"small\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"isSaving()\"\r\n (onClick)=\"stopCustomize()\"\r\n />\r\n </div>\r\n } @else {\r\n <div class=\"flex justify-start md:justify-end\">\r\n <mt-button\r\n icon=\"layout.layout-grid-01\"\r\n label=\"Customize\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"isLoading() || !selectedPage()\"\r\n (onClick)=\"startCustomize()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"flex-1 border-t border-surface px-4 pb-4 pt-4 md:px-5 md:pb-5\"\r\n >\r\n @if (errorMessage() && selectedPage()) {\r\n <div\r\n class=\"mb-4 rounded-xl border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-600\"\r\n >\r\n {{ errorMessage() }}\r\n </div>\r\n }\r\n\r\n @if (isSaving()) {\r\n <div class=\"mb-4 text-sm text-surface-500\">\r\n Saving home page changes...\r\n </div>\r\n }\r\n\r\n @if (isLoading() && !selectedPage()) {\r\n <div\r\n class=\"flex min-h-[28rem] items-center justify-center text-sm text-surface-500\"\r\n >\r\n Loading home page...\r\n </div>\r\n } @else if (errorMessage() && !selectedPage()) {\r\n <div\r\n class=\"flex min-h-[28rem] flex-col items-center justify-center gap-3 text-center\"\r\n >\r\n <p class=\"text-sm text-red-500\">{{ errorMessage() }}</p>\r\n <mt-button\r\n label=\"Retry\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n (onClick)=\"reload()\"\r\n />\r\n </div>\r\n } @else if (hasWidgets()) {\r\n @if (isCustomizing()) {\r\n <gridster\r\n [options]=\"gridOptions\"\r\n class=\"block w-full\"\r\n [style.min-height]=\"previewLayoutHeight()\"\r\n >\r\n @for (widget of widgets(); track widget.key) {\r\n <gridster-item [item]=\"widget\">\r\n <mt-card class=\"block h-full w-full\">\r\n <ng-template #headless>\r\n <div class=\"grid h-full gap-4 p-4\">\r\n <div class=\"flex items-start justify-between gap-3\">\r\n <div class=\"flex items-start gap-3\">\r\n <span\r\n class=\"flex h-10 w-10 items-center justify-center rounded-2xl text-white\"\r\n [style.background]=\"\r\n widget.props.color || 'var(--p-primary-color)'\r\n \"\r\n >\r\n <mt-icon\r\n [icon]=\"\r\n widget.props.icon || 'chart.bar-chart-01'\r\n \"\r\n class=\"h-5 w-5\"\r\n />\r\n </span>\r\n\r\n <div class=\"min-w-0 space-y-1\">\r\n <h3\r\n class=\"truncate text-base font-semibold text-surface-900\"\r\n >\r\n {{ widget.props.name }}\r\n </h3>\r\n <p class=\"text-sm text-surface-500\">\r\n {{ widget.props.description }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n (onClick)=\"removeWidget(widget.widgetId)\"\r\n />\r\n </div>\r\n\r\n <div class=\"grid gap-1 text-sm text-surface-500\">\r\n <span>Type: {{ widget.type }}</span>\r\n <span>\r\n Report:\r\n {{\r\n widget.props.dashboardId ||\r\n widget.props.reportId ||\r\n \"-\"\r\n }}\r\n </span>\r\n <span>\r\n Component:\r\n {{ widget.props.chartComponentId || widget.key }}\r\n </span>\r\n </div>\r\n\r\n <div\r\n class=\"mt-auto flex flex-wrap gap-4 text-sm text-surface-500\"\r\n >\r\n <span\r\n >Position: {{ widget.x }}, {{ widget.y }}</span\r\n >\r\n <span\r\n >Size: {{ widget.cols }} x {{ widget.rows }}</span\r\n >\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n </gridster-item>\r\n }\r\n </gridster>\r\n } @else {\r\n <div\r\n class=\"grid\"\r\n [style.min-height]=\"previewLayoutHeight()\"\r\n [style.grid-template-columns]=\"\r\n 'repeat(' + gridColumns + ', minmax(0, 1fr))'\r\n \"\r\n [style.grid-auto-rows]=\"gridRowHeight + 'px'\"\r\n [style.gap.px]=\"gridGap\"\r\n >\r\n @for (widget of widgets(); track widget.key) {\r\n <div\r\n class=\"h-full\"\r\n [style.grid-column]=\"getPreviewColumn(widget)\"\r\n [style.grid-row]=\"getPreviewRow(widget)\"\r\n >\r\n <mt-card class=\"block h-full w-full\">\r\n <ng-template #headless>\r\n <div class=\"grid h-full gap-4 p-4\">\r\n <div class=\"flex items-start gap-3\">\r\n <span\r\n class=\"flex h-10 w-10 items-center justify-center rounded-2xl text-white\"\r\n [style.background]=\"\r\n widget.props.color || 'var(--p-primary-color)'\r\n \"\r\n >\r\n <mt-icon\r\n [icon]=\"\r\n widget.props.icon || 'chart.bar-chart-01'\r\n \"\r\n class=\"h-5 w-5\"\r\n />\r\n </span>\r\n\r\n <div class=\"min-w-0 space-y-1\">\r\n <h3\r\n class=\"truncate text-base font-semibold text-surface-900\"\r\n >\r\n {{ widget.props.name }}\r\n </h3>\r\n <p class=\"text-sm text-surface-500\">\r\n {{ widget.props.description }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"grid gap-1 text-sm text-surface-500\">\r\n <span>Type: {{ widget.type }}</span>\r\n <span>\r\n Report:\r\n {{\r\n widget.props.dashboardId ||\r\n widget.props.reportId ||\r\n \"-\"\r\n }}\r\n </span>\r\n <span>\r\n Component:\r\n {{ widget.props.chartComponentId || widget.key }}\r\n </span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n </div>\r\n }\r\n </div>\r\n }\r\n } @else {\r\n <div\r\n class=\"flex min-h-[28rem] items-center justify-center text-sm text-surface-500\"\r\n >\r\n @if (isCustomizing()) {\r\n Use Add Widget to place charts in the grid builder.\r\n } @else {\r\n No widgets on this page.\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n</section>\r\n" }]
|
|
520
|
+
}, template: "<section class=\"h-full w-full p-4 md:p-5\">\r\n <mt-card class=\"block h-full w-full\">\r\n <ng-template #headless>\r\n <div class=\"flex h-full flex-col\">\r\n <div\r\n class=\"grid gap-3 p-4 md:grid-cols-[minmax(0,1fr)_auto] md:items-center md:px-5 md:py-4\"\r\n >\r\n <div class=\"min-w-0 space-y-1\">\r\n <h2 class=\"text-base font-semibold text-surface-900 md:text-lg\">\r\n Welcome,\r\n <span class=\"text-primary\">{{ welcomeName() }}</span>\r\n </h2>\r\n <p class=\"max-w-2xl text-sm text-surface-500\">\r\n {{ subtitle() }}\r\n </p>\r\n </div>\r\n\r\n @if (isCustomizing()) {\r\n <div class=\"flex flex-wrap justify-start gap-2 md:justify-end\">\r\n <mt-button\r\n icon=\"general.edit-03\"\r\n label=\"Edit Page\"\r\n size=\"small\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"isLoading() || isSaving() || !selectedPage()\"\r\n (onClick)=\"openEditPage()\"\r\n />\r\n <mt-button\r\n icon=\"layout.layout-grid-01\"\r\n label=\"Add Widget\"\r\n size=\"small\"\r\n severity=\"primary\"\r\n [disabled]=\"isLoading() || isSaving() || !selectedPage()\"\r\n (onClick)=\"openAddWidget()\"\r\n />\r\n <mt-button\r\n icon=\"general.x-close\"\r\n label=\"Stop Customize\"\r\n size=\"small\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"isSaving()\"\r\n (onClick)=\"stopCustomize()\"\r\n />\r\n </div>\r\n } @else {\r\n <div class=\"flex justify-start md:justify-end\">\r\n <mt-button\r\n icon=\"layout.layout-grid-01\"\r\n label=\"Customize\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"isLoading() || !selectedPage()\"\r\n (onClick)=\"startCustomize()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"flex-1 border-t border-surface px-4 pb-4 pt-4 md:px-5 md:pb-5\"\r\n >\r\n @if (errorMessage() && selectedPage()) {\r\n <div\r\n class=\"mb-4 rounded-xl border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-600\"\r\n >\r\n {{ errorMessage() }}\r\n </div>\r\n }\r\n\r\n @if (isSaving()) {\r\n <div class=\"mb-4 text-sm text-surface-500\">\r\n Saving home page changes...\r\n </div>\r\n }\r\n\r\n @if (isLoading() && !selectedPage()) {\r\n <div\r\n class=\"flex min-h-[28rem] items-center justify-center text-sm text-surface-500\"\r\n >\r\n Loading home page...\r\n </div>\r\n } @else if (errorMessage() && !selectedPage()) {\r\n <div\r\n class=\"flex min-h-[28rem] flex-col items-center justify-center gap-3 text-center\"\r\n >\r\n <p class=\"text-sm text-red-500\">{{ errorMessage() }}</p>\r\n <mt-button\r\n label=\"Retry\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n (onClick)=\"reload()\"\r\n />\r\n </div>\r\n } @else if (hasWidgets()) {\r\n @if (isCustomizing()) {\r\n <gridster\r\n [options]=\"gridOptions\"\r\n class=\"block w-full\"\r\n [style.min-height]=\"previewLayoutHeight()\"\r\n >\r\n @for (widget of widgets(); track widget.key) {\r\n <gridster-item [item]=\"widget\">\r\n <mt-card class=\"block h-full w-full\">\r\n <ng-template #headless>\r\n <div class=\"grid h-full gap-4 p-4\">\r\n <div class=\"flex items-start justify-between gap-3\">\r\n <div class=\"flex items-start gap-3\">\r\n <span\r\n class=\"flex h-10 w-10 items-center justify-center rounded-lg text-white\"\r\n [style.background]=\"\r\n widget.props.color || 'var(--p-primary-color)'\r\n \"\r\n >\r\n <mt-icon\r\n [icon]=\"\r\n widget.props.icon || 'chart.bar-chart-01'\r\n \"\r\n class=\"h-5 w-5\"\r\n />\r\n </span>\r\n\r\n <div class=\"min-w-0 space-y-1\">\r\n <h3\r\n class=\"truncate text-base font-semibold text-surface-900\"\r\n >\r\n {{ widget.props.name }}\r\n </h3>\r\n <p class=\"text-sm text-surface-500\">\r\n {{ widget.props.description }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n (onClick)=\"removeWidget(widget.widgetId)\"\r\n />\r\n </div>\r\n\r\n <div class=\"grid gap-1 text-sm text-surface-500\">\r\n <span>Type: {{ widget.type }}</span>\r\n <span>\r\n Report:\r\n {{\r\n widget.props.dashboardId ||\r\n widget.props.reportId ||\r\n \"-\"\r\n }}\r\n </span>\r\n <span>\r\n Component:\r\n {{ widget.props.chartComponentId || widget.key }}\r\n </span>\r\n </div>\r\n\r\n <div\r\n class=\"mt-auto flex flex-wrap gap-4 text-sm text-surface-500\"\r\n >\r\n <span\r\n >Position: {{ widget.x }}, {{ widget.y }}</span\r\n >\r\n <span\r\n >Size: {{ widget.cols }} x {{ widget.rows }}</span\r\n >\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n </gridster-item>\r\n }\r\n </gridster>\r\n } @else {\r\n <div\r\n class=\"grid\"\r\n [style.min-height]=\"previewLayoutHeight()\"\r\n [style.grid-template-columns]=\"\r\n 'repeat(' + gridColumns + ', minmax(0, 1fr))'\r\n \"\r\n [style.grid-auto-rows]=\"gridRowHeight + 'px'\"\r\n [style.gap.px]=\"gridGap\"\r\n >\r\n @for (widget of widgets(); track widget.key) {\r\n <div\r\n class=\"h-full\"\r\n [style.grid-column]=\"getPreviewColumn(widget)\"\r\n [style.grid-row]=\"getPreviewRow(widget)\"\r\n >\r\n <mt-card class=\"block h-full w-full\">\r\n <ng-template #headless>\r\n <div class=\"grid h-full gap-4 p-4\">\r\n <div class=\"flex items-start gap-3\">\r\n <span\r\n class=\"flex h-10 w-10 items-center justify-center rounded-lg text-white\"\r\n [style.background]=\"\r\n widget.props.color || 'var(--p-primary-color)'\r\n \"\r\n >\r\n <mt-icon\r\n [icon]=\"\r\n widget.props.icon || 'chart.bar-chart-01'\r\n \"\r\n class=\"h-5 w-5\"\r\n />\r\n </span>\r\n\r\n <div class=\"min-w-0 space-y-1\">\r\n <h3\r\n class=\"truncate text-base font-semibold text-surface-900\"\r\n >\r\n {{ widget.props.name }}\r\n </h3>\r\n <p class=\"text-sm text-surface-500\">\r\n {{ widget.props.description }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"grid gap-1 text-sm text-surface-500\">\r\n <span>Type: {{ widget.type }}</span>\r\n <span>\r\n Report:\r\n {{\r\n widget.props.dashboardId ||\r\n widget.props.reportId ||\r\n \"-\"\r\n }}\r\n </span>\r\n <span>\r\n Component:\r\n {{ widget.props.chartComponentId || widget.key }}\r\n </span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n </div>\r\n }\r\n </div>\r\n }\r\n } @else {\r\n <div\r\n class=\"flex min-h-[28rem] items-center justify-center text-sm text-surface-500\"\r\n >\r\n @if (isCustomizing()) {\r\n Use Add Widget to place charts in the grid builder.\r\n } @else {\r\n No widgets on this page.\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n</section>\r\n" }]
|
|
521
521
|
}], propDecorators: { welcomeName: [{ type: i0.Input, args: [{ isSignal: true, alias: "welcomeName", required: true }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }] } });
|
|
522
522
|
|
|
523
523
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-home-page.mjs","sources":["../../../../packages/masterteam/home-page/src/lib/home-page.api.ts","../../../../packages/masterteam/home-page/src/lib/home-page.service.ts","../../../../packages/masterteam/home-page/src/lib/home-page-page-dialog/home-page-page-dialog.ts","../../../../packages/masterteam/home-page/src/lib/home-page-page-dialog/home-page-page-dialog.html","../../../../packages/masterteam/home-page/src/lib/home-page-widget-dialog/home-page-widget-dialog.ts","../../../../packages/masterteam/home-page/src/lib/home-page-widget-dialog/home-page-widget-dialog.html","../../../../packages/masterteam/home-page/src/lib/home-page/home-page.ts","../../../../packages/masterteam/home-page/src/lib/home-page/home-page.html","../../../../packages/masterteam/home-page/src/masterteam-home-page.ts"],"sourcesContent":["import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { map, type Observable } from 'rxjs';\r\nimport type {\r\n AppResponseViewModel,\r\n HomePageDefinitionDto,\r\n HomePageRuntimeDto,\r\n HomePageUpdateRequest,\r\n} from './home-page.models';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class HomePageApi {\r\n private readonly http = inject(HttpClient);\r\n\r\n getRuntime(): Observable<HomePageRuntimeDto> {\r\n return this.http\r\n .get<AppResponseViewModel<HomePageRuntimeDto>>('home/runtime')\r\n .pipe(\r\n map((response) =>\r\n this.unwrapResponse(response, 'Failed to load home page runtime.'),\r\n ),\r\n );\r\n }\r\n\r\n updatePage(\r\n pageId: number,\r\n request: HomePageUpdateRequest,\r\n ): Observable<HomePageDefinitionDto> {\r\n return this.http\r\n .put<\r\n AppResponseViewModel<HomePageDefinitionDto>\r\n >(`home/pages/${pageId}`, request)\r\n .pipe(\r\n map((response) =>\r\n this.unwrapResponse(response, 'Failed to update home page.'),\r\n ),\r\n );\r\n }\r\n\r\n private unwrapResponse<T>(\r\n response: AppResponseViewModel<T>,\r\n fallbackMessage: string,\r\n ): T {\r\n if (response.code === 2) {\r\n throw new Error(\r\n response.errors?.message || response.message || fallbackMessage,\r\n );\r\n }\r\n\r\n return response.data;\r\n }\r\n}\r\n","import { Injectable, computed, inject, signal } from '@angular/core';\r\nimport { finalize } from 'rxjs';\r\nimport { HomePageApi } from './home-page.api';\r\nimport type {\r\n HomePageCardDto,\r\n HomePageDefinitionDto,\r\n HomePagePageDraft,\r\n HomePageUpdateRequest,\r\n HomePageWidgetCatalogItem,\r\n HomePageWidgetInstance,\r\n HomePageWidgetProps,\r\n} from './home-page.models';\r\n\r\nconst DEFAULT_WIDGET_SIZE = { w: 4, h: 4 };\r\nconst DEFAULT_WIDGET_ICON = 'chart.bar-chart-01';\r\nconst AVAILABLE_WIDGETS: HomePageWidgetCatalogItem[] = [\r\n {\r\n id: 'project-status',\r\n name: 'Project Status',\r\n description: 'Overview of project delivery and health.',\r\n icon: 'chart.pie-chart-01',\r\n color: '#12B3C7',\r\n category: 'chart',\r\n layout: DEFAULT_WIDGET_SIZE,\r\n reportId: 'project-status',\r\n chartComponentId: 'project-status',\r\n },\r\n {\r\n id: 'risk-matrix',\r\n name: 'Risk Matrix',\r\n description: 'Snapshot of current risk exposure by priority.',\r\n icon: 'chart.bar-chart-01',\r\n color: '#F59E0B',\r\n category: 'chart',\r\n layout: DEFAULT_WIDGET_SIZE,\r\n reportId: 'risk-matrix',\r\n chartComponentId: 'risk-matrix',\r\n },\r\n {\r\n id: 'budget-utilization',\r\n name: 'Budget Utilization',\r\n description: 'Planned versus consumed budget trend.',\r\n icon: 'finance.wallet-03',\r\n color: '#10B981',\r\n category: 'chart',\r\n layout: { w: 6, h: 4 },\r\n reportId: 'budget-utilization',\r\n chartComponentId: 'budget-utilization',\r\n },\r\n {\r\n id: 'gantt-chart',\r\n name: 'Gantt Chart',\r\n description: 'Project schedule and timeline overview.',\r\n icon: 'layout.layout-grid-01',\r\n color: '#6366F1',\r\n category: 'chart',\r\n layout: { w: 6, h: 4 },\r\n reportId: 'gantt-chart',\r\n chartComponentId: 'gantt-chart',\r\n },\r\n];\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class HomePageService {\r\n private readonly api = inject(HomePageApi);\r\n private readonly page = signal<HomePageDefinitionDto | null>(null);\r\n\r\n readonly availableWidgets =\r\n signal<HomePageWidgetCatalogItem[]>(AVAILABLE_WIDGETS);\r\n readonly loading = signal(false);\r\n readonly saving = signal(false);\r\n readonly loadingAvailableWidgets = signal(false);\r\n readonly error = signal<string | null>(null);\r\n readonly widgetCatalogError = signal<string | null>(null);\r\n\r\n readonly selectedPage = computed(() => this.page());\r\n readonly selectedWidgets = computed(() =>\r\n this.toWidgets(this.page()?.schema.cards ?? []).sort((a, b) =>\r\n a.y !== b.y ? a.y - b.y : a.x - b.x,\r\n ),\r\n );\r\n\r\n constructor() {\r\n this.load();\r\n }\r\n\r\n load(): void {\r\n this.loading.set(true);\r\n this.error.set(null);\r\n\r\n this.api\r\n .getRuntime()\r\n .pipe(finalize(() => this.loading.set(false)))\r\n .subscribe({\r\n next: (runtime) => this.page.set(runtime.selectedPage),\r\n error: (error) =>\r\n this.error.set(this.getMessage(error, 'Failed to load home page.')),\r\n });\r\n }\r\n\r\n reload(): void {\r\n this.load();\r\n }\r\n\r\n loadAvailableWidgets(): void {\r\n this.availableWidgets.set(AVAILABLE_WIDGETS);\r\n this.widgetCatalogError.set(null);\r\n this.loadingAvailableWidgets.set(false);\r\n }\r\n\r\n updatePage(pageId: number, draft: HomePagePageDraft): void {\r\n const page = this.page();\r\n if (!page || page.id !== pageId) {\r\n return;\r\n }\r\n\r\n const name = draft.name.trim() || page.name.display;\r\n const key = draft.key?.trim() || page.key;\r\n\r\n this.savePage(\r\n page.id,\r\n {\r\n key,\r\n name: { en: name, ar: name },\r\n },\r\n 'Failed to update home page.',\r\n );\r\n }\r\n\r\n isWidgetEnabled(widgetId: string): boolean {\r\n return this.selectedWidgets().some(\r\n (widget) => widget.widgetId === widgetId,\r\n );\r\n }\r\n\r\n toggleWidget(widgetId: string, enabled: boolean): void {\r\n if (enabled) {\r\n this.addWidget(widgetId);\r\n return;\r\n }\r\n\r\n this.removeWidget(widgetId);\r\n }\r\n\r\n addWidget(widgetId: string): void {\r\n const page = this.page();\r\n const widget = this.availableWidgets().find((item) => item.id === widgetId);\r\n\r\n if (!page || !widget || this.isWidgetEnabled(widgetId)) {\r\n return;\r\n }\r\n\r\n const cards = [...page.schema.cards];\r\n const layout = this.findNextLayout(widget.layout.w, widget.layout.h, cards);\r\n const key = this.uniqueKey(cards, widget.id);\r\n\r\n this.savePage(\r\n page.id,\r\n {\r\n schema: {\r\n version: page.schema.version,\r\n cards: [\r\n ...cards,\r\n {\r\n key,\r\n type: 'chart',\r\n layout,\r\n config: {},\r\n props: {\r\n name: widget.name,\r\n description: widget.description,\r\n icon: widget.icon,\r\n color: widget.color,\r\n category: widget.category,\r\n widgetId: widget.id,\r\n reportId: widget.reportId,\r\n dashboardId: widget.reportId,\r\n chartComponentId: widget.chartComponentId,\r\n },\r\n },\r\n ],\r\n },\r\n },\r\n 'Failed to add widget to home page.',\r\n );\r\n }\r\n\r\n removeWidget(widgetId: string): void {\r\n const page = this.page();\r\n if (!page) {\r\n return;\r\n }\r\n\r\n this.savePage(\r\n page.id,\r\n {\r\n schema: {\r\n version: page.schema.version,\r\n cards: page.schema.cards.filter(\r\n (card) => this.getWidgetId(card) !== widgetId,\r\n ),\r\n },\r\n },\r\n 'Failed to remove widget from home page.',\r\n );\r\n }\r\n\r\n updateWidgetLayout(\r\n widgetId: string,\r\n layout: Pick<HomePageWidgetInstance, 'x' | 'y' | 'cols' | 'rows'>,\r\n ): void {\r\n const page = this.page();\r\n if (!page) {\r\n return;\r\n }\r\n\r\n this.savePage(\r\n page.id,\r\n {\r\n schema: {\r\n version: page.schema.version,\r\n cards: page.schema.cards.map((card) =>\r\n this.getWidgetId(card) === widgetId\r\n ? {\r\n ...card,\r\n layout: {\r\n x: layout.x,\r\n y: layout.y,\r\n w: layout.cols,\r\n h: layout.rows,\r\n },\r\n }\r\n : card,\r\n ),\r\n },\r\n },\r\n 'Failed to save widget layout.',\r\n );\r\n }\r\n\r\n private savePage(\r\n pageId: number,\r\n request: HomePageUpdateRequest,\r\n fallbackMessage: string,\r\n ): void {\r\n this.error.set(null);\r\n this.saving.set(true);\r\n\r\n this.api\r\n .updatePage(pageId, request)\r\n .pipe(finalize(() => this.saving.set(false)))\r\n .subscribe({\r\n next: (page) => this.page.set(page),\r\n error: (error) =>\r\n this.error.set(this.getMessage(error, fallbackMessage)),\r\n });\r\n }\r\n\r\n private toWidgets(cards: HomePageCardDto[]): HomePageWidgetInstance[] {\r\n return cards.map((card) => {\r\n const props = (card.props ?? {}) as HomePageWidgetProps;\r\n\r\n return {\r\n widgetId: this.getWidgetId(card),\r\n key: card.key,\r\n type: card.type,\r\n x: card.layout?.x ?? 0,\r\n y: card.layout?.y ?? 0,\r\n cols: card.layout?.w ?? DEFAULT_WIDGET_SIZE.w,\r\n rows: card.layout?.h ?? DEFAULT_WIDGET_SIZE.h,\r\n config: card.config,\r\n props: {\r\n ...props,\r\n name: props.name || card.key,\r\n description:\r\n props.description ||\r\n `Chart component ${props.chartComponentId || card.key}`,\r\n icon: props.icon || DEFAULT_WIDGET_ICON,\r\n color: props.color || null,\r\n widgetId: props.widgetId || card.key,\r\n reportId: props.reportId ?? props.dashboardId ?? null,\r\n dashboardId: props.dashboardId ?? props.reportId ?? null,\r\n chartComponentId: props.chartComponentId || null,\r\n },\r\n permissions: card.permissions,\r\n style: card.style,\r\n };\r\n });\r\n }\r\n\r\n private getWidgetId(card: HomePageCardDto): string {\r\n const props = (card.props ?? {}) as HomePageWidgetProps;\r\n if (props.widgetId) {\r\n return props.widgetId;\r\n }\r\n\r\n const reportId = props.reportId ?? props.dashboardId;\r\n const chartComponentId = props.chartComponentId;\r\n\r\n return reportId && chartComponentId\r\n ? `report:${reportId}:${chartComponentId}`\r\n : card.key;\r\n }\r\n\r\n private findNextLayout(w: number, h: number, cards: HomePageCardDto[]) {\r\n let y = 0;\r\n\r\n while (true) {\r\n for (let x = 0; x <= 12 - w; x += 1) {\r\n const hasOverlap = cards.some((card) => {\r\n const current = card.layout || {\r\n x: 0,\r\n y: 0,\r\n w: DEFAULT_WIDGET_SIZE.w,\r\n h: DEFAULT_WIDGET_SIZE.h,\r\n };\r\n\r\n return !(\r\n current.x + current.w <= x ||\r\n x + w <= current.x ||\r\n current.y + current.h <= y ||\r\n y + h <= current.y\r\n );\r\n });\r\n\r\n if (!hasOverlap) {\r\n return { x, y, w, h };\r\n }\r\n }\r\n\r\n y += 1;\r\n }\r\n }\r\n\r\n private uniqueKey(cards: HomePageCardDto[], base: string): string {\r\n let key = base;\r\n let index = 2;\r\n\r\n while (cards.some((card) => card.key === key)) {\r\n key = `${base}-${index}`;\r\n index += 1;\r\n }\r\n\r\n return key;\r\n }\r\n\r\n private getMessage(error: unknown, fallbackMessage: string): string {\r\n return (\r\n (error as { error?: { message?: string } })?.error?.message ||\r\n (error as { message?: string })?.message ||\r\n fallbackMessage\r\n );\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { DynamicFormConfig, ValidatorConfig } from '@masterteam/components';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { DynamicForm } from '@masterteam/forms/dynamic-form';\r\nimport { HomePageService } from '../home-page.service';\r\n\r\n@Component({\r\n selector: 'mt-home-page-page-dialog',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, DynamicForm, Button],\r\n templateUrl: './home-page-page-dialog.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class HomePagePageDialog {\r\n protected readonly modalService = inject(ModalService);\r\n private readonly ref = inject(ModalRef);\r\n protected readonly homePageService = inject(HomePageService);\r\n\r\n readonly formControl = new FormControl<Record<string, unknown>>(\r\n {},\r\n { nonNullable: true },\r\n );\r\n\r\n readonly formConfig: DynamicFormConfig = {\r\n sections: [\r\n {\r\n key: 'page-form',\r\n type: 'none',\r\n columns: 12,\r\n order: 1,\r\n fields: [\r\n {\r\n key: 'name',\r\n label: 'Page Name',\r\n type: 'text',\r\n placeholder: 'Operations Home',\r\n validators: [ValidatorConfig.required()],\r\n colSpan: 12,\r\n order: 1,\r\n },\r\n {\r\n key: 'key',\r\n label: 'Page Key',\r\n type: 'text',\r\n placeholder: 'operations-home',\r\n colSpan: 12,\r\n order: 2,\r\n },\r\n ],\r\n },\r\n ],\r\n };\r\n\r\n constructor() {\r\n const page = this.homePageService.selectedPage();\r\n if (!page) {\r\n return;\r\n }\r\n\r\n this.formControl.patchValue({\r\n name: page.name.display,\r\n key: page.key,\r\n });\r\n }\r\n\r\n save(): void {\r\n if (this.formControl.invalid) {\r\n return;\r\n }\r\n\r\n const page = this.homePageService.selectedPage();\r\n if (!page) {\r\n return;\r\n }\r\n\r\n const value = this.formControl.getRawValue();\r\n this.homePageService.updatePage(page.id, {\r\n name: String(value['name'] ?? ''),\r\n key: String(value['key'] ?? ''),\r\n });\r\n this.ref.close(true);\r\n }\r\n\r\n close(): void {\r\n this.ref.close(false);\r\n }\r\n}\r\n","<div [class]=\"[modalService.contentClass, 'p-4']\">\r\n <mt-dynamic-form [formConfig]=\"formConfig\" [formControl]=\"formControl\" />\r\n</div>\r\n\r\n<div [class]=\"modalService.footerClass\">\r\n <mt-button\r\n label=\"Cancel\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"homePageService.saving()\"\r\n (onClick)=\"close()\"\r\n />\r\n <mt-button\r\n label=\"Save\"\r\n severity=\"primary\"\r\n [disabled]=\"formControl.invalid || homePageService.saving()\"\r\n (onClick)=\"save()\"\r\n />\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport type { HomePageWidgetCatalogItem } from '../home-page.models';\r\nimport { HomePageService } from '../home-page.service';\r\n\r\n@Component({\r\n selector: 'mt-home-page-widget-dialog',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, ToggleField, Button, Card],\r\n templateUrl: './home-page-widget-dialog.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class HomePageWidgetDialog {\r\n protected readonly modalService = inject(ModalService);\r\n private readonly ref = inject(ModalRef);\r\n protected readonly homePageService = inject(HomePageService);\r\n\r\n readonly pageLabel = () =>\r\n this.homePageService.selectedPage()?.name.display ?? 'Home';\r\n\r\n constructor() {\r\n this.homePageService.loadAvailableWidgets();\r\n }\r\n\r\n readonly availableWidgets = this.homePageService.availableWidgets;\r\n readonly isLoading = this.homePageService.loadingAvailableWidgets;\r\n readonly errorMessage = this.homePageService.widgetCatalogError;\r\n\r\n isEnabled(widgetId: string): boolean {\r\n return this.homePageService.isWidgetEnabled(widgetId);\r\n }\r\n\r\n onToggle(widget: HomePageWidgetCatalogItem, value: boolean | null): void {\r\n this.homePageService.toggleWidget(widget.id, !!value);\r\n }\r\n\r\n close(): void {\r\n this.ref.close(true);\r\n }\r\n}\r\n","<div [class]=\"[modalService.contentClass, 'p-5']\">\r\n <mt-card>\r\n <ng-template #headless>\r\n <div class=\"grid gap-4 p-4\">\r\n <div class=\"flex flex-wrap items-center justify-between gap-3\">\r\n <p class=\"text-sm text-surface-500\">\r\n Toggle widgets for\r\n <strong class=\"text-surface-900\">{{ pageLabel() }}</strong>\r\n </p>\r\n </div>\r\n\r\n @if (isLoading()) {\r\n <div\r\n class=\"flex min-h-40 items-center justify-center text-sm text-surface-500\"\r\n >\r\n Loading available widgets...\r\n </div>\r\n } @else if (errorMessage()) {\r\n <div\r\n class=\"rounded-xl border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-600\"\r\n >\r\n {{ errorMessage() }}\r\n </div>\r\n } @else if (availableWidgets().length) {\r\n <div class=\"grid gap-3 md:grid-cols-2\">\r\n @for (widget of availableWidgets(); track widget.id) {\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n [label]=\"widget.name\"\r\n [descriptionCard]=\"widget.description\"\r\n [icon]=\"widget.icon || 'chart.bar-chart-01'\"\r\n [ngModel]=\"isEnabled(widget.id)\"\r\n (ngModelChange)=\"onToggle(widget, $event)\"\r\n >\r\n <ng-template #toggleCardBottom>\r\n <div\r\n class=\"mt-4 flex items-center justify-between gap-3 border-t border-surface pt-4 text-xs text-surface-500\"\r\n >\r\n <div class=\"flex items-center gap-2\">\r\n <span\r\n class=\"h-3 w-3 rounded-full\"\r\n [style.background]=\"\r\n widget.color || 'var(--p-primary-color)'\r\n \"\r\n ></span>\r\n <span>{{ widget.category }}</span>\r\n </div>\r\n <span\r\n >{{ widget.chartComponentId }} | {{ widget.layout.w }} x\r\n {{ widget.layout.h }}</span\r\n >\r\n </div>\r\n </ng-template>\r\n </mt-toggle-field>\r\n }\r\n </div>\r\n } @else {\r\n <div\r\n class=\"flex min-h-40 items-center justify-center text-sm text-surface-500\"\r\n >\r\n No widgets are available for this page.\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n</div>\r\n\r\n<div [class]=\"modalService.footerClass\">\r\n <div class=\"text-sm text-surface-500\">\r\n Changes are applied immediately to the selected page.\r\n </div>\r\n\r\n <mt-button label=\"Close\" severity=\"primary\" (onClick)=\"close()\" />\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport {\r\n GridsterConfig,\r\n GridsterItem,\r\n GridsterModule,\r\n} from 'angular-gridster2';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Icon } from '@masterteam/icons';\r\nimport type { HomePageWidgetInstance } from '../home-page.models';\r\nimport { HomePagePageDialog } from '../home-page-page-dialog/home-page-page-dialog';\r\nimport { HomePageService } from '../home-page.service';\r\nimport { HomePageWidgetDialog } from '../home-page-widget-dialog/home-page-widget-dialog';\r\n\r\nconst HOME_PAGE_GRID_COLUMNS = 12;\r\nconst HOME_PAGE_GRID_ROW_HEIGHT = 60;\r\nconst HOME_PAGE_GRID_GAP = 10;\r\nconst HOME_PAGE_GRID_MIN_HEIGHT = 500;\r\n\r\n@Component({\r\n selector: 'mt-home-page',\r\n standalone: true,\r\n imports: [CommonModule, GridsterModule, Button, Card, Icon],\r\n templateUrl: './home-page.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'block h-full w-full',\r\n },\r\n})\r\nexport default class HomePage {\r\n readonly welcomeName = input.required<string>();\r\n readonly subtitle = input('Quickly access your workspace essentials.');\r\n readonly isCustomizing = signal(false);\r\n\r\n private readonly modalService = inject(ModalService);\r\n protected readonly homePageService = inject(HomePageService);\r\n\r\n readonly gridColumns = HOME_PAGE_GRID_COLUMNS;\r\n readonly gridGap = HOME_PAGE_GRID_GAP;\r\n readonly gridRowHeight = HOME_PAGE_GRID_ROW_HEIGHT;\r\n readonly isLoading = this.homePageService.loading;\r\n readonly isSaving = this.homePageService.saving;\r\n readonly errorMessage = this.homePageService.error;\r\n readonly selectedPage = this.homePageService.selectedPage;\r\n readonly widgets = this.homePageService.selectedWidgets;\r\n readonly hasWidgets = computed(() => this.widgets().length > 0);\r\n readonly previewLayoutHeight = computed(() => {\r\n const items = this.widgets();\r\n if (!items.length) {\r\n return `${HOME_PAGE_GRID_MIN_HEIGHT}px`;\r\n }\r\n\r\n const maxRow = Math.max(...items.map((item) => item.y + item.rows));\r\n return `${Math.max(maxRow * HOME_PAGE_GRID_ROW_HEIGHT, HOME_PAGE_GRID_MIN_HEIGHT)}px`;\r\n });\r\n\r\n readonly gridOptions: GridsterConfig = {\r\n gridType: 'verticalFixed',\r\n compactType: 'none',\r\n draggable: {\r\n enabled: true,\r\n ignoreContent: false,\r\n stop: (item) => this.onWidgetLayoutChange(item),\r\n },\r\n resizable: {\r\n enabled: true,\r\n stop: (item) => this.onWidgetLayoutChange(item),\r\n },\r\n pushItems: true,\r\n swap: true,\r\n displayGrid: 'always',\r\n minCols: HOME_PAGE_GRID_COLUMNS,\r\n maxCols: HOME_PAGE_GRID_COLUMNS,\r\n minRows: 6,\r\n maxRows: 1000,\r\n fixedRowHeight: HOME_PAGE_GRID_ROW_HEIGHT,\r\n margin: HOME_PAGE_GRID_GAP,\r\n outerMargin: false,\r\n mobileBreakpoint: 0,\r\n useTransformPositioning: true,\r\n };\r\n\r\n startCustomize(): void {\r\n this.isCustomizing.set(true);\r\n }\r\n\r\n stopCustomize(): void {\r\n this.isCustomizing.set(false);\r\n }\r\n\r\n openEditPage(): void {\r\n if (!this.selectedPage()) {\r\n return;\r\n }\r\n\r\n this.modalService.openModal(HomePagePageDialog, 'dialog', {\r\n header: 'Edit Page',\r\n styleClass: '!w-[32rem]',\r\n modal: true,\r\n closable: true,\r\n });\r\n }\r\n\r\n openAddWidget(): void {\r\n if (!this.selectedPage()) {\r\n return;\r\n }\r\n\r\n this.homePageService.loadAvailableWidgets();\r\n this.modalService.openModal(HomePageWidgetDialog, 'dialog', {\r\n header: 'Add Widget',\r\n styleClass: '!w-[58rem]',\r\n modal: true,\r\n closable: true,\r\n });\r\n }\r\n\r\n removeWidget(widgetId: string): void {\r\n this.homePageService.removeWidget(widgetId);\r\n }\r\n\r\n reload(): void {\r\n this.homePageService.reload();\r\n }\r\n\r\n getPreviewColumn(widget: HomePageWidgetInstance): string {\r\n return `${widget.x + 1} / span ${widget.cols}`;\r\n }\r\n\r\n getPreviewRow(widget: HomePageWidgetInstance): string {\r\n return `${widget.y + 1} / span ${widget.rows}`;\r\n }\r\n\r\n private onWidgetLayoutChange(item: GridsterItem): void {\r\n const widget = item as HomePageWidgetInstance;\r\n this.homePageService.updateWidgetLayout(widget.widgetId, {\r\n x: widget.x ?? 0,\r\n y: widget.y ?? 0,\r\n cols: widget.cols ?? 1,\r\n rows: widget.rows ?? 1,\r\n });\r\n }\r\n}\r\n","<section class=\"h-full w-full p-4 md:p-5\">\r\n <mt-card class=\"block h-full w-full\">\r\n <ng-template #headless>\r\n <div class=\"flex h-full flex-col\">\r\n <div\r\n class=\"grid gap-3 p-4 md:grid-cols-[minmax(0,1fr)_auto] md:items-center md:px-5 md:py-4\"\r\n >\r\n <div class=\"min-w-0 space-y-1\">\r\n <h2 class=\"text-base font-semibold text-surface-900 md:text-lg\">\r\n Welcome,\r\n <span class=\"text-primary\">{{ welcomeName() }}</span>\r\n </h2>\r\n <p class=\"max-w-2xl text-sm text-surface-500\">\r\n {{ subtitle() }}\r\n </p>\r\n </div>\r\n\r\n @if (isCustomizing()) {\r\n <div class=\"flex flex-wrap justify-start gap-2 md:justify-end\">\r\n <mt-button\r\n icon=\"general.edit-03\"\r\n label=\"Edit Page\"\r\n size=\"small\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"isLoading() || isSaving() || !selectedPage()\"\r\n (onClick)=\"openEditPage()\"\r\n />\r\n <mt-button\r\n icon=\"layout.layout-grid-01\"\r\n label=\"Add Widget\"\r\n size=\"small\"\r\n severity=\"primary\"\r\n [disabled]=\"isLoading() || isSaving() || !selectedPage()\"\r\n (onClick)=\"openAddWidget()\"\r\n />\r\n <mt-button\r\n icon=\"general.x-close\"\r\n label=\"Stop Customize\"\r\n size=\"small\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"isSaving()\"\r\n (onClick)=\"stopCustomize()\"\r\n />\r\n </div>\r\n } @else {\r\n <div class=\"flex justify-start md:justify-end\">\r\n <mt-button\r\n icon=\"layout.layout-grid-01\"\r\n label=\"Customize\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"isLoading() || !selectedPage()\"\r\n (onClick)=\"startCustomize()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"flex-1 border-t border-surface px-4 pb-4 pt-4 md:px-5 md:pb-5\"\r\n >\r\n @if (errorMessage() && selectedPage()) {\r\n <div\r\n class=\"mb-4 rounded-xl border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-600\"\r\n >\r\n {{ errorMessage() }}\r\n </div>\r\n }\r\n\r\n @if (isSaving()) {\r\n <div class=\"mb-4 text-sm text-surface-500\">\r\n Saving home page changes...\r\n </div>\r\n }\r\n\r\n @if (isLoading() && !selectedPage()) {\r\n <div\r\n class=\"flex min-h-[28rem] items-center justify-center text-sm text-surface-500\"\r\n >\r\n Loading home page...\r\n </div>\r\n } @else if (errorMessage() && !selectedPage()) {\r\n <div\r\n class=\"flex min-h-[28rem] flex-col items-center justify-center gap-3 text-center\"\r\n >\r\n <p class=\"text-sm text-red-500\">{{ errorMessage() }}</p>\r\n <mt-button\r\n label=\"Retry\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n (onClick)=\"reload()\"\r\n />\r\n </div>\r\n } @else if (hasWidgets()) {\r\n @if (isCustomizing()) {\r\n <gridster\r\n [options]=\"gridOptions\"\r\n class=\"block w-full\"\r\n [style.min-height]=\"previewLayoutHeight()\"\r\n >\r\n @for (widget of widgets(); track widget.key) {\r\n <gridster-item [item]=\"widget\">\r\n <mt-card class=\"block h-full w-full\">\r\n <ng-template #headless>\r\n <div class=\"grid h-full gap-4 p-4\">\r\n <div class=\"flex items-start justify-between gap-3\">\r\n <div class=\"flex items-start gap-3\">\r\n <span\r\n class=\"flex h-10 w-10 items-center justify-center rounded-2xl text-white\"\r\n [style.background]=\"\r\n widget.props.color || 'var(--p-primary-color)'\r\n \"\r\n >\r\n <mt-icon\r\n [icon]=\"\r\n widget.props.icon || 'chart.bar-chart-01'\r\n \"\r\n class=\"h-5 w-5\"\r\n />\r\n </span>\r\n\r\n <div class=\"min-w-0 space-y-1\">\r\n <h3\r\n class=\"truncate text-base font-semibold text-surface-900\"\r\n >\r\n {{ widget.props.name }}\r\n </h3>\r\n <p class=\"text-sm text-surface-500\">\r\n {{ widget.props.description }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n (onClick)=\"removeWidget(widget.widgetId)\"\r\n />\r\n </div>\r\n\r\n <div class=\"grid gap-1 text-sm text-surface-500\">\r\n <span>Type: {{ widget.type }}</span>\r\n <span>\r\n Report:\r\n {{\r\n widget.props.dashboardId ||\r\n widget.props.reportId ||\r\n \"-\"\r\n }}\r\n </span>\r\n <span>\r\n Component:\r\n {{ widget.props.chartComponentId || widget.key }}\r\n </span>\r\n </div>\r\n\r\n <div\r\n class=\"mt-auto flex flex-wrap gap-4 text-sm text-surface-500\"\r\n >\r\n <span\r\n >Position: {{ widget.x }}, {{ widget.y }}</span\r\n >\r\n <span\r\n >Size: {{ widget.cols }} x {{ widget.rows }}</span\r\n >\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n </gridster-item>\r\n }\r\n </gridster>\r\n } @else {\r\n <div\r\n class=\"grid\"\r\n [style.min-height]=\"previewLayoutHeight()\"\r\n [style.grid-template-columns]=\"\r\n 'repeat(' + gridColumns + ', minmax(0, 1fr))'\r\n \"\r\n [style.grid-auto-rows]=\"gridRowHeight + 'px'\"\r\n [style.gap.px]=\"gridGap\"\r\n >\r\n @for (widget of widgets(); track widget.key) {\r\n <div\r\n class=\"h-full\"\r\n [style.grid-column]=\"getPreviewColumn(widget)\"\r\n [style.grid-row]=\"getPreviewRow(widget)\"\r\n >\r\n <mt-card class=\"block h-full w-full\">\r\n <ng-template #headless>\r\n <div class=\"grid h-full gap-4 p-4\">\r\n <div class=\"flex items-start gap-3\">\r\n <span\r\n class=\"flex h-10 w-10 items-center justify-center rounded-2xl text-white\"\r\n [style.background]=\"\r\n widget.props.color || 'var(--p-primary-color)'\r\n \"\r\n >\r\n <mt-icon\r\n [icon]=\"\r\n widget.props.icon || 'chart.bar-chart-01'\r\n \"\r\n class=\"h-5 w-5\"\r\n />\r\n </span>\r\n\r\n <div class=\"min-w-0 space-y-1\">\r\n <h3\r\n class=\"truncate text-base font-semibold text-surface-900\"\r\n >\r\n {{ widget.props.name }}\r\n </h3>\r\n <p class=\"text-sm text-surface-500\">\r\n {{ widget.props.description }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"grid gap-1 text-sm text-surface-500\">\r\n <span>Type: {{ widget.type }}</span>\r\n <span>\r\n Report:\r\n {{\r\n widget.props.dashboardId ||\r\n widget.props.reportId ||\r\n \"-\"\r\n }}\r\n </span>\r\n <span>\r\n Component:\r\n {{ widget.props.chartComponentId || widget.key }}\r\n </span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n </div>\r\n }\r\n </div>\r\n }\r\n } @else {\r\n <div\r\n class=\"flex min-h-[28rem] items-center justify-center text-sm text-surface-500\"\r\n >\r\n @if (isCustomizing()) {\r\n Use Add Widget to place charts in the grid builder.\r\n } @else {\r\n No widgets on this page.\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n</section>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"masterteam-home-page.mjs","sources":["../../../../packages/masterteam/home-page/src/lib/home-page.api.ts","../../../../packages/masterteam/home-page/src/lib/home-page.service.ts","../../../../packages/masterteam/home-page/src/lib/home-page-page-dialog/home-page-page-dialog.ts","../../../../packages/masterteam/home-page/src/lib/home-page-page-dialog/home-page-page-dialog.html","../../../../packages/masterteam/home-page/src/lib/home-page-widget-dialog/home-page-widget-dialog.ts","../../../../packages/masterteam/home-page/src/lib/home-page-widget-dialog/home-page-widget-dialog.html","../../../../packages/masterteam/home-page/src/lib/home-page/home-page.ts","../../../../packages/masterteam/home-page/src/lib/home-page/home-page.html","../../../../packages/masterteam/home-page/src/masterteam-home-page.ts"],"sourcesContent":["import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { map, type Observable } from 'rxjs';\r\nimport type {\r\n AppResponseViewModel,\r\n HomePageDefinitionDto,\r\n HomePageRuntimeDto,\r\n HomePageUpdateRequest,\r\n} from './home-page.models';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class HomePageApi {\r\n private readonly http = inject(HttpClient);\r\n\r\n getRuntime(): Observable<HomePageRuntimeDto> {\r\n return this.http\r\n .get<AppResponseViewModel<HomePageRuntimeDto>>('home/runtime')\r\n .pipe(\r\n map((response) =>\r\n this.unwrapResponse(response, 'Failed to load home page runtime.'),\r\n ),\r\n );\r\n }\r\n\r\n updatePage(\r\n pageId: number,\r\n request: HomePageUpdateRequest,\r\n ): Observable<HomePageDefinitionDto> {\r\n return this.http\r\n .put<\r\n AppResponseViewModel<HomePageDefinitionDto>\r\n >(`home/pages/${pageId}`, request)\r\n .pipe(\r\n map((response) =>\r\n this.unwrapResponse(response, 'Failed to update home page.'),\r\n ),\r\n );\r\n }\r\n\r\n private unwrapResponse<T>(\r\n response: AppResponseViewModel<T>,\r\n fallbackMessage: string,\r\n ): T {\r\n if (response.code === 2) {\r\n throw new Error(\r\n response.errors?.message || response.message || fallbackMessage,\r\n );\r\n }\r\n\r\n return response.data;\r\n }\r\n}\r\n","import { Injectable, computed, inject, signal } from '@angular/core';\r\nimport { finalize } from 'rxjs';\r\nimport { HomePageApi } from './home-page.api';\r\nimport type {\r\n HomePageCardDto,\r\n HomePageDefinitionDto,\r\n HomePagePageDraft,\r\n HomePageUpdateRequest,\r\n HomePageWidgetCatalogItem,\r\n HomePageWidgetInstance,\r\n HomePageWidgetProps,\r\n} from './home-page.models';\r\n\r\nconst DEFAULT_WIDGET_SIZE = { w: 4, h: 4 };\r\nconst DEFAULT_WIDGET_ICON = 'chart.bar-chart-01';\r\nconst AVAILABLE_WIDGETS: HomePageWidgetCatalogItem[] = [\r\n {\r\n id: 'project-status',\r\n name: 'Project Status',\r\n description: 'Overview of project delivery and health.',\r\n icon: 'chart.pie-chart-01',\r\n color: '#12B3C7',\r\n category: 'chart',\r\n layout: DEFAULT_WIDGET_SIZE,\r\n reportId: 'project-status',\r\n chartComponentId: 'project-status',\r\n },\r\n {\r\n id: 'risk-matrix',\r\n name: 'Risk Matrix',\r\n description: 'Snapshot of current risk exposure by priority.',\r\n icon: 'chart.bar-chart-01',\r\n color: '#F59E0B',\r\n category: 'chart',\r\n layout: DEFAULT_WIDGET_SIZE,\r\n reportId: 'risk-matrix',\r\n chartComponentId: 'risk-matrix',\r\n },\r\n {\r\n id: 'budget-utilization',\r\n name: 'Budget Utilization',\r\n description: 'Planned versus consumed budget trend.',\r\n icon: 'finance.wallet-03',\r\n color: '#10B981',\r\n category: 'chart',\r\n layout: { w: 6, h: 4 },\r\n reportId: 'budget-utilization',\r\n chartComponentId: 'budget-utilization',\r\n },\r\n {\r\n id: 'gantt-chart',\r\n name: 'Gantt Chart',\r\n description: 'Project schedule and timeline overview.',\r\n icon: 'layout.layout-grid-01',\r\n color: '#6366F1',\r\n category: 'chart',\r\n layout: { w: 6, h: 4 },\r\n reportId: 'gantt-chart',\r\n chartComponentId: 'gantt-chart',\r\n },\r\n];\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class HomePageService {\r\n private readonly api = inject(HomePageApi);\r\n private readonly page = signal<HomePageDefinitionDto | null>(null);\r\n\r\n readonly availableWidgets =\r\n signal<HomePageWidgetCatalogItem[]>(AVAILABLE_WIDGETS);\r\n readonly loading = signal(false);\r\n readonly saving = signal(false);\r\n readonly loadingAvailableWidgets = signal(false);\r\n readonly error = signal<string | null>(null);\r\n readonly widgetCatalogError = signal<string | null>(null);\r\n\r\n readonly selectedPage = computed(() => this.page());\r\n readonly selectedWidgets = computed(() =>\r\n this.toWidgets(this.page()?.schema.cards ?? []).sort((a, b) =>\r\n a.y !== b.y ? a.y - b.y : a.x - b.x,\r\n ),\r\n );\r\n\r\n constructor() {\r\n this.load();\r\n }\r\n\r\n load(): void {\r\n this.loading.set(true);\r\n this.error.set(null);\r\n\r\n this.api\r\n .getRuntime()\r\n .pipe(finalize(() => this.loading.set(false)))\r\n .subscribe({\r\n next: (runtime) => this.page.set(runtime.selectedPage),\r\n error: (error) =>\r\n this.error.set(this.getMessage(error, 'Failed to load home page.')),\r\n });\r\n }\r\n\r\n reload(): void {\r\n this.load();\r\n }\r\n\r\n loadAvailableWidgets(): void {\r\n this.availableWidgets.set(AVAILABLE_WIDGETS);\r\n this.widgetCatalogError.set(null);\r\n this.loadingAvailableWidgets.set(false);\r\n }\r\n\r\n updatePage(pageId: number, draft: HomePagePageDraft): void {\r\n const page = this.page();\r\n if (!page || page.id !== pageId) {\r\n return;\r\n }\r\n\r\n const name = draft.name.trim() || page.name.display;\r\n const key = draft.key?.trim() || page.key;\r\n\r\n this.savePage(\r\n page.id,\r\n {\r\n key,\r\n name: { en: name, ar: name },\r\n },\r\n 'Failed to update home page.',\r\n );\r\n }\r\n\r\n isWidgetEnabled(widgetId: string): boolean {\r\n return this.selectedWidgets().some(\r\n (widget) => widget.widgetId === widgetId,\r\n );\r\n }\r\n\r\n toggleWidget(widgetId: string, enabled: boolean): void {\r\n if (enabled) {\r\n this.addWidget(widgetId);\r\n return;\r\n }\r\n\r\n this.removeWidget(widgetId);\r\n }\r\n\r\n addWidget(widgetId: string): void {\r\n const page = this.page();\r\n const widget = this.availableWidgets().find((item) => item.id === widgetId);\r\n\r\n if (!page || !widget || this.isWidgetEnabled(widgetId)) {\r\n return;\r\n }\r\n\r\n const cards = [...page.schema.cards];\r\n const layout = this.findNextLayout(widget.layout.w, widget.layout.h, cards);\r\n const key = this.uniqueKey(cards, widget.id);\r\n\r\n this.savePage(\r\n page.id,\r\n {\r\n schema: {\r\n version: page.schema.version,\r\n cards: [\r\n ...cards,\r\n {\r\n key,\r\n type: 'chart',\r\n layout,\r\n config: {},\r\n props: {\r\n name: widget.name,\r\n description: widget.description,\r\n icon: widget.icon,\r\n color: widget.color,\r\n category: widget.category,\r\n widgetId: widget.id,\r\n reportId: widget.reportId,\r\n dashboardId: widget.reportId,\r\n chartComponentId: widget.chartComponentId,\r\n },\r\n },\r\n ],\r\n },\r\n },\r\n 'Failed to add widget to home page.',\r\n );\r\n }\r\n\r\n removeWidget(widgetId: string): void {\r\n const page = this.page();\r\n if (!page) {\r\n return;\r\n }\r\n\r\n this.savePage(\r\n page.id,\r\n {\r\n schema: {\r\n version: page.schema.version,\r\n cards: page.schema.cards.filter(\r\n (card) => this.getWidgetId(card) !== widgetId,\r\n ),\r\n },\r\n },\r\n 'Failed to remove widget from home page.',\r\n );\r\n }\r\n\r\n updateWidgetLayout(\r\n widgetId: string,\r\n layout: Pick<HomePageWidgetInstance, 'x' | 'y' | 'cols' | 'rows'>,\r\n ): void {\r\n const page = this.page();\r\n if (!page) {\r\n return;\r\n }\r\n\r\n this.savePage(\r\n page.id,\r\n {\r\n schema: {\r\n version: page.schema.version,\r\n cards: page.schema.cards.map((card) =>\r\n this.getWidgetId(card) === widgetId\r\n ? {\r\n ...card,\r\n layout: {\r\n x: layout.x,\r\n y: layout.y,\r\n w: layout.cols,\r\n h: layout.rows,\r\n },\r\n }\r\n : card,\r\n ),\r\n },\r\n },\r\n 'Failed to save widget layout.',\r\n );\r\n }\r\n\r\n private savePage(\r\n pageId: number,\r\n request: HomePageUpdateRequest,\r\n fallbackMessage: string,\r\n ): void {\r\n this.error.set(null);\r\n this.saving.set(true);\r\n\r\n this.api\r\n .updatePage(pageId, request)\r\n .pipe(finalize(() => this.saving.set(false)))\r\n .subscribe({\r\n next: (page) => this.page.set(page),\r\n error: (error) =>\r\n this.error.set(this.getMessage(error, fallbackMessage)),\r\n });\r\n }\r\n\r\n private toWidgets(cards: HomePageCardDto[]): HomePageWidgetInstance[] {\r\n return cards.map((card) => {\r\n const props = (card.props ?? {}) as HomePageWidgetProps;\r\n\r\n return {\r\n widgetId: this.getWidgetId(card),\r\n key: card.key,\r\n type: card.type,\r\n x: card.layout?.x ?? 0,\r\n y: card.layout?.y ?? 0,\r\n cols: card.layout?.w ?? DEFAULT_WIDGET_SIZE.w,\r\n rows: card.layout?.h ?? DEFAULT_WIDGET_SIZE.h,\r\n config: card.config,\r\n props: {\r\n ...props,\r\n name: props.name || card.key,\r\n description:\r\n props.description ||\r\n `Chart component ${props.chartComponentId || card.key}`,\r\n icon: props.icon || DEFAULT_WIDGET_ICON,\r\n color: props.color || null,\r\n widgetId: props.widgetId || card.key,\r\n reportId: props.reportId ?? props.dashboardId ?? null,\r\n dashboardId: props.dashboardId ?? props.reportId ?? null,\r\n chartComponentId: props.chartComponentId || null,\r\n },\r\n permissions: card.permissions,\r\n style: card.style,\r\n };\r\n });\r\n }\r\n\r\n private getWidgetId(card: HomePageCardDto): string {\r\n const props = (card.props ?? {}) as HomePageWidgetProps;\r\n if (props.widgetId) {\r\n return props.widgetId;\r\n }\r\n\r\n const reportId = props.reportId ?? props.dashboardId;\r\n const chartComponentId = props.chartComponentId;\r\n\r\n return reportId && chartComponentId\r\n ? `report:${reportId}:${chartComponentId}`\r\n : card.key;\r\n }\r\n\r\n private findNextLayout(w: number, h: number, cards: HomePageCardDto[]) {\r\n let y = 0;\r\n\r\n while (true) {\r\n for (let x = 0; x <= 12 - w; x += 1) {\r\n const hasOverlap = cards.some((card) => {\r\n const current = card.layout || {\r\n x: 0,\r\n y: 0,\r\n w: DEFAULT_WIDGET_SIZE.w,\r\n h: DEFAULT_WIDGET_SIZE.h,\r\n };\r\n\r\n return !(\r\n current.x + current.w <= x ||\r\n x + w <= current.x ||\r\n current.y + current.h <= y ||\r\n y + h <= current.y\r\n );\r\n });\r\n\r\n if (!hasOverlap) {\r\n return { x, y, w, h };\r\n }\r\n }\r\n\r\n y += 1;\r\n }\r\n }\r\n\r\n private uniqueKey(cards: HomePageCardDto[], base: string): string {\r\n let key = base;\r\n let index = 2;\r\n\r\n while (cards.some((card) => card.key === key)) {\r\n key = `${base}-${index}`;\r\n index += 1;\r\n }\r\n\r\n return key;\r\n }\r\n\r\n private getMessage(error: unknown, fallbackMessage: string): string {\r\n return (\r\n (error as { error?: { message?: string } })?.error?.message ||\r\n (error as { message?: string })?.message ||\r\n fallbackMessage\r\n );\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { DynamicFormConfig, ValidatorConfig } from '@masterteam/components';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { DynamicForm } from '@masterteam/forms/dynamic-form';\r\nimport { HomePageService } from '../home-page.service';\r\n\r\n@Component({\r\n selector: 'mt-home-page-page-dialog',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, DynamicForm, Button],\r\n templateUrl: './home-page-page-dialog.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class HomePagePageDialog {\r\n protected readonly modalService = inject(ModalService);\r\n private readonly ref = inject(ModalRef);\r\n protected readonly homePageService = inject(HomePageService);\r\n\r\n readonly formControl = new FormControl<Record<string, unknown>>(\r\n {},\r\n { nonNullable: true },\r\n );\r\n\r\n readonly formConfig: DynamicFormConfig = {\r\n sections: [\r\n {\r\n key: 'page-form',\r\n type: 'none',\r\n columns: 12,\r\n order: 1,\r\n fields: [\r\n {\r\n key: 'name',\r\n label: 'Page Name',\r\n type: 'text',\r\n placeholder: 'Operations Home',\r\n validators: [ValidatorConfig.required()],\r\n colSpan: 12,\r\n order: 1,\r\n },\r\n {\r\n key: 'key',\r\n label: 'Page Key',\r\n type: 'text',\r\n placeholder: 'operations-home',\r\n colSpan: 12,\r\n order: 2,\r\n },\r\n ],\r\n },\r\n ],\r\n };\r\n\r\n constructor() {\r\n const page = this.homePageService.selectedPage();\r\n if (!page) {\r\n return;\r\n }\r\n\r\n this.formControl.patchValue({\r\n name: page.name.display,\r\n key: page.key,\r\n });\r\n }\r\n\r\n save(): void {\r\n if (this.formControl.invalid) {\r\n return;\r\n }\r\n\r\n const page = this.homePageService.selectedPage();\r\n if (!page) {\r\n return;\r\n }\r\n\r\n const value = this.formControl.getRawValue();\r\n this.homePageService.updatePage(page.id, {\r\n name: String(value['name'] ?? ''),\r\n key: String(value['key'] ?? ''),\r\n });\r\n this.ref.close(true);\r\n }\r\n\r\n close(): void {\r\n this.ref.close(false);\r\n }\r\n}\r\n","<div [class]=\"[modalService.contentClass, 'p-4']\">\r\n <mt-dynamic-form [formConfig]=\"formConfig\" [formControl]=\"formControl\" />\r\n</div>\r\n\r\n<div [class]=\"modalService.footerClass\">\r\n <mt-button\r\n label=\"Cancel\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"homePageService.saving()\"\r\n (onClick)=\"close()\"\r\n />\r\n <mt-button\r\n label=\"Save\"\r\n severity=\"primary\"\r\n [disabled]=\"formControl.invalid || homePageService.saving()\"\r\n (onClick)=\"save()\"\r\n />\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport type { HomePageWidgetCatalogItem } from '../home-page.models';\r\nimport { HomePageService } from '../home-page.service';\r\n\r\n@Component({\r\n selector: 'mt-home-page-widget-dialog',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, ToggleField, Button, Card],\r\n templateUrl: './home-page-widget-dialog.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class HomePageWidgetDialog {\r\n protected readonly modalService = inject(ModalService);\r\n private readonly ref = inject(ModalRef);\r\n protected readonly homePageService = inject(HomePageService);\r\n\r\n readonly pageLabel = () =>\r\n this.homePageService.selectedPage()?.name.display ?? 'Home';\r\n\r\n constructor() {\r\n this.homePageService.loadAvailableWidgets();\r\n }\r\n\r\n readonly availableWidgets = this.homePageService.availableWidgets;\r\n readonly isLoading = this.homePageService.loadingAvailableWidgets;\r\n readonly errorMessage = this.homePageService.widgetCatalogError;\r\n\r\n isEnabled(widgetId: string): boolean {\r\n return this.homePageService.isWidgetEnabled(widgetId);\r\n }\r\n\r\n onToggle(widget: HomePageWidgetCatalogItem, value: boolean | null): void {\r\n this.homePageService.toggleWidget(widget.id, !!value);\r\n }\r\n\r\n close(): void {\r\n this.ref.close(true);\r\n }\r\n}\r\n","<div [class]=\"[modalService.contentClass, 'p-5']\">\r\n <mt-card>\r\n <ng-template #headless>\r\n <div class=\"grid gap-4 p-4\">\r\n <div class=\"flex flex-wrap items-center justify-between gap-3\">\r\n <p class=\"text-sm text-surface-500\">\r\n Toggle widgets for\r\n <strong class=\"text-surface-900\">{{ pageLabel() }}</strong>\r\n </p>\r\n </div>\r\n\r\n @if (isLoading()) {\r\n <div\r\n class=\"flex min-h-40 items-center justify-center text-sm text-surface-500\"\r\n >\r\n Loading available widgets...\r\n </div>\r\n } @else if (errorMessage()) {\r\n <div\r\n class=\"rounded-xl border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-600\"\r\n >\r\n {{ errorMessage() }}\r\n </div>\r\n } @else if (availableWidgets().length) {\r\n <div class=\"grid gap-3 md:grid-cols-2\">\r\n @for (widget of availableWidgets(); track widget.id) {\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n [label]=\"widget.name\"\r\n [descriptionCard]=\"widget.description\"\r\n [icon]=\"widget.icon || 'chart.bar-chart-01'\"\r\n [ngModel]=\"isEnabled(widget.id)\"\r\n (ngModelChange)=\"onToggle(widget, $event)\"\r\n >\r\n <ng-template #toggleCardBottom>\r\n <div\r\n class=\"mt-4 flex items-center justify-between gap-3 border-t border-surface pt-4 text-xs text-surface-500\"\r\n >\r\n <div class=\"flex items-center gap-2\">\r\n <span\r\n class=\"h-3 w-3 rounded-full\"\r\n [style.background]=\"\r\n widget.color || 'var(--p-primary-color)'\r\n \"\r\n ></span>\r\n <span>{{ widget.category }}</span>\r\n </div>\r\n <span\r\n >{{ widget.chartComponentId }} | {{ widget.layout.w }} x\r\n {{ widget.layout.h }}</span\r\n >\r\n </div>\r\n </ng-template>\r\n </mt-toggle-field>\r\n }\r\n </div>\r\n } @else {\r\n <div\r\n class=\"flex min-h-40 items-center justify-center text-sm text-surface-500\"\r\n >\r\n No widgets are available for this page.\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n</div>\r\n\r\n<div [class]=\"modalService.footerClass\">\r\n <div class=\"text-sm text-surface-500\">\r\n Changes are applied immediately to the selected page.\r\n </div>\r\n\r\n <mt-button label=\"Close\" severity=\"primary\" (onClick)=\"close()\" />\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport {\r\n GridsterConfig,\r\n GridsterItem,\r\n GridsterModule,\r\n} from 'angular-gridster2';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Icon } from '@masterteam/icons';\r\nimport type { HomePageWidgetInstance } from '../home-page.models';\r\nimport { HomePagePageDialog } from '../home-page-page-dialog/home-page-page-dialog';\r\nimport { HomePageService } from '../home-page.service';\r\nimport { HomePageWidgetDialog } from '../home-page-widget-dialog/home-page-widget-dialog';\r\n\r\nconst HOME_PAGE_GRID_COLUMNS = 12;\r\nconst HOME_PAGE_GRID_ROW_HEIGHT = 60;\r\nconst HOME_PAGE_GRID_GAP = 10;\r\nconst HOME_PAGE_GRID_MIN_HEIGHT = 500;\r\n\r\n@Component({\r\n selector: 'mt-home-page',\r\n standalone: true,\r\n imports: [CommonModule, GridsterModule, Button, Card, Icon],\r\n templateUrl: './home-page.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'block h-full w-full',\r\n },\r\n})\r\nexport default class HomePage {\r\n readonly welcomeName = input.required<string>();\r\n readonly subtitle = input('Quickly access your workspace essentials.');\r\n readonly isCustomizing = signal(false);\r\n\r\n private readonly modalService = inject(ModalService);\r\n protected readonly homePageService = inject(HomePageService);\r\n\r\n readonly gridColumns = HOME_PAGE_GRID_COLUMNS;\r\n readonly gridGap = HOME_PAGE_GRID_GAP;\r\n readonly gridRowHeight = HOME_PAGE_GRID_ROW_HEIGHT;\r\n readonly isLoading = this.homePageService.loading;\r\n readonly isSaving = this.homePageService.saving;\r\n readonly errorMessage = this.homePageService.error;\r\n readonly selectedPage = this.homePageService.selectedPage;\r\n readonly widgets = this.homePageService.selectedWidgets;\r\n readonly hasWidgets = computed(() => this.widgets().length > 0);\r\n readonly previewLayoutHeight = computed(() => {\r\n const items = this.widgets();\r\n if (!items.length) {\r\n return `${HOME_PAGE_GRID_MIN_HEIGHT}px`;\r\n }\r\n\r\n const maxRow = Math.max(...items.map((item) => item.y + item.rows));\r\n return `${Math.max(maxRow * HOME_PAGE_GRID_ROW_HEIGHT, HOME_PAGE_GRID_MIN_HEIGHT)}px`;\r\n });\r\n\r\n readonly gridOptions: GridsterConfig = {\r\n gridType: 'verticalFixed',\r\n compactType: 'none',\r\n draggable: {\r\n enabled: true,\r\n ignoreContent: false,\r\n stop: (item) => this.onWidgetLayoutChange(item),\r\n },\r\n resizable: {\r\n enabled: true,\r\n stop: (item) => this.onWidgetLayoutChange(item),\r\n },\r\n pushItems: true,\r\n swap: true,\r\n displayGrid: 'always',\r\n minCols: HOME_PAGE_GRID_COLUMNS,\r\n maxCols: HOME_PAGE_GRID_COLUMNS,\r\n minRows: 6,\r\n maxRows: 1000,\r\n fixedRowHeight: HOME_PAGE_GRID_ROW_HEIGHT,\r\n margin: HOME_PAGE_GRID_GAP,\r\n outerMargin: false,\r\n mobileBreakpoint: 0,\r\n useTransformPositioning: true,\r\n };\r\n\r\n startCustomize(): void {\r\n this.isCustomizing.set(true);\r\n }\r\n\r\n stopCustomize(): void {\r\n this.isCustomizing.set(false);\r\n }\r\n\r\n openEditPage(): void {\r\n if (!this.selectedPage()) {\r\n return;\r\n }\r\n\r\n this.modalService.openModal(HomePagePageDialog, 'dialog', {\r\n header: 'Edit Page',\r\n styleClass: '!w-[32rem]',\r\n modal: true,\r\n closable: true,\r\n });\r\n }\r\n\r\n openAddWidget(): void {\r\n if (!this.selectedPage()) {\r\n return;\r\n }\r\n\r\n this.homePageService.loadAvailableWidgets();\r\n this.modalService.openModal(HomePageWidgetDialog, 'dialog', {\r\n header: 'Add Widget',\r\n styleClass: '!w-[58rem]',\r\n modal: true,\r\n closable: true,\r\n });\r\n }\r\n\r\n removeWidget(widgetId: string): void {\r\n this.homePageService.removeWidget(widgetId);\r\n }\r\n\r\n reload(): void {\r\n this.homePageService.reload();\r\n }\r\n\r\n getPreviewColumn(widget: HomePageWidgetInstance): string {\r\n return `${widget.x + 1} / span ${widget.cols}`;\r\n }\r\n\r\n getPreviewRow(widget: HomePageWidgetInstance): string {\r\n return `${widget.y + 1} / span ${widget.rows}`;\r\n }\r\n\r\n private onWidgetLayoutChange(item: GridsterItem): void {\r\n const widget = item as HomePageWidgetInstance;\r\n this.homePageService.updateWidgetLayout(widget.widgetId, {\r\n x: widget.x ?? 0,\r\n y: widget.y ?? 0,\r\n cols: widget.cols ?? 1,\r\n rows: widget.rows ?? 1,\r\n });\r\n }\r\n}\r\n","<section class=\"h-full w-full p-4 md:p-5\">\r\n <mt-card class=\"block h-full w-full\">\r\n <ng-template #headless>\r\n <div class=\"flex h-full flex-col\">\r\n <div\r\n class=\"grid gap-3 p-4 md:grid-cols-[minmax(0,1fr)_auto] md:items-center md:px-5 md:py-4\"\r\n >\r\n <div class=\"min-w-0 space-y-1\">\r\n <h2 class=\"text-base font-semibold text-surface-900 md:text-lg\">\r\n Welcome,\r\n <span class=\"text-primary\">{{ welcomeName() }}</span>\r\n </h2>\r\n <p class=\"max-w-2xl text-sm text-surface-500\">\r\n {{ subtitle() }}\r\n </p>\r\n </div>\r\n\r\n @if (isCustomizing()) {\r\n <div class=\"flex flex-wrap justify-start gap-2 md:justify-end\">\r\n <mt-button\r\n icon=\"general.edit-03\"\r\n label=\"Edit Page\"\r\n size=\"small\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"isLoading() || isSaving() || !selectedPage()\"\r\n (onClick)=\"openEditPage()\"\r\n />\r\n <mt-button\r\n icon=\"layout.layout-grid-01\"\r\n label=\"Add Widget\"\r\n size=\"small\"\r\n severity=\"primary\"\r\n [disabled]=\"isLoading() || isSaving() || !selectedPage()\"\r\n (onClick)=\"openAddWidget()\"\r\n />\r\n <mt-button\r\n icon=\"general.x-close\"\r\n label=\"Stop Customize\"\r\n size=\"small\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"isSaving()\"\r\n (onClick)=\"stopCustomize()\"\r\n />\r\n </div>\r\n } @else {\r\n <div class=\"flex justify-start md:justify-end\">\r\n <mt-button\r\n icon=\"layout.layout-grid-01\"\r\n label=\"Customize\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n [disabled]=\"isLoading() || !selectedPage()\"\r\n (onClick)=\"startCustomize()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"flex-1 border-t border-surface px-4 pb-4 pt-4 md:px-5 md:pb-5\"\r\n >\r\n @if (errorMessage() && selectedPage()) {\r\n <div\r\n class=\"mb-4 rounded-xl border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-600\"\r\n >\r\n {{ errorMessage() }}\r\n </div>\r\n }\r\n\r\n @if (isSaving()) {\r\n <div class=\"mb-4 text-sm text-surface-500\">\r\n Saving home page changes...\r\n </div>\r\n }\r\n\r\n @if (isLoading() && !selectedPage()) {\r\n <div\r\n class=\"flex min-h-[28rem] items-center justify-center text-sm text-surface-500\"\r\n >\r\n Loading home page...\r\n </div>\r\n } @else if (errorMessage() && !selectedPage()) {\r\n <div\r\n class=\"flex min-h-[28rem] flex-col items-center justify-center gap-3 text-center\"\r\n >\r\n <p class=\"text-sm text-red-500\">{{ errorMessage() }}</p>\r\n <mt-button\r\n label=\"Retry\"\r\n severity=\"secondary\"\r\n [outlined]=\"true\"\r\n (onClick)=\"reload()\"\r\n />\r\n </div>\r\n } @else if (hasWidgets()) {\r\n @if (isCustomizing()) {\r\n <gridster\r\n [options]=\"gridOptions\"\r\n class=\"block w-full\"\r\n [style.min-height]=\"previewLayoutHeight()\"\r\n >\r\n @for (widget of widgets(); track widget.key) {\r\n <gridster-item [item]=\"widget\">\r\n <mt-card class=\"block h-full w-full\">\r\n <ng-template #headless>\r\n <div class=\"grid h-full gap-4 p-4\">\r\n <div class=\"flex items-start justify-between gap-3\">\r\n <div class=\"flex items-start gap-3\">\r\n <span\r\n class=\"flex h-10 w-10 items-center justify-center rounded-lg text-white\"\r\n [style.background]=\"\r\n widget.props.color || 'var(--p-primary-color)'\r\n \"\r\n >\r\n <mt-icon\r\n [icon]=\"\r\n widget.props.icon || 'chart.bar-chart-01'\r\n \"\r\n class=\"h-5 w-5\"\r\n />\r\n </span>\r\n\r\n <div class=\"min-w-0 space-y-1\">\r\n <h3\r\n class=\"truncate text-base font-semibold text-surface-900\"\r\n >\r\n {{ widget.props.name }}\r\n </h3>\r\n <p class=\"text-sm text-surface-500\">\r\n {{ widget.props.description }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n [text]=\"true\"\r\n (onClick)=\"removeWidget(widget.widgetId)\"\r\n />\r\n </div>\r\n\r\n <div class=\"grid gap-1 text-sm text-surface-500\">\r\n <span>Type: {{ widget.type }}</span>\r\n <span>\r\n Report:\r\n {{\r\n widget.props.dashboardId ||\r\n widget.props.reportId ||\r\n \"-\"\r\n }}\r\n </span>\r\n <span>\r\n Component:\r\n {{ widget.props.chartComponentId || widget.key }}\r\n </span>\r\n </div>\r\n\r\n <div\r\n class=\"mt-auto flex flex-wrap gap-4 text-sm text-surface-500\"\r\n >\r\n <span\r\n >Position: {{ widget.x }}, {{ widget.y }}</span\r\n >\r\n <span\r\n >Size: {{ widget.cols }} x {{ widget.rows }}</span\r\n >\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n </gridster-item>\r\n }\r\n </gridster>\r\n } @else {\r\n <div\r\n class=\"grid\"\r\n [style.min-height]=\"previewLayoutHeight()\"\r\n [style.grid-template-columns]=\"\r\n 'repeat(' + gridColumns + ', minmax(0, 1fr))'\r\n \"\r\n [style.grid-auto-rows]=\"gridRowHeight + 'px'\"\r\n [style.gap.px]=\"gridGap\"\r\n >\r\n @for (widget of widgets(); track widget.key) {\r\n <div\r\n class=\"h-full\"\r\n [style.grid-column]=\"getPreviewColumn(widget)\"\r\n [style.grid-row]=\"getPreviewRow(widget)\"\r\n >\r\n <mt-card class=\"block h-full w-full\">\r\n <ng-template #headless>\r\n <div class=\"grid h-full gap-4 p-4\">\r\n <div class=\"flex items-start gap-3\">\r\n <span\r\n class=\"flex h-10 w-10 items-center justify-center rounded-lg text-white\"\r\n [style.background]=\"\r\n widget.props.color || 'var(--p-primary-color)'\r\n \"\r\n >\r\n <mt-icon\r\n [icon]=\"\r\n widget.props.icon || 'chart.bar-chart-01'\r\n \"\r\n class=\"h-5 w-5\"\r\n />\r\n </span>\r\n\r\n <div class=\"min-w-0 space-y-1\">\r\n <h3\r\n class=\"truncate text-base font-semibold text-surface-900\"\r\n >\r\n {{ widget.props.name }}\r\n </h3>\r\n <p class=\"text-sm text-surface-500\">\r\n {{ widget.props.description }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"grid gap-1 text-sm text-surface-500\">\r\n <span>Type: {{ widget.type }}</span>\r\n <span>\r\n Report:\r\n {{\r\n widget.props.dashboardId ||\r\n widget.props.reportId ||\r\n \"-\"\r\n }}\r\n </span>\r\n <span>\r\n Component:\r\n {{ widget.props.chartComponentId || widget.key }}\r\n </span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n </div>\r\n }\r\n </div>\r\n }\r\n } @else {\r\n <div\r\n class=\"flex min-h-[28rem] items-center justify-center text-sm text-surface-500\"\r\n >\r\n @if (isCustomizing()) {\r\n Use Add Widget to place charts in the grid builder.\r\n } @else {\r\n No widgets on this page.\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n</section>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@masterteam/home-page",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.5",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"directory": "../../../dist/masterteam/home-page",
|
|
6
6
|
"linkDirectory": false,
|
|
7
7
|
"access": "public"
|
|
8
8
|
},
|
|
9
9
|
"peerDependencies": {
|
|
10
|
-
"@angular/common": "^21.
|
|
11
|
-
"@angular/core": "^21.
|
|
12
|
-
"@angular/forms": "^21.
|
|
13
|
-
"@primeuix/themes": "^2.0.
|
|
14
|
-
"@tailwindcss/postcss": "^4.
|
|
10
|
+
"@angular/common": "^21.2.8",
|
|
11
|
+
"@angular/core": "^21.2.8",
|
|
12
|
+
"@angular/forms": "^21.2.8",
|
|
13
|
+
"@primeuix/themes": "^2.0.3",
|
|
14
|
+
"@tailwindcss/postcss": "^4.2.2",
|
|
15
15
|
"angular-gridster2": "^18.0.1",
|
|
16
|
-
"postcss": "^8.5.
|
|
17
|
-
"primeng": "21.
|
|
16
|
+
"postcss": "^8.5.9",
|
|
17
|
+
"primeng": "21.1.5",
|
|
18
18
|
"rxjs": "^7.8.2",
|
|
19
|
-
"tailwindcss": "^4.
|
|
19
|
+
"tailwindcss": "^4.2.2",
|
|
20
20
|
"tailwindcss-primeui": "^0.6.1",
|
|
21
|
-
"@masterteam/
|
|
22
|
-
"@masterteam/
|
|
23
|
-
"@masterteam/
|
|
21
|
+
"@masterteam/components": "^0.0.143",
|
|
22
|
+
"@masterteam/forms": "^0.0.66",
|
|
23
|
+
"@masterteam/icons": "^0.0.14"
|
|
24
24
|
},
|
|
25
25
|
"sideEffects": false,
|
|
26
26
|
"exports": {
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
},
|
|
38
38
|
"module": "fesm2022/masterteam-home-page.mjs",
|
|
39
39
|
"typings": "types/masterteam-home-page.d.ts",
|
|
40
|
+
"type": "module",
|
|
40
41
|
"dependencies": {
|
|
41
42
|
"tslib": "^2.8.1"
|
|
42
43
|
}
|