@memberjunction/ng-dashboards 5.20.0 → 5.22.0
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/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +102 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +583 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +148 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +773 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +241 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -0
- package/dist/AI/components/vectors/vector-management-resource.component.js +1782 -0
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -0
- package/dist/AI/index.d.ts +3 -0
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +6 -0
- package/dist/AI/index.js.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.d.ts +50 -7
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js +161 -193
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +11 -0
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +57 -0
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +10 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +35 -11
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.d.ts +1 -0
- package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.js +8 -4
- package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +181 -1
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +1704 -182
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +121 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +1058 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.d.ts +56 -0
- package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.js +291 -0
- package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.js.map +1 -0
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +85 -0
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +461 -0
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/index.d.ts +4 -0
- package/dist/KnowledgeHub/index.d.ts.map +1 -0
- package/dist/KnowledgeHub/index.js +5 -0
- package/dist/KnowledgeHub/index.js.map +1 -0
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +5 -1
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +1 -0
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +7 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +63 -8
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts +9 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.js +109 -62
- package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +2 -1
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +241 -200
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts +7 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +63 -8
- package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +7 -5
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +9 -1
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +128 -59
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +26 -19
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +40 -5
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +1 -0
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +3 -0
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +4 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +5 -1
- package/dist/public-api.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +5 -4
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +4 -0
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +44 -42
|
@@ -4,102 +4,913 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
-
import { Component, ViewChild, ChangeDetectionStrategy } from '@angular/core';
|
|
7
|
+
import { Component, ViewChild, ChangeDetectionStrategy, inject } from '@angular/core';
|
|
8
8
|
import { Subject } from 'rxjs';
|
|
9
9
|
import { takeUntil } from 'rxjs/operators';
|
|
10
|
-
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
10
|
+
import { BaseResourceComponent, HomeAppPinService } from '@memberjunction/ng-shared';
|
|
11
11
|
import { RegisterClass } from '@memberjunction/global';
|
|
12
|
-
import { Metadata, CompositeKey } from '@memberjunction/core';
|
|
12
|
+
import { Metadata, CompositeKey, RunView } from '@memberjunction/core';
|
|
13
13
|
import { UserInfoEngine } from '@memberjunction/core-entities';
|
|
14
14
|
import { MJNotificationService } from '@memberjunction/ng-notifications';
|
|
15
15
|
import * as i0 from "@angular/core";
|
|
16
16
|
import * as i1 from "@memberjunction/ng-base-application";
|
|
17
17
|
import * as i2 from "@memberjunction/ng-shared";
|
|
18
|
-
import * as i3 from "@
|
|
19
|
-
import * as i4 from "@
|
|
20
|
-
import * as i5 from "@memberjunction/ng-
|
|
21
|
-
import * as i6 from "@
|
|
18
|
+
import * as i3 from "@angular/forms";
|
|
19
|
+
import * as i4 from "@progress/kendo-angular-buttons";
|
|
20
|
+
import * as i5 from "@memberjunction/ng-shared-generic";
|
|
21
|
+
import * as i6 from "@memberjunction/ng-explorer-settings";
|
|
22
|
+
import * as i7 from "@angular/common";
|
|
22
23
|
const _c0 = ["appConfigDialog"];
|
|
24
|
+
const _forTrack0 = ($index, $item) => $item.appId;
|
|
25
|
+
const _forTrack1 = ($index, $item) => $item.label;
|
|
26
|
+
const _forTrack2 = ($index, $item) => $item.id;
|
|
27
|
+
function HomeDashboardComponent_Conditional_8_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
28
|
+
const _r2 = i0.ɵɵgetCurrentView();
|
|
29
|
+
i0.ɵɵelementStart(0, "button", 21);
|
|
30
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_8_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.ToggleEditMode()); });
|
|
31
|
+
i0.ɵɵelement(1, "i", 22);
|
|
32
|
+
i0.ɵɵtext(2, " Done ");
|
|
33
|
+
i0.ɵɵelementEnd();
|
|
34
|
+
} }
|
|
35
|
+
function HomeDashboardComponent_Conditional_8_Conditional_7_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
36
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
37
|
+
i0.ɵɵelementStart(0, "button", 26);
|
|
38
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_8_Conditional_7_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.ToggleEditMode()); });
|
|
39
|
+
i0.ɵɵelement(1, "i", 27);
|
|
40
|
+
i0.ɵɵtext(2, " Edit ");
|
|
41
|
+
i0.ɵɵelementEnd();
|
|
42
|
+
} }
|
|
43
|
+
function HomeDashboardComponent_Conditional_8_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
44
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
45
|
+
i0.ɵɵelementStart(0, "button", 23);
|
|
46
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_8_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OpenAddPinPanel()); });
|
|
47
|
+
i0.ɵɵelement(1, "i", 24);
|
|
48
|
+
i0.ɵɵtext(2, " Add Pin ");
|
|
49
|
+
i0.ɵɵelementEnd();
|
|
50
|
+
i0.ɵɵconditionalCreate(3, HomeDashboardComponent_Conditional_8_Conditional_7_Conditional_3_Template, 3, 0, "button", 25);
|
|
51
|
+
} if (rf & 2) {
|
|
52
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
53
|
+
i0.ɵɵadvance(3);
|
|
54
|
+
i0.ɵɵconditional(ctx_r2.PinnedItems.length > 0 ? 3 : -1);
|
|
55
|
+
} }
|
|
56
|
+
function HomeDashboardComponent_Conditional_8_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
57
|
+
i0.ɵɵelementStart(0, "div", 18);
|
|
58
|
+
i0.ɵɵelement(1, "i", 28);
|
|
59
|
+
i0.ɵɵelementStart(2, "span")(3, "strong");
|
|
60
|
+
i0.ɵɵtext(4, "Edit mode");
|
|
61
|
+
i0.ɵɵelementEnd();
|
|
62
|
+
i0.ɵɵtext(5, " \u2014 Drag cards to reorder. Click names to rename.");
|
|
63
|
+
i0.ɵɵelementEnd()();
|
|
64
|
+
} }
|
|
65
|
+
function HomeDashboardComponent_Conditional_8_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
66
|
+
const _r6 = i0.ɵɵgetCurrentView();
|
|
67
|
+
i0.ɵɵelementStart(0, "div", 19);
|
|
68
|
+
i0.ɵɵelement(1, "i", 15);
|
|
69
|
+
i0.ɵɵelementStart(2, "h3");
|
|
70
|
+
i0.ɵɵtext(3, "No pinned items yet");
|
|
71
|
+
i0.ɵɵelementEnd();
|
|
72
|
+
i0.ɵɵelementStart(4, "p");
|
|
73
|
+
i0.ɵɵtext(5, "Pin your favorite dashboards, views, queries, and reports for quick access.");
|
|
74
|
+
i0.ɵɵelementEnd();
|
|
75
|
+
i0.ɵɵelementStart(6, "button", 23);
|
|
76
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_8_Conditional_9_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OpenAddPinPanel()); });
|
|
77
|
+
i0.ɵɵelement(7, "i", 24);
|
|
78
|
+
i0.ɵɵtext(8, " Add your first pin ");
|
|
79
|
+
i0.ɵɵelementEnd()();
|
|
80
|
+
} }
|
|
81
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
82
|
+
const _r9 = i0.ɵɵgetCurrentView();
|
|
83
|
+
i0.ɵɵelementStart(0, "div", 32)(1, "div", 40);
|
|
84
|
+
i0.ɵɵelement(2, "i", 41);
|
|
85
|
+
i0.ɵɵelementEnd();
|
|
86
|
+
i0.ɵɵelementStart(3, "div", 42)(4, "button", 43);
|
|
87
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_1_Template_button_click_4_listener($event) { i0.ɵɵrestoreView(_r9); const pin_r8 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); ctx_r2.RemovePin(pin_r8.Id); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
88
|
+
i0.ɵɵelement(5, "i", 44);
|
|
89
|
+
i0.ɵɵelementEnd()()();
|
|
90
|
+
} }
|
|
91
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
92
|
+
const _r10 = i0.ɵɵgetCurrentView();
|
|
93
|
+
i0.ɵɵelementStart(0, "div", 46)(1, "button", 47);
|
|
94
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_2_Conditional_2_Template_button_click_1_listener($event) { i0.ɵɵrestoreView(_r10); const pin_r8 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); ctx_r2.OnPinClick(pin_r8); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
95
|
+
i0.ɵɵtext(2, "Open");
|
|
96
|
+
i0.ɵɵelementEnd()();
|
|
97
|
+
} }
|
|
98
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
99
|
+
i0.ɵɵelementStart(0, "div", 33);
|
|
100
|
+
i0.ɵɵelement(1, "img", 45);
|
|
101
|
+
i0.ɵɵconditionalCreate(2, HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_2_Conditional_2_Template, 3, 0, "div", 46);
|
|
102
|
+
i0.ɵɵelementEnd();
|
|
103
|
+
} if (rf & 2) {
|
|
104
|
+
const pin_r8 = i0.ɵɵnextContext().$implicit;
|
|
105
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
106
|
+
i0.ɵɵadvance();
|
|
107
|
+
i0.ɵɵproperty("src", pin_r8.Thumbnail, i0.ɵɵsanitizeUrl)("alt", pin_r8.DisplayName);
|
|
108
|
+
i0.ɵɵadvance();
|
|
109
|
+
i0.ɵɵconditional(!ctx_r2.EditMode ? 2 : -1);
|
|
110
|
+
} }
|
|
111
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
112
|
+
const _r11 = i0.ɵɵgetCurrentView();
|
|
113
|
+
i0.ɵɵelementStart(0, "div", 46)(1, "button", 47);
|
|
114
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_3_Conditional_2_Template_button_click_1_listener($event) { i0.ɵɵrestoreView(_r11); const pin_r8 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); ctx_r2.OnPinClick(pin_r8); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
115
|
+
i0.ɵɵtext(2, "Open");
|
|
116
|
+
i0.ɵɵelementEnd()();
|
|
117
|
+
} }
|
|
118
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
119
|
+
i0.ɵɵelementStart(0, "div", 48);
|
|
120
|
+
i0.ɵɵelement(1, "i");
|
|
121
|
+
i0.ɵɵconditionalCreate(2, HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_3_Conditional_2_Template, 3, 0, "div", 46);
|
|
122
|
+
i0.ɵɵelementEnd();
|
|
123
|
+
} if (rf & 2) {
|
|
124
|
+
const pin_r8 = i0.ɵɵnextContext().$implicit;
|
|
125
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
126
|
+
i0.ɵɵstyleProp("--pin-icon-color", pin_r8.Color || "var(--mj-text-muted)");
|
|
127
|
+
i0.ɵɵadvance();
|
|
128
|
+
i0.ɵɵclassMap(ctx_r2.GetPinIcon(pin_r8));
|
|
129
|
+
i0.ɵɵadvance();
|
|
130
|
+
i0.ɵɵconditional(!ctx_r2.EditMode ? 2 : -1);
|
|
131
|
+
} }
|
|
132
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
133
|
+
const _r12 = i0.ɵɵgetCurrentView();
|
|
134
|
+
i0.ɵɵelementStart(0, "input", 49);
|
|
135
|
+
i0.ɵɵlistener("blur", function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_5_Template_input_blur_0_listener($event) { i0.ɵɵrestoreView(_r12); const pin_r8 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SavePinName(pin_r8.Id, ctx_r2.GetInputValue($event))); })("keydown.enter", function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_5_Template_input_keydown_enter_0_listener($event) { i0.ɵɵrestoreView(_r12); const pin_r8 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SavePinName(pin_r8.Id, ctx_r2.GetInputValue($event))); })("click", function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_5_Template_input_click_0_listener($event) { i0.ɵɵrestoreView(_r12); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
136
|
+
i0.ɵɵelementEnd();
|
|
137
|
+
} if (rf & 2) {
|
|
138
|
+
const pin_r8 = i0.ɵɵnextContext().$implicit;
|
|
139
|
+
i0.ɵɵproperty("value", pin_r8.DisplayName);
|
|
140
|
+
} }
|
|
141
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_6_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
142
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
143
|
+
i0.ɵɵelementStart(0, "button", 52);
|
|
144
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_6_Conditional_2_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r14); const pin_r8 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.ShowPinMenu($event, pin_r8)); });
|
|
145
|
+
i0.ɵɵelement(1, "i", 53);
|
|
146
|
+
i0.ɵɵelementEnd();
|
|
147
|
+
} }
|
|
148
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
149
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
150
|
+
i0.ɵɵelementStart(0, "div", 50);
|
|
151
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_6_Template_div_click_0_listener($event) { i0.ɵɵrestoreView(_r13); const pin_r8 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.EditMode ? ctx_r2.StartEditingPin(pin_r8.Id, $event) : null); });
|
|
152
|
+
i0.ɵɵtext(1);
|
|
153
|
+
i0.ɵɵconditionalCreate(2, HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_6_Conditional_2_Template, 2, 0, "button", 51);
|
|
154
|
+
i0.ɵɵelementEnd();
|
|
155
|
+
} if (rf & 2) {
|
|
156
|
+
const pin_r8 = i0.ɵɵnextContext().$implicit;
|
|
157
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
158
|
+
i0.ɵɵadvance();
|
|
159
|
+
i0.ɵɵtextInterpolate1(" ", pin_r8.DisplayName, " ");
|
|
160
|
+
i0.ɵɵadvance();
|
|
161
|
+
i0.ɵɵconditional(!ctx_r2.EditMode ? 2 : -1);
|
|
162
|
+
} }
|
|
163
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
164
|
+
i0.ɵɵelementStart(0, "span", 39);
|
|
165
|
+
i0.ɵɵtext(1);
|
|
166
|
+
i0.ɵɵelementEnd();
|
|
167
|
+
} if (rf & 2) {
|
|
168
|
+
const pin_r8 = i0.ɵɵnextContext().$implicit;
|
|
169
|
+
i0.ɵɵadvance();
|
|
170
|
+
i0.ɵɵtextInterpolate(pin_r8.ApplicationName);
|
|
171
|
+
} }
|
|
172
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
173
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
174
|
+
i0.ɵɵelementStart(0, "div", 31);
|
|
175
|
+
i0.ɵɵlistener("dragstart", function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Template_div_dragstart_0_listener($event) { const pin_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OnDragStart($event, pin_r8)); })("dragover", function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Template_div_dragover_0_listener($event) { const pin_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OnDragOver($event, pin_r8)); })("dragleave", function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Template_div_dragleave_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OnDragLeave()); })("drop", function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Template_div_drop_0_listener($event) { const pin_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OnDrop($event, pin_r8)); })("dragend", function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Template_div_dragend_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OnDragEnd()); })("click", function HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Template_div_click_0_listener() { const pin_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OnPinClick(pin_r8)); });
|
|
176
|
+
i0.ɵɵconditionalCreate(1, HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_1_Template, 6, 0, "div", 32);
|
|
177
|
+
i0.ɵɵconditionalCreate(2, HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_2_Template, 3, 3, "div", 33)(3, HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_3_Template, 3, 5, "div", 34);
|
|
178
|
+
i0.ɵɵelementStart(4, "div", 35);
|
|
179
|
+
i0.ɵɵconditionalCreate(5, HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_5_Template, 1, 1, "input", 36)(6, HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_6_Template, 3, 2, "div", 37);
|
|
180
|
+
i0.ɵɵelementStart(7, "div", 38);
|
|
181
|
+
i0.ɵɵelement(8, "i");
|
|
182
|
+
i0.ɵɵtext(9);
|
|
183
|
+
i0.ɵɵconditionalCreate(10, HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Conditional_10_Template, 2, 1, "span", 39);
|
|
184
|
+
i0.ɵɵelementEnd()()();
|
|
185
|
+
} if (rf & 2) {
|
|
186
|
+
const pin_r8 = ctx.$implicit;
|
|
187
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
188
|
+
i0.ɵɵclassProp("edit-mode", ctx_r2.EditMode)("dragging", ctx_r2.DraggingPinId === pin_r8.Id)("drag-over", ctx_r2.DragOverPinId === pin_r8.Id);
|
|
189
|
+
i0.ɵɵproperty("draggable", ctx_r2.EditMode);
|
|
190
|
+
i0.ɵɵadvance();
|
|
191
|
+
i0.ɵɵconditional(ctx_r2.EditMode ? 1 : -1);
|
|
192
|
+
i0.ɵɵadvance();
|
|
193
|
+
i0.ɵɵconditional(pin_r8.Thumbnail ? 2 : 3);
|
|
194
|
+
i0.ɵɵadvance(3);
|
|
195
|
+
i0.ɵɵconditional(ctx_r2.EditMode && ctx_r2.EditingPinId === pin_r8.Id ? 5 : 6);
|
|
196
|
+
i0.ɵɵadvance(3);
|
|
197
|
+
i0.ɵɵclassMap(ctx_r2.GetPinIcon(pin_r8));
|
|
198
|
+
i0.ɵɵadvance();
|
|
199
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.GetResourceTypeLabel(pin_r8), " ");
|
|
200
|
+
i0.ɵɵadvance();
|
|
201
|
+
i0.ɵɵconditional(pin_r8.ApplicationName && pin_r8.ResourceType !== "Custom" ? 10 : -1);
|
|
202
|
+
} }
|
|
203
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
204
|
+
const _r15 = i0.ɵɵgetCurrentView();
|
|
205
|
+
i0.ɵɵelementStart(0, "input", 60);
|
|
206
|
+
i0.ɵɵlistener("blur", function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_Conditional_1_Template_input_blur_0_listener($event) { i0.ɵɵrestoreView(_r15); const group_r16 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SaveGroupName(group_r16, ctx_r2.GetInputValue($event))); })("keydown.enter", function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_Conditional_1_Template_input_keydown_enter_0_listener($event) { i0.ɵɵrestoreView(_r15); const group_r16 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SaveGroupName(group_r16, ctx_r2.GetInputValue($event))); });
|
|
207
|
+
i0.ɵɵelementEnd();
|
|
208
|
+
} if (rf & 2) {
|
|
209
|
+
const group_r16 = i0.ɵɵnextContext().$implicit;
|
|
210
|
+
i0.ɵɵproperty("value", group_r16);
|
|
211
|
+
} }
|
|
212
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
213
|
+
const _r17 = i0.ɵɵgetCurrentView();
|
|
214
|
+
i0.ɵɵelementStart(0, "span", 61);
|
|
215
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_Conditional_2_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r17); const group_r16 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.EditMode ? ctx_r2.StartEditingGroup(group_r16) : null); });
|
|
216
|
+
i0.ɵɵtext(1);
|
|
217
|
+
i0.ɵɵelementEnd();
|
|
218
|
+
} if (rf & 2) {
|
|
219
|
+
const group_r16 = i0.ɵɵnextContext().$implicit;
|
|
220
|
+
i0.ɵɵadvance();
|
|
221
|
+
i0.ɵɵtextInterpolate(group_r16);
|
|
222
|
+
} }
|
|
223
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
224
|
+
const _r18 = i0.ɵɵgetCurrentView();
|
|
225
|
+
i0.ɵɵelementStart(0, "div", 59)(1, "button", 62);
|
|
226
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_Conditional_6_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r18); const group_r16 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.RemoveGroup(group_r16)); });
|
|
227
|
+
i0.ɵɵelement(2, "i", 63);
|
|
228
|
+
i0.ɵɵtext(3, " Remove Group ");
|
|
229
|
+
i0.ɵɵelementEnd()();
|
|
230
|
+
} }
|
|
231
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
232
|
+
const _r21 = i0.ɵɵgetCurrentView();
|
|
233
|
+
i0.ɵɵelementStart(0, "div", 32)(1, "div", 40);
|
|
234
|
+
i0.ɵɵelement(2, "i", 41);
|
|
235
|
+
i0.ɵɵelementEnd();
|
|
236
|
+
i0.ɵɵelementStart(3, "div", 42)(4, "button", 43);
|
|
237
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_1_Template_button_click_4_listener($event) { i0.ɵɵrestoreView(_r21); const pin_r20 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(4); ctx_r2.RemovePin(pin_r20.Id); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
238
|
+
i0.ɵɵelement(5, "i", 44);
|
|
239
|
+
i0.ɵɵelementEnd()()();
|
|
240
|
+
} }
|
|
241
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
242
|
+
const _r22 = i0.ɵɵgetCurrentView();
|
|
243
|
+
i0.ɵɵelementStart(0, "div", 46)(1, "button", 47);
|
|
244
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_2_Conditional_2_Template_button_click_1_listener($event) { i0.ɵɵrestoreView(_r22); const pin_r20 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); ctx_r2.OnPinClick(pin_r20); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
245
|
+
i0.ɵɵtext(2, "Open");
|
|
246
|
+
i0.ɵɵelementEnd()();
|
|
247
|
+
} }
|
|
248
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
249
|
+
i0.ɵɵelementStart(0, "div", 33);
|
|
250
|
+
i0.ɵɵelement(1, "img", 45);
|
|
251
|
+
i0.ɵɵconditionalCreate(2, HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_2_Conditional_2_Template, 3, 0, "div", 46);
|
|
252
|
+
i0.ɵɵelementEnd();
|
|
253
|
+
} if (rf & 2) {
|
|
254
|
+
const pin_r20 = i0.ɵɵnextContext().$implicit;
|
|
255
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
256
|
+
i0.ɵɵadvance();
|
|
257
|
+
i0.ɵɵproperty("src", pin_r20.Thumbnail, i0.ɵɵsanitizeUrl)("alt", pin_r20.DisplayName);
|
|
258
|
+
i0.ɵɵadvance();
|
|
259
|
+
i0.ɵɵconditional(!ctx_r2.EditMode ? 2 : -1);
|
|
260
|
+
} }
|
|
261
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
262
|
+
const _r23 = i0.ɵɵgetCurrentView();
|
|
263
|
+
i0.ɵɵelementStart(0, "div", 46)(1, "button", 47);
|
|
264
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_3_Conditional_2_Template_button_click_1_listener($event) { i0.ɵɵrestoreView(_r23); const pin_r20 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); ctx_r2.OnPinClick(pin_r20); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
265
|
+
i0.ɵɵtext(2, "Open");
|
|
266
|
+
i0.ɵɵelementEnd()();
|
|
267
|
+
} }
|
|
268
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
269
|
+
i0.ɵɵelementStart(0, "div", 48);
|
|
270
|
+
i0.ɵɵelement(1, "i");
|
|
271
|
+
i0.ɵɵconditionalCreate(2, HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_3_Conditional_2_Template, 3, 0, "div", 46);
|
|
272
|
+
i0.ɵɵelementEnd();
|
|
273
|
+
} if (rf & 2) {
|
|
274
|
+
const pin_r20 = i0.ɵɵnextContext().$implicit;
|
|
275
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
276
|
+
i0.ɵɵstyleProp("--pin-icon-color", pin_r20.Color || "var(--mj-text-muted)");
|
|
277
|
+
i0.ɵɵadvance();
|
|
278
|
+
i0.ɵɵclassMap(ctx_r2.GetPinIcon(pin_r20));
|
|
279
|
+
i0.ɵɵadvance();
|
|
280
|
+
i0.ɵɵconditional(!ctx_r2.EditMode ? 2 : -1);
|
|
281
|
+
} }
|
|
282
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
283
|
+
const _r24 = i0.ɵɵgetCurrentView();
|
|
284
|
+
i0.ɵɵelementStart(0, "input", 49);
|
|
285
|
+
i0.ɵɵlistener("blur", function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_5_Template_input_blur_0_listener($event) { i0.ɵɵrestoreView(_r24); const pin_r20 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.SavePinName(pin_r20.Id, $event.target.value)); })("keydown.enter", function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_5_Template_input_keydown_enter_0_listener($event) { i0.ɵɵrestoreView(_r24); const pin_r20 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.SavePinName(pin_r20.Id, $event.target.value)); })("click", function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_5_Template_input_click_0_listener($event) { i0.ɵɵrestoreView(_r24); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
286
|
+
i0.ɵɵelementEnd();
|
|
287
|
+
} if (rf & 2) {
|
|
288
|
+
const pin_r20 = i0.ɵɵnextContext().$implicit;
|
|
289
|
+
i0.ɵɵproperty("value", pin_r20.DisplayName);
|
|
290
|
+
} }
|
|
291
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_6_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
292
|
+
const _r26 = i0.ɵɵgetCurrentView();
|
|
293
|
+
i0.ɵɵelementStart(0, "button", 52);
|
|
294
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_6_Conditional_2_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r26); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
295
|
+
i0.ɵɵelement(1, "i", 53);
|
|
296
|
+
i0.ɵɵelementEnd();
|
|
297
|
+
} }
|
|
298
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
299
|
+
const _r25 = i0.ɵɵgetCurrentView();
|
|
300
|
+
i0.ɵɵelementStart(0, "div", 50);
|
|
301
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_6_Template_div_click_0_listener($event) { i0.ɵɵrestoreView(_r25); const pin_r20 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.EditMode ? ctx_r2.StartEditingPin(pin_r20.Id, $event) : null); });
|
|
302
|
+
i0.ɵɵtext(1);
|
|
303
|
+
i0.ɵɵconditionalCreate(2, HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_6_Conditional_2_Template, 2, 0, "button", 51);
|
|
304
|
+
i0.ɵɵelementEnd();
|
|
305
|
+
} if (rf & 2) {
|
|
306
|
+
const pin_r20 = i0.ɵɵnextContext().$implicit;
|
|
307
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
308
|
+
i0.ɵɵadvance();
|
|
309
|
+
i0.ɵɵtextInterpolate1(" ", pin_r20.DisplayName, " ");
|
|
310
|
+
i0.ɵɵadvance();
|
|
311
|
+
i0.ɵɵconditional(!ctx_r2.EditMode ? 2 : -1);
|
|
312
|
+
} }
|
|
313
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
314
|
+
i0.ɵɵelementStart(0, "span", 39);
|
|
315
|
+
i0.ɵɵtext(1);
|
|
316
|
+
i0.ɵɵelementEnd();
|
|
317
|
+
} if (rf & 2) {
|
|
318
|
+
const pin_r20 = i0.ɵɵnextContext().$implicit;
|
|
319
|
+
i0.ɵɵadvance();
|
|
320
|
+
i0.ɵɵtextInterpolate(pin_r20.ApplicationName);
|
|
321
|
+
} }
|
|
322
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
323
|
+
const _r19 = i0.ɵɵgetCurrentView();
|
|
324
|
+
i0.ɵɵelementStart(0, "div", 31);
|
|
325
|
+
i0.ɵɵlistener("dragstart", function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Template_div_dragstart_0_listener($event) { const pin_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.OnDragStart($event, pin_r20)); })("dragover", function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Template_div_dragover_0_listener($event) { const pin_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.OnDragOver($event, pin_r20)); })("dragleave", function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Template_div_dragleave_0_listener() { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.OnDragLeave()); })("drop", function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Template_div_drop_0_listener($event) { const pin_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.OnDrop($event, pin_r20)); })("dragend", function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Template_div_dragend_0_listener() { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.OnDragEnd()); })("click", function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Template_div_click_0_listener() { const pin_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.OnPinClick(pin_r20)); });
|
|
326
|
+
i0.ɵɵconditionalCreate(1, HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_1_Template, 6, 0, "div", 32);
|
|
327
|
+
i0.ɵɵconditionalCreate(2, HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_2_Template, 3, 3, "div", 33)(3, HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_3_Template, 3, 5, "div", 34);
|
|
328
|
+
i0.ɵɵelementStart(4, "div", 35);
|
|
329
|
+
i0.ɵɵconditionalCreate(5, HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_5_Template, 1, 1, "input", 36)(6, HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_6_Template, 3, 2, "div", 37);
|
|
330
|
+
i0.ɵɵelementStart(7, "div", 38);
|
|
331
|
+
i0.ɵɵelement(8, "i");
|
|
332
|
+
i0.ɵɵtext(9);
|
|
333
|
+
i0.ɵɵconditionalCreate(10, HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Conditional_10_Template, 2, 1, "span", 39);
|
|
334
|
+
i0.ɵɵelementEnd()()();
|
|
335
|
+
} if (rf & 2) {
|
|
336
|
+
const pin_r20 = ctx.$implicit;
|
|
337
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
338
|
+
i0.ɵɵclassProp("edit-mode", ctx_r2.EditMode)("dragging", ctx_r2.DraggingPinId === pin_r20.Id)("drag-over", ctx_r2.DragOverPinId === pin_r20.Id);
|
|
339
|
+
i0.ɵɵproperty("draggable", ctx_r2.EditMode);
|
|
340
|
+
i0.ɵɵadvance();
|
|
341
|
+
i0.ɵɵconditional(ctx_r2.EditMode ? 1 : -1);
|
|
342
|
+
i0.ɵɵadvance();
|
|
343
|
+
i0.ɵɵconditional(pin_r20.Thumbnail ? 2 : 3);
|
|
344
|
+
i0.ɵɵadvance(3);
|
|
345
|
+
i0.ɵɵconditional(ctx_r2.EditMode && ctx_r2.EditingPinId === pin_r20.Id ? 5 : 6);
|
|
346
|
+
i0.ɵɵadvance(3);
|
|
347
|
+
i0.ɵɵclassMap(ctx_r2.GetPinIcon(pin_r20));
|
|
348
|
+
i0.ɵɵadvance();
|
|
349
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.GetResourceTypeLabel(pin_r20), " ");
|
|
350
|
+
i0.ɵɵadvance();
|
|
351
|
+
i0.ɵɵconditional(pin_r20.ApplicationName ? 10 : -1);
|
|
352
|
+
} }
|
|
353
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
354
|
+
i0.ɵɵelementStart(0, "div", 54);
|
|
355
|
+
i0.ɵɵconditionalCreate(1, HomeDashboardComponent_Conditional_8_Conditional_10_For_4_Conditional_1_Template, 1, 1, "input", 55)(2, HomeDashboardComponent_Conditional_8_Conditional_10_For_4_Conditional_2_Template, 2, 1, "span", 56);
|
|
356
|
+
i0.ɵɵelement(3, "div", 57);
|
|
357
|
+
i0.ɵɵelementStart(4, "span", 58);
|
|
358
|
+
i0.ɵɵtext(5);
|
|
359
|
+
i0.ɵɵelementEnd();
|
|
360
|
+
i0.ɵɵconditionalCreate(6, HomeDashboardComponent_Conditional_8_Conditional_10_For_4_Conditional_6_Template, 4, 0, "div", 59);
|
|
361
|
+
i0.ɵɵelementEnd();
|
|
362
|
+
i0.ɵɵrepeaterCreate(7, HomeDashboardComponent_Conditional_8_Conditional_10_For_4_For_8_Template, 11, 14, "div", 29, i0.ɵɵcomponentInstance().trackByPin, true);
|
|
363
|
+
} if (rf & 2) {
|
|
364
|
+
const group_r16 = ctx.$implicit;
|
|
365
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
366
|
+
i0.ɵɵadvance();
|
|
367
|
+
i0.ɵɵconditional(ctx_r2.EditMode && ctx_r2.EditingGroupName === group_r16 ? 1 : 2);
|
|
368
|
+
i0.ɵɵadvance(4);
|
|
369
|
+
i0.ɵɵtextInterpolate1("", ctx_r2.GetPinsInGroup(group_r16).length, " pins");
|
|
370
|
+
i0.ɵɵadvance();
|
|
371
|
+
i0.ɵɵconditional(ctx_r2.EditMode ? 6 : -1);
|
|
372
|
+
i0.ɵɵadvance();
|
|
373
|
+
i0.ɵɵrepeater(ctx_r2.GetPinsInGroup(group_r16));
|
|
374
|
+
} }
|
|
375
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
376
|
+
const _r27 = i0.ɵɵgetCurrentView();
|
|
377
|
+
i0.ɵɵelementStart(0, "div", 64);
|
|
378
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_8_Conditional_10_Conditional_5_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r27); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OpenAddPinPanel()); });
|
|
379
|
+
i0.ɵɵelement(1, "i", 24);
|
|
380
|
+
i0.ɵɵelementStart(2, "span");
|
|
381
|
+
i0.ɵɵtext(3, "Add Pin");
|
|
382
|
+
i0.ɵɵelementEnd()();
|
|
383
|
+
} }
|
|
384
|
+
function HomeDashboardComponent_Conditional_8_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
385
|
+
i0.ɵɵelementStart(0, "div", 20);
|
|
386
|
+
i0.ɵɵrepeaterCreate(1, HomeDashboardComponent_Conditional_8_Conditional_10_For_2_Template, 11, 14, "div", 29, i0.ɵɵcomponentInstance().trackByPin, true);
|
|
387
|
+
i0.ɵɵrepeaterCreate(3, HomeDashboardComponent_Conditional_8_Conditional_10_For_4_Template, 9, 3, null, null, i0.ɵɵcomponentInstance().trackByGroup, true);
|
|
388
|
+
i0.ɵɵconditionalCreate(5, HomeDashboardComponent_Conditional_8_Conditional_10_Conditional_5_Template, 4, 0, "div", 30);
|
|
389
|
+
i0.ɵɵelementEnd();
|
|
390
|
+
} if (rf & 2) {
|
|
391
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
392
|
+
i0.ɵɵadvance();
|
|
393
|
+
i0.ɵɵrepeater(ctx_r2.UngroupedPins);
|
|
394
|
+
i0.ɵɵadvance(2);
|
|
395
|
+
i0.ɵɵrepeater(ctx_r2.PinGroups);
|
|
396
|
+
i0.ɵɵadvance(2);
|
|
397
|
+
i0.ɵɵconditional(ctx_r2.EditMode ? 5 : -1);
|
|
398
|
+
} }
|
|
23
399
|
function HomeDashboardComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
24
|
-
i0.ɵɵelementStart(0, "div", 6);
|
|
25
|
-
i0.ɵɵelement(
|
|
400
|
+
i0.ɵɵelementStart(0, "div", 6)(1, "div", 13)(2, "h2", 14);
|
|
401
|
+
i0.ɵɵelement(3, "i", 15);
|
|
402
|
+
i0.ɵɵtext(4, " Pinned ");
|
|
403
|
+
i0.ɵɵelementEnd();
|
|
404
|
+
i0.ɵɵelementStart(5, "div", 16);
|
|
405
|
+
i0.ɵɵconditionalCreate(6, HomeDashboardComponent_Conditional_8_Conditional_6_Template, 3, 0, "button", 17)(7, HomeDashboardComponent_Conditional_8_Conditional_7_Template, 4, 1);
|
|
406
|
+
i0.ɵɵelementEnd()();
|
|
407
|
+
i0.ɵɵconditionalCreate(8, HomeDashboardComponent_Conditional_8_Conditional_8_Template, 6, 0, "div", 18);
|
|
408
|
+
i0.ɵɵconditionalCreate(9, HomeDashboardComponent_Conditional_8_Conditional_9_Template, 9, 0, "div", 19);
|
|
409
|
+
i0.ɵɵconditionalCreate(10, HomeDashboardComponent_Conditional_8_Conditional_10_Template, 6, 1, "div", 20);
|
|
410
|
+
i0.ɵɵelementEnd();
|
|
411
|
+
} if (rf & 2) {
|
|
412
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
413
|
+
i0.ɵɵadvance(6);
|
|
414
|
+
i0.ɵɵconditional(ctx_r2.EditMode ? 6 : 7);
|
|
415
|
+
i0.ɵɵadvance(2);
|
|
416
|
+
i0.ɵɵconditional(ctx_r2.EditMode ? 8 : -1);
|
|
417
|
+
i0.ɵɵadvance();
|
|
418
|
+
i0.ɵɵconditional(ctx_r2.PinnedItems.length === 0 && !ctx_r2.EditMode ? 9 : -1);
|
|
419
|
+
i0.ɵɵadvance();
|
|
420
|
+
i0.ɵɵconditional(ctx_r2.PinnedItems.length > 0 ? 10 : -1);
|
|
421
|
+
} }
|
|
422
|
+
function HomeDashboardComponent_Conditional_9_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
423
|
+
const _r29 = i0.ɵɵgetCurrentView();
|
|
424
|
+
i0.ɵɵelementStart(0, "div", 74);
|
|
425
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_9_Conditional_11_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r29); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnPinMenuMoveToGroup(undefined)); });
|
|
426
|
+
i0.ɵɵelementStart(1, "span");
|
|
427
|
+
i0.ɵɵtext(2, "(No group)");
|
|
428
|
+
i0.ɵɵelementEnd()();
|
|
429
|
+
} }
|
|
430
|
+
function HomeDashboardComponent_Conditional_9_For_13_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
431
|
+
const _r30 = i0.ɵɵgetCurrentView();
|
|
432
|
+
i0.ɵɵelementStart(0, "div", 74);
|
|
433
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_9_For_13_Conditional_0_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r30); const group_r31 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnPinMenuMoveToGroup(group_r31)); });
|
|
434
|
+
i0.ɵɵelementStart(1, "span");
|
|
435
|
+
i0.ɵɵtext(2);
|
|
436
|
+
i0.ɵɵelementEnd()();
|
|
437
|
+
} if (rf & 2) {
|
|
438
|
+
const group_r31 = i0.ɵɵnextContext().$implicit;
|
|
439
|
+
i0.ɵɵadvance(2);
|
|
440
|
+
i0.ɵɵtextInterpolate(group_r31);
|
|
441
|
+
} }
|
|
442
|
+
function HomeDashboardComponent_Conditional_9_For_13_Template(rf, ctx) { if (rf & 1) {
|
|
443
|
+
i0.ɵɵconditionalCreate(0, HomeDashboardComponent_Conditional_9_For_13_Conditional_0_Template, 3, 1, "div", 71);
|
|
444
|
+
} if (rf & 2) {
|
|
445
|
+
const group_r31 = ctx.$implicit;
|
|
446
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
447
|
+
i0.ɵɵconditional(group_r31 !== ctx_r2.PinMenuPin.Group ? 0 : -1);
|
|
448
|
+
} }
|
|
449
|
+
function HomeDashboardComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
450
|
+
const _r28 = i0.ɵɵgetCurrentView();
|
|
451
|
+
i0.ɵɵelementStart(0, "div", 65)(1, "div", 66);
|
|
452
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_9_Template_div_click_1_listener() { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OnPinMenuEdit()); });
|
|
453
|
+
i0.ɵɵelement(2, "i", 27);
|
|
454
|
+
i0.ɵɵelementStart(3, "span");
|
|
455
|
+
i0.ɵɵtext(4, "Edit");
|
|
456
|
+
i0.ɵɵelementEnd()();
|
|
457
|
+
i0.ɵɵelement(5, "div", 67);
|
|
458
|
+
i0.ɵɵelementStart(6, "div", 68)(7, "div", 69);
|
|
459
|
+
i0.ɵɵelement(8, "i", 70);
|
|
460
|
+
i0.ɵɵelementStart(9, "span");
|
|
461
|
+
i0.ɵɵtext(10, "Move to Group");
|
|
462
|
+
i0.ɵɵelementEnd()();
|
|
463
|
+
i0.ɵɵconditionalCreate(11, HomeDashboardComponent_Conditional_9_Conditional_11_Template, 3, 0, "div", 71);
|
|
464
|
+
i0.ɵɵrepeaterCreate(12, HomeDashboardComponent_Conditional_9_For_13_Template, 1, 1, null, null, i0.ɵɵrepeaterTrackByIdentity);
|
|
465
|
+
i0.ɵɵelementEnd();
|
|
466
|
+
i0.ɵɵelement(14, "div", 67);
|
|
467
|
+
i0.ɵɵelementStart(15, "div", 72);
|
|
468
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_9_Template_div_click_15_listener() { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OnPinMenuUnpin()); });
|
|
469
|
+
i0.ɵɵelement(16, "i", 73);
|
|
470
|
+
i0.ɵɵelementStart(17, "span");
|
|
471
|
+
i0.ɵɵtext(18, "Unpin");
|
|
472
|
+
i0.ɵɵelementEnd()()();
|
|
473
|
+
} if (rf & 2) {
|
|
474
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
475
|
+
i0.ɵɵstyleProp("left", ctx_r2.PinMenuX, "px")("top", ctx_r2.PinMenuY, "px");
|
|
476
|
+
i0.ɵɵadvance(11);
|
|
477
|
+
i0.ɵɵconditional(ctx_r2.PinMenuPin.Group ? 11 : -1);
|
|
478
|
+
i0.ɵɵadvance();
|
|
479
|
+
i0.ɵɵrepeater(ctx_r2.PinGroups);
|
|
480
|
+
} }
|
|
481
|
+
function HomeDashboardComponent_Conditional_10_For_20_Template(rf, ctx) { if (rf & 1) {
|
|
482
|
+
i0.ɵɵelementStart(0, "option", 86);
|
|
483
|
+
i0.ɵɵtext(1);
|
|
484
|
+
i0.ɵɵelementEnd();
|
|
485
|
+
} if (rf & 2) {
|
|
486
|
+
const group_r33 = ctx.$implicit;
|
|
487
|
+
i0.ɵɵproperty("value", group_r33);
|
|
488
|
+
i0.ɵɵadvance();
|
|
489
|
+
i0.ɵɵtextInterpolate(group_r33);
|
|
490
|
+
} }
|
|
491
|
+
function HomeDashboardComponent_Conditional_10_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
492
|
+
const _r34 = i0.ɵɵgetCurrentView();
|
|
493
|
+
i0.ɵɵelementStart(0, "div", 88)(1, "input", 91);
|
|
494
|
+
i0.ɵɵtwoWayListener("ngModelChange", function HomeDashboardComponent_Conditional_10_Conditional_23_Template_input_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.AddPanelNewGroupName, $event) || (ctx_r2.AddPanelNewGroupName = $event); return i0.ɵɵresetView($event); });
|
|
495
|
+
i0.ɵɵelementEnd()();
|
|
496
|
+
} if (rf & 2) {
|
|
497
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
498
|
+
i0.ɵɵadvance();
|
|
499
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.AddPanelNewGroupName);
|
|
500
|
+
} }
|
|
501
|
+
function HomeDashboardComponent_Conditional_10_Conditional_25_Template(rf, ctx) { if (rf & 1) {
|
|
502
|
+
i0.ɵɵelementStart(0, "div", 90);
|
|
503
|
+
i0.ɵɵelement(1, "mj-loading", 92);
|
|
504
|
+
i0.ɵɵelementEnd();
|
|
505
|
+
} }
|
|
506
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_0_Conditional_7_For_1_For_6_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
507
|
+
i0.ɵɵelementStart(0, "button", 106);
|
|
508
|
+
i0.ɵɵelement(1, "i", 22);
|
|
509
|
+
i0.ɵɵtext(2, " Pinned");
|
|
510
|
+
i0.ɵɵelementEnd();
|
|
511
|
+
} }
|
|
512
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_0_Conditional_7_For_1_For_6_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
513
|
+
const _r36 = i0.ɵɵgetCurrentView();
|
|
514
|
+
i0.ɵɵelementStart(0, "button", 108);
|
|
515
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_0_Conditional_7_For_1_For_6_Conditional_8_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r36); const ni_r37 = i0.ɵɵnextContext().$implicit; const app_r38 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r2.PinAppNavItem(app_r38.appName, app_r38.icon, app_r38.color, ni_r37.label, ni_r37.icon)); });
|
|
516
|
+
i0.ɵɵelement(1, "i", 24);
|
|
517
|
+
i0.ɵɵtext(2, " Pin ");
|
|
518
|
+
i0.ɵɵelementEnd();
|
|
519
|
+
} }
|
|
520
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_0_Conditional_7_For_1_For_6_Template(rf, ctx) { if (rf & 1) {
|
|
521
|
+
i0.ɵɵelementStart(0, "div", 101)(1, "div", 102);
|
|
522
|
+
i0.ɵɵelement(2, "i");
|
|
523
|
+
i0.ɵɵelementEnd();
|
|
524
|
+
i0.ɵɵelementStart(3, "div", 103)(4, "div", 104);
|
|
525
|
+
i0.ɵɵtext(5);
|
|
526
|
+
i0.ɵɵelementEnd()();
|
|
527
|
+
i0.ɵɵelementStart(6, "div", 105);
|
|
528
|
+
i0.ɵɵconditionalCreate(7, HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_0_Conditional_7_For_1_For_6_Conditional_7_Template, 3, 0, "button", 106)(8, HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_0_Conditional_7_For_1_For_6_Conditional_8_Template, 3, 0, "button", 107);
|
|
529
|
+
i0.ɵɵelementEnd()();
|
|
530
|
+
} if (rf & 2) {
|
|
531
|
+
const ni_r37 = ctx.$implicit;
|
|
532
|
+
const app_r38 = i0.ɵɵnextContext().$implicit;
|
|
533
|
+
i0.ɵɵadvance();
|
|
534
|
+
i0.ɵɵstyleProp("background", "color-mix(in srgb, " + app_r38.color + " 10%, var(--mj-bg-surface-card))");
|
|
535
|
+
i0.ɵɵadvance();
|
|
536
|
+
i0.ɵɵclassMap(ni_r37.icon);
|
|
537
|
+
i0.ɵɵstyleProp("color", app_r38.color);
|
|
538
|
+
i0.ɵɵadvance(3);
|
|
539
|
+
i0.ɵɵtextInterpolate(ni_r37.label);
|
|
540
|
+
i0.ɵɵadvance(2);
|
|
541
|
+
i0.ɵɵconditional(ni_r37.pinned ? 7 : 8);
|
|
542
|
+
} }
|
|
543
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_0_Conditional_7_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
544
|
+
i0.ɵɵelementStart(0, "div", 98)(1, "div", 99);
|
|
545
|
+
i0.ɵɵelement(2, "i");
|
|
546
|
+
i0.ɵɵelementEnd();
|
|
547
|
+
i0.ɵɵelementStart(3, "span", 100);
|
|
548
|
+
i0.ɵɵtext(4);
|
|
549
|
+
i0.ɵɵelementEnd()();
|
|
550
|
+
i0.ɵɵrepeaterCreate(5, HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_0_Conditional_7_For_1_For_6_Template, 9, 8, "div", 101, _forTrack1);
|
|
551
|
+
} if (rf & 2) {
|
|
552
|
+
const app_r38 = ctx.$implicit;
|
|
553
|
+
i0.ɵɵstyleProp("--panel-app-color", app_r38.color);
|
|
554
|
+
i0.ɵɵadvance(2);
|
|
555
|
+
i0.ɵɵclassMap(app_r38.icon);
|
|
556
|
+
i0.ɵɵadvance(2);
|
|
557
|
+
i0.ɵɵtextInterpolate(app_r38.appName);
|
|
558
|
+
i0.ɵɵadvance();
|
|
559
|
+
i0.ɵɵrepeater(app_r38.navItems);
|
|
560
|
+
} }
|
|
561
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_0_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
562
|
+
i0.ɵɵrepeaterCreate(0, HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_0_Conditional_7_For_1_Template, 7, 5, null, null, _forTrack0);
|
|
563
|
+
} if (rf & 2) {
|
|
564
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
565
|
+
i0.ɵɵrepeater(ctx_r2.FilterApps());
|
|
566
|
+
} }
|
|
567
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
568
|
+
const _r35 = i0.ɵɵgetCurrentView();
|
|
569
|
+
i0.ɵɵelementStart(0, "div", 93)(1, "div", 94);
|
|
570
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_0_Template_div_click_1_listener() { i0.ɵɵrestoreView(_r35); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.TogglePanelSection("apps")); });
|
|
571
|
+
i0.ɵɵelement(2, "i", 95);
|
|
572
|
+
i0.ɵɵtext(3, " Applications ");
|
|
573
|
+
i0.ɵɵelementStart(4, "span", 96);
|
|
574
|
+
i0.ɵɵtext(5);
|
|
575
|
+
i0.ɵɵelementEnd();
|
|
576
|
+
i0.ɵɵelement(6, "i", 97);
|
|
577
|
+
i0.ɵɵelementEnd();
|
|
578
|
+
i0.ɵɵconditionalCreate(7, HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_0_Conditional_7_Template, 2, 0);
|
|
579
|
+
i0.ɵɵelementEnd();
|
|
580
|
+
} if (rf & 2) {
|
|
581
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
582
|
+
i0.ɵɵadvance(5);
|
|
583
|
+
i0.ɵɵtextInterpolate(ctx_r2.FilterApps().length);
|
|
584
|
+
i0.ɵɵadvance();
|
|
585
|
+
i0.ɵɵclassProp("fa-chevron-down", !ctx_r2.PanelSectionCollapsed["apps"])("fa-chevron-right", ctx_r2.PanelSectionCollapsed["apps"]);
|
|
586
|
+
i0.ɵɵadvance();
|
|
587
|
+
i0.ɵɵconditional(!ctx_r2.PanelSectionCollapsed["apps"] ? 7 : -1);
|
|
588
|
+
} }
|
|
589
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_1_Conditional_7_For_1_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
590
|
+
i0.ɵɵelementStart(0, "button", 106);
|
|
591
|
+
i0.ɵɵelement(1, "i", 22);
|
|
592
|
+
i0.ɵɵtext(2, " Pinned");
|
|
593
|
+
i0.ɵɵelementEnd();
|
|
594
|
+
} }
|
|
595
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_1_Conditional_7_For_1_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
596
|
+
const _r40 = i0.ɵɵgetCurrentView();
|
|
597
|
+
i0.ɵɵelementStart(0, "button", 108);
|
|
598
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_1_Conditional_7_For_1_Conditional_8_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r40); const item_r41 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r2.PinFromPanel("Dashboards", item_r41.id, item_r41.name)); });
|
|
599
|
+
i0.ɵɵelement(1, "i", 24);
|
|
600
|
+
i0.ɵɵtext(2, " Pin ");
|
|
601
|
+
i0.ɵɵelementEnd();
|
|
602
|
+
} }
|
|
603
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_1_Conditional_7_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
604
|
+
i0.ɵɵelementStart(0, "div", 110)(1, "div", 111);
|
|
605
|
+
i0.ɵɵelement(2, "i", 112);
|
|
606
|
+
i0.ɵɵelementEnd();
|
|
607
|
+
i0.ɵɵelementStart(3, "div", 103)(4, "div", 104);
|
|
608
|
+
i0.ɵɵtext(5);
|
|
609
|
+
i0.ɵɵelementEnd()();
|
|
610
|
+
i0.ɵɵelementStart(6, "div", 105);
|
|
611
|
+
i0.ɵɵconditionalCreate(7, HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_1_Conditional_7_For_1_Conditional_7_Template, 3, 0, "button", 106)(8, HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_1_Conditional_7_For_1_Conditional_8_Template, 3, 0, "button", 107);
|
|
612
|
+
i0.ɵɵelementEnd()();
|
|
613
|
+
} if (rf & 2) {
|
|
614
|
+
const item_r41 = ctx.$implicit;
|
|
615
|
+
i0.ɵɵadvance(5);
|
|
616
|
+
i0.ɵɵtextInterpolate(item_r41.name);
|
|
617
|
+
i0.ɵɵadvance(2);
|
|
618
|
+
i0.ɵɵconditional(item_r41.pinned ? 7 : 8);
|
|
619
|
+
} }
|
|
620
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_1_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
621
|
+
i0.ɵɵrepeaterCreate(0, HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_1_Conditional_7_For_1_Template, 9, 2, "div", 110, _forTrack2);
|
|
622
|
+
} if (rf & 2) {
|
|
623
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
624
|
+
i0.ɵɵrepeater(ctx_r2.FilterPanelItems(ctx_r2.AvailableDashboards));
|
|
625
|
+
} }
|
|
626
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
627
|
+
const _r39 = i0.ɵɵgetCurrentView();
|
|
628
|
+
i0.ɵɵelementStart(0, "div", 93)(1, "div", 94);
|
|
629
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_1_Template_div_click_1_listener() { i0.ɵɵrestoreView(_r39); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.TogglePanelSection("dashboards")); });
|
|
630
|
+
i0.ɵɵelement(2, "i", 109);
|
|
631
|
+
i0.ɵɵtext(3, " Dashboards ");
|
|
632
|
+
i0.ɵɵelementStart(4, "span", 96);
|
|
633
|
+
i0.ɵɵtext(5);
|
|
634
|
+
i0.ɵɵelementEnd();
|
|
635
|
+
i0.ɵɵelement(6, "i", 97);
|
|
636
|
+
i0.ɵɵelementEnd();
|
|
637
|
+
i0.ɵɵconditionalCreate(7, HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_1_Conditional_7_Template, 2, 0);
|
|
638
|
+
i0.ɵɵelementEnd();
|
|
639
|
+
} if (rf & 2) {
|
|
640
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
641
|
+
i0.ɵɵadvance(5);
|
|
642
|
+
i0.ɵɵtextInterpolate(ctx_r2.FilterPanelItems(ctx_r2.AvailableDashboards).length);
|
|
643
|
+
i0.ɵɵadvance();
|
|
644
|
+
i0.ɵɵclassProp("fa-chevron-down", !ctx_r2.PanelSectionCollapsed["dashboards"])("fa-chevron-right", ctx_r2.PanelSectionCollapsed["dashboards"]);
|
|
645
|
+
i0.ɵɵadvance();
|
|
646
|
+
i0.ɵɵconditional(!ctx_r2.PanelSectionCollapsed["dashboards"] ? 7 : -1);
|
|
647
|
+
} }
|
|
648
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_2_Conditional_7_For_1_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
649
|
+
i0.ɵɵelementStart(0, "button", 106);
|
|
650
|
+
i0.ɵɵelement(1, "i", 22);
|
|
651
|
+
i0.ɵɵtext(2, " Pinned");
|
|
652
|
+
i0.ɵɵelementEnd();
|
|
653
|
+
} }
|
|
654
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_2_Conditional_7_For_1_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
655
|
+
const _r43 = i0.ɵɵgetCurrentView();
|
|
656
|
+
i0.ɵɵelementStart(0, "button", 108);
|
|
657
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_2_Conditional_7_For_1_Conditional_10_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r43); const item_r44 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r2.PinFromPanel("User Views", item_r44.id, item_r44.name)); });
|
|
658
|
+
i0.ɵɵelement(1, "i", 24);
|
|
659
|
+
i0.ɵɵtext(2, " Pin ");
|
|
660
|
+
i0.ɵɵelementEnd();
|
|
661
|
+
} }
|
|
662
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_2_Conditional_7_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
663
|
+
i0.ɵɵelementStart(0, "div", 110)(1, "div", 111);
|
|
664
|
+
i0.ɵɵelement(2, "i", 114);
|
|
665
|
+
i0.ɵɵelementEnd();
|
|
666
|
+
i0.ɵɵelementStart(3, "div", 103)(4, "div", 104);
|
|
667
|
+
i0.ɵɵtext(5);
|
|
668
|
+
i0.ɵɵelementEnd();
|
|
669
|
+
i0.ɵɵelementStart(6, "div", 115);
|
|
670
|
+
i0.ɵɵtext(7);
|
|
671
|
+
i0.ɵɵelementEnd()();
|
|
672
|
+
i0.ɵɵelementStart(8, "div", 105);
|
|
673
|
+
i0.ɵɵconditionalCreate(9, HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_2_Conditional_7_For_1_Conditional_9_Template, 3, 0, "button", 106)(10, HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_2_Conditional_7_For_1_Conditional_10_Template, 3, 0, "button", 107);
|
|
674
|
+
i0.ɵɵelementEnd()();
|
|
675
|
+
} if (rf & 2) {
|
|
676
|
+
const item_r44 = ctx.$implicit;
|
|
677
|
+
i0.ɵɵadvance(5);
|
|
678
|
+
i0.ɵɵtextInterpolate(item_r44.name);
|
|
679
|
+
i0.ɵɵadvance(2);
|
|
680
|
+
i0.ɵɵtextInterpolate(item_r44.entityName);
|
|
681
|
+
i0.ɵɵadvance(2);
|
|
682
|
+
i0.ɵɵconditional(item_r44.pinned ? 9 : 10);
|
|
683
|
+
} }
|
|
684
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
685
|
+
i0.ɵɵrepeaterCreate(0, HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_2_Conditional_7_For_1_Template, 11, 3, "div", 110, _forTrack2);
|
|
686
|
+
} if (rf & 2) {
|
|
687
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
688
|
+
i0.ɵɵrepeater(ctx_r2.FilterPanelItems(ctx_r2.AvailableViews));
|
|
689
|
+
} }
|
|
690
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
691
|
+
const _r42 = i0.ɵɵgetCurrentView();
|
|
692
|
+
i0.ɵɵelementStart(0, "div", 93)(1, "div", 94);
|
|
693
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_2_Template_div_click_1_listener() { i0.ɵɵrestoreView(_r42); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.TogglePanelSection("views")); });
|
|
694
|
+
i0.ɵɵelement(2, "i", 113);
|
|
695
|
+
i0.ɵɵtext(3, " Views ");
|
|
696
|
+
i0.ɵɵelementStart(4, "span", 96);
|
|
697
|
+
i0.ɵɵtext(5);
|
|
698
|
+
i0.ɵɵelementEnd();
|
|
699
|
+
i0.ɵɵelement(6, "i", 97);
|
|
700
|
+
i0.ɵɵelementEnd();
|
|
701
|
+
i0.ɵɵconditionalCreate(7, HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_2_Conditional_7_Template, 2, 0);
|
|
702
|
+
i0.ɵɵelementEnd();
|
|
703
|
+
} if (rf & 2) {
|
|
704
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
705
|
+
i0.ɵɵadvance(5);
|
|
706
|
+
i0.ɵɵtextInterpolate(ctx_r2.FilterPanelItems(ctx_r2.AvailableViews).length);
|
|
707
|
+
i0.ɵɵadvance();
|
|
708
|
+
i0.ɵɵclassProp("fa-chevron-down", !ctx_r2.PanelSectionCollapsed["views"])("fa-chevron-right", ctx_r2.PanelSectionCollapsed["views"]);
|
|
709
|
+
i0.ɵɵadvance();
|
|
710
|
+
i0.ɵɵconditional(!ctx_r2.PanelSectionCollapsed["views"] ? 7 : -1);
|
|
711
|
+
} }
|
|
712
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_3_Conditional_7_For_1_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
713
|
+
i0.ɵɵelementStart(0, "button", 106);
|
|
714
|
+
i0.ɵɵelement(1, "i", 22);
|
|
715
|
+
i0.ɵɵtext(2, " Pinned");
|
|
716
|
+
i0.ɵɵelementEnd();
|
|
717
|
+
} }
|
|
718
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_3_Conditional_7_For_1_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
719
|
+
const _r46 = i0.ɵɵgetCurrentView();
|
|
720
|
+
i0.ɵɵelementStart(0, "button", 108);
|
|
721
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_3_Conditional_7_For_1_Conditional_8_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r46); const item_r47 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r2.PinFromPanel("Queries", item_r47.id, item_r47.name)); });
|
|
722
|
+
i0.ɵɵelement(1, "i", 24);
|
|
723
|
+
i0.ɵɵtext(2, " Pin ");
|
|
724
|
+
i0.ɵɵelementEnd();
|
|
725
|
+
} }
|
|
726
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_3_Conditional_7_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
727
|
+
i0.ɵɵelementStart(0, "div", 110)(1, "div", 111);
|
|
728
|
+
i0.ɵɵelement(2, "i", 117);
|
|
729
|
+
i0.ɵɵelementEnd();
|
|
730
|
+
i0.ɵɵelementStart(3, "div", 103)(4, "div", 104);
|
|
731
|
+
i0.ɵɵtext(5);
|
|
732
|
+
i0.ɵɵelementEnd()();
|
|
733
|
+
i0.ɵɵelementStart(6, "div", 105);
|
|
734
|
+
i0.ɵɵconditionalCreate(7, HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_3_Conditional_7_For_1_Conditional_7_Template, 3, 0, "button", 106)(8, HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_3_Conditional_7_For_1_Conditional_8_Template, 3, 0, "button", 107);
|
|
735
|
+
i0.ɵɵelementEnd()();
|
|
736
|
+
} if (rf & 2) {
|
|
737
|
+
const item_r47 = ctx.$implicit;
|
|
738
|
+
i0.ɵɵadvance(5);
|
|
739
|
+
i0.ɵɵtextInterpolate(item_r47.name);
|
|
740
|
+
i0.ɵɵadvance(2);
|
|
741
|
+
i0.ɵɵconditional(item_r47.pinned ? 7 : 8);
|
|
742
|
+
} }
|
|
743
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_3_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
744
|
+
i0.ɵɵrepeaterCreate(0, HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_3_Conditional_7_For_1_Template, 9, 2, "div", 110, _forTrack2);
|
|
745
|
+
} if (rf & 2) {
|
|
746
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
747
|
+
i0.ɵɵrepeater(ctx_r2.FilterPanelItems(ctx_r2.AvailableQueries));
|
|
748
|
+
} }
|
|
749
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
750
|
+
const _r45 = i0.ɵɵgetCurrentView();
|
|
751
|
+
i0.ɵɵelementStart(0, "div", 93)(1, "div", 94);
|
|
752
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_3_Template_div_click_1_listener() { i0.ɵɵrestoreView(_r45); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.TogglePanelSection("queries")); });
|
|
753
|
+
i0.ɵɵelement(2, "i", 116);
|
|
754
|
+
i0.ɵɵtext(3, " Queries ");
|
|
755
|
+
i0.ɵɵelementStart(4, "span", 96);
|
|
756
|
+
i0.ɵɵtext(5);
|
|
757
|
+
i0.ɵɵelementEnd();
|
|
758
|
+
i0.ɵɵelement(6, "i", 97);
|
|
759
|
+
i0.ɵɵelementEnd();
|
|
760
|
+
i0.ɵɵconditionalCreate(7, HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_3_Conditional_7_Template, 2, 0);
|
|
761
|
+
i0.ɵɵelementEnd();
|
|
762
|
+
} if (rf & 2) {
|
|
763
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
764
|
+
i0.ɵɵadvance(5);
|
|
765
|
+
i0.ɵɵtextInterpolate(ctx_r2.FilterPanelItems(ctx_r2.AvailableQueries).length);
|
|
766
|
+
i0.ɵɵadvance();
|
|
767
|
+
i0.ɵɵclassProp("fa-chevron-down", !ctx_r2.PanelSectionCollapsed["queries"])("fa-chevron-right", ctx_r2.PanelSectionCollapsed["queries"]);
|
|
768
|
+
i0.ɵɵadvance();
|
|
769
|
+
i0.ɵɵconditional(!ctx_r2.PanelSectionCollapsed["queries"] ? 7 : -1);
|
|
770
|
+
} }
|
|
771
|
+
function HomeDashboardComponent_Conditional_10_Conditional_26_Template(rf, ctx) { if (rf & 1) {
|
|
772
|
+
i0.ɵɵconditionalCreate(0, HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_0_Template, 8, 6, "div", 93);
|
|
773
|
+
i0.ɵɵconditionalCreate(1, HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_1_Template, 8, 6, "div", 93);
|
|
774
|
+
i0.ɵɵconditionalCreate(2, HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_2_Template, 8, 6, "div", 93);
|
|
775
|
+
i0.ɵɵconditionalCreate(3, HomeDashboardComponent_Conditional_10_Conditional_26_Conditional_3_Template, 8, 6, "div", 93);
|
|
776
|
+
} if (rf & 2) {
|
|
777
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
778
|
+
i0.ɵɵconditional(ctx_r2.FilterApps().length > 0 ? 0 : -1);
|
|
779
|
+
i0.ɵɵadvance();
|
|
780
|
+
i0.ɵɵconditional(ctx_r2.FilterPanelItems(ctx_r2.AvailableDashboards).length > 0 ? 1 : -1);
|
|
781
|
+
i0.ɵɵadvance();
|
|
782
|
+
i0.ɵɵconditional(ctx_r2.FilterPanelItems(ctx_r2.AvailableViews).length > 0 ? 2 : -1);
|
|
783
|
+
i0.ɵɵadvance();
|
|
784
|
+
i0.ɵɵconditional(ctx_r2.FilterPanelItems(ctx_r2.AvailableQueries).length > 0 ? 3 : -1);
|
|
785
|
+
} }
|
|
786
|
+
function HomeDashboardComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
787
|
+
const _r32 = i0.ɵɵgetCurrentView();
|
|
788
|
+
i0.ɵɵelementStart(0, "div", 75);
|
|
789
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_10_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r32); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.CloseAddPinPanel()); });
|
|
790
|
+
i0.ɵɵelementEnd();
|
|
791
|
+
i0.ɵɵelementStart(1, "div", 76)(2, "div", 77)(3, "h3");
|
|
792
|
+
i0.ɵɵelement(4, "i", 15);
|
|
793
|
+
i0.ɵɵtext(5, " Add Pin");
|
|
794
|
+
i0.ɵɵelementEnd();
|
|
795
|
+
i0.ɵɵelementStart(6, "button", 78);
|
|
796
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_10_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r32); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.CloseAddPinPanel()); });
|
|
797
|
+
i0.ɵɵelement(7, "i", 44);
|
|
798
|
+
i0.ɵɵelementEnd()();
|
|
799
|
+
i0.ɵɵelementStart(8, "div", 79)(9, "div", 80);
|
|
800
|
+
i0.ɵɵelement(10, "i", 81);
|
|
801
|
+
i0.ɵɵelementStart(11, "input", 82);
|
|
802
|
+
i0.ɵɵtwoWayListener("ngModelChange", function HomeDashboardComponent_Conditional_10_Template_input_ngModelChange_11_listener($event) { i0.ɵɵrestoreView(_r32); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.AddPanelSearchQuery, $event) || (ctx_r2.AddPanelSearchQuery = $event); return i0.ɵɵresetView($event); });
|
|
803
|
+
i0.ɵɵelementEnd()()();
|
|
804
|
+
i0.ɵɵelementStart(12, "div", 83)(13, "label");
|
|
805
|
+
i0.ɵɵelement(14, "i", 70);
|
|
806
|
+
i0.ɵɵtext(15, " Add to group:");
|
|
807
|
+
i0.ɵɵelementEnd();
|
|
808
|
+
i0.ɵɵelementStart(16, "select", 84);
|
|
809
|
+
i0.ɵɵtwoWayListener("ngModelChange", function HomeDashboardComponent_Conditional_10_Template_select_ngModelChange_16_listener($event) { i0.ɵɵrestoreView(_r32); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.AddPanelSelectedGroup, $event) || (ctx_r2.AddPanelSelectedGroup = $event); return i0.ɵɵresetView($event); });
|
|
810
|
+
i0.ɵɵelementStart(17, "option", 85);
|
|
811
|
+
i0.ɵɵtext(18, "(No group)");
|
|
812
|
+
i0.ɵɵelementEnd();
|
|
813
|
+
i0.ɵɵrepeaterCreate(19, HomeDashboardComponent_Conditional_10_For_20_Template, 2, 2, "option", 86, i0.ɵɵrepeaterTrackByIdentity);
|
|
814
|
+
i0.ɵɵelementStart(21, "option", 87);
|
|
815
|
+
i0.ɵɵtext(22, "+ New group...");
|
|
816
|
+
i0.ɵɵelementEnd()()();
|
|
817
|
+
i0.ɵɵconditionalCreate(23, HomeDashboardComponent_Conditional_10_Conditional_23_Template, 2, 1, "div", 88);
|
|
818
|
+
i0.ɵɵelementStart(24, "div", 89);
|
|
819
|
+
i0.ɵɵconditionalCreate(25, HomeDashboardComponent_Conditional_10_Conditional_25_Template, 2, 0, "div", 90)(26, HomeDashboardComponent_Conditional_10_Conditional_26_Template, 4, 4);
|
|
820
|
+
i0.ɵɵelementEnd()();
|
|
821
|
+
} if (rf & 2) {
|
|
822
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
823
|
+
i0.ɵɵadvance(11);
|
|
824
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.AddPanelSearchQuery);
|
|
825
|
+
i0.ɵɵadvance(5);
|
|
826
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.AddPanelSelectedGroup);
|
|
827
|
+
i0.ɵɵadvance(3);
|
|
828
|
+
i0.ɵɵrepeater(ctx_r2.PinGroups);
|
|
829
|
+
i0.ɵɵadvance(4);
|
|
830
|
+
i0.ɵɵconditional(ctx_r2.AddPanelSelectedGroup === "__new__" ? 23 : -1);
|
|
831
|
+
i0.ɵɵadvance(2);
|
|
832
|
+
i0.ɵɵconditional(ctx_r2.AddPanelLoading ? 25 : 26);
|
|
833
|
+
} }
|
|
834
|
+
function HomeDashboardComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
835
|
+
i0.ɵɵelementStart(0, "div", 8);
|
|
836
|
+
i0.ɵɵelement(1, "mj-loading", 118);
|
|
26
837
|
i0.ɵɵelementEnd();
|
|
27
838
|
} }
|
|
28
|
-
function
|
|
29
|
-
i0.ɵɵelementStart(0, "p",
|
|
839
|
+
function HomeDashboardComponent_Conditional_12_For_6_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
840
|
+
i0.ɵɵelementStart(0, "p", 127);
|
|
30
841
|
i0.ɵɵtext(1);
|
|
31
842
|
i0.ɵɵelementEnd();
|
|
32
843
|
} if (rf & 2) {
|
|
33
|
-
const
|
|
844
|
+
const appData_r49 = i0.ɵɵnextContext().$implicit;
|
|
34
845
|
i0.ɵɵadvance();
|
|
35
|
-
i0.ɵɵtextInterpolate(
|
|
846
|
+
i0.ɵɵtextInterpolate(appData_r49.app.Description);
|
|
36
847
|
} }
|
|
37
|
-
function
|
|
38
|
-
i0.ɵɵelementStart(0, "div",
|
|
848
|
+
function HomeDashboardComponent_Conditional_12_For_6_Conditional_8_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
849
|
+
i0.ɵɵelementStart(0, "div", 131);
|
|
39
850
|
i0.ɵɵelement(1, "i");
|
|
40
851
|
i0.ɵɵelementStart(2, "span");
|
|
41
852
|
i0.ɵɵtext(3);
|
|
42
853
|
i0.ɵɵelementEnd()();
|
|
43
854
|
} if (rf & 2) {
|
|
44
|
-
const
|
|
855
|
+
const item_r50 = ctx.$implicit;
|
|
45
856
|
i0.ɵɵadvance();
|
|
46
|
-
i0.ɵɵclassMap(
|
|
857
|
+
i0.ɵɵclassMap(item_r50.Icon);
|
|
47
858
|
i0.ɵɵadvance(2);
|
|
48
|
-
i0.ɵɵtextInterpolate(
|
|
859
|
+
i0.ɵɵtextInterpolate(item_r50.Label);
|
|
49
860
|
} }
|
|
50
|
-
function
|
|
51
|
-
i0.ɵɵelementStart(0, "span",
|
|
861
|
+
function HomeDashboardComponent_Conditional_12_For_6_Conditional_8_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
862
|
+
i0.ɵɵelementStart(0, "span", 132);
|
|
52
863
|
i0.ɵɵtext(1);
|
|
53
864
|
i0.ɵɵelementEnd();
|
|
54
865
|
} if (rf & 2) {
|
|
55
|
-
const
|
|
866
|
+
const appData_r49 = i0.ɵɵnextContext(2).$implicit;
|
|
56
867
|
i0.ɵɵadvance();
|
|
57
|
-
i0.ɵɵtextInterpolate1(" +",
|
|
868
|
+
i0.ɵɵtextInterpolate1(" +", appData_r49.moreItemsCount, " more ");
|
|
58
869
|
} }
|
|
59
|
-
function
|
|
60
|
-
i0.ɵɵelementStart(0, "div",
|
|
61
|
-
i0.ɵɵrepeaterCreate(1,
|
|
62
|
-
i0.ɵɵconditionalCreate(3,
|
|
870
|
+
function HomeDashboardComponent_Conditional_12_For_6_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
871
|
+
i0.ɵɵelementStart(0, "div", 128);
|
|
872
|
+
i0.ɵɵrepeaterCreate(1, HomeDashboardComponent_Conditional_12_For_6_Conditional_8_For_2_Template, 4, 3, "div", 131, i0.ɵɵcomponentInstance().trackByNavItem, true);
|
|
873
|
+
i0.ɵɵconditionalCreate(3, HomeDashboardComponent_Conditional_12_For_6_Conditional_8_Conditional_3_Template, 2, 1, "span", 132);
|
|
63
874
|
i0.ɵɵelementEnd();
|
|
64
875
|
} if (rf & 2) {
|
|
65
|
-
const
|
|
876
|
+
const appData_r49 = i0.ɵɵnextContext().$implicit;
|
|
66
877
|
i0.ɵɵadvance();
|
|
67
|
-
i0.ɵɵrepeater(
|
|
878
|
+
i0.ɵɵrepeater(appData_r49.navItemsPreview);
|
|
68
879
|
i0.ɵɵadvance(2);
|
|
69
|
-
i0.ɵɵconditional(
|
|
880
|
+
i0.ɵɵconditional(appData_r49.showMoreItems ? 3 : -1);
|
|
70
881
|
} }
|
|
71
|
-
function
|
|
72
|
-
const
|
|
73
|
-
i0.ɵɵelementStart(0, "div",
|
|
74
|
-
i0.ɵɵlistener("click", function
|
|
75
|
-
i0.ɵɵelementStart(1, "div",
|
|
882
|
+
function HomeDashboardComponent_Conditional_12_For_6_Template(rf, ctx) { if (rf & 1) {
|
|
883
|
+
const _r48 = i0.ɵɵgetCurrentView();
|
|
884
|
+
i0.ɵɵelementStart(0, "div", 122);
|
|
885
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_12_For_6_Template_div_click_0_listener() { const appData_r49 = i0.ɵɵrestoreView(_r48).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onAppClick(appData_r49.app)); });
|
|
886
|
+
i0.ɵɵelementStart(1, "div", 123)(2, "div", 124);
|
|
76
887
|
i0.ɵɵelement(3, "i");
|
|
77
888
|
i0.ɵɵelementEnd()();
|
|
78
|
-
i0.ɵɵelementStart(4, "div",
|
|
889
|
+
i0.ɵɵelementStart(4, "div", 125)(5, "h3", 126);
|
|
79
890
|
i0.ɵɵtext(6);
|
|
80
891
|
i0.ɵɵelementEnd();
|
|
81
|
-
i0.ɵɵconditionalCreate(7,
|
|
82
|
-
i0.ɵɵconditionalCreate(8,
|
|
892
|
+
i0.ɵɵconditionalCreate(7, HomeDashboardComponent_Conditional_12_For_6_Conditional_7_Template, 2, 1, "p", 127);
|
|
893
|
+
i0.ɵɵconditionalCreate(8, HomeDashboardComponent_Conditional_12_For_6_Conditional_8_Template, 4, 1, "div", 128);
|
|
83
894
|
i0.ɵɵelementEnd();
|
|
84
|
-
i0.ɵɵelementStart(9, "div",
|
|
85
|
-
i0.ɵɵelement(10, "i",
|
|
895
|
+
i0.ɵɵelementStart(9, "div", 129);
|
|
896
|
+
i0.ɵɵelement(10, "i", 130);
|
|
86
897
|
i0.ɵɵelementEnd()();
|
|
87
898
|
} if (rf & 2) {
|
|
88
|
-
const
|
|
89
|
-
i0.ɵɵstyleProp("--app-color",
|
|
899
|
+
const appData_r49 = ctx.$implicit;
|
|
900
|
+
i0.ɵɵstyleProp("--app-color", appData_r49.color);
|
|
90
901
|
i0.ɵɵadvance(3);
|
|
91
|
-
i0.ɵɵclassMap(
|
|
902
|
+
i0.ɵɵclassMap(appData_r49.icon);
|
|
92
903
|
i0.ɵɵadvance(3);
|
|
93
|
-
i0.ɵɵtextInterpolate(
|
|
904
|
+
i0.ɵɵtextInterpolate(appData_r49.app.Name);
|
|
94
905
|
i0.ɵɵadvance();
|
|
95
|
-
i0.ɵɵconditional(
|
|
906
|
+
i0.ɵɵconditional(appData_r49.app.Description ? 7 : -1);
|
|
96
907
|
i0.ɵɵadvance();
|
|
97
|
-
i0.ɵɵconditional(
|
|
908
|
+
i0.ɵɵconditional(appData_r49.navItemsCount > 0 ? 8 : -1);
|
|
98
909
|
} }
|
|
99
|
-
function
|
|
100
|
-
const
|
|
101
|
-
i0.ɵɵelementStart(0, "div",
|
|
102
|
-
i0.ɵɵelement(2, "i",
|
|
910
|
+
function HomeDashboardComponent_Conditional_12_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
911
|
+
const _r51 = i0.ɵɵgetCurrentView();
|
|
912
|
+
i0.ɵɵelementStart(0, "div", 121)(1, "div", 133);
|
|
913
|
+
i0.ɵɵelement(2, "i", 134);
|
|
103
914
|
i0.ɵɵelementEnd();
|
|
104
915
|
i0.ɵɵelementStart(3, "h3");
|
|
105
916
|
i0.ɵɵtext(4, "No Applications Available");
|
|
@@ -107,226 +918,226 @@ function HomeDashboardComponent_Conditional_9_Conditional_7_Template(rf, ctx) {
|
|
|
107
918
|
i0.ɵɵelementStart(5, "p");
|
|
108
919
|
i0.ɵɵtext(6, "You don't have any applications configured yet.");
|
|
109
920
|
i0.ɵɵelementEnd();
|
|
110
|
-
i0.ɵɵelementStart(7, "button",
|
|
111
|
-
i0.ɵɵlistener("click", function
|
|
112
|
-
i0.ɵɵelement(8, "i",
|
|
921
|
+
i0.ɵɵelementStart(7, "button", 135);
|
|
922
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_12_Conditional_7_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r51); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.openConfigDialog()); });
|
|
923
|
+
i0.ɵɵelement(8, "i", 136);
|
|
113
924
|
i0.ɵɵtext(9, " Configure Applications ");
|
|
114
925
|
i0.ɵɵelementEnd()();
|
|
115
926
|
} }
|
|
116
|
-
function
|
|
117
|
-
i0.ɵɵelementStart(0, "div",
|
|
118
|
-
i0.ɵɵelement(2, "i",
|
|
119
|
-
i0.ɵɵtext(3, "
|
|
927
|
+
function HomeDashboardComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
928
|
+
i0.ɵɵelementStart(0, "div", 9)(1, "h2", 14);
|
|
929
|
+
i0.ɵɵelement(2, "i", 95);
|
|
930
|
+
i0.ɵɵtext(3, " My Applications ");
|
|
120
931
|
i0.ɵɵelementEnd();
|
|
121
|
-
i0.ɵɵelementStart(4, "div",
|
|
122
|
-
i0.ɵɵrepeaterCreate(5,
|
|
932
|
+
i0.ɵɵelementStart(4, "div", 119);
|
|
933
|
+
i0.ɵɵrepeaterCreate(5, HomeDashboardComponent_Conditional_12_For_6_Template, 11, 7, "div", 120, i0.ɵɵcomponentInstance().trackByApp, true);
|
|
123
934
|
i0.ɵɵelementEnd();
|
|
124
|
-
i0.ɵɵconditionalCreate(7,
|
|
935
|
+
i0.ɵɵconditionalCreate(7, HomeDashboardComponent_Conditional_12_Conditional_7_Template, 10, 0, "div", 121);
|
|
125
936
|
i0.ɵɵelementEnd();
|
|
126
937
|
} if (rf & 2) {
|
|
127
|
-
const
|
|
938
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
128
939
|
i0.ɵɵadvance(5);
|
|
129
|
-
i0.ɵɵrepeater(
|
|
940
|
+
i0.ɵɵrepeater(ctx_r2.appsDisplayData);
|
|
130
941
|
i0.ɵɵadvance(2);
|
|
131
|
-
i0.ɵɵconditional(
|
|
942
|
+
i0.ɵɵconditional(ctx_r2.apps.length === 0 ? 7 : -1);
|
|
132
943
|
} }
|
|
133
|
-
function
|
|
134
|
-
const
|
|
135
|
-
i0.ɵɵelementStart(0, "div",
|
|
136
|
-
i0.ɵɵlistener("click", function
|
|
137
|
-
i0.ɵɵelementStart(1, "div",
|
|
944
|
+
function HomeDashboardComponent_Conditional_13_Conditional_8_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
945
|
+
const _r53 = i0.ɵɵgetCurrentView();
|
|
946
|
+
i0.ɵɵelementStart(0, "div", 150);
|
|
947
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_13_Conditional_8_For_8_Template_div_click_0_listener() { const notification_r54 = i0.ɵɵrestoreView(_r53).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onNotificationClick(notification_r54)); });
|
|
948
|
+
i0.ɵɵelementStart(1, "div", 151)(2, "span", 152);
|
|
138
949
|
i0.ɵɵtext(3);
|
|
139
950
|
i0.ɵɵelementEnd();
|
|
140
|
-
i0.ɵɵelementStart(4, "span",
|
|
951
|
+
i0.ɵɵelementStart(4, "span", 153);
|
|
141
952
|
i0.ɵɵtext(5);
|
|
142
953
|
i0.ɵɵpipe(6, "slice");
|
|
143
954
|
i0.ɵɵelementEnd()()();
|
|
144
955
|
} if (rf & 2) {
|
|
145
|
-
const
|
|
956
|
+
const notification_r54 = ctx.$implicit;
|
|
146
957
|
i0.ɵɵadvance(3);
|
|
147
|
-
i0.ɵɵtextInterpolate(
|
|
958
|
+
i0.ɵɵtextInterpolate(notification_r54.Title);
|
|
148
959
|
i0.ɵɵadvance(2);
|
|
149
|
-
i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind3(6, 3,
|
|
960
|
+
i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind3(6, 3, notification_r54.Message, 0, 40), "", ((notification_r54.Message == null ? null : notification_r54.Message.length) || 0) > 40 ? "..." : "");
|
|
150
961
|
} }
|
|
151
|
-
function
|
|
152
|
-
i0.ɵɵelementStart(0, "div",
|
|
153
|
-
i0.ɵɵelement(2, "i",
|
|
962
|
+
function HomeDashboardComponent_Conditional_13_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
963
|
+
i0.ɵɵelementStart(0, "div", 141)(1, "h4", 145);
|
|
964
|
+
i0.ɵɵelement(2, "i", 146);
|
|
154
965
|
i0.ɵɵtext(3, " Notifications ");
|
|
155
|
-
i0.ɵɵelementStart(4, "span",
|
|
966
|
+
i0.ɵɵelementStart(4, "span", 147);
|
|
156
967
|
i0.ɵɵtext(5);
|
|
157
968
|
i0.ɵɵelementEnd()();
|
|
158
|
-
i0.ɵɵelementStart(6, "div",
|
|
159
|
-
i0.ɵɵrepeaterCreate(7,
|
|
969
|
+
i0.ɵɵelementStart(6, "div", 148);
|
|
970
|
+
i0.ɵɵrepeaterCreate(7, HomeDashboardComponent_Conditional_13_Conditional_8_For_8_Template, 7, 7, "div", 149, i0.ɵɵcomponentInstance().trackByNotification, true);
|
|
160
971
|
i0.ɵɵelementEnd()();
|
|
161
972
|
} if (rf & 2) {
|
|
162
|
-
const
|
|
973
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
163
974
|
i0.ɵɵadvance(5);
|
|
164
|
-
i0.ɵɵtextInterpolate(
|
|
975
|
+
i0.ɵɵtextInterpolate(ctx_r2.unreadNotifications.length);
|
|
165
976
|
i0.ɵɵadvance(2);
|
|
166
|
-
i0.ɵɵrepeater(
|
|
977
|
+
i0.ɵɵrepeater(ctx_r2.unreadNotifications);
|
|
167
978
|
} }
|
|
168
|
-
function
|
|
169
|
-
const
|
|
170
|
-
i0.ɵɵelementStart(0, "div",
|
|
171
|
-
i0.ɵɵlistener("click", function
|
|
172
|
-
i0.ɵɵelementStart(1, "div",
|
|
979
|
+
function HomeDashboardComponent_Conditional_13_Conditional_9_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
980
|
+
const _r55 = i0.ɵɵgetCurrentView();
|
|
981
|
+
i0.ɵɵelementStart(0, "div", 157);
|
|
982
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_13_Conditional_9_Conditional_4_For_2_Template_div_click_0_listener() { const favorite_r56 = i0.ɵɵrestoreView(_r55).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.onFavoriteClick(favorite_r56)); });
|
|
983
|
+
i0.ɵɵelementStart(1, "div", 158);
|
|
173
984
|
i0.ɵɵelement(2, "i");
|
|
174
985
|
i0.ɵɵelementEnd();
|
|
175
|
-
i0.ɵɵelementStart(3, "div",
|
|
986
|
+
i0.ɵɵelementStart(3, "div", 151)(4, "span", 152);
|
|
176
987
|
i0.ɵɵtext(5);
|
|
177
988
|
i0.ɵɵelementEnd();
|
|
178
|
-
i0.ɵɵelementStart(6, "span",
|
|
989
|
+
i0.ɵɵelementStart(6, "span", 153);
|
|
179
990
|
i0.ɵɵtext(7);
|
|
180
991
|
i0.ɵɵelementEnd()()();
|
|
181
992
|
} if (rf & 2) {
|
|
182
|
-
const
|
|
183
|
-
const
|
|
993
|
+
const favorite_r56 = ctx.$implicit;
|
|
994
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
184
995
|
i0.ɵɵadvance(2);
|
|
185
|
-
i0.ɵɵclassMap(
|
|
996
|
+
i0.ɵɵclassMap(ctx_r2.getEntityIconByName(favorite_r56.Entity));
|
|
186
997
|
i0.ɵɵadvance(3);
|
|
187
|
-
i0.ɵɵtextInterpolate(
|
|
998
|
+
i0.ɵɵtextInterpolate(ctx_r2.getFavoriteDisplayName(favorite_r56));
|
|
188
999
|
i0.ɵɵadvance(2);
|
|
189
|
-
i0.ɵɵtextInterpolate(
|
|
1000
|
+
i0.ɵɵtextInterpolate(favorite_r56.Entity);
|
|
190
1001
|
} }
|
|
191
|
-
function
|
|
192
|
-
i0.ɵɵelementStart(0, "div",
|
|
193
|
-
i0.ɵɵrepeaterCreate(1,
|
|
1002
|
+
function HomeDashboardComponent_Conditional_13_Conditional_9_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
1003
|
+
i0.ɵɵelementStart(0, "div", 148);
|
|
1004
|
+
i0.ɵɵrepeaterCreate(1, HomeDashboardComponent_Conditional_13_Conditional_9_Conditional_4_For_2_Template, 8, 4, "div", 156, i0.ɵɵcomponentInstance().trackByFavorite, true);
|
|
194
1005
|
i0.ɵɵelementEnd();
|
|
195
1006
|
} if (rf & 2) {
|
|
196
|
-
const
|
|
1007
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
197
1008
|
i0.ɵɵadvance();
|
|
198
|
-
i0.ɵɵrepeater(
|
|
1009
|
+
i0.ɵɵrepeater(ctx_r2.favorites);
|
|
199
1010
|
} }
|
|
200
|
-
function
|
|
201
|
-
i0.ɵɵelementStart(0, "div",
|
|
202
|
-
i0.ɵɵelement(1, "i",
|
|
1011
|
+
function HomeDashboardComponent_Conditional_13_Conditional_9_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
1012
|
+
i0.ɵɵelementStart(0, "div", 155);
|
|
1013
|
+
i0.ɵɵelement(1, "i", 159);
|
|
203
1014
|
i0.ɵɵelementStart(2, "span");
|
|
204
1015
|
i0.ɵɵtext(3, "Loading...");
|
|
205
1016
|
i0.ɵɵelementEnd()();
|
|
206
1017
|
} }
|
|
207
|
-
function
|
|
208
|
-
i0.ɵɵelementStart(0, "div",
|
|
209
|
-
i0.ɵɵelement(2, "i",
|
|
1018
|
+
function HomeDashboardComponent_Conditional_13_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
1019
|
+
i0.ɵɵelementStart(0, "div", 142)(1, "h4", 145);
|
|
1020
|
+
i0.ɵɵelement(2, "i", 154);
|
|
210
1021
|
i0.ɵɵtext(3, " Favorites ");
|
|
211
1022
|
i0.ɵɵelementEnd();
|
|
212
|
-
i0.ɵɵconditionalCreate(4,
|
|
213
|
-
i0.ɵɵconditionalCreate(5,
|
|
1023
|
+
i0.ɵɵconditionalCreate(4, HomeDashboardComponent_Conditional_13_Conditional_9_Conditional_4_Template, 3, 0, "div", 148);
|
|
1024
|
+
i0.ɵɵconditionalCreate(5, HomeDashboardComponent_Conditional_13_Conditional_9_Conditional_5_Template, 4, 0, "div", 155);
|
|
214
1025
|
i0.ɵɵelementEnd();
|
|
215
1026
|
} if (rf & 2) {
|
|
216
|
-
const
|
|
1027
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
217
1028
|
i0.ɵɵadvance(4);
|
|
218
|
-
i0.ɵɵconditional(!
|
|
1029
|
+
i0.ɵɵconditional(!ctx_r2.favoritesLoading ? 4 : -1);
|
|
219
1030
|
i0.ɵɵadvance();
|
|
220
|
-
i0.ɵɵconditional(
|
|
1031
|
+
i0.ɵɵconditional(ctx_r2.favoritesLoading ? 5 : -1);
|
|
221
1032
|
} }
|
|
222
|
-
function
|
|
223
|
-
const
|
|
224
|
-
i0.ɵɵelementStart(0, "div",
|
|
225
|
-
i0.ɵɵlistener("click", function
|
|
226
|
-
i0.ɵɵelementStart(1, "div",
|
|
1033
|
+
function HomeDashboardComponent_Conditional_13_Conditional_10_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
1034
|
+
const _r57 = i0.ɵɵgetCurrentView();
|
|
1035
|
+
i0.ɵɵelementStart(0, "div", 162);
|
|
1036
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_13_Conditional_10_Conditional_4_For_2_Template_div_click_0_listener() { const item_r58 = i0.ɵɵrestoreView(_r57).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.onRecentClick(item_r58)); });
|
|
1037
|
+
i0.ɵɵelementStart(1, "div", 158);
|
|
227
1038
|
i0.ɵɵelement(2, "i");
|
|
228
1039
|
i0.ɵɵelementEnd();
|
|
229
|
-
i0.ɵɵelementStart(3, "div",
|
|
1040
|
+
i0.ɵɵelementStart(3, "div", 151)(4, "span", 152);
|
|
230
1041
|
i0.ɵɵtext(5);
|
|
231
1042
|
i0.ɵɵelementEnd();
|
|
232
|
-
i0.ɵɵelementStart(6, "span",
|
|
1043
|
+
i0.ɵɵelementStart(6, "span", 153);
|
|
233
1044
|
i0.ɵɵtext(7);
|
|
234
1045
|
i0.ɵɵelementEnd()()();
|
|
235
1046
|
} if (rf & 2) {
|
|
236
|
-
const
|
|
237
|
-
const
|
|
1047
|
+
const item_r58 = ctx.$implicit;
|
|
1048
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
238
1049
|
i0.ɵɵadvance(2);
|
|
239
|
-
i0.ɵɵclassMap(
|
|
1050
|
+
i0.ɵɵclassMap(ctx_r2.getEntityIconByName(item_r58.entityName));
|
|
240
1051
|
i0.ɵɵadvance(3);
|
|
241
|
-
i0.ɵɵtextInterpolate(
|
|
1052
|
+
i0.ɵɵtextInterpolate(item_r58.recordName || item_r58.recordId);
|
|
242
1053
|
i0.ɵɵadvance(2);
|
|
243
|
-
i0.ɵɵtextInterpolate2("",
|
|
1054
|
+
i0.ɵɵtextInterpolate2("", item_r58.entityName, " \u00B7 ", ctx_r2.formatDate(item_r58.latestAt));
|
|
244
1055
|
} }
|
|
245
|
-
function
|
|
246
|
-
i0.ɵɵelementStart(0, "div",
|
|
247
|
-
i0.ɵɵrepeaterCreate(1,
|
|
1056
|
+
function HomeDashboardComponent_Conditional_13_Conditional_10_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
1057
|
+
i0.ɵɵelementStart(0, "div", 148);
|
|
1058
|
+
i0.ɵɵrepeaterCreate(1, HomeDashboardComponent_Conditional_13_Conditional_10_Conditional_4_For_2_Template, 8, 5, "div", 161, i0.ɵɵcomponentInstance().trackByRecent, true);
|
|
248
1059
|
i0.ɵɵelementEnd();
|
|
249
1060
|
} if (rf & 2) {
|
|
250
|
-
const
|
|
1061
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
251
1062
|
i0.ɵɵadvance();
|
|
252
|
-
i0.ɵɵrepeater(
|
|
1063
|
+
i0.ɵɵrepeater(ctx_r2.recentItems);
|
|
253
1064
|
} }
|
|
254
|
-
function
|
|
255
|
-
i0.ɵɵelementStart(0, "div",
|
|
256
|
-
i0.ɵɵelement(1, "i",
|
|
1065
|
+
function HomeDashboardComponent_Conditional_13_Conditional_10_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
1066
|
+
i0.ɵɵelementStart(0, "div", 155);
|
|
1067
|
+
i0.ɵɵelement(1, "i", 159);
|
|
257
1068
|
i0.ɵɵelementStart(2, "span");
|
|
258
1069
|
i0.ɵɵtext(3, "Loading...");
|
|
259
1070
|
i0.ɵɵelementEnd()();
|
|
260
1071
|
} }
|
|
261
|
-
function
|
|
262
|
-
i0.ɵɵelementStart(0, "div",
|
|
263
|
-
i0.ɵɵelement(2, "i",
|
|
1072
|
+
function HomeDashboardComponent_Conditional_13_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
1073
|
+
i0.ɵɵelementStart(0, "div", 143)(1, "h4", 145);
|
|
1074
|
+
i0.ɵɵelement(2, "i", 160);
|
|
264
1075
|
i0.ɵɵtext(3, " Recent ");
|
|
265
1076
|
i0.ɵɵelementEnd();
|
|
266
|
-
i0.ɵɵconditionalCreate(4,
|
|
267
|
-
i0.ɵɵconditionalCreate(5,
|
|
1077
|
+
i0.ɵɵconditionalCreate(4, HomeDashboardComponent_Conditional_13_Conditional_10_Conditional_4_Template, 3, 0, "div", 148);
|
|
1078
|
+
i0.ɵɵconditionalCreate(5, HomeDashboardComponent_Conditional_13_Conditional_10_Conditional_5_Template, 4, 0, "div", 155);
|
|
268
1079
|
i0.ɵɵelementEnd();
|
|
269
1080
|
} if (rf & 2) {
|
|
270
|
-
const
|
|
1081
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
271
1082
|
i0.ɵɵadvance(4);
|
|
272
|
-
i0.ɵɵconditional(!
|
|
1083
|
+
i0.ɵɵconditional(!ctx_r2.recentsLoading ? 4 : -1);
|
|
273
1084
|
i0.ɵɵadvance();
|
|
274
|
-
i0.ɵɵconditional(
|
|
1085
|
+
i0.ɵɵconditional(ctx_r2.recentsLoading ? 5 : -1);
|
|
275
1086
|
} }
|
|
276
|
-
function
|
|
277
|
-
i0.ɵɵelementStart(0, "div",
|
|
278
|
-
i0.ɵɵelement(1, "i",
|
|
1087
|
+
function HomeDashboardComponent_Conditional_13_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
1088
|
+
i0.ɵɵelementStart(0, "div", 144);
|
|
1089
|
+
i0.ɵɵelement(1, "i", 163);
|
|
279
1090
|
i0.ɵɵelementStart(2, "p");
|
|
280
1091
|
i0.ɵɵtext(3, "No quick access items");
|
|
281
1092
|
i0.ɵɵelementEnd()();
|
|
282
1093
|
} }
|
|
283
|
-
function
|
|
284
|
-
const
|
|
285
|
-
i0.ɵɵelementStart(0, "div",
|
|
286
|
-
i0.ɵɵelement(3, "i",
|
|
1094
|
+
function HomeDashboardComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
1095
|
+
const _r52 = i0.ɵɵgetCurrentView();
|
|
1096
|
+
i0.ɵɵelementStart(0, "div", 10)(1, "div", 137)(2, "h3");
|
|
1097
|
+
i0.ɵɵelement(3, "i", 138);
|
|
287
1098
|
i0.ɵɵtext(4, " Quick Access ");
|
|
288
1099
|
i0.ɵɵelementEnd();
|
|
289
|
-
i0.ɵɵelementStart(5, "button",
|
|
290
|
-
i0.ɵɵlistener("click", function
|
|
291
|
-
i0.ɵɵelement(6, "i",
|
|
1100
|
+
i0.ɵɵelementStart(5, "button", 139);
|
|
1101
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_13_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r52); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.toggleSidebar()); });
|
|
1102
|
+
i0.ɵɵelement(6, "i", 44);
|
|
292
1103
|
i0.ɵɵelementEnd()();
|
|
293
|
-
i0.ɵɵelementStart(7, "div",
|
|
294
|
-
i0.ɵɵconditionalCreate(8,
|
|
295
|
-
i0.ɵɵconditionalCreate(9,
|
|
296
|
-
i0.ɵɵconditionalCreate(10,
|
|
297
|
-
i0.ɵɵconditionalCreate(11,
|
|
1104
|
+
i0.ɵɵelementStart(7, "div", 140);
|
|
1105
|
+
i0.ɵɵconditionalCreate(8, HomeDashboardComponent_Conditional_13_Conditional_8_Template, 9, 1, "div", 141);
|
|
1106
|
+
i0.ɵɵconditionalCreate(9, HomeDashboardComponent_Conditional_13_Conditional_9_Template, 6, 2, "div", 142);
|
|
1107
|
+
i0.ɵɵconditionalCreate(10, HomeDashboardComponent_Conditional_13_Conditional_10_Template, 6, 2, "div", 143);
|
|
1108
|
+
i0.ɵɵconditionalCreate(11, HomeDashboardComponent_Conditional_13_Conditional_11_Template, 4, 0, "div", 144);
|
|
298
1109
|
i0.ɵɵelementEnd()();
|
|
299
1110
|
} if (rf & 2) {
|
|
300
|
-
const
|
|
1111
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
301
1112
|
i0.ɵɵadvance(8);
|
|
302
|
-
i0.ɵɵconditional(
|
|
1113
|
+
i0.ɵɵconditional(ctx_r2.unreadNotifications.length > 0 ? 8 : -1);
|
|
303
1114
|
i0.ɵɵadvance();
|
|
304
|
-
i0.ɵɵconditional(
|
|
1115
|
+
i0.ɵɵconditional(ctx_r2.favorites.length > 0 || ctx_r2.favoritesLoading ? 9 : -1);
|
|
305
1116
|
i0.ɵɵadvance();
|
|
306
|
-
i0.ɵɵconditional(
|
|
1117
|
+
i0.ɵɵconditional(ctx_r2.recentItems.length > 0 || ctx_r2.recentsLoading ? 10 : -1);
|
|
307
1118
|
i0.ɵɵadvance();
|
|
308
|
-
i0.ɵɵconditional(!
|
|
1119
|
+
i0.ɵɵconditional(!ctx_r2.favoritesLoading && !ctx_r2.recentsLoading && ctx_r2.unreadNotifications.length === 0 && ctx_r2.favorites.length === 0 && ctx_r2.recentItems.length === 0 ? 11 : -1);
|
|
309
1120
|
} }
|
|
310
|
-
function
|
|
311
|
-
i0.ɵɵelementStart(0, "span",
|
|
1121
|
+
function HomeDashboardComponent_Conditional_14_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
1122
|
+
i0.ɵɵelementStart(0, "span", 165);
|
|
312
1123
|
i0.ɵɵtext(1);
|
|
313
1124
|
i0.ɵɵelementEnd();
|
|
314
1125
|
} if (rf & 2) {
|
|
315
|
-
const
|
|
1126
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
316
1127
|
i0.ɵɵadvance();
|
|
317
|
-
i0.ɵɵtextInterpolate(
|
|
1128
|
+
i0.ɵɵtextInterpolate(ctx_r2.unreadNotifications.length);
|
|
318
1129
|
} }
|
|
319
|
-
function
|
|
320
|
-
const
|
|
321
|
-
i0.ɵɵelementStart(0, "button",
|
|
322
|
-
i0.ɵɵlistener("click", function
|
|
323
|
-
i0.ɵɵelement(1, "i",
|
|
324
|
-
i0.ɵɵconditionalCreate(2,
|
|
1130
|
+
function HomeDashboardComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
1131
|
+
const _r59 = i0.ɵɵgetCurrentView();
|
|
1132
|
+
i0.ɵɵelementStart(0, "button", 164);
|
|
1133
|
+
i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_14_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r59); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.toggleSidebar()); });
|
|
1134
|
+
i0.ɵɵelement(1, "i", 138);
|
|
1135
|
+
i0.ɵɵconditionalCreate(2, HomeDashboardComponent_Conditional_14_Conditional_2_Template, 2, 1, "span", 165);
|
|
325
1136
|
i0.ɵɵelementEnd();
|
|
326
1137
|
} if (rf & 2) {
|
|
327
|
-
const
|
|
1138
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
328
1139
|
i0.ɵɵadvance(2);
|
|
329
|
-
i0.ɵɵconditional(
|
|
1140
|
+
i0.ɵɵconditional(ctx_r2.unreadNotifications.length > 0 ? 2 : -1);
|
|
330
1141
|
} }
|
|
331
1142
|
/**
|
|
332
1143
|
* Home Dashboard - Personalized home screen showing all available applications
|
|
@@ -343,6 +1154,7 @@ let HomeDashboardComponent = class HomeDashboardComponent extends BaseResourceCo
|
|
|
343
1154
|
cdr;
|
|
344
1155
|
destroy$ = new Subject();
|
|
345
1156
|
metadata = new Metadata();
|
|
1157
|
+
pinService = inject(HomeAppPinService);
|
|
346
1158
|
appConfigDialog;
|
|
347
1159
|
// State
|
|
348
1160
|
isLoading = true;
|
|
@@ -361,6 +1173,35 @@ let HomeDashboardComponent = class HomeDashboardComponent extends BaseResourceCo
|
|
|
361
1173
|
notificationsLoading = true;
|
|
362
1174
|
// Sidebar state - default closed on all screen sizes
|
|
363
1175
|
sidebarOpen = false;
|
|
1176
|
+
// Pin state
|
|
1177
|
+
PinnedItems = [];
|
|
1178
|
+
UngroupedPins = [];
|
|
1179
|
+
PinGroups = [];
|
|
1180
|
+
EditMode = false;
|
|
1181
|
+
AddPanelOpen = false;
|
|
1182
|
+
AddPanelSearchQuery = '';
|
|
1183
|
+
AddPanelSelectedGroup = '';
|
|
1184
|
+
AddPanelNewGroupName = '';
|
|
1185
|
+
EditingPinId = null;
|
|
1186
|
+
EditingGroupName = null;
|
|
1187
|
+
// Add pin panel - available resources
|
|
1188
|
+
AvailableDashboards = [];
|
|
1189
|
+
AvailableViews = [];
|
|
1190
|
+
AvailableQueries = [];
|
|
1191
|
+
AvailableApps = [];
|
|
1192
|
+
AddPanelLoading = false;
|
|
1193
|
+
// Collapsible section state for Add Pin panel
|
|
1194
|
+
PanelSectionCollapsed = {};
|
|
1195
|
+
// Pin context menu (ellipsis)
|
|
1196
|
+
PinMenuVisible = false;
|
|
1197
|
+
PinMenuX = 0;
|
|
1198
|
+
PinMenuY = 0;
|
|
1199
|
+
PinMenuPin = null;
|
|
1200
|
+
// Whether Data Explorer app is available (if so, dashboards/queries/views are accessible via its nav items)
|
|
1201
|
+
HasDataExplorerApp = false;
|
|
1202
|
+
// Drag state
|
|
1203
|
+
DraggingPinId = null;
|
|
1204
|
+
DragOverPinId = null;
|
|
364
1205
|
// Cached icon lookups to avoid repeated method calls
|
|
365
1206
|
favoriteIconCache = new Map();
|
|
366
1207
|
resourceIconCache = new Map();
|
|
@@ -451,6 +1292,20 @@ let HomeDashboardComponent = class HomeDashboardComponent extends BaseResourceCo
|
|
|
451
1292
|
// Load favorites and recents asynchronously (don't block rendering)
|
|
452
1293
|
this.loadFavorites();
|
|
453
1294
|
this.loadRecents();
|
|
1295
|
+
// Load pinned items
|
|
1296
|
+
await this.pinService.LoadPins();
|
|
1297
|
+
this.pinService.Pins$
|
|
1298
|
+
.pipe(takeUntil(this.destroy$))
|
|
1299
|
+
.subscribe(pins => {
|
|
1300
|
+
this.PinnedItems = pins;
|
|
1301
|
+
this.UngroupedPins = this.pinService.GetUngroupedPins();
|
|
1302
|
+
this.PinGroups = this.pinService.GetGroups();
|
|
1303
|
+
this.cdr.markForCheck();
|
|
1304
|
+
});
|
|
1305
|
+
// Resolve display names for record-type pins that have raw ID titles
|
|
1306
|
+
this.resolveRecordPinNames();
|
|
1307
|
+
// Resolve missing icons for Custom pins
|
|
1308
|
+
this.resolveCustomPinIcons();
|
|
454
1309
|
}
|
|
455
1310
|
ngOnDestroy() {
|
|
456
1311
|
this.destroy$.next();
|
|
@@ -785,13 +1640,671 @@ let HomeDashboardComponent = class HomeDashboardComponent extends BaseResourceCo
|
|
|
785
1640
|
trackByNotification(_index, item) {
|
|
786
1641
|
return item.ID;
|
|
787
1642
|
}
|
|
1643
|
+
// =============================================
|
|
1644
|
+
// PIN NAME RESOLUTION
|
|
1645
|
+
// =============================================
|
|
1646
|
+
/**
|
|
1647
|
+
* Resolve display names for record-type pins that have raw "Entity - ID|..." titles.
|
|
1648
|
+
* Uses batch GetEntityRecordNames() for efficiency, same pattern as favorites.
|
|
1649
|
+
*/
|
|
1650
|
+
async resolveRecordPinNames() {
|
|
1651
|
+
// Find pins that need name resolution: records with raw ID titles,
|
|
1652
|
+
// or any pin whose DisplayName contains "ID|" (raw composite key)
|
|
1653
|
+
const pinsNeedingNames = this.PinnedItems.filter(pin => {
|
|
1654
|
+
const rt = this.resolveStoredResourceType(pin);
|
|
1655
|
+
if (rt !== 'Records')
|
|
1656
|
+
return false;
|
|
1657
|
+
// Check if the name looks like a raw ID format
|
|
1658
|
+
return pin.DisplayName.includes('ID|') || pin.DisplayName.includes(' - ID');
|
|
1659
|
+
});
|
|
1660
|
+
if (pinsNeedingNames.length === 0)
|
|
1661
|
+
return;
|
|
1662
|
+
const nameInputs = [];
|
|
1663
|
+
const pinIdByKey = new Map();
|
|
1664
|
+
for (const pin of pinsNeedingNames) {
|
|
1665
|
+
const entityName = (pin.Configuration['Entity'] || pin.Configuration['entity']);
|
|
1666
|
+
const recordId = pin.Configuration['recordId'];
|
|
1667
|
+
if (!entityName || !recordId)
|
|
1668
|
+
continue;
|
|
1669
|
+
const compositeKey = this.buildCompositeKeyForRecord(entityName, recordId);
|
|
1670
|
+
if (!compositeKey)
|
|
1671
|
+
continue;
|
|
1672
|
+
nameInputs.push({ EntityName: entityName, CompositeKey: compositeKey });
|
|
1673
|
+
pinIdByKey.set(`${entityName}||${compositeKey.ToConcatenatedString()}`, pin.Id);
|
|
1674
|
+
}
|
|
1675
|
+
if (nameInputs.length === 0)
|
|
1676
|
+
return;
|
|
1677
|
+
try {
|
|
1678
|
+
const nameResults = await this.metadata.GetEntityRecordNames(nameInputs);
|
|
1679
|
+
for (const result of nameResults) {
|
|
1680
|
+
if (result.Success && result.RecordName) {
|
|
1681
|
+
const key = `${result.EntityName}||${result.CompositeKey.ToConcatenatedString()}`;
|
|
1682
|
+
const pinId = pinIdByKey.get(key);
|
|
1683
|
+
if (pinId) {
|
|
1684
|
+
this.pinService.UpdatePin(pinId, { DisplayName: result.RecordName });
|
|
1685
|
+
}
|
|
1686
|
+
}
|
|
1687
|
+
}
|
|
1688
|
+
}
|
|
1689
|
+
catch (error) {
|
|
1690
|
+
console.warn('[Pin Names] Failed to resolve record names:', error);
|
|
1691
|
+
}
|
|
1692
|
+
}
|
|
1693
|
+
/**
|
|
1694
|
+
* Resolve missing icons for Custom (app nav item) pins by looking up nav items.
|
|
1695
|
+
*/
|
|
1696
|
+
async resolveCustomPinIcons() {
|
|
1697
|
+
const pinsNeedingIcons = this.PinnedItems.filter(pin => this.resolveStoredResourceType(pin) === 'Custom' && !pin.Icon);
|
|
1698
|
+
if (pinsNeedingIcons.length === 0)
|
|
1699
|
+
return;
|
|
1700
|
+
for (const pin of pinsNeedingIcons) {
|
|
1701
|
+
const appName = pin.ApplicationName || pin.Configuration['appName'];
|
|
1702
|
+
const navItemName = pin.Configuration['navItemName'];
|
|
1703
|
+
if (!appName || !navItemName)
|
|
1704
|
+
continue;
|
|
1705
|
+
const app = this.appManager.GetAllApps().find(a => a.Name === appName);
|
|
1706
|
+
if (!app)
|
|
1707
|
+
continue;
|
|
1708
|
+
const navItems = await app.GetNavItems();
|
|
1709
|
+
const navItem = navItems.find(ni => ni.Label === navItemName);
|
|
1710
|
+
if (navItem?.Icon) {
|
|
1711
|
+
this.pinService.UpdatePin(pin.Id, { Icon: navItem.Icon });
|
|
1712
|
+
}
|
|
1713
|
+
}
|
|
1714
|
+
}
|
|
1715
|
+
// =============================================
|
|
1716
|
+
// PIN MANAGEMENT
|
|
1717
|
+
// =============================================
|
|
1718
|
+
/**
|
|
1719
|
+
* Navigate to a pinned resource
|
|
1720
|
+
*/
|
|
1721
|
+
OnPinClick(pin) {
|
|
1722
|
+
if (this.EditMode)
|
|
1723
|
+
return;
|
|
1724
|
+
const config = pin.Configuration;
|
|
1725
|
+
const rt = this.resolveStoredResourceType(pin);
|
|
1726
|
+
// For Dashboards, Views, Queries — route through Data Explorer if available
|
|
1727
|
+
const deApp = this.HasDataExplorerApp
|
|
1728
|
+
? this.appManager.GetAllApps().find(a => a.Name === 'Data Explorer')
|
|
1729
|
+
: null;
|
|
1730
|
+
switch (rt) {
|
|
1731
|
+
case 'Dashboards': {
|
|
1732
|
+
const dashboardId = config['dashboardId'];
|
|
1733
|
+
if (!dashboardId)
|
|
1734
|
+
break;
|
|
1735
|
+
if (deApp) {
|
|
1736
|
+
this.navigationService.SwitchToApp(deApp.ID, 'Dashboards').then(() => {
|
|
1737
|
+
this.navigationService.UpdateActiveTabQueryParams({ dashboard: dashboardId });
|
|
1738
|
+
});
|
|
1739
|
+
}
|
|
1740
|
+
else {
|
|
1741
|
+
this.navigationService.OpenDashboard(dashboardId, pin.DisplayName);
|
|
1742
|
+
}
|
|
1743
|
+
break;
|
|
1744
|
+
}
|
|
1745
|
+
case 'User Views':
|
|
1746
|
+
if (config['isDynamic']) {
|
|
1747
|
+
this.navigationService.OpenDynamicView((config['Entity'] || config['entity']), config['extraFilter']);
|
|
1748
|
+
}
|
|
1749
|
+
else {
|
|
1750
|
+
const viewId = config['viewId'];
|
|
1751
|
+
if (viewId) {
|
|
1752
|
+
this.navigationService.OpenView(viewId, pin.DisplayName);
|
|
1753
|
+
}
|
|
1754
|
+
}
|
|
1755
|
+
break;
|
|
1756
|
+
case 'Queries': {
|
|
1757
|
+
const queryId = config['queryId'];
|
|
1758
|
+
if (!queryId)
|
|
1759
|
+
break;
|
|
1760
|
+
if (deApp) {
|
|
1761
|
+
this.navigationService.SwitchToApp(deApp.ID, 'Queries').then(() => {
|
|
1762
|
+
this.navigationService.UpdateActiveTabQueryParams({ queryId: queryId });
|
|
1763
|
+
});
|
|
1764
|
+
}
|
|
1765
|
+
else {
|
|
1766
|
+
this.navigationService.OpenQuery(queryId, pin.DisplayName);
|
|
1767
|
+
}
|
|
1768
|
+
break;
|
|
1769
|
+
}
|
|
1770
|
+
case 'Records': {
|
|
1771
|
+
const entityName = (config['Entity'] || config['entity']);
|
|
1772
|
+
const recordId = config['recordId'];
|
|
1773
|
+
if (entityName && recordId) {
|
|
1774
|
+
const compositeKey = this.buildCompositeKeyForRecord(entityName, recordId);
|
|
1775
|
+
if (compositeKey) {
|
|
1776
|
+
this.navigationService.OpenEntityRecord(entityName, compositeKey);
|
|
1777
|
+
}
|
|
1778
|
+
}
|
|
1779
|
+
else {
|
|
1780
|
+
console.warn('[Pin Click] Records pin missing Entity or recordId', config);
|
|
1781
|
+
}
|
|
1782
|
+
break;
|
|
1783
|
+
}
|
|
1784
|
+
case 'Custom': {
|
|
1785
|
+
// Custom resources are nav items within apps — always use app name, never ID
|
|
1786
|
+
const navItemName = config['navItemName'];
|
|
1787
|
+
const appName = config['appName'];
|
|
1788
|
+
const queryParams = config['queryParams'];
|
|
1789
|
+
if (appName) {
|
|
1790
|
+
const app = this.appManager.GetAllApps().find(a => a.Name === appName);
|
|
1791
|
+
if (app) {
|
|
1792
|
+
this.navigationService.SwitchToApp(app.ID, navItemName).then(() => {
|
|
1793
|
+
// Apply query params after the tab is created/activated
|
|
1794
|
+
if (queryParams && Object.keys(queryParams).length > 0) {
|
|
1795
|
+
this.navigationService.UpdateActiveTabQueryParams(queryParams);
|
|
1796
|
+
}
|
|
1797
|
+
});
|
|
1798
|
+
}
|
|
1799
|
+
else {
|
|
1800
|
+
console.warn(`[Pin Click] Custom pin: app "${appName}" not found`, config);
|
|
1801
|
+
}
|
|
1802
|
+
}
|
|
1803
|
+
else {
|
|
1804
|
+
console.warn('[Pin Click] Custom pin missing appName', config);
|
|
1805
|
+
}
|
|
1806
|
+
break;
|
|
1807
|
+
}
|
|
1808
|
+
default:
|
|
1809
|
+
console.warn('[Pin Click] Unrecognized resource type', rt, 'for pin', pin.DisplayName, config);
|
|
1810
|
+
break;
|
|
1811
|
+
}
|
|
1812
|
+
}
|
|
1813
|
+
/**
|
|
1814
|
+
* Resolve a pin's resource type from its stored ResourceType and config keys.
|
|
1815
|
+
* Handles legacy pins that may have stored a UUID resourceTypeId or
|
|
1816
|
+
* a raw config.resourceType string instead of the canonical type names.
|
|
1817
|
+
*/
|
|
1818
|
+
resolveStoredResourceType(pin) {
|
|
1819
|
+
const rt = pin.ResourceType;
|
|
1820
|
+
const config = pin.Configuration;
|
|
1821
|
+
// Already a known canonical type
|
|
1822
|
+
const knownTypes = ['Dashboards', 'User Views', 'Queries', 'Reports', 'Records', 'Custom'];
|
|
1823
|
+
if (knownTypes.includes(rt))
|
|
1824
|
+
return rt;
|
|
1825
|
+
// Check the config's own resourceType field
|
|
1826
|
+
const configRt = config['resourceType'];
|
|
1827
|
+
if (configRt && knownTypes.includes(configRt))
|
|
1828
|
+
return configRt;
|
|
1829
|
+
// Fall back to detecting by config keys
|
|
1830
|
+
if (config['dashboardId'])
|
|
1831
|
+
return 'Dashboards';
|
|
1832
|
+
if (config['viewId'])
|
|
1833
|
+
return 'User Views';
|
|
1834
|
+
if (config['queryId'])
|
|
1835
|
+
return 'Queries';
|
|
1836
|
+
if (config['reportId'])
|
|
1837
|
+
return 'Reports';
|
|
1838
|
+
if ((config['Entity'] || config['entity']) && config['recordId'])
|
|
1839
|
+
return 'Records';
|
|
1840
|
+
if (config['navItemName'])
|
|
1841
|
+
return 'Custom';
|
|
1842
|
+
return rt; // Give up and return whatever was stored
|
|
1843
|
+
}
|
|
1844
|
+
/**
|
|
1845
|
+
* Toggle edit mode for pins
|
|
1846
|
+
*/
|
|
1847
|
+
ToggleEditMode() {
|
|
1848
|
+
this.EditMode = !this.EditMode;
|
|
1849
|
+
if (!this.EditMode) {
|
|
1850
|
+
this.EditingPinId = null;
|
|
1851
|
+
this.EditingGroupName = null;
|
|
1852
|
+
}
|
|
1853
|
+
this.cdr.markForCheck();
|
|
1854
|
+
}
|
|
1855
|
+
/**
|
|
1856
|
+
* Remove a pin
|
|
1857
|
+
*/
|
|
1858
|
+
RemovePin(pinId) {
|
|
1859
|
+
this.pinService.RemovePin(pinId);
|
|
1860
|
+
}
|
|
1861
|
+
/**
|
|
1862
|
+
* Start inline editing of a pin's display name
|
|
1863
|
+
*/
|
|
1864
|
+
StartEditingPin(pinId, event) {
|
|
1865
|
+
event.stopPropagation();
|
|
1866
|
+
this.EditingPinId = pinId;
|
|
1867
|
+
this.cdr.markForCheck();
|
|
1868
|
+
}
|
|
1869
|
+
/**
|
|
1870
|
+
* Save edited pin name
|
|
1871
|
+
*/
|
|
1872
|
+
SavePinName(pinId, newName) {
|
|
1873
|
+
if (newName.trim()) {
|
|
1874
|
+
this.pinService.UpdatePin(pinId, { DisplayName: newName.trim() });
|
|
1875
|
+
}
|
|
1876
|
+
this.EditingPinId = null;
|
|
1877
|
+
this.cdr.markForCheck();
|
|
1878
|
+
}
|
|
1879
|
+
/**
|
|
1880
|
+
* Extract input value from a DOM event (strict template helper)
|
|
1881
|
+
*/
|
|
1882
|
+
GetInputValue(event) {
|
|
1883
|
+
return event.target.value;
|
|
1884
|
+
}
|
|
1885
|
+
/**
|
|
1886
|
+
* Start editing a group name
|
|
1887
|
+
*/
|
|
1888
|
+
StartEditingGroup(groupName) {
|
|
1889
|
+
this.EditingGroupName = groupName;
|
|
1890
|
+
this.cdr.markForCheck();
|
|
1891
|
+
}
|
|
1892
|
+
/**
|
|
1893
|
+
* Save edited group name - updates all pins in the group
|
|
1894
|
+
*/
|
|
1895
|
+
SaveGroupName(oldName, newName) {
|
|
1896
|
+
if (newName.trim() && newName.trim() !== oldName) {
|
|
1897
|
+
const pinsInGroup = this.pinService.GetPinsInGroup(oldName);
|
|
1898
|
+
for (const pin of pinsInGroup) {
|
|
1899
|
+
this.pinService.UpdatePin(pin.Id, { Group: newName.trim() });
|
|
1900
|
+
}
|
|
1901
|
+
}
|
|
1902
|
+
this.EditingGroupName = null;
|
|
1903
|
+
this.cdr.markForCheck();
|
|
1904
|
+
}
|
|
1905
|
+
/**
|
|
1906
|
+
* Remove a group - moves all pins to ungrouped
|
|
1907
|
+
*/
|
|
1908
|
+
RemoveGroup(groupName) {
|
|
1909
|
+
const pinsInGroup = this.pinService.GetPinsInGroup(groupName);
|
|
1910
|
+
for (const pin of pinsInGroup) {
|
|
1911
|
+
this.pinService.UpdatePin(pin.Id, { Group: undefined });
|
|
1912
|
+
}
|
|
1913
|
+
}
|
|
1914
|
+
/**
|
|
1915
|
+
* Get pins in a specific group
|
|
1916
|
+
*/
|
|
1917
|
+
GetPinsInGroup(groupName) {
|
|
1918
|
+
return this.pinService.GetPinsInGroup(groupName);
|
|
1919
|
+
}
|
|
1920
|
+
/**
|
|
1921
|
+
* Get icon for a pin based on resource type and metadata
|
|
1922
|
+
*/
|
|
1923
|
+
GetPinIcon(pin) {
|
|
1924
|
+
if (pin.Icon)
|
|
1925
|
+
return pin.Icon;
|
|
1926
|
+
const entity = (pin.Configuration['Entity'] || pin.Configuration['entity'] || '');
|
|
1927
|
+
switch (pin.ResourceType) {
|
|
1928
|
+
case 'Dashboards': return 'fa-solid fa-gauge-high';
|
|
1929
|
+
case 'User Views': return entity ? this.getEntityIconByName(entity) : 'fa-solid fa-table-list';
|
|
1930
|
+
case 'Queries': return 'fa-solid fa-database';
|
|
1931
|
+
case 'Reports': return 'fa-solid fa-chart-bar';
|
|
1932
|
+
case 'Records': return entity ? this.getEntityIconByName(entity) : 'fa-solid fa-file';
|
|
1933
|
+
case 'Custom': return this.getNavItemIcon(pin) || this.getAppIcon(pin) || 'fa-solid fa-cube';
|
|
1934
|
+
default: return 'fa-solid fa-thumbtack';
|
|
1935
|
+
}
|
|
1936
|
+
}
|
|
1937
|
+
/**
|
|
1938
|
+
* Get display label for a resource type
|
|
1939
|
+
*/
|
|
1940
|
+
GetResourceTypeLabel(pin) {
|
|
1941
|
+
switch (pin.ResourceType) {
|
|
1942
|
+
case 'Dashboards': return 'Dashboard';
|
|
1943
|
+
case 'User Views': return 'View';
|
|
1944
|
+
case 'Queries': return 'Query';
|
|
1945
|
+
case 'Reports': return 'Report';
|
|
1946
|
+
case 'Records': return pin.Configuration?.['Entity'] || pin.Configuration?.['entity'] || 'Record';
|
|
1947
|
+
case 'Custom': return pin.ApplicationName || pin.Configuration['appName'] || 'App';
|
|
1948
|
+
default: return pin.ResourceType;
|
|
1949
|
+
}
|
|
1950
|
+
}
|
|
1951
|
+
/**
|
|
1952
|
+
* Get the app icon for a pin by looking up the app by name
|
|
1953
|
+
*/
|
|
1954
|
+
getAppIcon(pin) {
|
|
1955
|
+
const appName = pin.ApplicationName || pin.Configuration['appName'];
|
|
1956
|
+
if (!appName)
|
|
1957
|
+
return undefined;
|
|
1958
|
+
const app = this.appManager.GetAllApps().find(a => a.Name === appName);
|
|
1959
|
+
return app?.Icon || undefined;
|
|
1960
|
+
}
|
|
1961
|
+
/**
|
|
1962
|
+
* Look up the nav item icon for a Custom pin from the app's nav items cache.
|
|
1963
|
+
* Uses the pre-computed appsDisplayData to avoid async lookups.
|
|
1964
|
+
*/
|
|
1965
|
+
getNavItemIcon(pin) {
|
|
1966
|
+
const appName = pin.ApplicationName || pin.Configuration['appName'];
|
|
1967
|
+
const navItemName = pin.Configuration['navItemName'];
|
|
1968
|
+
if (!appName || !navItemName)
|
|
1969
|
+
return undefined;
|
|
1970
|
+
// Check the pre-computed display data first (fast)
|
|
1971
|
+
const appData = this.appsDisplayData.find(d => d.app.Name === appName);
|
|
1972
|
+
if (appData) {
|
|
1973
|
+
const navItem = appData.navItemsPreview.find(ni => ni.Label === navItemName);
|
|
1974
|
+
if (navItem)
|
|
1975
|
+
return navItem.Icon;
|
|
1976
|
+
}
|
|
1977
|
+
// Fall back to AvailableApps data (if Add Panel was loaded)
|
|
1978
|
+
const panelApp = this.AvailableApps.find(a => a.appName === appName);
|
|
1979
|
+
if (panelApp) {
|
|
1980
|
+
const ni = panelApp.navItems.find(n => n.label === navItemName);
|
|
1981
|
+
if (ni)
|
|
1982
|
+
return ni.icon;
|
|
1983
|
+
}
|
|
1984
|
+
return undefined;
|
|
1985
|
+
}
|
|
1986
|
+
// =============================================
|
|
1987
|
+
// PIN CONTEXT MENU (ELLIPSIS)
|
|
1988
|
+
// =============================================
|
|
1989
|
+
/**
|
|
1990
|
+
* Show the pin context menu (triggered by ellipsis button)
|
|
1991
|
+
*/
|
|
1992
|
+
ShowPinMenu(event, pin) {
|
|
1993
|
+
event.stopPropagation();
|
|
1994
|
+
event.preventDefault();
|
|
1995
|
+
this.PinMenuPin = pin;
|
|
1996
|
+
this.PinMenuX = event.clientX;
|
|
1997
|
+
this.PinMenuY = event.clientY;
|
|
1998
|
+
this.PinMenuVisible = true;
|
|
1999
|
+
this.cdr.markForCheck();
|
|
2000
|
+
// Close on click outside or Escape
|
|
2001
|
+
setTimeout(() => {
|
|
2002
|
+
const clickHandler = () => {
|
|
2003
|
+
this.HidePinMenu();
|
|
2004
|
+
document.removeEventListener('click', clickHandler);
|
|
2005
|
+
document.removeEventListener('keydown', keyHandler);
|
|
2006
|
+
};
|
|
2007
|
+
const keyHandler = (e) => {
|
|
2008
|
+
if (e.key === 'Escape') {
|
|
2009
|
+
this.HidePinMenu();
|
|
2010
|
+
document.removeEventListener('click', clickHandler);
|
|
2011
|
+
document.removeEventListener('keydown', keyHandler);
|
|
2012
|
+
}
|
|
2013
|
+
};
|
|
2014
|
+
document.addEventListener('click', clickHandler);
|
|
2015
|
+
document.addEventListener('keydown', keyHandler);
|
|
2016
|
+
}, 0);
|
|
2017
|
+
}
|
|
2018
|
+
/**
|
|
2019
|
+
* Hide the pin context menu
|
|
2020
|
+
*/
|
|
2021
|
+
HidePinMenu() {
|
|
2022
|
+
this.PinMenuVisible = false;
|
|
2023
|
+
this.PinMenuPin = null;
|
|
2024
|
+
this.cdr.markForCheck();
|
|
2025
|
+
}
|
|
2026
|
+
/**
|
|
2027
|
+
* Edit a pin (enters edit mode focused on this pin)
|
|
2028
|
+
*/
|
|
2029
|
+
OnPinMenuEdit() {
|
|
2030
|
+
if (this.PinMenuPin) {
|
|
2031
|
+
this.EditMode = true;
|
|
2032
|
+
this.EditingPinId = this.PinMenuPin.Id;
|
|
2033
|
+
this.cdr.markForCheck();
|
|
2034
|
+
}
|
|
2035
|
+
this.HidePinMenu();
|
|
2036
|
+
}
|
|
2037
|
+
/**
|
|
2038
|
+
* Move a pin to a different group
|
|
2039
|
+
*/
|
|
2040
|
+
OnPinMenuMoveToGroup(groupName) {
|
|
2041
|
+
if (this.PinMenuPin) {
|
|
2042
|
+
this.pinService.UpdatePin(this.PinMenuPin.Id, { Group: groupName });
|
|
2043
|
+
}
|
|
2044
|
+
this.HidePinMenu();
|
|
2045
|
+
}
|
|
2046
|
+
/**
|
|
2047
|
+
* Unpin a resource from the pin context menu
|
|
2048
|
+
*/
|
|
2049
|
+
OnPinMenuUnpin() {
|
|
2050
|
+
if (this.PinMenuPin) {
|
|
2051
|
+
this.pinService.RemovePin(this.PinMenuPin.Id);
|
|
2052
|
+
}
|
|
2053
|
+
this.HidePinMenu();
|
|
2054
|
+
}
|
|
2055
|
+
// =============================================
|
|
2056
|
+
// DRAG AND DROP
|
|
2057
|
+
// =============================================
|
|
2058
|
+
OnDragStart(event, pin) {
|
|
2059
|
+
this.DraggingPinId = pin.Id;
|
|
2060
|
+
if (event.dataTransfer) {
|
|
2061
|
+
event.dataTransfer.effectAllowed = 'move';
|
|
2062
|
+
event.dataTransfer.setData('text/plain', pin.Id);
|
|
2063
|
+
}
|
|
2064
|
+
}
|
|
2065
|
+
OnDragOver(event, targetPin) {
|
|
2066
|
+
event.preventDefault();
|
|
2067
|
+
if (event.dataTransfer) {
|
|
2068
|
+
event.dataTransfer.dropEffect = 'move';
|
|
2069
|
+
}
|
|
2070
|
+
this.DragOverPinId = targetPin.Id;
|
|
2071
|
+
}
|
|
2072
|
+
OnDragLeave() {
|
|
2073
|
+
this.DragOverPinId = null;
|
|
2074
|
+
}
|
|
2075
|
+
OnDrop(event, targetPin) {
|
|
2076
|
+
event.preventDefault();
|
|
2077
|
+
this.DragOverPinId = null;
|
|
2078
|
+
if (!this.DraggingPinId || this.DraggingPinId === targetPin.Id) {
|
|
2079
|
+
this.DraggingPinId = null;
|
|
2080
|
+
return;
|
|
2081
|
+
}
|
|
2082
|
+
const pins = [...this.PinnedItems];
|
|
2083
|
+
const dragIndex = pins.findIndex(p => p.Id === this.DraggingPinId);
|
|
2084
|
+
const dropIndex = pins.findIndex(p => p.Id === targetPin.Id);
|
|
2085
|
+
if (dragIndex === -1 || dropIndex === -1) {
|
|
2086
|
+
this.DraggingPinId = null;
|
|
2087
|
+
return;
|
|
2088
|
+
}
|
|
2089
|
+
// Move the dragged pin to the target position and adopt target's group
|
|
2090
|
+
const [draggedPin] = pins.splice(dragIndex, 1);
|
|
2091
|
+
draggedPin.Group = targetPin.Group;
|
|
2092
|
+
pins.splice(dropIndex, 0, draggedPin);
|
|
2093
|
+
this.pinService.ReorderPins(pins);
|
|
2094
|
+
this.DraggingPinId = null;
|
|
2095
|
+
}
|
|
2096
|
+
OnDragEnd() {
|
|
2097
|
+
this.DraggingPinId = null;
|
|
2098
|
+
this.DragOverPinId = null;
|
|
2099
|
+
}
|
|
2100
|
+
trackByPin(_index, pin) {
|
|
2101
|
+
return pin.Id;
|
|
2102
|
+
}
|
|
2103
|
+
trackByGroup(_index, group) {
|
|
2104
|
+
return group;
|
|
2105
|
+
}
|
|
2106
|
+
// =============================================
|
|
2107
|
+
// ADD PIN PANEL
|
|
2108
|
+
// =============================================
|
|
2109
|
+
async OpenAddPinPanel() {
|
|
2110
|
+
this.AddPanelOpen = true;
|
|
2111
|
+
this.AddPanelSearchQuery = '';
|
|
2112
|
+
this.AddPanelSelectedGroup = '';
|
|
2113
|
+
this.AddPanelLoading = true;
|
|
2114
|
+
this.cdr.markForCheck();
|
|
2115
|
+
await this.loadAvailableResources();
|
|
2116
|
+
this.AddPanelLoading = false;
|
|
2117
|
+
this.cdr.markForCheck();
|
|
2118
|
+
}
|
|
2119
|
+
CloseAddPinPanel() {
|
|
2120
|
+
this.AddPanelOpen = false;
|
|
2121
|
+
this.cdr.markForCheck();
|
|
2122
|
+
}
|
|
2123
|
+
async loadAvailableResources() {
|
|
2124
|
+
const rv = new RunView();
|
|
2125
|
+
// Load dashboards, views, queries in parallel
|
|
2126
|
+
const [dashboards, views, queries] = await Promise.all([
|
|
2127
|
+
rv.RunView({
|
|
2128
|
+
EntityName: 'MJ: Dashboards',
|
|
2129
|
+
Fields: ['ID', 'Name'],
|
|
2130
|
+
ExtraFilter: `Type='Config'`,
|
|
2131
|
+
OrderBy: 'Name',
|
|
2132
|
+
ResultType: 'simple'
|
|
2133
|
+
}),
|
|
2134
|
+
rv.RunView({
|
|
2135
|
+
EntityName: 'MJ: User Views',
|
|
2136
|
+
Fields: ['ID', 'Name', 'Entity'],
|
|
2137
|
+
ExtraFilter: `UserID='${this.metadata.CurrentUser.ID}'`,
|
|
2138
|
+
OrderBy: 'Name',
|
|
2139
|
+
ResultType: 'simple'
|
|
2140
|
+
}),
|
|
2141
|
+
rv.RunView({
|
|
2142
|
+
EntityName: 'MJ: Queries',
|
|
2143
|
+
Fields: ['ID', 'Name'],
|
|
2144
|
+
OrderBy: 'Name',
|
|
2145
|
+
ResultType: 'simple'
|
|
2146
|
+
})
|
|
2147
|
+
]);
|
|
2148
|
+
this.AvailableDashboards = (dashboards.Results || []).map(d => ({
|
|
2149
|
+
id: d.ID, name: d.Name,
|
|
2150
|
+
pinned: this.pinService.IsPinned('Dashboards', { dashboardId: d.ID })
|
|
2151
|
+
}));
|
|
2152
|
+
this.AvailableViews = (views.Results || []).map(v => ({
|
|
2153
|
+
id: v.ID, name: v.Name, entityName: v.Entity || '',
|
|
2154
|
+
pinned: this.pinService.IsPinned('User Views', { viewId: v.ID })
|
|
2155
|
+
}));
|
|
2156
|
+
this.AvailableQueries = (queries.Results || []).map(q => ({
|
|
2157
|
+
id: q.ID, name: q.Name,
|
|
2158
|
+
pinned: this.pinService.IsPinned('Queries', { queryId: q.ID })
|
|
2159
|
+
}));
|
|
2160
|
+
// Load apps with their nav items
|
|
2161
|
+
await this.loadAvailableApps();
|
|
2162
|
+
// Check if Data Explorer is available — if so, dashboards/queries/views
|
|
2163
|
+
// are accessible through its nav items, no need for standalone sections
|
|
2164
|
+
this.HasDataExplorerApp = this.AvailableApps.some(a => a.appName === 'Data Explorer');
|
|
2165
|
+
}
|
|
2166
|
+
/**
|
|
2167
|
+
* Filter panel items by search query
|
|
2168
|
+
*/
|
|
2169
|
+
FilterPanelItems(items) {
|
|
2170
|
+
if (!this.AddPanelSearchQuery)
|
|
2171
|
+
return items;
|
|
2172
|
+
const q = this.AddPanelSearchQuery.toLowerCase();
|
|
2173
|
+
return items.filter(item => item.name.toLowerCase().includes(q));
|
|
2174
|
+
}
|
|
2175
|
+
/**
|
|
2176
|
+
* Load available apps with their nav items for the Add Pin panel
|
|
2177
|
+
*/
|
|
2178
|
+
async loadAvailableApps() {
|
|
2179
|
+
const allApps = this.appManager.GetAllApps().filter(a => a.Name !== 'Home');
|
|
2180
|
+
this.AvailableApps = await Promise.all(allApps.map(async (app) => {
|
|
2181
|
+
const navItems = await app.GetNavItems();
|
|
2182
|
+
return {
|
|
2183
|
+
appId: app.ID,
|
|
2184
|
+
appName: app.Name,
|
|
2185
|
+
icon: app.Icon || 'fa-solid fa-cube',
|
|
2186
|
+
color: app.GetColor() || '#1976d2',
|
|
2187
|
+
navItems: navItems.map(ni => ({
|
|
2188
|
+
label: ni.Label,
|
|
2189
|
+
icon: ni.Icon || 'fa-solid fa-circle',
|
|
2190
|
+
pinned: this.pinService.IsPinned('Custom', { appName: app.Name, navItemName: ni.Label })
|
|
2191
|
+
}))
|
|
2192
|
+
};
|
|
2193
|
+
}));
|
|
2194
|
+
}
|
|
2195
|
+
/**
|
|
2196
|
+
* Toggle a section's collapsed state in the Add Pin panel
|
|
2197
|
+
*/
|
|
2198
|
+
TogglePanelSection(section) {
|
|
2199
|
+
this.PanelSectionCollapsed[section] = !this.PanelSectionCollapsed[section];
|
|
2200
|
+
}
|
|
2201
|
+
/**
|
|
2202
|
+
* Pin an app nav item from the Add Panel
|
|
2203
|
+
*/
|
|
2204
|
+
PinAppNavItem(appName, _appIcon, appColor, navItemLabel, navItemIcon) {
|
|
2205
|
+
const input = {
|
|
2206
|
+
DisplayName: navItemLabel,
|
|
2207
|
+
ResourceType: 'Custom',
|
|
2208
|
+
ApplicationName: appName,
|
|
2209
|
+
Icon: navItemIcon,
|
|
2210
|
+
Color: appColor,
|
|
2211
|
+
Configuration: {
|
|
2212
|
+
resourceType: 'Custom',
|
|
2213
|
+
appName: appName,
|
|
2214
|
+
navItemName: navItemLabel,
|
|
2215
|
+
},
|
|
2216
|
+
Group: this.getSelectedGroup() || undefined,
|
|
2217
|
+
};
|
|
2218
|
+
const added = this.pinService.AddPin(input);
|
|
2219
|
+
if (added) {
|
|
2220
|
+
// Update pinned state in the panel
|
|
2221
|
+
this.AvailableApps = this.AvailableApps.map(app => {
|
|
2222
|
+
if (app.appName !== appName)
|
|
2223
|
+
return app;
|
|
2224
|
+
return {
|
|
2225
|
+
...app,
|
|
2226
|
+
navItems: app.navItems.map(ni => ni.label === navItemLabel ? { ...ni, pinned: true } : ni)
|
|
2227
|
+
};
|
|
2228
|
+
});
|
|
2229
|
+
MJNotificationService.Instance.CreateSimpleNotification(`"${navItemLabel}" pinned to Home`, 'success', 3000);
|
|
2230
|
+
this.cdr.markForCheck();
|
|
2231
|
+
}
|
|
2232
|
+
}
|
|
2233
|
+
/**
|
|
2234
|
+
* Pin a resource from the Add Panel
|
|
2235
|
+
*/
|
|
2236
|
+
PinFromPanel(resourceType, id, name) {
|
|
2237
|
+
let config = {};
|
|
2238
|
+
switch (resourceType) {
|
|
2239
|
+
case 'Dashboards':
|
|
2240
|
+
config = { dashboardId: id };
|
|
2241
|
+
break;
|
|
2242
|
+
case 'User Views':
|
|
2243
|
+
config = { viewId: id };
|
|
2244
|
+
break;
|
|
2245
|
+
case 'Queries':
|
|
2246
|
+
config = { queryId: id };
|
|
2247
|
+
break;
|
|
2248
|
+
case 'Reports':
|
|
2249
|
+
config = { reportId: id };
|
|
2250
|
+
break;
|
|
2251
|
+
}
|
|
2252
|
+
const input = {
|
|
2253
|
+
DisplayName: name,
|
|
2254
|
+
ResourceType: resourceType,
|
|
2255
|
+
Configuration: config,
|
|
2256
|
+
Group: this.getSelectedGroup() || undefined,
|
|
2257
|
+
};
|
|
2258
|
+
const added = this.pinService.AddPin(input);
|
|
2259
|
+
if (added) {
|
|
2260
|
+
this.updatePanelPinnedState(resourceType, id, true);
|
|
2261
|
+
MJNotificationService.Instance.CreateSimpleNotification(`"${name}" pinned to Home`, 'success', 3000);
|
|
2262
|
+
}
|
|
2263
|
+
}
|
|
2264
|
+
/**
|
|
2265
|
+
* Resolve the selected group — handles the "new group" option
|
|
2266
|
+
*/
|
|
2267
|
+
getSelectedGroup() {
|
|
2268
|
+
if (this.AddPanelSelectedGroup === '__new__') {
|
|
2269
|
+
return this.AddPanelNewGroupName.trim();
|
|
2270
|
+
}
|
|
2271
|
+
return this.AddPanelSelectedGroup;
|
|
2272
|
+
}
|
|
2273
|
+
updatePanelPinnedState(resourceType, id, pinned) {
|
|
2274
|
+
switch (resourceType) {
|
|
2275
|
+
case 'Dashboards':
|
|
2276
|
+
this.AvailableDashboards = this.AvailableDashboards.map(d => d.id === id ? { ...d, pinned } : d);
|
|
2277
|
+
break;
|
|
2278
|
+
case 'User Views':
|
|
2279
|
+
this.AvailableViews = this.AvailableViews.map(v => v.id === id ? { ...v, pinned } : v);
|
|
2280
|
+
break;
|
|
2281
|
+
case 'Queries':
|
|
2282
|
+
this.AvailableQueries = this.AvailableQueries.map(q => q.id === id ? { ...q, pinned } : q);
|
|
2283
|
+
break;
|
|
2284
|
+
}
|
|
2285
|
+
this.cdr.markForCheck();
|
|
2286
|
+
}
|
|
2287
|
+
/**
|
|
2288
|
+
* Filter apps by search query (matches app name or nav item labels)
|
|
2289
|
+
*/
|
|
2290
|
+
FilterApps() {
|
|
2291
|
+
if (!this.AddPanelSearchQuery)
|
|
2292
|
+
return this.AvailableApps;
|
|
2293
|
+
const q = this.AddPanelSearchQuery.toLowerCase();
|
|
2294
|
+
return this.AvailableApps
|
|
2295
|
+
.map(app => ({
|
|
2296
|
+
...app,
|
|
2297
|
+
navItems: app.navItems.filter(ni => ni.label.toLowerCase().includes(q))
|
|
2298
|
+
}))
|
|
2299
|
+
.filter(app => app.appName.toLowerCase().includes(q) || app.navItems.length > 0);
|
|
2300
|
+
}
|
|
788
2301
|
static ɵfac = function HomeDashboardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || HomeDashboardComponent)(i0.ɵɵdirectiveInject(i1.ApplicationManager), i0.ɵɵdirectiveInject(i2.NavigationService), i0.ɵɵdirectiveInject(i2.RecentAccessService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
789
2302
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: HomeDashboardComponent, selectors: [["mj-home-dashboard"]], viewQuery: function HomeDashboardComponent_Query(rf, ctx) { if (rf & 1) {
|
|
790
2303
|
i0.ɵɵviewQuery(_c0, 5);
|
|
791
2304
|
} if (rf & 2) {
|
|
792
2305
|
let _t;
|
|
793
2306
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.appConfigDialog = _t.first);
|
|
794
|
-
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
2307
|
+
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 17, vars: 13, consts: [["appConfigDialog", ""], [1, "home-dashboard"], [1, "main-content"], [1, "home-header"], [1, "greeting-section"], [1, "date"], [1, "pinned-section"], [1, "pin-context-menu", 3, "left", "top"], [1, "loading-container"], [1, "apps-section"], [1, "quick-access-sidebar"], ["title", "Quick Access", 1, "sidebar-fab-toggle"], [3, "ShowDialogChange", "ConfigSaved", "ShowDialog"], [1, "pinned-header"], [1, "section-title"], [1, "fa-solid", "fa-thumbtack"], [1, "pinned-actions"], [1, "pin-action-btn", "done"], [1, "edit-mode-banner"], [1, "pin-empty-state"], [1, "pin-grid"], [1, "pin-action-btn", "done", 3, "click"], [1, "fa-solid", "fa-check"], [1, "pin-action-btn", "primary", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "pin-action-btn"], [1, "pin-action-btn", 3, "click"], [1, "fa-solid", "fa-pen"], [1, "fa-solid", "fa-arrows-up-down-left-right"], [1, "pin-card", 3, "edit-mode", "dragging", "drag-over", "draggable"], [1, "add-pin-card"], [1, "pin-card", 3, "dragstart", "dragover", "dragleave", "drop", "dragend", "click", "draggable"], [1, "edit-controls"], [1, "pin-thumbnail"], [1, "pin-thumbnail", "icon-mode", 3, "--pin-icon-color"], [1, "pin-info"], [1, "pin-name-input", 3, "value"], [1, "pin-name"], [1, "pin-meta"], [1, "pin-app-badge"], [1, "drag-handle"], [1, "fa-solid", "fa-grip-vertical"], [1, "edit-card-actions"], [1, "edit-card-btn", "delete", 3, "click"], [1, "fa-solid", "fa-xmark"], [3, "src", "alt"], [1, "pin-overlay"], [1, "open-btn", 3, "click"], [1, "pin-thumbnail", "icon-mode"], [1, "pin-name-input", 3, "blur", "keydown.enter", "click", "value"], [1, "pin-name", 3, "click"], [1, "more-btn"], [1, "more-btn", 3, "click"], [1, "fa-solid", "fa-ellipsis"], [1, "group-header"], [1, "group-name-input", 3, "value"], [1, "group-name"], [1, "group-line"], [1, "group-count"], [1, "group-edit-controls"], [1, "group-name-input", 3, "blur", "keydown.enter", "value"], [1, "group-name", 3, "click"], [1, "group-edit-btn", "danger", 3, "click"], [1, "fa-solid", "fa-folder-minus"], [1, "add-pin-card", 3, "click"], [1, "pin-context-menu"], [1, "pin-context-item", 3, "click"], [1, "pin-context-divider"], [1, "pin-context-submenu"], [1, "pin-context-item", "submenu-header"], [1, "fa-solid", "fa-folder"], [1, "pin-context-item", "submenu-item"], [1, "pin-context-item", "danger", 3, "click"], [1, "fa-solid", "fa-thumbtack-slash"], [1, "pin-context-item", "submenu-item", 3, "click"], [1, "slide-panel-backdrop", 3, "click"], [1, "slide-panel"], [1, "slide-panel-header"], [1, "slide-panel-close", 3, "click"], [1, "search-box"], [1, "search-input-wrapper"], [1, "fa-solid", "fa-magnifying-glass"], ["type", "text", "placeholder", "Search apps, dashboards, views, queries...", 3, "ngModelChange", "ngModel"], [1, "group-selector"], [3, "ngModelChange", "ngModel"], ["value", ""], [3, "value"], ["value", "__new__"], [1, "new-group-row"], [1, "panel-results"], [1, "panel-loading"], ["type", "text", "placeholder", "Enter new group name...", 1, "new-group-input", 3, "ngModelChange", "ngModel"], ["text", "Loading resources...", "size", "small"], [1, "panel-section"], [1, "panel-section-title", "collapsible", 3, "click"], [1, "fa-solid", "fa-grid-2"], [1, "panel-count"], [1, "section-chevron", "fa-solid"], [1, "panel-app-header"], [1, "panel-app-icon"], [1, "panel-app-name"], [1, "panel-item", "panel-nav-item"], [1, "panel-item-icon"], [1, "panel-item-info"], [1, "panel-item-name"], [1, "panel-item-action"], [1, "pinned-badge"], [1, "pin-btn"], [1, "pin-btn", 3, "click"], [1, "fa-solid", "fa-gauge-high"], [1, "panel-item"], [1, "panel-item-icon", 2, "background", "color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface-card))"], [1, "fa-solid", "fa-gauge-high", 2, "color", "var(--mj-brand-primary)"], [1, "fa-solid", "fa-table-list"], [1, "fa-solid", "fa-table-list", 2, "color", "var(--mj-brand-primary)"], [1, "panel-item-sub"], [1, "fa-solid", "fa-database"], [1, "fa-solid", "fa-database", 2, "color", "var(--mj-brand-primary)"], ["text", "Loading your applications...", "size", "large"], [1, "apps-grid"], [1, "app-card", 3, "--app-color"], [1, "empty-state"], [1, "app-card", 3, "click"], [1, "app-icon-wrapper"], [1, "app-icon"], [1, "app-info"], [1, "app-name"], [1, "app-description"], [1, "nav-preview"], [1, "app-arrow"], [1, "fa-solid", "fa-arrow-right"], [1, "nav-item-chip"], [1, "more-items"], [1, "empty-icon"], [1, "fa-solid", "fa-folder-open"], ["kendoButton", "", "themeColor", "primary", 3, "click"], [1, "fa-solid", "fa-gear"], [1, "sidebar-header"], [1, "fa-solid", "fa-bolt"], ["title", "Close panel", 1, "sidebar-close-btn", 3, "click"], [1, "sidebar-content"], [1, "sidebar-section", "notifications-section"], [1, "sidebar-section", "favorites-section"], [1, "sidebar-section", "recents-section"], [1, "sidebar-empty"], [1, "sidebar-section-title"], [1, "fa-solid", "fa-bell"], [1, "section-badge"], [1, "sidebar-items"], [1, "sidebar-item", "notification-item"], [1, "sidebar-item", "notification-item", 3, "click"], [1, "sidebar-item-info"], [1, "sidebar-item-title"], [1, "sidebar-item-subtitle"], [1, "fa-solid", "fa-star"], [1, "sidebar-loading"], [1, "sidebar-item", "favorite-item"], [1, "sidebar-item", "favorite-item", 3, "click"], [1, "sidebar-item-icon"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-clock-rotate-left"], [1, "sidebar-item", "recent-item"], [1, "sidebar-item", "recent-item", 3, "click"], [1, "fa-solid", "fa-inbox"], ["title", "Quick Access", 1, "sidebar-fab-toggle", 3, "click"], [1, "fab-badge"]], template: function HomeDashboardComponent_Template(rf, ctx) { if (rf & 1) {
|
|
795
2308
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
796
2309
|
i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "div", 3)(3, "div", 4)(4, "h1");
|
|
797
2310
|
i0.ɵɵtext(5);
|
|
@@ -799,14 +2312,17 @@ let HomeDashboardComponent = class HomeDashboardComponent extends BaseResourceCo
|
|
|
799
2312
|
i0.ɵɵelementStart(6, "p", 5);
|
|
800
2313
|
i0.ɵɵtext(7);
|
|
801
2314
|
i0.ɵɵelementEnd()()();
|
|
802
|
-
i0.ɵɵconditionalCreate(8, HomeDashboardComponent_Conditional_8_Template,
|
|
803
|
-
i0.ɵɵconditionalCreate(9, HomeDashboardComponent_Conditional_9_Template,
|
|
2315
|
+
i0.ɵɵconditionalCreate(8, HomeDashboardComponent_Conditional_8_Template, 11, 4, "div", 6);
|
|
2316
|
+
i0.ɵɵconditionalCreate(9, HomeDashboardComponent_Conditional_9_Template, 19, 5, "div", 7);
|
|
2317
|
+
i0.ɵɵconditionalCreate(10, HomeDashboardComponent_Conditional_10_Template, 27, 4);
|
|
2318
|
+
i0.ɵɵconditionalCreate(11, HomeDashboardComponent_Conditional_11_Template, 2, 0, "div", 8);
|
|
2319
|
+
i0.ɵɵconditionalCreate(12, HomeDashboardComponent_Conditional_12_Template, 8, 1, "div", 9);
|
|
804
2320
|
i0.ɵɵelementEnd();
|
|
805
|
-
i0.ɵɵconditionalCreate(
|
|
806
|
-
i0.ɵɵconditionalCreate(
|
|
807
|
-
i0.ɵɵelementStart(
|
|
808
|
-
i0.ɵɵtwoWayListener("ShowDialogChange", function
|
|
809
|
-
i0.ɵɵlistener("ConfigSaved", function
|
|
2321
|
+
i0.ɵɵconditionalCreate(13, HomeDashboardComponent_Conditional_13_Template, 12, 4, "div", 10);
|
|
2322
|
+
i0.ɵɵconditionalCreate(14, HomeDashboardComponent_Conditional_14_Template, 3, 1, "button", 11);
|
|
2323
|
+
i0.ɵɵelementStart(15, "mj-user-app-config", 12, 0);
|
|
2324
|
+
i0.ɵɵtwoWayListener("ShowDialogChange", function HomeDashboardComponent_Template_mj_user_app_config_ShowDialogChange_15_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showConfigDialog, $event) || (ctx.showConfigDialog = $event); return i0.ɵɵresetView($event); });
|
|
2325
|
+
i0.ɵɵlistener("ConfigSaved", function HomeDashboardComponent_Template_mj_user_app_config_ConfigSaved_15_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onConfigSaved()); });
|
|
810
2326
|
i0.ɵɵelementEnd()();
|
|
811
2327
|
} if (rf & 2) {
|
|
812
2328
|
i0.ɵɵclassProp("sidebar-open", ctx.sidebarOpen && ctx.hasSidebarContent);
|
|
@@ -815,16 +2331,22 @@ let HomeDashboardComponent = class HomeDashboardComponent extends BaseResourceCo
|
|
|
815
2331
|
i0.ɵɵadvance(2);
|
|
816
2332
|
i0.ɵɵtextInterpolate(ctx.formattedDate);
|
|
817
2333
|
i0.ɵɵadvance();
|
|
818
|
-
i0.ɵɵconditional(ctx.isLoading ? 8 : -1);
|
|
2334
|
+
i0.ɵɵconditional(!ctx.isLoading ? 8 : -1);
|
|
2335
|
+
i0.ɵɵadvance();
|
|
2336
|
+
i0.ɵɵconditional(ctx.PinMenuVisible && ctx.PinMenuPin ? 9 : -1);
|
|
2337
|
+
i0.ɵɵadvance();
|
|
2338
|
+
i0.ɵɵconditional(ctx.AddPanelOpen ? 10 : -1);
|
|
2339
|
+
i0.ɵɵadvance();
|
|
2340
|
+
i0.ɵɵconditional(ctx.isLoading ? 11 : -1);
|
|
819
2341
|
i0.ɵɵadvance();
|
|
820
|
-
i0.ɵɵconditional(!ctx.isLoading ?
|
|
2342
|
+
i0.ɵɵconditional(!ctx.isLoading ? 12 : -1);
|
|
821
2343
|
i0.ɵɵadvance();
|
|
822
|
-
i0.ɵɵconditional(ctx.hasSidebarContent ?
|
|
2344
|
+
i0.ɵɵconditional(ctx.hasSidebarContent ? 13 : -1);
|
|
823
2345
|
i0.ɵɵadvance();
|
|
824
|
-
i0.ɵɵconditional(ctx.hasSidebarContent && !ctx.sidebarOpen ?
|
|
2346
|
+
i0.ɵɵconditional(ctx.hasSidebarContent && !ctx.sidebarOpen ? 14 : -1);
|
|
825
2347
|
i0.ɵɵadvance();
|
|
826
2348
|
i0.ɵɵtwoWayProperty("ShowDialog", ctx.showConfigDialog);
|
|
827
|
-
} }, dependencies: [i3.ButtonComponent, i4.LoadingComponent, i5.UserAppConfigComponent, i6.SlicePipe], styles: [".home-dashboard[_ngcontent-%COMP%] {\n display: flex;\n height: 100%;\n background: var(--mj-bg-page);\n overflow: hidden;\n position: relative;\n}\n\n\n\n.main-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 32px;\n overflow-y: auto;\n transition: margin-right var(--mj-transition-slow);\n}\n\n\n\n.home-dashboard.sidebar-open[_ngcontent-%COMP%] .main-content[_ngcontent-%COMP%] {\n margin-right: 320px;\n}\n\n\n\n.home-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 32px;\n}\n\n.greeting-section[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: var(--mj-text-4xl);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.greeting-section[_ngcontent-%COMP%] .date[_ngcontent-%COMP%] {\n margin: 0;\n font-size: var(--mj-text-base);\n color: var(--mj-text-muted);\n}\n\n\n\n.sidebar-fab-toggle[_ngcontent-%COMP%] {\n position: fixed;\n top: 80px; \n\n right: 24px;\n width: 56px;\n height: 56px;\n border: none;\n border-radius: var(--mj-radius-full);\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: var(--mj-text-xl);\n cursor: pointer;\n box-shadow: var(--mj-shadow-brand-md);\n transition: all var(--mj-transition-base);\n z-index: 100;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.sidebar-fab-toggle[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n transform: scale(1.05);\n box-shadow: 0 6px 16px color-mix(in srgb, var(--mj-brand-primary) 50%, transparent);\n}\n\n.fab-badge[_ngcontent-%COMP%] {\n position: absolute;\n top: -4px;\n right: -4px;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n border-radius: var(--mj-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n gap: 16px;\n color: var(--mj-text-muted);\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n font-size: var(--mj-text-4xl);\n color: var(--mj-brand-primary);\n}\n\n\n\n.apps-section[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n}\n\n.section-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin: 0 0 24px 0;\n font-size: var(--mj-text-xl);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n}\n\n.section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n\n\n.apps-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 20px;\n}\n\n\n\n.app-card[_ngcontent-%COMP%] {\n --app-color: var(--mj-text-muted);\n display: flex;\n align-items: flex-start;\n gap: 16px;\n padding: 20px;\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-lg);\n border: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n cursor: pointer;\n transition: all 0.25s ease;\n position: relative;\n overflow: hidden;\n}\n\n.app-card[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 4px;\n height: 100%;\n background: var(--app-color);\n opacity: 0;\n transition: opacity 0.25s ease;\n}\n\n.app-card[_ngcontent-%COMP%]:hover {\n border-color: var(--app-color);\n box-shadow: var(--mj-shadow-lg);\n transform: translateY(-3px);\n}\n\n.app-card[_ngcontent-%COMP%]:hover::before {\n opacity: 1;\n}\n\n\n\n.app-icon-wrapper[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.app-icon[_ngcontent-%COMP%] {\n width: 52px;\n height: 52px;\n border-radius: var(--mj-radius-lg);\n background: color-mix(in srgb, var(--app-color) 12%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.25s ease;\n}\n\n.app-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-xl);\n color: var(--app-color);\n transition: transform 0.25s ease;\n}\n\n.app-card[_ngcontent-%COMP%]:hover .app-icon[_ngcontent-%COMP%] {\n background: var(--app-color);\n}\n\n.app-card[_ngcontent-%COMP%]:hover .app-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-inverse);\n transform: scale(1.1);\n}\n\n\n\n.app-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.app-name[_ngcontent-%COMP%] {\n margin: 0 0 4px 0;\n font-size: var(--mj-text-base);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.app-description[_ngcontent-%COMP%] {\n margin: 0 0 10px 0;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n line-height: var(--mj-leading-snug);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n\n\n.nav-preview[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: center;\n}\n\n.nav-item-chip[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 5px;\n padding: 3px 8px;\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-sm);\n font-size: var(--mj-text-xs);\n color: var(--mj-text-secondary);\n}\n\n.nav-item-chip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 9px;\n color: var(--mj-text-muted);\n}\n\n.more-items[_ngcontent-%COMP%] {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n\n\n.app-arrow[_ngcontent-%COMP%] {\n position: absolute;\n right: 14px;\n top: 50%;\n transform: translateY(-50%) translateX(10px);\n opacity: 0;\n transition: all 0.25s ease;\n color: var(--app-color);\n font-size: var(--mj-text-base);\n}\n\n.app-card[_ngcontent-%COMP%]:hover .app-arrow[_ngcontent-%COMP%] {\n opacity: 1;\n transform: translateY(-50%) translateX(0);\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-xl);\n border: 2px dashed var(--mj-border-default);\n text-align: center;\n}\n\n.empty-icon[_ngcontent-%COMP%] {\n width: 80px;\n height: 80px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-card);\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 24px;\n}\n\n.empty-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-4xl);\n color: var(--mj-text-disabled);\n}\n\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: var(--mj-text-xl);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 20px 0;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n max-width: 400px;\n}\n\n.empty-state[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 8px;\n}\n\n\n\n\n\n.quick-access-sidebar[_ngcontent-%COMP%] {\n position: fixed;\n top: 60px; \n\n right: 0;\n bottom: 0;\n width: 320px;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n transform: translateX(100%);\n transition: transform var(--mj-transition-slow);\n overflow: hidden;\n z-index: 100;\n box-shadow: -2px 0 8px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n}\n\n.home-dashboard.sidebar-open[_ngcontent-%COMP%] .quick-access-sidebar[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n.sidebar-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.sidebar-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: var(--mj-text-base);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.sidebar-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: var(--mj-text-sm);\n}\n\n.sidebar-close-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: none;\n border-radius: var(--mj-radius-md);\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all var(--mj-transition-base);\n}\n\n.sidebar-close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.sidebar-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n\n\n.sidebar-section[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}\n\n.sidebar-section[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.sidebar-section-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 12px 0;\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.sidebar-section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-xs);\n}\n\n.notifications-section[_ngcontent-%COMP%] .sidebar-section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-color-warning-600);\n}\n\n.favorites-section[_ngcontent-%COMP%] .sidebar-section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n.recents-section[_ngcontent-%COMP%] .sidebar-section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.section-badge[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: var(--mj-font-semibold);\n padding: 2px 6px;\n border-radius: var(--mj-radius-md);\n margin-left: auto;\n}\n\n\n\n.sidebar-items[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.sidebar-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-lg);\n cursor: pointer;\n transition: all var(--mj-transition-base);\n}\n\n.sidebar-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n transform: translateX(4px);\n}\n\n.sidebar-item-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.sidebar-item-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n}\n\n.notification-item[_ngcontent-%COMP%] .sidebar-item-icon[_ngcontent-%COMP%] {\n background: var(--mj-color-warning-50);\n}\n\n.notification-item[_ngcontent-%COMP%] .sidebar-item-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-color-warning-600);\n}\n\n.favorite-item[_ngcontent-%COMP%] .sidebar-item-icon[_ngcontent-%COMP%] {\n background: var(--mj-color-warning-50);\n}\n\n.favorite-item[_ngcontent-%COMP%] .sidebar-item-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-color-warning-500);\n}\n\n.recent-item[_ngcontent-%COMP%] .sidebar-item-icon[_ngcontent-%COMP%] {\n background: var(--mj-color-info-50);\n}\n\n.recent-item[_ngcontent-%COMP%] .sidebar-item-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.sidebar-item-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n flex: 1;\n}\n\n.sidebar-item-title[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-medium);\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.sidebar-item-subtitle[_ngcontent-%COMP%] {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.sidebar-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n padding: 8px 0;\n}\n\n.sidebar-loading[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.sidebar-empty[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n text-align: center;\n color: var(--mj-text-disabled);\n}\n\n.sidebar-empty[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-4xl);\n margin-bottom: 12px;\n}\n\n.sidebar-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: var(--mj-text-sm);\n}\n\n\n\n\n\n\n\n\n\n@media (max-width: 1200px) {\n .quick-access-sidebar[_ngcontent-%COMP%] {\n width: 280px;\n }\n\n .home-dashboard.sidebar-open[_ngcontent-%COMP%] .main-content[_ngcontent-%COMP%] {\n margin-right: 280px;\n }\n\n .apps-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n }\n}\n\n\n\n@media (max-width: 992px) {\n .main-content[_ngcontent-%COMP%] {\n padding: 24px;\n }\n\n .greeting-section[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] {\n font-size: var(--mj-text-3xl);\n }\n\n \n\n .quick-access-sidebar[_ngcontent-%COMP%] {\n position: fixed;\n top: 60px; \n\n right: 0;\n bottom: 0;\n width: 320px;\n z-index: 1000;\n box-shadow: -4px 0 20px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n }\n\n .home-dashboard.sidebar-open[_ngcontent-%COMP%] .main-content[_ngcontent-%COMP%] {\n margin-right: 0;\n }\n\n \n\n .home-dashboard.sidebar-open[_ngcontent-%COMP%]::after {\n content: '';\n position: fixed;\n top: 60px;\n left: 0;\n right: 320px;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 999;\n }\n}\n\n\n\n@media (max-width: 768px) {\n .home-dashboard[_ngcontent-%COMP%] {\n height: auto;\n min-height: 100%;\n overflow: visible;\n }\n\n .main-content[_ngcontent-%COMP%] {\n padding: 20px;\n padding-bottom: 100px; \n\n overflow: visible;\n }\n\n .home-header[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n margin-bottom: 24px;\n }\n\n .greeting-section[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] {\n font-size: var(--mj-text-2xl);\n }\n\n \n\n .quick-access-sidebar[_ngcontent-%COMP%] {\n position: fixed;\n top: 60px; \n\n right: 0;\n bottom: 0;\n width: 100%;\n max-width: 100%;\n z-index: 100; \n\n border-left: none;\n border-top: 1px solid var(--mj-border-default);\n }\n\n \n\n .home-dashboard.sidebar-open[_ngcontent-%COMP%]::before {\n content: '';\n position: fixed;\n top: 60px;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 99;\n }\n\n \n\n .home-dashboard.sidebar-open[_ngcontent-%COMP%]::after {\n display: none;\n }\n\n .apps-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 16px;\n }\n\n .app-card[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .app-icon[_ngcontent-%COMP%] {\n width: 44px;\n height: 44px;\n }\n\n .app-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-lg);\n }\n\n .app-name[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n }\n\n .nav-preview[_ngcontent-%COMP%] {\n display: none;\n }\n\n \n\n .sidebar-fab-toggle[_ngcontent-%COMP%] {\n top: auto;\n bottom: 20px;\n right: 20px;\n width: 48px;\n height: 48px;\n font-size: var(--mj-text-lg);\n }\n}\n\n@media (max-width: 480px) {\n .main-content[_ngcontent-%COMP%] {\n padding: 16px;\n padding-bottom: 80px;\n }\n\n .greeting-section[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] {\n font-size: var(--mj-text-xl);\n }\n\n .greeting-section[_ngcontent-%COMP%] .date[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n }\n\n .section-title[_ngcontent-%COMP%] {\n font-size: var(--mj-text-base);\n margin-bottom: 16px;\n }\n\n .sidebar-fab-toggle[_ngcontent-%COMP%] {\n bottom: 16px;\n right: 16px;\n width: 44px;\n height: 44px;\n font-size: var(--mj-text-base);\n }\n}"], changeDetection: 0 });
|
|
2349
|
+
} }, dependencies: [i3.NgSelectOption, i3.ɵNgSelectMultipleOption, i3.DefaultValueAccessor, i3.SelectControlValueAccessor, i3.NgControlStatus, i3.NgModel, i4.ButtonComponent, i5.LoadingComponent, i6.UserAppConfigComponent, i7.SlicePipe], styles: [".home-dashboard[_ngcontent-%COMP%] {\n display: flex;\n height: 100%;\n background: var(--mj-bg-page);\n overflow: hidden;\n position: relative;\n}\n\n\n\n.main-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 32px;\n overflow-y: auto;\n transition: margin-right var(--mj-transition-slow);\n}\n\n\n\n.home-dashboard.sidebar-open[_ngcontent-%COMP%] .main-content[_ngcontent-%COMP%] {\n margin-right: 320px;\n}\n\n\n\n.home-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 32px;\n}\n\n.greeting-section[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: var(--mj-text-4xl);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.greeting-section[_ngcontent-%COMP%] .date[_ngcontent-%COMP%] {\n margin: 0;\n font-size: var(--mj-text-base);\n color: var(--mj-text-muted);\n}\n\n\n\n.sidebar-fab-toggle[_ngcontent-%COMP%] {\n position: fixed;\n top: 80px; \n\n right: 24px;\n width: 56px;\n height: 56px;\n border: none;\n border-radius: var(--mj-radius-full);\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: var(--mj-text-xl);\n cursor: pointer;\n box-shadow: var(--mj-shadow-brand-md);\n transition: all var(--mj-transition-base);\n z-index: 100;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.sidebar-fab-toggle[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n transform: scale(1.05);\n box-shadow: 0 6px 16px color-mix(in srgb, var(--mj-brand-primary) 50%, transparent);\n}\n\n.fab-badge[_ngcontent-%COMP%] {\n position: absolute;\n top: -4px;\n right: -4px;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n border-radius: var(--mj-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n gap: 16px;\n color: var(--mj-text-muted);\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n font-size: var(--mj-text-4xl);\n color: var(--mj-brand-primary);\n}\n\n\n\n.apps-section[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n}\n\n.section-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin: 0 0 24px 0;\n font-size: var(--mj-text-xl);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n}\n\n.section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n\n\n.apps-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 20px;\n}\n\n\n\n.app-card[_ngcontent-%COMP%] {\n --app-color: var(--mj-text-muted);\n display: flex;\n align-items: flex-start;\n gap: 16px;\n padding: 20px;\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-lg);\n border: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n cursor: pointer;\n transition: all 0.25s ease;\n position: relative;\n overflow: hidden;\n}\n\n.app-card[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 4px;\n height: 100%;\n background: var(--app-color);\n opacity: 0;\n transition: opacity 0.25s ease;\n}\n\n.app-card[_ngcontent-%COMP%]:hover {\n border-color: var(--app-color);\n box-shadow: var(--mj-shadow-lg);\n transform: translateY(-3px);\n}\n\n.app-card[_ngcontent-%COMP%]:hover::before {\n opacity: 1;\n}\n\n\n\n.app-icon-wrapper[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.app-icon[_ngcontent-%COMP%] {\n width: 52px;\n height: 52px;\n border-radius: var(--mj-radius-lg);\n background: color-mix(in srgb, var(--app-color) 12%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.25s ease;\n}\n\n.app-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-xl);\n color: var(--app-color);\n transition: transform 0.25s ease;\n}\n\n.app-card[_ngcontent-%COMP%]:hover .app-icon[_ngcontent-%COMP%] {\n background: var(--app-color);\n}\n\n.app-card[_ngcontent-%COMP%]:hover .app-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-inverse);\n transform: scale(1.1);\n}\n\n\n\n.app-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.app-name[_ngcontent-%COMP%] {\n margin: 0 0 4px 0;\n font-size: var(--mj-text-base);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.app-description[_ngcontent-%COMP%] {\n margin: 0 0 10px 0;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n line-height: var(--mj-leading-snug);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n\n\n.nav-preview[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: center;\n}\n\n.nav-item-chip[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 5px;\n padding: 3px 8px;\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-sm);\n font-size: var(--mj-text-xs);\n color: var(--mj-text-secondary);\n}\n\n.nav-item-chip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 9px;\n color: var(--mj-text-muted);\n}\n\n.more-items[_ngcontent-%COMP%] {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n\n\n.app-arrow[_ngcontent-%COMP%] {\n position: absolute;\n right: 14px;\n top: 50%;\n transform: translateY(-50%) translateX(10px);\n opacity: 0;\n transition: all 0.25s ease;\n color: var(--app-color);\n font-size: var(--mj-text-base);\n}\n\n.app-card[_ngcontent-%COMP%]:hover .app-arrow[_ngcontent-%COMP%] {\n opacity: 1;\n transform: translateY(-50%) translateX(0);\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-xl);\n border: 2px dashed var(--mj-border-default);\n text-align: center;\n}\n\n.empty-icon[_ngcontent-%COMP%] {\n width: 80px;\n height: 80px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-card);\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 24px;\n}\n\n.empty-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-4xl);\n color: var(--mj-text-disabled);\n}\n\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: var(--mj-text-xl);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 20px 0;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n max-width: 400px;\n}\n\n.empty-state[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 8px;\n}\n\n\n\n\n\n.quick-access-sidebar[_ngcontent-%COMP%] {\n position: fixed;\n top: 60px; \n\n right: 0;\n bottom: 0;\n width: 320px;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n transform: translateX(100%);\n transition: transform var(--mj-transition-slow);\n overflow: hidden;\n z-index: 100;\n box-shadow: -2px 0 8px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n}\n\n.home-dashboard.sidebar-open[_ngcontent-%COMP%] .quick-access-sidebar[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n.sidebar-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.sidebar-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: var(--mj-text-base);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.sidebar-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: var(--mj-text-sm);\n}\n\n.sidebar-close-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: none;\n border-radius: var(--mj-radius-md);\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all var(--mj-transition-base);\n}\n\n.sidebar-close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.sidebar-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n\n\n.sidebar-section[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}\n\n.sidebar-section[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.sidebar-section-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 12px 0;\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.sidebar-section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-xs);\n}\n\n.notifications-section[_ngcontent-%COMP%] .sidebar-section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-color-warning-600);\n}\n\n.favorites-section[_ngcontent-%COMP%] .sidebar-section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n.recents-section[_ngcontent-%COMP%] .sidebar-section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.section-badge[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: var(--mj-font-semibold);\n padding: 2px 6px;\n border-radius: var(--mj-radius-md);\n margin-left: auto;\n}\n\n\n\n.sidebar-items[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.sidebar-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-lg);\n cursor: pointer;\n transition: all var(--mj-transition-base);\n}\n\n.sidebar-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n transform: translateX(4px);\n}\n\n.sidebar-item-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.sidebar-item-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n}\n\n.notification-item[_ngcontent-%COMP%] .sidebar-item-icon[_ngcontent-%COMP%] {\n background: var(--mj-color-warning-50);\n}\n\n.notification-item[_ngcontent-%COMP%] .sidebar-item-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-color-warning-600);\n}\n\n.favorite-item[_ngcontent-%COMP%] .sidebar-item-icon[_ngcontent-%COMP%] {\n background: var(--mj-color-warning-50);\n}\n\n.favorite-item[_ngcontent-%COMP%] .sidebar-item-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-color-warning-500);\n}\n\n.recent-item[_ngcontent-%COMP%] .sidebar-item-icon[_ngcontent-%COMP%] {\n background: var(--mj-color-info-50);\n}\n\n.recent-item[_ngcontent-%COMP%] .sidebar-item-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.sidebar-item-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n flex: 1;\n}\n\n.sidebar-item-title[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-medium);\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.sidebar-item-subtitle[_ngcontent-%COMP%] {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.sidebar-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n padding: 8px 0;\n}\n\n.sidebar-loading[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.sidebar-empty[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n text-align: center;\n color: var(--mj-text-disabled);\n}\n\n.sidebar-empty[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-4xl);\n margin-bottom: 12px;\n}\n\n.sidebar-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: var(--mj-text-sm);\n}\n\n\n\n\n\n\n.pinned-section[_ngcontent-%COMP%] {\n margin-bottom: 32px;\n}\n\n.pinned-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.pinned-header[_ngcontent-%COMP%] .section-title[_ngcontent-%COMP%] {\n margin: 0;\n}\n\n.pinned-actions[_ngcontent-%COMP%] {\n margin-left: auto;\n display: flex;\n gap: 8px;\n}\n\n.pin-action-btn[_ngcontent-%COMP%] {\n padding: 6px 14px;\n border-radius: var(--mj-radius-md);\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: var(--mj-text-sm);\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all var(--mj-transition-base);\n}\n\n.pin-action-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.pin-action-btn.primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.pin-action-btn.primary[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.pin-action-btn.done[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n border-color: var(--mj-status-success);\n}\n\n\n\n.edit-mode-banner[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default));\n border-radius: var(--mj-radius-lg);\n padding: 12px 20px;\n margin-bottom: 20px;\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n}\n\n.edit-mode-banner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: var(--mj-text-base);\n}\n\n.edit-mode-banner[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n\n\n.pin-empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 40px 20px;\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-xl);\n border: 2px dashed var(--mj-border-default);\n text-align: center;\n}\n\n.pin-empty-state[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n font-size: 40px;\n color: var(--mj-text-disabled);\n margin-bottom: 16px;\n}\n\n.pin-empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: var(--mj-text-base);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n margin: 0 0 6px 0;\n}\n\n.pin-empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n max-width: 360px;\n margin: 0 0 16px 0;\n}\n\n\n\n.pin-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 16px;\n margin-bottom: 12px;\n}\n\n\n\n.group-header[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 0 4px 0;\n margin-top: 8px;\n}\n\n.group-name[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.group-line[_ngcontent-%COMP%] {\n flex: 1;\n height: 1px;\n background: var(--mj-border-default);\n}\n\n.group-count[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n background: var(--mj-bg-surface-card);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.group-name-input[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n border: 1px solid var(--mj-border-focus);\n border-radius: var(--mj-radius-sm);\n padding: 2px 8px;\n background: var(--mj-bg-surface);\n outline: none;\n width: 160px;\n}\n\n.group-edit-controls[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n}\n\n.group-edit-btn[_ngcontent-%COMP%] {\n background: none;\n border: 1px solid transparent;\n color: var(--mj-text-muted);\n font-size: 11px;\n cursor: pointer;\n padding: 2px 8px;\n border-radius: var(--mj-radius-sm);\n display: flex;\n align-items: center;\n gap: 4px;\n transition: all var(--mj-transition-base);\n}\n\n.group-edit-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-default);\n color: var(--mj-text-secondary);\n}\n\n.group-edit-btn.danger[_ngcontent-%COMP%]:hover {\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n}\n\n\n\n.pin-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-lg);\n border: 1px solid var(--mj-border-default);\n overflow: hidden;\n cursor: pointer;\n transition: all 0.25s ease;\n position: relative;\n}\n\n.pin-card[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, var(--mj-border-default));\n box-shadow: var(--mj-shadow-md);\n transform: translateY(-2px);\n}\n\n.pin-card.edit-mode[_ngcontent-%COMP%] {\n cursor: grab;\n}\n\n.pin-card.edit-mode[_ngcontent-%COMP%]:active {\n cursor: grabbing;\n}\n\n.pin-card.dragging[_ngcontent-%COMP%] {\n opacity: 0.5;\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-lg);\n transform: rotate(2deg);\n}\n\n.pin-card.drag-over[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n border-style: dashed;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n\n\n.edit-controls[_ngcontent-%COMP%] {\n position: absolute;\n top: 8px;\n left: 8px;\n right: 8px;\n display: flex;\n justify-content: space-between;\n z-index: 10;\n pointer-events: none;\n}\n\n.edit-controls[_ngcontent-%COMP%] > *[_ngcontent-%COMP%] {\n pointer-events: auto;\n}\n\n.drag-handle[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n background: color-mix(in srgb, var(--mj-bg-surface) 92%, transparent);\n border-radius: var(--mj-radius-sm);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 14px;\n cursor: grab;\n box-shadow: var(--mj-shadow-sm);\n border: 1px solid var(--mj-border-subtle);\n transition: all var(--mj-transition-base);\n}\n\n.drag-handle[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-md);\n}\n\n.edit-card-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n}\n\n.edit-card-btn[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n background: color-mix(in srgb, var(--mj-bg-surface) 92%, transparent);\n border-radius: var(--mj-radius-sm);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n box-shadow: var(--mj-shadow-sm);\n border: 1px solid var(--mj-border-subtle);\n transition: all var(--mj-transition-base);\n}\n\n.edit-card-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-md);\n}\n\n.edit-card-btn.delete[_ngcontent-%COMP%]:hover {\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-border-default));\n}\n\n\n\n.pin-thumbnail[_ngcontent-%COMP%] {\n width: 100%;\n aspect-ratio: 16 / 10;\n overflow: hidden;\n position: relative;\n}\n\n.pin-thumbnail[_ngcontent-%COMP%] img[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.pin-thumbnail.icon-mode[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--pin-icon-color, var(--mj-text-muted)) 10%, var(--mj-bg-surface-card));\n}\n\n.pin-thumbnail.icon-mode[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n font-size: 36px;\n color: var(--pin-icon-color, var(--mj-text-muted));\n opacity: 0.7;\n}\n\n\n\n.pin-overlay[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n background: rgba(0,0,0,0.4);\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n\n.pin-card[_ngcontent-%COMP%]:hover .pin-overlay[_ngcontent-%COMP%] {\n opacity: 1;\n pointer-events: auto;\n}\n\n.open-btn[_ngcontent-%COMP%] {\n padding: 8px 20px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border: none;\n border-radius: var(--mj-radius-md);\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n cursor: pointer;\n box-shadow: var(--mj-shadow-md);\n}\n\n\n\n.pin-info[_ngcontent-%COMP%] {\n padding: 10px 12px;\n}\n\n.pin-name[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.pin-name[_ngcontent-%COMP%] .more-btn[_ngcontent-%COMP%] {\n margin-left: auto;\n opacity: 0;\n transition: opacity var(--mj-transition-base);\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 2px 4px;\n border-radius: 4px;\n font-size: 14px;\n}\n\n.pin-card[_ngcontent-%COMP%]:hover .pin-name[_ngcontent-%COMP%] .more-btn[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.pin-name[_ngcontent-%COMP%] .more-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.pin-name-input[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n border: 1px solid var(--mj-border-focus);\n border-radius: var(--mj-radius-sm);\n padding: 2px 6px;\n width: 100%;\n outline: none;\n background: var(--mj-bg-surface);\n}\n\n.pin-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.pin-meta[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.pin-app-badge[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n padding: 1px 6px;\n border-radius: 4px;\n font-size: 10px;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n}\n\n\n\n.add-pin-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-lg);\n border: 2px dashed var(--mj-border-default);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 180px;\n cursor: pointer;\n transition: all var(--mj-transition-base);\n gap: 8px;\n color: var(--mj-text-muted);\n}\n\n.add-pin-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.add-pin-card[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 28px;\n}\n\n.add-pin-card[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n}\n\n\n\n\n\n.pin-context-menu[_ngcontent-%COMP%] {\n position: fixed;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n box-shadow: var(--mj-shadow-lg);\n min-width: 180px;\n z-index: 10001;\n overflow: hidden;\n animation: _ngcontent-%COMP%_pinMenuIn 0.15s ease;\n}\n\n@keyframes _ngcontent-%COMP%_pinMenuIn {\n from { opacity: 0; transform: scale(0.95); }\n to { opacity: 1; transform: scale(1); }\n}\n\n.pin-context-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 9px 14px;\n cursor: pointer;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-primary);\n transition: background 0.15s;\n}\n\n.pin-context-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.pin-context-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 16px;\n text-align: center;\n color: var(--mj-text-secondary);\n font-size: var(--mj-text-sm);\n}\n\n.pin-context-item.danger[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.pin-context-item.danger[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.pin-context-item.danger[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n}\n\n.pin-context-item.submenu-header[_ngcontent-%COMP%] {\n font-weight: var(--mj-font-medium);\n cursor: default;\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n padding: 6px 14px;\n}\n\n.pin-context-item.submenu-header[_ngcontent-%COMP%]:hover {\n background: transparent;\n}\n\n.pin-context-item.submenu-item[_ngcontent-%COMP%] {\n padding-left: 30px;\n font-size: var(--mj-text-sm);\n}\n\n.pin-context-divider[_ngcontent-%COMP%] {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n}\n\n\n\n\n\n.slide-panel-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 2000;\n}\n\n.slide-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 60px;\n right: 0;\n bottom: 0;\n width: 400px;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-xl);\n z-index: 2001;\n display: flex;\n flex-direction: column;\n animation: _ngcontent-%COMP%_slideIn 0.3s ease;\n}\n\n@keyframes _ngcontent-%COMP%_slideIn {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n}\n\n.slide-panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.slide-panel-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: var(--mj-text-base);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n}\n\n.slide-panel-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.slide-panel-close[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: none;\n border-radius: var(--mj-radius-md);\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all var(--mj-transition-base);\n}\n\n.slide-panel-close[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n\n\n.search-box[_ngcontent-%COMP%] {\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.search-input-wrapper[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n padding: 8px 12px;\n transition: all var(--mj-transition-base);\n}\n\n.search-input-wrapper[_ngcontent-%COMP%]:focus-within {\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.search-input-wrapper[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 14px;\n}\n\n.search-input-wrapper[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n border: none;\n outline: none;\n background: transparent;\n font-size: 14px;\n color: var(--mj-text-primary);\n flex: 1;\n}\n\n.search-input-wrapper[_ngcontent-%COMP%] input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n\n\n.group-selector[_ngcontent-%COMP%] {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n}\n\n.group-selector[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-weight: var(--mj-font-medium);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.group-selector[_ngcontent-%COMP%] select[_ngcontent-%COMP%] {\n flex: 1;\n padding: 4px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n font-size: var(--mj-text-sm);\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n outline: none;\n cursor: pointer;\n}\n\n.new-group-input[_ngcontent-%COMP%] {\n flex: 1;\n padding: 4px 8px;\n border: 1px solid var(--mj-border-focus);\n border-radius: var(--mj-radius-sm);\n font-size: var(--mj-text-sm);\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n outline: none;\n}\n\n\n\n.panel-results[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 16px 20px;\n}\n\n.panel-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 40px;\n}\n\n.panel-section[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}\n\n.panel-section-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 10px;\n padding-bottom: 6px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child {\n font-size: 12px;\n}\n\n.panel-section-title.collapsible[_ngcontent-%COMP%] {\n cursor: pointer;\n user-select: none;\n transition: color var(--mj-transition-base);\n}\n\n.panel-section-title.collapsible[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n}\n\n.section-chevron[_ngcontent-%COMP%] {\n font-size: 10px;\n transition: transform 0.2s ease;\n}\n\n.panel-count[_ngcontent-%COMP%] {\n margin-left: auto;\n background: var(--mj-bg-surface-card);\n padding: 1px 6px;\n border-radius: 8px;\n font-size: 10px;\n color: var(--mj-text-disabled);\n}\n\n\n\n.panel-app-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 12px 6px 12px;\n margin-top: 8px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-app-header[_ngcontent-%COMP%]:first-child {\n margin-top: 0;\n}\n\n.panel-app-icon[_ngcontent-%COMP%] {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.panel-app-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--panel-app-color);\n}\n\n.panel-app-name[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n\n\n.panel-item.panel-nav-item[_ngcontent-%COMP%] {\n padding: 10px 12px 10px 32px;\n margin-left: 12px;\n border-left: 2px solid var(--mj-border-subtle);\n}\n\n.panel-item.panel-nav-item[_ngcontent-%COMP%]:last-of-type {\n border-left-color: transparent;\n}\n\n.panel-item.panel-nav-item[_ngcontent-%COMP%]:hover {\n border-left-color: var(--mj-brand-primary);\n}\n\n\n\n.new-group-row[_ngcontent-%COMP%] {\n padding: 0 20px 12px 20px;\n}\n\n.new-group-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 6px 10px;\n border: 1px solid var(--mj-border-focus);\n border-radius: var(--mj-radius-sm);\n font-size: var(--mj-text-sm);\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n outline: none;\n}\n\n.panel-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border-radius: var(--mj-radius-md);\n transition: all var(--mj-transition-base);\n cursor: pointer;\n}\n\n.panel-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.panel-item-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: var(--mj-radius-md);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.panel-item-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.panel-item-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.panel-item-name[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-medium);\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.panel-item-sub[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.panel-item-action[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.panel-item-action[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n padding: 4px 12px;\n border-radius: var(--mj-radius-sm);\n font-size: 12px;\n font-weight: var(--mj-font-semibold);\n cursor: pointer;\n transition: all var(--mj-transition-base);\n}\n\n.pin-btn[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: 1px solid var(--mj-brand-primary);\n}\n\n.pin-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.pinned-badge[_ngcontent-%COMP%] {\n background: transparent;\n color: var(--mj-status-success);\n border: 1px solid var(--mj-status-success);\n cursor: default !important;\n}\n\n\n\n\n\n\n\n\n\n@media (max-width: 1200px) {\n .quick-access-sidebar[_ngcontent-%COMP%] {\n width: 280px;\n }\n\n .home-dashboard.sidebar-open[_ngcontent-%COMP%] .main-content[_ngcontent-%COMP%] {\n margin-right: 280px;\n }\n\n .apps-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n }\n}\n\n\n\n@media (max-width: 992px) {\n .main-content[_ngcontent-%COMP%] {\n padding: 24px;\n }\n\n .greeting-section[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] {\n font-size: var(--mj-text-3xl);\n }\n\n \n\n .quick-access-sidebar[_ngcontent-%COMP%] {\n position: fixed;\n top: 60px; \n\n right: 0;\n bottom: 0;\n width: 320px;\n z-index: 1000;\n box-shadow: -4px 0 20px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n }\n\n .home-dashboard.sidebar-open[_ngcontent-%COMP%] .main-content[_ngcontent-%COMP%] {\n margin-right: 0;\n }\n\n \n\n .home-dashboard.sidebar-open[_ngcontent-%COMP%]::after {\n content: '';\n position: fixed;\n top: 60px;\n left: 0;\n right: 320px;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 999;\n }\n}\n\n\n\n@media (max-width: 768px) {\n .home-dashboard[_ngcontent-%COMP%] {\n height: auto;\n min-height: 100%;\n overflow: visible;\n }\n\n .main-content[_ngcontent-%COMP%] {\n padding: 20px;\n padding-bottom: 100px; \n\n overflow: visible;\n }\n\n .home-header[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n margin-bottom: 24px;\n }\n\n .greeting-section[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] {\n font-size: var(--mj-text-2xl);\n }\n\n \n\n .quick-access-sidebar[_ngcontent-%COMP%] {\n position: fixed;\n top: 60px; \n\n right: 0;\n bottom: 0;\n width: 100%;\n max-width: 100%;\n z-index: 100; \n\n border-left: none;\n border-top: 1px solid var(--mj-border-default);\n }\n\n \n\n .home-dashboard.sidebar-open[_ngcontent-%COMP%]::before {\n content: '';\n position: fixed;\n top: 60px;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 99;\n }\n\n \n\n .home-dashboard.sidebar-open[_ngcontent-%COMP%]::after {\n display: none;\n }\n\n .pin-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));\n gap: 12px;\n }\n\n .slide-panel[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .apps-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 16px;\n }\n\n .app-card[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .app-icon[_ngcontent-%COMP%] {\n width: 44px;\n height: 44px;\n }\n\n .app-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-lg);\n }\n\n .app-name[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n }\n\n .nav-preview[_ngcontent-%COMP%] {\n display: none;\n }\n\n \n\n .sidebar-fab-toggle[_ngcontent-%COMP%] {\n top: auto;\n bottom: 20px;\n right: 20px;\n width: 48px;\n height: 48px;\n font-size: var(--mj-text-lg);\n }\n}\n\n@media (max-width: 480px) {\n .main-content[_ngcontent-%COMP%] {\n padding: 16px;\n padding-bottom: 80px;\n }\n\n .greeting-section[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] {\n font-size: var(--mj-text-xl);\n }\n\n .greeting-section[_ngcontent-%COMP%] .date[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n }\n\n .section-title[_ngcontent-%COMP%] {\n font-size: var(--mj-text-base);\n margin-bottom: 16px;\n }\n\n .sidebar-fab-toggle[_ngcontent-%COMP%] {\n bottom: 16px;\n right: 16px;\n width: 44px;\n height: 44px;\n font-size: var(--mj-text-base);\n }\n}"], changeDetection: 0 });
|
|
828
2350
|
};
|
|
829
2351
|
HomeDashboardComponent = __decorate([
|
|
830
2352
|
RegisterClass(BaseResourceComponent, 'HomeDashboard')
|
|
@@ -832,7 +2354,7 @@ HomeDashboardComponent = __decorate([
|
|
|
832
2354
|
export { HomeDashboardComponent };
|
|
833
2355
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(HomeDashboardComponent, [{
|
|
834
2356
|
type: Component,
|
|
835
|
-
args: [{ standalone: false, selector: 'mj-home-dashboard', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"home-dashboard\" [class.sidebar-open]=\"sidebarOpen && hasSidebarContent\">\n <!-- Main Content Area -->\n <div class=\"main-content\">\n <!-- Header Section -->\n <div class=\"home-header\">\n <div class=\"greeting-section\">\n <h1>{{ greeting }}, {{ currentUser?.Name }}</h1>\n <p class=\"date\">{{ formattedDate }}</p>\n </div>\n </div>\n\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading your applications...\" size=\"large\"></mj-loading>\n </div>\n }\n\n <!-- Apps Grid -->\n @if (!isLoading) {\n <div class=\"apps-section\">\n <h2 class=\"section-title\">\n <i class=\"fa-solid fa-grid-2\"></i>\n Your Applications\n </h2>\n <div class=\"apps-grid\">\n @for (appData of appsDisplayData; track trackByApp($index, appData)) {\n <div\n class=\"app-card\"\n [style.--app-color]=\"appData.color\"\n (click)=\"onAppClick(appData.app)\">\n <!-- App Icon -->\n <div class=\"app-icon-wrapper\">\n <div class=\"app-icon\">\n <i [class]=\"appData.icon\"></i>\n </div>\n </div>\n <!-- App Info -->\n <div class=\"app-info\">\n <h3 class=\"app-name\">{{ appData.app.Name }}</h3>\n @if (appData.app.Description) {\n <p class=\"app-description\">{{ appData.app.Description }}</p>\n }\n <!-- Nav Items Preview -->\n @if (appData.navItemsCount > 0) {\n <div class=\"nav-preview\">\n @for (item of appData.navItemsPreview; track trackByNavItem($index, item)) {\n <div class=\"nav-item-chip\">\n <i [class]=\"item.Icon\"></i>\n <span>{{ item.Label }}</span>\n </div>\n }\n @if (appData.showMoreItems) {\n <span class=\"more-items\">\n +{{ appData.moreItemsCount }} more\n </span>\n }\n </div>\n }\n </div>\n <!-- Hover Arrow -->\n <div class=\"app-arrow\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n </div>\n </div>\n }\n </div>\n <!-- Empty State -->\n @if (apps.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-folder-open\"></i>\n </div>\n <h3>No Applications Available</h3>\n <p>You don't have any applications configured yet.</p>\n <button kendoButton\n themeColor=\"primary\"\n (click)=\"openConfigDialog()\">\n <i class=\"fa-solid fa-gear\"></i>\n Configure Applications\n </button>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Collapsible Right Sidebar -->\n @if (hasSidebarContent) {\n <div class=\"quick-access-sidebar\">\n <div class=\"sidebar-header\">\n <h3>\n <i class=\"fa-solid fa-bolt\"></i>\n Quick Access\n </h3>\n <button class=\"sidebar-close-btn\" (click)=\"toggleSidebar()\" title=\"Close panel\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"sidebar-content\">\n <!-- Unread Notifications Section -->\n @if (unreadNotifications.length > 0) {\n <div class=\"sidebar-section notifications-section\">\n <h4 class=\"sidebar-section-title\">\n <i class=\"fa-solid fa-bell\"></i>\n Notifications\n <span class=\"section-badge\">{{ unreadNotifications.length }}</span>\n </h4>\n <div class=\"sidebar-items\">\n @for (notification of unreadNotifications; track trackByNotification($index, notification)) {\n <div\n class=\"sidebar-item notification-item\"\n (click)=\"onNotificationClick(notification)\">\n <div class=\"sidebar-item-info\">\n <span class=\"sidebar-item-title\">{{ notification.Title }}</span>\n <span class=\"sidebar-item-subtitle\">{{ notification.Message | slice:0:40 }}{{ (notification.Message?.length || 0) > 40 ? '...' : '' }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Favorites Section -->\n @if (favorites.length > 0 || favoritesLoading) {\n <div class=\"sidebar-section favorites-section\">\n <h4 class=\"sidebar-section-title\">\n <i class=\"fa-solid fa-star\"></i>\n Favorites\n </h4>\n @if (!favoritesLoading) {\n <div class=\"sidebar-items\">\n @for (favorite of favorites; track trackByFavorite($index, favorite)) {\n <div\n class=\"sidebar-item favorite-item\"\n (click)=\"onFavoriteClick(favorite)\">\n <div class=\"sidebar-item-icon\">\n <i [class]=\"getEntityIconByName(favorite.Entity)\"></i>\n </div>\n <div class=\"sidebar-item-info\">\n <span class=\"sidebar-item-title\">{{ getFavoriteDisplayName(favorite) }}</span>\n <span class=\"sidebar-item-subtitle\">{{ favorite.Entity }}</span>\n </div>\n </div>\n }\n </div>\n }\n @if (favoritesLoading) {\n <div class=\"sidebar-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading...</span>\n </div>\n }\n </div>\n }\n <!-- Recents Section -->\n @if (recentItems.length > 0 || recentsLoading) {\n <div class=\"sidebar-section recents-section\">\n <h4 class=\"sidebar-section-title\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n Recent\n </h4>\n @if (!recentsLoading) {\n <div class=\"sidebar-items\">\n @for (item of recentItems; track trackByRecent($index, item)) {\n <div\n class=\"sidebar-item recent-item\"\n (click)=\"onRecentClick(item)\">\n <div class=\"sidebar-item-icon\">\n <i [class]=\"getEntityIconByName(item.entityName)\"></i>\n </div>\n <div class=\"sidebar-item-info\">\n <span class=\"sidebar-item-title\">{{ item.recordName || item.recordId }}</span>\n <span class=\"sidebar-item-subtitle\">{{ item.entityName }} \u00B7 {{ formatDate(item.latestAt) }}</span>\n </div>\n </div>\n }\n </div>\n }\n @if (recentsLoading) {\n <div class=\"sidebar-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading...</span>\n </div>\n }\n </div>\n }\n <!-- Empty sidebar state -->\n @if (!favoritesLoading && !recentsLoading && unreadNotifications.length === 0 && favorites.length === 0 && recentItems.length === 0) {\n <div class=\"sidebar-empty\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No quick access items</p>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Quick Access FAB Toggle (Fixed Button) -->\n @if (hasSidebarContent && !sidebarOpen) {\n <button class=\"sidebar-fab-toggle\"\n (click)=\"toggleSidebar()\"\n title=\"Quick Access\">\n <i class=\"fa-solid fa-bolt\"></i>\n @if (unreadNotifications.length > 0) {\n <span class=\"fab-badge\">{{ unreadNotifications.length }}</span>\n }\n </button>\n }\n\n <!-- App Configuration Dialog -->\n <mj-user-app-config\n #appConfigDialog\n [(ShowDialog)]=\"showConfigDialog\"\n (ConfigSaved)=\"onConfigSaved()\">\n </mj-user-app-config>\n</div>\n", styles: [".home-dashboard {\n display: flex;\n height: 100%;\n background: var(--mj-bg-page);\n overflow: hidden;\n position: relative;\n}\n\n/* Main Content Area */\n.main-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 32px;\n overflow-y: auto;\n transition: margin-right var(--mj-transition-slow);\n}\n\n/* Sidebar open state adjusts main content on desktop */\n.home-dashboard.sidebar-open .main-content {\n margin-right: 320px;\n}\n\n/* Header */\n.home-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 32px;\n}\n\n.greeting-section h1 {\n margin: 0 0 8px 0;\n font-size: var(--mj-text-4xl);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.greeting-section .date {\n margin: 0;\n font-size: var(--mj-text-base);\n color: var(--mj-text-muted);\n}\n\n/* FAB Toggle Button for Quick Access - top-right on desktop */\n.sidebar-fab-toggle {\n position: fixed;\n top: 80px; /* Below shell header with some spacing */\n right: 24px;\n width: 56px;\n height: 56px;\n border: none;\n border-radius: var(--mj-radius-full);\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: var(--mj-text-xl);\n cursor: pointer;\n box-shadow: var(--mj-shadow-brand-md);\n transition: all var(--mj-transition-base);\n z-index: 100;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.sidebar-fab-toggle:hover {\n background: var(--mj-brand-primary-hover);\n transform: scale(1.05);\n box-shadow: 0 6px 16px color-mix(in srgb, var(--mj-brand-primary) 50%, transparent);\n}\n\n.fab-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n border-radius: var(--mj-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Loading State */\n.loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n gap: 16px;\n color: var(--mj-text-muted);\n}\n\n.loading-spinner {\n font-size: var(--mj-text-4xl);\n color: var(--mj-brand-primary);\n}\n\n/* Apps Section */\n.apps-section {\n flex: 0 0 auto;\n}\n\n.section-title {\n display: flex;\n align-items: center;\n gap: 12px;\n margin: 0 0 24px 0;\n font-size: var(--mj-text-xl);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n}\n\n.section-title i {\n color: var(--mj-text-muted);\n}\n\n/* Apps Grid */\n.apps-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 20px;\n}\n\n/* App Card */\n.app-card {\n --app-color: var(--mj-text-muted);\n display: flex;\n align-items: flex-start;\n gap: 16px;\n padding: 20px;\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-lg);\n border: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n cursor: pointer;\n transition: all 0.25s ease;\n position: relative;\n overflow: hidden;\n}\n\n.app-card::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 4px;\n height: 100%;\n background: var(--app-color);\n opacity: 0;\n transition: opacity 0.25s ease;\n}\n\n.app-card:hover {\n border-color: var(--app-color);\n box-shadow: var(--mj-shadow-lg);\n transform: translateY(-3px);\n}\n\n.app-card:hover::before {\n opacity: 1;\n}\n\n/* App Icon */\n.app-icon-wrapper {\n flex-shrink: 0;\n}\n\n.app-icon {\n width: 52px;\n height: 52px;\n border-radius: var(--mj-radius-lg);\n background: color-mix(in srgb, var(--app-color) 12%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.25s ease;\n}\n\n.app-icon i {\n font-size: var(--mj-text-xl);\n color: var(--app-color);\n transition: transform 0.25s ease;\n}\n\n.app-card:hover .app-icon {\n background: var(--app-color);\n}\n\n.app-card:hover .app-icon i {\n color: var(--mj-text-inverse);\n transform: scale(1.1);\n}\n\n/* App Info */\n.app-info {\n flex: 1;\n min-width: 0;\n}\n\n.app-name {\n margin: 0 0 4px 0;\n font-size: var(--mj-text-base);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.app-description {\n margin: 0 0 10px 0;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n line-height: var(--mj-leading-snug);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* Nav Items Preview */\n.nav-preview {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: center;\n}\n\n.nav-item-chip {\n display: flex;\n align-items: center;\n gap: 5px;\n padding: 3px 8px;\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-sm);\n font-size: var(--mj-text-xs);\n color: var(--mj-text-secondary);\n}\n\n.nav-item-chip i {\n font-size: 9px;\n color: var(--mj-text-muted);\n}\n\n.more-items {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n/* App Arrow */\n.app-arrow {\n position: absolute;\n right: 14px;\n top: 50%;\n transform: translateY(-50%) translateX(10px);\n opacity: 0;\n transition: all 0.25s ease;\n color: var(--app-color);\n font-size: var(--mj-text-base);\n}\n\n.app-card:hover .app-arrow {\n opacity: 1;\n transform: translateY(-50%) translateX(0);\n}\n\n/* Empty State */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-xl);\n border: 2px dashed var(--mj-border-default);\n text-align: center;\n}\n\n.empty-icon {\n width: 80px;\n height: 80px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-card);\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 24px;\n}\n\n.empty-icon i {\n font-size: var(--mj-text-4xl);\n color: var(--mj-text-disabled);\n}\n\n.empty-state h3 {\n margin: 0 0 8px 0;\n font-size: var(--mj-text-xl);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n}\n\n.empty-state p {\n margin: 0 0 20px 0;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n max-width: 400px;\n}\n\n.empty-state button i {\n margin-right: 8px;\n}\n\n/* ========================================\n RIGHT SIDEBAR\n ======================================== */\n.quick-access-sidebar {\n position: fixed;\n top: 60px; /* Below shell header */\n right: 0;\n bottom: 0;\n width: 320px;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n transform: translateX(100%);\n transition: transform var(--mj-transition-slow);\n overflow: hidden;\n z-index: 100;\n box-shadow: -2px 0 8px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n}\n\n.home-dashboard.sidebar-open .quick-access-sidebar {\n transform: translateX(0);\n}\n\n.sidebar-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.sidebar-header h3 {\n margin: 0;\n font-size: var(--mj-text-base);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.sidebar-header h3 i {\n color: var(--mj-brand-primary);\n font-size: var(--mj-text-sm);\n}\n\n.sidebar-close-btn {\n width: 32px;\n height: 32px;\n border: none;\n border-radius: var(--mj-radius-md);\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all var(--mj-transition-base);\n}\n\n.sidebar-close-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.sidebar-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n/* Sidebar Sections */\n.sidebar-section {\n margin-bottom: 20px;\n}\n\n.sidebar-section:last-child {\n margin-bottom: 0;\n}\n\n.sidebar-section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 12px 0;\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.sidebar-section-title i {\n font-size: var(--mj-text-xs);\n}\n\n.notifications-section .sidebar-section-title i {\n color: var(--mj-color-warning-600);\n}\n\n.favorites-section .sidebar-section-title i {\n color: var(--mj-status-warning);\n}\n\n.recents-section .sidebar-section-title i {\n color: var(--mj-brand-primary);\n}\n\n.section-badge {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: var(--mj-font-semibold);\n padding: 2px 6px;\n border-radius: var(--mj-radius-md);\n margin-left: auto;\n}\n\n/* Sidebar Items */\n.sidebar-items {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.sidebar-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-lg);\n cursor: pointer;\n transition: all var(--mj-transition-base);\n}\n\n.sidebar-item:hover {\n background: var(--mj-bg-surface-hover);\n transform: translateX(4px);\n}\n\n.sidebar-item-icon {\n width: 36px;\n height: 36px;\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.sidebar-item-icon i {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n}\n\n.notification-item .sidebar-item-icon {\n background: var(--mj-color-warning-50);\n}\n\n.notification-item .sidebar-item-icon i {\n color: var(--mj-color-warning-600);\n}\n\n.favorite-item .sidebar-item-icon {\n background: var(--mj-color-warning-50);\n}\n\n.favorite-item .sidebar-item-icon i {\n color: var(--mj-color-warning-500);\n}\n\n.recent-item .sidebar-item-icon {\n background: var(--mj-color-info-50);\n}\n\n.recent-item .sidebar-item-icon i {\n color: var(--mj-brand-primary);\n}\n\n.sidebar-item-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n flex: 1;\n}\n\n.sidebar-item-title {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-medium);\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.sidebar-item-subtitle {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.sidebar-loading {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n padding: 8px 0;\n}\n\n.sidebar-loading i {\n color: var(--mj-brand-primary);\n}\n\n.sidebar-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n text-align: center;\n color: var(--mj-text-disabled);\n}\n\n.sidebar-empty i {\n font-size: var(--mj-text-4xl);\n margin-bottom: 12px;\n}\n\n.sidebar-empty p {\n margin: 0;\n font-size: var(--mj-text-sm);\n}\n\n\n/* ========================================\n RESPONSIVE DESIGN\n ======================================== */\n\n/* Tablet and smaller desktop */\n@media (max-width: 1200px) {\n .quick-access-sidebar {\n width: 280px;\n }\n\n .home-dashboard.sidebar-open .main-content {\n margin-right: 280px;\n }\n\n .apps-grid {\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n }\n}\n\n/* Tablet */\n@media (max-width: 992px) {\n .main-content {\n padding: 24px;\n }\n\n .greeting-section h1 {\n font-size: var(--mj-text-3xl);\n }\n\n /* Make sidebar an overlay on tablet */\n .quick-access-sidebar {\n position: fixed;\n top: 60px; /* Below shell header */\n right: 0;\n bottom: 0;\n width: 320px;\n z-index: 1000;\n box-shadow: -4px 0 20px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n }\n\n .home-dashboard.sidebar-open .main-content {\n margin-right: 0;\n }\n\n /* Show backdrop when sidebar is open on tablet */\n .home-dashboard.sidebar-open::after {\n content: '';\n position: fixed;\n top: 60px;\n left: 0;\n right: 320px;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 999;\n }\n}\n\n/* Mobile */\n@media (max-width: 768px) {\n .home-dashboard {\n height: auto;\n min-height: 100%;\n overflow: visible;\n }\n\n .main-content {\n padding: 20px;\n padding-bottom: 100px; /* Space for FAB button */\n overflow: visible;\n }\n\n .home-header {\n flex-direction: column;\n gap: 16px;\n margin-bottom: 24px;\n }\n\n .greeting-section h1 {\n font-size: var(--mj-text-2xl);\n }\n\n /* Full-width sidebar on mobile - positioned below top nav */\n .quick-access-sidebar {\n position: fixed;\n top: 60px; /* Below the shell header */\n right: 0;\n bottom: 0;\n width: 100%;\n max-width: 100%;\n z-index: 100; /* Below shell header */\n border-left: none;\n border-top: 1px solid var(--mj-border-default);\n }\n\n /* Add backdrop on mobile when sidebar is open */\n .home-dashboard.sidebar-open::before {\n content: '';\n position: fixed;\n top: 60px;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 99;\n }\n\n /* No ::after backdrop needed on mobile */\n .home-dashboard.sidebar-open::after {\n display: none;\n }\n\n .apps-grid {\n grid-template-columns: 1fr;\n gap: 16px;\n }\n\n .app-card {\n padding: 16px;\n }\n\n .app-icon {\n width: 44px;\n height: 44px;\n }\n\n .app-icon i {\n font-size: var(--mj-text-lg);\n }\n\n .app-name {\n font-size: var(--mj-text-sm);\n }\n\n .nav-preview {\n display: none;\n }\n\n /* Move FAB to bottom-right on mobile */\n .sidebar-fab-toggle {\n top: auto;\n bottom: 20px;\n right: 20px;\n width: 48px;\n height: 48px;\n font-size: var(--mj-text-lg);\n }\n}\n\n@media (max-width: 480px) {\n .main-content {\n padding: 16px;\n padding-bottom: 80px;\n }\n\n .greeting-section h1 {\n font-size: var(--mj-text-xl);\n }\n\n .greeting-section .date {\n font-size: var(--mj-text-sm);\n }\n\n .section-title {\n font-size: var(--mj-text-base);\n margin-bottom: 16px;\n }\n\n .sidebar-fab-toggle {\n bottom: 16px;\n right: 16px;\n width: 44px;\n height: 44px;\n font-size: var(--mj-text-base);\n }\n}\n"] }]
|
|
2357
|
+
args: [{ standalone: false, selector: 'mj-home-dashboard', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"home-dashboard\" [class.sidebar-open]=\"sidebarOpen && hasSidebarContent\">\n <!-- Main Content Area -->\n <div class=\"main-content\">\n <!-- Header Section -->\n <div class=\"home-header\">\n <div class=\"greeting-section\">\n <h1>{{ greeting }}, {{ currentUser?.Name }}</h1>\n <p class=\"date\">{{ formattedDate }}</p>\n </div>\n </div>\n\n <!-- Pinned Section -->\n @if (!isLoading) {\n <div class=\"pinned-section\">\n <div class=\"pinned-header\">\n <h2 class=\"section-title\">\n <i class=\"fa-solid fa-thumbtack\"></i>\n Pinned\n </h2>\n <div class=\"pinned-actions\">\n @if (EditMode) {\n <button class=\"pin-action-btn done\" (click)=\"ToggleEditMode()\">\n <i class=\"fa-solid fa-check\"></i> Done\n </button>\n } @else {\n <button class=\"pin-action-btn primary\" (click)=\"OpenAddPinPanel()\">\n <i class=\"fa-solid fa-plus\"></i> Add Pin\n </button>\n @if (PinnedItems.length > 0) {\n <button class=\"pin-action-btn\" (click)=\"ToggleEditMode()\">\n <i class=\"fa-solid fa-pen\"></i> Edit\n </button>\n }\n }\n </div>\n </div>\n\n @if (EditMode) {\n <div class=\"edit-mode-banner\">\n <i class=\"fa-solid fa-arrows-up-down-left-right\"></i>\n <span><strong>Edit mode</strong> \u2014 Drag cards to reorder. Click names to rename.</span>\n </div>\n }\n\n <!-- Empty State -->\n @if (PinnedItems.length === 0 && !EditMode) {\n <div class=\"pin-empty-state\">\n <i class=\"fa-solid fa-thumbtack\"></i>\n <h3>No pinned items yet</h3>\n <p>Pin your favorite dashboards, views, queries, and reports for quick access.</p>\n <button class=\"pin-action-btn primary\" (click)=\"OpenAddPinPanel()\">\n <i class=\"fa-solid fa-plus\"></i> Add your first pin\n </button>\n </div>\n }\n\n <!-- Pin Grid -->\n @if (PinnedItems.length > 0) {\n <div class=\"pin-grid\">\n <!-- Ungrouped Pins -->\n @for (pin of UngroupedPins; track trackByPin($index, pin)) {\n <div class=\"pin-card\"\n [class.edit-mode]=\"EditMode\"\n [class.dragging]=\"DraggingPinId === pin.Id\"\n [class.drag-over]=\"DragOverPinId === pin.Id\"\n [draggable]=\"EditMode\"\n (dragstart)=\"OnDragStart($event, pin)\"\n (dragover)=\"OnDragOver($event, pin)\"\n (dragleave)=\"OnDragLeave()\"\n (drop)=\"OnDrop($event, pin)\"\n (dragend)=\"OnDragEnd()\"\n (click)=\"OnPinClick(pin)\">\n\n <!-- Edit mode controls -->\n @if (EditMode) {\n <div class=\"edit-controls\">\n <div class=\"drag-handle\"><i class=\"fa-solid fa-grip-vertical\"></i></div>\n <div class=\"edit-card-actions\">\n <button class=\"edit-card-btn delete\" (click)=\"RemovePin(pin.Id); $event.stopPropagation()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n }\n\n <!-- Thumbnail / Icon -->\n @if (pin.Thumbnail) {\n <div class=\"pin-thumbnail\">\n <img [src]=\"pin.Thumbnail\" [alt]=\"pin.DisplayName\" />\n @if (!EditMode) {\n <div class=\"pin-overlay\">\n <button class=\"open-btn\" (click)=\"OnPinClick(pin); $event.stopPropagation()\">Open</button>\n </div>\n }\n </div>\n } @else {\n <div class=\"pin-thumbnail icon-mode\" [style.--pin-icon-color]=\"pin.Color || 'var(--mj-text-muted)'\">\n <i [class]=\"GetPinIcon(pin)\"></i>\n @if (!EditMode) {\n <div class=\"pin-overlay\">\n <button class=\"open-btn\" (click)=\"OnPinClick(pin); $event.stopPropagation()\">Open</button>\n </div>\n }\n </div>\n }\n\n <!-- Pin Info -->\n <div class=\"pin-info\">\n @if (EditMode && EditingPinId === pin.Id) {\n <input class=\"pin-name-input\"\n [value]=\"pin.DisplayName\"\n (blur)=\"SavePinName(pin.Id, GetInputValue($event))\"\n (keydown.enter)=\"SavePinName(pin.Id, GetInputValue($event))\"\n (click)=\"$event.stopPropagation()\" />\n } @else {\n <div class=\"pin-name\" (click)=\"EditMode ? StartEditingPin(pin.Id, $event) : null\">\n {{ pin.DisplayName }}\n @if (!EditMode) {\n <button class=\"more-btn\" (click)=\"ShowPinMenu($event, pin)\">\n <i class=\"fa-solid fa-ellipsis\"></i>\n </button>\n }\n </div>\n }\n <div class=\"pin-meta\">\n <i [class]=\"GetPinIcon(pin)\"></i>\n {{ GetResourceTypeLabel(pin) }}\n @if (pin.ApplicationName && pin.ResourceType !== 'Custom') {\n <span class=\"pin-app-badge\">{{ pin.ApplicationName }}</span>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Grouped Pins -->\n @for (group of PinGroups; track trackByGroup($index, group)) {\n <!-- Group Header -->\n <div class=\"group-header\">\n @if (EditMode && EditingGroupName === group) {\n <input class=\"group-name-input\"\n [value]=\"group\"\n (blur)=\"SaveGroupName(group, GetInputValue($event))\"\n (keydown.enter)=\"SaveGroupName(group, GetInputValue($event))\" />\n } @else {\n <span class=\"group-name\" (click)=\"EditMode ? StartEditingGroup(group) : null\">{{ group }}</span>\n }\n <div class=\"group-line\"></div>\n <span class=\"group-count\">{{ GetPinsInGroup(group).length }} pins</span>\n @if (EditMode) {\n <div class=\"group-edit-controls\">\n <button class=\"group-edit-btn danger\" (click)=\"RemoveGroup(group)\">\n <i class=\"fa-solid fa-folder-minus\"></i> Remove Group\n </button>\n </div>\n }\n </div>\n\n <!-- Pins in Group -->\n @for (pin of GetPinsInGroup(group); track trackByPin($index, pin)) {\n <div class=\"pin-card\"\n [class.edit-mode]=\"EditMode\"\n [class.dragging]=\"DraggingPinId === pin.Id\"\n [class.drag-over]=\"DragOverPinId === pin.Id\"\n [draggable]=\"EditMode\"\n (dragstart)=\"OnDragStart($event, pin)\"\n (dragover)=\"OnDragOver($event, pin)\"\n (dragleave)=\"OnDragLeave()\"\n (drop)=\"OnDrop($event, pin)\"\n (dragend)=\"OnDragEnd()\"\n (click)=\"OnPinClick(pin)\">\n\n @if (EditMode) {\n <div class=\"edit-controls\">\n <div class=\"drag-handle\"><i class=\"fa-solid fa-grip-vertical\"></i></div>\n <div class=\"edit-card-actions\">\n <button class=\"edit-card-btn delete\" (click)=\"RemovePin(pin.Id); $event.stopPropagation()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n }\n\n @if (pin.Thumbnail) {\n <div class=\"pin-thumbnail\">\n <img [src]=\"pin.Thumbnail\" [alt]=\"pin.DisplayName\" />\n @if (!EditMode) {\n <div class=\"pin-overlay\">\n <button class=\"open-btn\" (click)=\"OnPinClick(pin); $event.stopPropagation()\">Open</button>\n </div>\n }\n </div>\n } @else {\n <div class=\"pin-thumbnail icon-mode\" [style.--pin-icon-color]=\"pin.Color || 'var(--mj-text-muted)'\">\n <i [class]=\"GetPinIcon(pin)\"></i>\n @if (!EditMode) {\n <div class=\"pin-overlay\">\n <button class=\"open-btn\" (click)=\"OnPinClick(pin); $event.stopPropagation()\">Open</button>\n </div>\n }\n </div>\n }\n\n <div class=\"pin-info\">\n @if (EditMode && EditingPinId === pin.Id) {\n <input class=\"pin-name-input\"\n [value]=\"pin.DisplayName\"\n (blur)=\"SavePinName(pin.Id, $event.target.value)\"\n (keydown.enter)=\"SavePinName(pin.Id, $event.target.value)\"\n (click)=\"$event.stopPropagation()\" />\n } @else {\n <div class=\"pin-name\" (click)=\"EditMode ? StartEditingPin(pin.Id, $event) : null\">\n {{ pin.DisplayName }}\n @if (!EditMode) {\n <button class=\"more-btn\" (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-ellipsis\"></i>\n </button>\n }\n </div>\n }\n <div class=\"pin-meta\">\n <i [class]=\"GetPinIcon(pin)\"></i>\n {{ GetResourceTypeLabel(pin) }}\n @if (pin.ApplicationName) {\n <span class=\"pin-app-badge\">{{ pin.ApplicationName }}</span>\n }\n </div>\n </div>\n </div>\n }\n }\n\n <!-- Add Pin card (edit mode) -->\n @if (EditMode) {\n <div class=\"add-pin-card\" (click)=\"OpenAddPinPanel()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>Add Pin</span>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Pin Context Menu (ellipsis) -->\n @if (PinMenuVisible && PinMenuPin) {\n <div class=\"pin-context-menu\"\n [style.left.px]=\"PinMenuX\"\n [style.top.px]=\"PinMenuY\">\n <div class=\"pin-context-item\" (click)=\"OnPinMenuEdit()\">\n <i class=\"fa-solid fa-pen\"></i>\n <span>Edit</span>\n </div>\n <div class=\"pin-context-divider\"></div>\n <div class=\"pin-context-submenu\">\n <div class=\"pin-context-item submenu-header\">\n <i class=\"fa-solid fa-folder\"></i>\n <span>Move to Group</span>\n </div>\n @if (PinMenuPin.Group) {\n <div class=\"pin-context-item submenu-item\" (click)=\"OnPinMenuMoveToGroup(undefined)\">\n <span>(No group)</span>\n </div>\n }\n @for (group of PinGroups; track group) {\n @if (group !== PinMenuPin.Group) {\n <div class=\"pin-context-item submenu-item\" (click)=\"OnPinMenuMoveToGroup(group)\">\n <span>{{ group }}</span>\n </div>\n }\n }\n </div>\n <div class=\"pin-context-divider\"></div>\n <div class=\"pin-context-item danger\" (click)=\"OnPinMenuUnpin()\">\n <i class=\"fa-solid fa-thumbtack-slash\"></i>\n <span>Unpin</span>\n </div>\n </div>\n }\n\n <!-- Add Pin Slide-In Panel -->\n @if (AddPanelOpen) {\n <div class=\"slide-panel-backdrop\" (click)=\"CloseAddPinPanel()\"></div>\n <div class=\"slide-panel\">\n <div class=\"slide-panel-header\">\n <h3><i class=\"fa-solid fa-thumbtack\"></i> Add Pin</h3>\n <button class=\"slide-panel-close\" (click)=\"CloseAddPinPanel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <div class=\"search-box\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <input type=\"text\"\n placeholder=\"Search apps, dashboards, views, queries...\"\n [(ngModel)]=\"AddPanelSearchQuery\" />\n </div>\n </div>\n\n <div class=\"group-selector\">\n <label><i class=\"fa-solid fa-folder\"></i> Add to group:</label>\n <select [(ngModel)]=\"AddPanelSelectedGroup\">\n <option value=\"\">(No group)</option>\n @for (group of PinGroups; track group) {\n <option [value]=\"group\">{{ group }}</option>\n }\n <option value=\"__new__\">+ New group...</option>\n </select>\n </div>\n @if (AddPanelSelectedGroup === '__new__') {\n <div class=\"new-group-row\">\n <input class=\"new-group-input\"\n type=\"text\"\n placeholder=\"Enter new group name...\"\n [(ngModel)]=\"AddPanelNewGroupName\" />\n </div>\n }\n\n <div class=\"panel-results\">\n @if (AddPanelLoading) {\n <div class=\"panel-loading\">\n <mj-loading text=\"Loading resources...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <!-- Apps with Nav Items -->\n @if (FilterApps().length > 0) {\n <div class=\"panel-section\">\n <div class=\"panel-section-title collapsible\" (click)=\"TogglePanelSection('apps')\">\n <i class=\"fa-solid fa-grid-2\"></i> Applications\n <span class=\"panel-count\">{{ FilterApps().length }}</span>\n <i class=\"section-chevron fa-solid\" [class.fa-chevron-down]=\"!PanelSectionCollapsed['apps']\" [class.fa-chevron-right]=\"PanelSectionCollapsed['apps']\"></i>\n </div>\n @if (!PanelSectionCollapsed['apps']) {\n @for (app of FilterApps(); track app.appId) {\n <div class=\"panel-app-header\" [style.--panel-app-color]=\"app.color\">\n <div class=\"panel-app-icon\">\n <i [class]=\"app.icon\"></i>\n </div>\n <span class=\"panel-app-name\">{{ app.appName }}</span>\n </div>\n @for (ni of app.navItems; track ni.label) {\n <div class=\"panel-item panel-nav-item\">\n <div class=\"panel-item-icon\" [style.background]=\"'color-mix(in srgb, ' + app.color + ' 10%, var(--mj-bg-surface-card))'\">\n <i [class]=\"ni.icon\" [style.color]=\"app.color\"></i>\n </div>\n <div class=\"panel-item-info\">\n <div class=\"panel-item-name\">{{ ni.label }}</div>\n </div>\n <div class=\"panel-item-action\">\n @if (ni.pinned) {\n <button class=\"pinned-badge\"><i class=\"fa-solid fa-check\"></i> Pinned</button>\n } @else {\n <button class=\"pin-btn\" (click)=\"PinAppNavItem(app.appName, app.icon, app.color, ni.label, ni.icon)\">\n <i class=\"fa-solid fa-plus\"></i> Pin\n </button>\n }\n </div>\n </div>\n }\n }\n }\n </div>\n }\n\n <!-- Dashboards (metadata-driven Config type only) -->\n @if (FilterPanelItems(AvailableDashboards).length > 0) {\n <div class=\"panel-section\">\n <div class=\"panel-section-title collapsible\" (click)=\"TogglePanelSection('dashboards')\">\n <i class=\"fa-solid fa-gauge-high\"></i> Dashboards\n <span class=\"panel-count\">{{ FilterPanelItems(AvailableDashboards).length }}</span>\n <i class=\"section-chevron fa-solid\" [class.fa-chevron-down]=\"!PanelSectionCollapsed['dashboards']\" [class.fa-chevron-right]=\"PanelSectionCollapsed['dashboards']\"></i>\n </div>\n @if (!PanelSectionCollapsed['dashboards']) {\n @for (item of FilterPanelItems(AvailableDashboards); track item.id) {\n <div class=\"panel-item\">\n <div class=\"panel-item-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface-card))\">\n <i class=\"fa-solid fa-gauge-high\" style=\"color: var(--mj-brand-primary)\"></i>\n </div>\n <div class=\"panel-item-info\">\n <div class=\"panel-item-name\">{{ item.name }}</div>\n </div>\n <div class=\"panel-item-action\">\n @if (item.pinned) {\n <button class=\"pinned-badge\"><i class=\"fa-solid fa-check\"></i> Pinned</button>\n } @else {\n <button class=\"pin-btn\" (click)=\"PinFromPanel('Dashboards', item.id, item.name)\">\n <i class=\"fa-solid fa-plus\"></i> Pin\n </button>\n }\n </div>\n </div>\n }\n }\n </div>\n }\n\n <!-- Views -->\n @if (FilterPanelItems(AvailableViews).length > 0) {\n <div class=\"panel-section\">\n <div class=\"panel-section-title collapsible\" (click)=\"TogglePanelSection('views')\">\n <i class=\"fa-solid fa-table-list\"></i> Views\n <span class=\"panel-count\">{{ FilterPanelItems(AvailableViews).length }}</span>\n <i class=\"section-chevron fa-solid\" [class.fa-chevron-down]=\"!PanelSectionCollapsed['views']\" [class.fa-chevron-right]=\"PanelSectionCollapsed['views']\"></i>\n </div>\n @if (!PanelSectionCollapsed['views']) {\n @for (item of FilterPanelItems(AvailableViews); track item.id) {\n <div class=\"panel-item\">\n <div class=\"panel-item-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface-card))\">\n <i class=\"fa-solid fa-table-list\" style=\"color: var(--mj-brand-primary)\"></i>\n </div>\n <div class=\"panel-item-info\">\n <div class=\"panel-item-name\">{{ item.name }}</div>\n <div class=\"panel-item-sub\">{{ item.entityName }}</div>\n </div>\n <div class=\"panel-item-action\">\n @if (item.pinned) {\n <button class=\"pinned-badge\"><i class=\"fa-solid fa-check\"></i> Pinned</button>\n } @else {\n <button class=\"pin-btn\" (click)=\"PinFromPanel('User Views', item.id, item.name)\">\n <i class=\"fa-solid fa-plus\"></i> Pin\n </button>\n }\n </div>\n </div>\n }\n }\n </div>\n }\n\n <!-- Queries -->\n @if (FilterPanelItems(AvailableQueries).length > 0) {\n <div class=\"panel-section\">\n <div class=\"panel-section-title collapsible\" (click)=\"TogglePanelSection('queries')\">\n <i class=\"fa-solid fa-database\"></i> Queries\n <span class=\"panel-count\">{{ FilterPanelItems(AvailableQueries).length }}</span>\n <i class=\"section-chevron fa-solid\" [class.fa-chevron-down]=\"!PanelSectionCollapsed['queries']\" [class.fa-chevron-right]=\"PanelSectionCollapsed['queries']\"></i>\n </div>\n @if (!PanelSectionCollapsed['queries']) {\n @for (item of FilterPanelItems(AvailableQueries); track item.id) {\n <div class=\"panel-item\">\n <div class=\"panel-item-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface-card))\">\n <i class=\"fa-solid fa-database\" style=\"color: var(--mj-brand-primary)\"></i>\n </div>\n <div class=\"panel-item-info\">\n <div class=\"panel-item-name\">{{ item.name }}</div>\n </div>\n <div class=\"panel-item-action\">\n @if (item.pinned) {\n <button class=\"pinned-badge\"><i class=\"fa-solid fa-check\"></i> Pinned</button>\n } @else {\n <button class=\"pin-btn\" (click)=\"PinFromPanel('Queries', item.id, item.name)\">\n <i class=\"fa-solid fa-plus\"></i> Pin\n </button>\n }\n </div>\n </div>\n }\n }\n </div>\n }\n }\n </div>\n </div>\n }\n\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading your applications...\" size=\"large\"></mj-loading>\n </div>\n }\n\n <!-- Apps Grid -->\n @if (!isLoading) {\n <div class=\"apps-section\">\n <h2 class=\"section-title\">\n <i class=\"fa-solid fa-grid-2\"></i>\n My Applications\n </h2>\n <div class=\"apps-grid\">\n @for (appData of appsDisplayData; track trackByApp($index, appData)) {\n <div\n class=\"app-card\"\n [style.--app-color]=\"appData.color\"\n (click)=\"onAppClick(appData.app)\">\n <!-- App Icon -->\n <div class=\"app-icon-wrapper\">\n <div class=\"app-icon\">\n <i [class]=\"appData.icon\"></i>\n </div>\n </div>\n <!-- App Info -->\n <div class=\"app-info\">\n <h3 class=\"app-name\">{{ appData.app.Name }}</h3>\n @if (appData.app.Description) {\n <p class=\"app-description\">{{ appData.app.Description }}</p>\n }\n <!-- Nav Items Preview -->\n @if (appData.navItemsCount > 0) {\n <div class=\"nav-preview\">\n @for (item of appData.navItemsPreview; track trackByNavItem($index, item)) {\n <div class=\"nav-item-chip\">\n <i [class]=\"item.Icon\"></i>\n <span>{{ item.Label }}</span>\n </div>\n }\n @if (appData.showMoreItems) {\n <span class=\"more-items\">\n +{{ appData.moreItemsCount }} more\n </span>\n }\n </div>\n }\n </div>\n <!-- Hover Arrow -->\n <div class=\"app-arrow\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n </div>\n </div>\n }\n </div>\n <!-- Empty State -->\n @if (apps.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-folder-open\"></i>\n </div>\n <h3>No Applications Available</h3>\n <p>You don't have any applications configured yet.</p>\n <button kendoButton\n themeColor=\"primary\"\n (click)=\"openConfigDialog()\">\n <i class=\"fa-solid fa-gear\"></i>\n Configure Applications\n </button>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Collapsible Right Sidebar -->\n @if (hasSidebarContent) {\n <div class=\"quick-access-sidebar\">\n <div class=\"sidebar-header\">\n <h3>\n <i class=\"fa-solid fa-bolt\"></i>\n Quick Access\n </h3>\n <button class=\"sidebar-close-btn\" (click)=\"toggleSidebar()\" title=\"Close panel\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"sidebar-content\">\n <!-- Unread Notifications Section -->\n @if (unreadNotifications.length > 0) {\n <div class=\"sidebar-section notifications-section\">\n <h4 class=\"sidebar-section-title\">\n <i class=\"fa-solid fa-bell\"></i>\n Notifications\n <span class=\"section-badge\">{{ unreadNotifications.length }}</span>\n </h4>\n <div class=\"sidebar-items\">\n @for (notification of unreadNotifications; track trackByNotification($index, notification)) {\n <div\n class=\"sidebar-item notification-item\"\n (click)=\"onNotificationClick(notification)\">\n <div class=\"sidebar-item-info\">\n <span class=\"sidebar-item-title\">{{ notification.Title }}</span>\n <span class=\"sidebar-item-subtitle\">{{ notification.Message | slice:0:40 }}{{ (notification.Message?.length || 0) > 40 ? '...' : '' }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Favorites Section -->\n @if (favorites.length > 0 || favoritesLoading) {\n <div class=\"sidebar-section favorites-section\">\n <h4 class=\"sidebar-section-title\">\n <i class=\"fa-solid fa-star\"></i>\n Favorites\n </h4>\n @if (!favoritesLoading) {\n <div class=\"sidebar-items\">\n @for (favorite of favorites; track trackByFavorite($index, favorite)) {\n <div\n class=\"sidebar-item favorite-item\"\n (click)=\"onFavoriteClick(favorite)\">\n <div class=\"sidebar-item-icon\">\n <i [class]=\"getEntityIconByName(favorite.Entity)\"></i>\n </div>\n <div class=\"sidebar-item-info\">\n <span class=\"sidebar-item-title\">{{ getFavoriteDisplayName(favorite) }}</span>\n <span class=\"sidebar-item-subtitle\">{{ favorite.Entity }}</span>\n </div>\n </div>\n }\n </div>\n }\n @if (favoritesLoading) {\n <div class=\"sidebar-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading...</span>\n </div>\n }\n </div>\n }\n <!-- Recents Section -->\n @if (recentItems.length > 0 || recentsLoading) {\n <div class=\"sidebar-section recents-section\">\n <h4 class=\"sidebar-section-title\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n Recent\n </h4>\n @if (!recentsLoading) {\n <div class=\"sidebar-items\">\n @for (item of recentItems; track trackByRecent($index, item)) {\n <div\n class=\"sidebar-item recent-item\"\n (click)=\"onRecentClick(item)\">\n <div class=\"sidebar-item-icon\">\n <i [class]=\"getEntityIconByName(item.entityName)\"></i>\n </div>\n <div class=\"sidebar-item-info\">\n <span class=\"sidebar-item-title\">{{ item.recordName || item.recordId }}</span>\n <span class=\"sidebar-item-subtitle\">{{ item.entityName }} \u00B7 {{ formatDate(item.latestAt) }}</span>\n </div>\n </div>\n }\n </div>\n }\n @if (recentsLoading) {\n <div class=\"sidebar-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading...</span>\n </div>\n }\n </div>\n }\n <!-- Empty sidebar state -->\n @if (!favoritesLoading && !recentsLoading && unreadNotifications.length === 0 && favorites.length === 0 && recentItems.length === 0) {\n <div class=\"sidebar-empty\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No quick access items</p>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Quick Access FAB Toggle (Fixed Button) -->\n @if (hasSidebarContent && !sidebarOpen) {\n <button class=\"sidebar-fab-toggle\"\n (click)=\"toggleSidebar()\"\n title=\"Quick Access\">\n <i class=\"fa-solid fa-bolt\"></i>\n @if (unreadNotifications.length > 0) {\n <span class=\"fab-badge\">{{ unreadNotifications.length }}</span>\n }\n </button>\n }\n\n <!-- App Configuration Dialog -->\n <mj-user-app-config\n #appConfigDialog\n [(ShowDialog)]=\"showConfigDialog\"\n (ConfigSaved)=\"onConfigSaved()\">\n </mj-user-app-config>\n</div>\n", styles: [".home-dashboard {\n display: flex;\n height: 100%;\n background: var(--mj-bg-page);\n overflow: hidden;\n position: relative;\n}\n\n/* Main Content Area */\n.main-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 32px;\n overflow-y: auto;\n transition: margin-right var(--mj-transition-slow);\n}\n\n/* Sidebar open state adjusts main content on desktop */\n.home-dashboard.sidebar-open .main-content {\n margin-right: 320px;\n}\n\n/* Header */\n.home-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 32px;\n}\n\n.greeting-section h1 {\n margin: 0 0 8px 0;\n font-size: var(--mj-text-4xl);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.greeting-section .date {\n margin: 0;\n font-size: var(--mj-text-base);\n color: var(--mj-text-muted);\n}\n\n/* FAB Toggle Button for Quick Access - top-right on desktop */\n.sidebar-fab-toggle {\n position: fixed;\n top: 80px; /* Below shell header with some spacing */\n right: 24px;\n width: 56px;\n height: 56px;\n border: none;\n border-radius: var(--mj-radius-full);\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: var(--mj-text-xl);\n cursor: pointer;\n box-shadow: var(--mj-shadow-brand-md);\n transition: all var(--mj-transition-base);\n z-index: 100;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.sidebar-fab-toggle:hover {\n background: var(--mj-brand-primary-hover);\n transform: scale(1.05);\n box-shadow: 0 6px 16px color-mix(in srgb, var(--mj-brand-primary) 50%, transparent);\n}\n\n.fab-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n border-radius: var(--mj-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Loading State */\n.loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n gap: 16px;\n color: var(--mj-text-muted);\n}\n\n.loading-spinner {\n font-size: var(--mj-text-4xl);\n color: var(--mj-brand-primary);\n}\n\n/* Apps Section */\n.apps-section {\n flex: 0 0 auto;\n}\n\n.section-title {\n display: flex;\n align-items: center;\n gap: 12px;\n margin: 0 0 24px 0;\n font-size: var(--mj-text-xl);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n}\n\n.section-title i {\n color: var(--mj-text-muted);\n}\n\n/* Apps Grid */\n.apps-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 20px;\n}\n\n/* App Card */\n.app-card {\n --app-color: var(--mj-text-muted);\n display: flex;\n align-items: flex-start;\n gap: 16px;\n padding: 20px;\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-lg);\n border: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-sm);\n cursor: pointer;\n transition: all 0.25s ease;\n position: relative;\n overflow: hidden;\n}\n\n.app-card::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 4px;\n height: 100%;\n background: var(--app-color);\n opacity: 0;\n transition: opacity 0.25s ease;\n}\n\n.app-card:hover {\n border-color: var(--app-color);\n box-shadow: var(--mj-shadow-lg);\n transform: translateY(-3px);\n}\n\n.app-card:hover::before {\n opacity: 1;\n}\n\n/* App Icon */\n.app-icon-wrapper {\n flex-shrink: 0;\n}\n\n.app-icon {\n width: 52px;\n height: 52px;\n border-radius: var(--mj-radius-lg);\n background: color-mix(in srgb, var(--app-color) 12%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.25s ease;\n}\n\n.app-icon i {\n font-size: var(--mj-text-xl);\n color: var(--app-color);\n transition: transform 0.25s ease;\n}\n\n.app-card:hover .app-icon {\n background: var(--app-color);\n}\n\n.app-card:hover .app-icon i {\n color: var(--mj-text-inverse);\n transform: scale(1.1);\n}\n\n/* App Info */\n.app-info {\n flex: 1;\n min-width: 0;\n}\n\n.app-name {\n margin: 0 0 4px 0;\n font-size: var(--mj-text-base);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.app-description {\n margin: 0 0 10px 0;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n line-height: var(--mj-leading-snug);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* Nav Items Preview */\n.nav-preview {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: center;\n}\n\n.nav-item-chip {\n display: flex;\n align-items: center;\n gap: 5px;\n padding: 3px 8px;\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-sm);\n font-size: var(--mj-text-xs);\n color: var(--mj-text-secondary);\n}\n\n.nav-item-chip i {\n font-size: 9px;\n color: var(--mj-text-muted);\n}\n\n.more-items {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n/* App Arrow */\n.app-arrow {\n position: absolute;\n right: 14px;\n top: 50%;\n transform: translateY(-50%) translateX(10px);\n opacity: 0;\n transition: all 0.25s ease;\n color: var(--app-color);\n font-size: var(--mj-text-base);\n}\n\n.app-card:hover .app-arrow {\n opacity: 1;\n transform: translateY(-50%) translateX(0);\n}\n\n/* Empty State */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-xl);\n border: 2px dashed var(--mj-border-default);\n text-align: center;\n}\n\n.empty-icon {\n width: 80px;\n height: 80px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-card);\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 24px;\n}\n\n.empty-icon i {\n font-size: var(--mj-text-4xl);\n color: var(--mj-text-disabled);\n}\n\n.empty-state h3 {\n margin: 0 0 8px 0;\n font-size: var(--mj-text-xl);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n}\n\n.empty-state p {\n margin: 0 0 20px 0;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n max-width: 400px;\n}\n\n.empty-state button i {\n margin-right: 8px;\n}\n\n/* ========================================\n RIGHT SIDEBAR\n ======================================== */\n.quick-access-sidebar {\n position: fixed;\n top: 60px; /* Below shell header */\n right: 0;\n bottom: 0;\n width: 320px;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n transform: translateX(100%);\n transition: transform var(--mj-transition-slow);\n overflow: hidden;\n z-index: 100;\n box-shadow: -2px 0 8px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n}\n\n.home-dashboard.sidebar-open .quick-access-sidebar {\n transform: translateX(0);\n}\n\n.sidebar-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.sidebar-header h3 {\n margin: 0;\n font-size: var(--mj-text-base);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.sidebar-header h3 i {\n color: var(--mj-brand-primary);\n font-size: var(--mj-text-sm);\n}\n\n.sidebar-close-btn {\n width: 32px;\n height: 32px;\n border: none;\n border-radius: var(--mj-radius-md);\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all var(--mj-transition-base);\n}\n\n.sidebar-close-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.sidebar-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n/* Sidebar Sections */\n.sidebar-section {\n margin-bottom: 20px;\n}\n\n.sidebar-section:last-child {\n margin-bottom: 0;\n}\n\n.sidebar-section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 12px 0;\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.sidebar-section-title i {\n font-size: var(--mj-text-xs);\n}\n\n.notifications-section .sidebar-section-title i {\n color: var(--mj-color-warning-600);\n}\n\n.favorites-section .sidebar-section-title i {\n color: var(--mj-status-warning);\n}\n\n.recents-section .sidebar-section-title i {\n color: var(--mj-brand-primary);\n}\n\n.section-badge {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: var(--mj-font-semibold);\n padding: 2px 6px;\n border-radius: var(--mj-radius-md);\n margin-left: auto;\n}\n\n/* Sidebar Items */\n.sidebar-items {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.sidebar-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-lg);\n cursor: pointer;\n transition: all var(--mj-transition-base);\n}\n\n.sidebar-item:hover {\n background: var(--mj-bg-surface-hover);\n transform: translateX(4px);\n}\n\n.sidebar-item-icon {\n width: 36px;\n height: 36px;\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.sidebar-item-icon i {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n}\n\n.notification-item .sidebar-item-icon {\n background: var(--mj-color-warning-50);\n}\n\n.notification-item .sidebar-item-icon i {\n color: var(--mj-color-warning-600);\n}\n\n.favorite-item .sidebar-item-icon {\n background: var(--mj-color-warning-50);\n}\n\n.favorite-item .sidebar-item-icon i {\n color: var(--mj-color-warning-500);\n}\n\n.recent-item .sidebar-item-icon {\n background: var(--mj-color-info-50);\n}\n\n.recent-item .sidebar-item-icon i {\n color: var(--mj-brand-primary);\n}\n\n.sidebar-item-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n flex: 1;\n}\n\n.sidebar-item-title {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-medium);\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.sidebar-item-subtitle {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.sidebar-loading {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n padding: 8px 0;\n}\n\n.sidebar-loading i {\n color: var(--mj-brand-primary);\n}\n\n.sidebar-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n text-align: center;\n color: var(--mj-text-disabled);\n}\n\n.sidebar-empty i {\n font-size: var(--mj-text-4xl);\n margin-bottom: 12px;\n}\n\n.sidebar-empty p {\n margin: 0;\n font-size: var(--mj-text-sm);\n}\n\n\n/* ========================================\n PINNED SECTION\n ======================================== */\n.pinned-section {\n margin-bottom: 32px;\n}\n\n.pinned-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.pinned-header .section-title {\n margin: 0;\n}\n\n.pinned-actions {\n margin-left: auto;\n display: flex;\n gap: 8px;\n}\n\n.pin-action-btn {\n padding: 6px 14px;\n border-radius: var(--mj-radius-md);\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: var(--mj-text-sm);\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all var(--mj-transition-base);\n}\n\n.pin-action-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.pin-action-btn.primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.pin-action-btn.primary:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.pin-action-btn.done {\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n border-color: var(--mj-status-success);\n}\n\n/* Edit Mode Banner */\n.edit-mode-banner {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default));\n border-radius: var(--mj-radius-lg);\n padding: 12px 20px;\n margin-bottom: 20px;\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n}\n\n.edit-mode-banner i {\n color: var(--mj-brand-primary);\n font-size: var(--mj-text-base);\n}\n\n.edit-mode-banner strong {\n color: var(--mj-brand-primary);\n}\n\n/* Pin Empty State */\n.pin-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 40px 20px;\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-xl);\n border: 2px dashed var(--mj-border-default);\n text-align: center;\n}\n\n.pin-empty-state > i {\n font-size: 40px;\n color: var(--mj-text-disabled);\n margin-bottom: 16px;\n}\n\n.pin-empty-state h3 {\n font-size: var(--mj-text-base);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n margin: 0 0 6px 0;\n}\n\n.pin-empty-state p {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n max-width: 360px;\n margin: 0 0 16px 0;\n}\n\n/* Pin Grid */\n.pin-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 16px;\n margin-bottom: 12px;\n}\n\n/* Group Header */\n.group-header {\n grid-column: 1 / -1;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 0 4px 0;\n margin-top: 8px;\n}\n\n.group-name {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.group-line {\n flex: 1;\n height: 1px;\n background: var(--mj-border-default);\n}\n\n.group-count {\n font-size: 11px;\n color: var(--mj-text-disabled);\n background: var(--mj-bg-surface-card);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.group-name-input {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n border: 1px solid var(--mj-border-focus);\n border-radius: var(--mj-radius-sm);\n padding: 2px 8px;\n background: var(--mj-bg-surface);\n outline: none;\n width: 160px;\n}\n\n.group-edit-controls {\n display: flex;\n gap: 6px;\n}\n\n.group-edit-btn {\n background: none;\n border: 1px solid transparent;\n color: var(--mj-text-muted);\n font-size: 11px;\n cursor: pointer;\n padding: 2px 8px;\n border-radius: var(--mj-radius-sm);\n display: flex;\n align-items: center;\n gap: 4px;\n transition: all var(--mj-transition-base);\n}\n\n.group-edit-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-default);\n color: var(--mj-text-secondary);\n}\n\n.group-edit-btn.danger:hover {\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n}\n\n/* Pin Card */\n.pin-card {\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-lg);\n border: 1px solid var(--mj-border-default);\n overflow: hidden;\n cursor: pointer;\n transition: all 0.25s ease;\n position: relative;\n}\n\n.pin-card:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, var(--mj-border-default));\n box-shadow: var(--mj-shadow-md);\n transform: translateY(-2px);\n}\n\n.pin-card.edit-mode {\n cursor: grab;\n}\n\n.pin-card.edit-mode:active {\n cursor: grabbing;\n}\n\n.pin-card.dragging {\n opacity: 0.5;\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-lg);\n transform: rotate(2deg);\n}\n\n.pin-card.drag-over {\n border-color: var(--mj-brand-primary);\n border-style: dashed;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n/* Edit controls overlay */\n.edit-controls {\n position: absolute;\n top: 8px;\n left: 8px;\n right: 8px;\n display: flex;\n justify-content: space-between;\n z-index: 10;\n pointer-events: none;\n}\n\n.edit-controls > * {\n pointer-events: auto;\n}\n\n.drag-handle {\n width: 28px;\n height: 28px;\n background: color-mix(in srgb, var(--mj-bg-surface) 92%, transparent);\n border-radius: var(--mj-radius-sm);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 14px;\n cursor: grab;\n box-shadow: var(--mj-shadow-sm);\n border: 1px solid var(--mj-border-subtle);\n transition: all var(--mj-transition-base);\n}\n\n.drag-handle:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-md);\n}\n\n.edit-card-actions {\n display: flex;\n gap: 4px;\n}\n\n.edit-card-btn {\n width: 28px;\n height: 28px;\n background: color-mix(in srgb, var(--mj-bg-surface) 92%, transparent);\n border-radius: var(--mj-radius-sm);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n box-shadow: var(--mj-shadow-sm);\n border: 1px solid var(--mj-border-subtle);\n transition: all var(--mj-transition-base);\n}\n\n.edit-card-btn:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-md);\n}\n\n.edit-card-btn.delete:hover {\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-border-default));\n}\n\n/* Pin Thumbnail */\n.pin-thumbnail {\n width: 100%;\n aspect-ratio: 16 / 10;\n overflow: hidden;\n position: relative;\n}\n\n.pin-thumbnail img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.pin-thumbnail.icon-mode {\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--pin-icon-color, var(--mj-text-muted)) 10%, var(--mj-bg-surface-card));\n}\n\n.pin-thumbnail.icon-mode > i {\n font-size: 36px;\n color: var(--pin-icon-color, var(--mj-text-muted));\n opacity: 0.7;\n}\n\n/* Hover overlay */\n.pin-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n background: rgba(0,0,0,0.4);\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n\n.pin-card:hover .pin-overlay {\n opacity: 1;\n pointer-events: auto;\n}\n\n.open-btn {\n padding: 8px 20px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border: none;\n border-radius: var(--mj-radius-md);\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n cursor: pointer;\n box-shadow: var(--mj-shadow-md);\n}\n\n/* Pin Info */\n.pin-info {\n padding: 10px 12px;\n}\n\n.pin-name {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.pin-name .more-btn {\n margin-left: auto;\n opacity: 0;\n transition: opacity var(--mj-transition-base);\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 2px 4px;\n border-radius: 4px;\n font-size: 14px;\n}\n\n.pin-card:hover .pin-name .more-btn {\n opacity: 1;\n}\n\n.pin-name .more-btn:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.pin-name-input {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n border: 1px solid var(--mj-border-focus);\n border-radius: var(--mj-radius-sm);\n padding: 2px 6px;\n width: 100%;\n outline: none;\n background: var(--mj-bg-surface);\n}\n\n.pin-meta {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.pin-meta > i {\n font-size: 10px;\n}\n\n.pin-app-badge {\n background: var(--mj-bg-surface-card);\n padding: 1px 6px;\n border-radius: 4px;\n font-size: 10px;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n}\n\n/* Add Pin Card */\n.add-pin-card {\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-lg);\n border: 2px dashed var(--mj-border-default);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 180px;\n cursor: pointer;\n transition: all var(--mj-transition-base);\n gap: 8px;\n color: var(--mj-text-muted);\n}\n\n.add-pin-card:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.add-pin-card i {\n font-size: 28px;\n}\n\n.add-pin-card span {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n}\n\n/* ========================================\n PIN CONTEXT MENU (ELLIPSIS)\n ======================================== */\n.pin-context-menu {\n position: fixed;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n box-shadow: var(--mj-shadow-lg);\n min-width: 180px;\n z-index: 10001;\n overflow: hidden;\n animation: pinMenuIn 0.15s ease;\n}\n\n@keyframes pinMenuIn {\n from { opacity: 0; transform: scale(0.95); }\n to { opacity: 1; transform: scale(1); }\n}\n\n.pin-context-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 9px 14px;\n cursor: pointer;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-primary);\n transition: background 0.15s;\n}\n\n.pin-context-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.pin-context-item i {\n width: 16px;\n text-align: center;\n color: var(--mj-text-secondary);\n font-size: var(--mj-text-sm);\n}\n\n.pin-context-item.danger {\n color: var(--mj-status-error);\n}\n\n.pin-context-item.danger i {\n color: var(--mj-status-error);\n}\n\n.pin-context-item.danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n}\n\n.pin-context-item.submenu-header {\n font-weight: var(--mj-font-medium);\n cursor: default;\n font-size: 12px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n padding: 6px 14px;\n}\n\n.pin-context-item.submenu-header:hover {\n background: transparent;\n}\n\n.pin-context-item.submenu-item {\n padding-left: 30px;\n font-size: var(--mj-text-sm);\n}\n\n.pin-context-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n}\n\n/* ========================================\n SLIDE-IN PANEL (Add Pin)\n ======================================== */\n.slide-panel-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 2000;\n}\n\n.slide-panel {\n position: fixed;\n top: 60px;\n right: 0;\n bottom: 0;\n width: 400px;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-xl);\n z-index: 2001;\n display: flex;\n flex-direction: column;\n animation: slideIn 0.3s ease;\n}\n\n@keyframes slideIn {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n}\n\n.slide-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.slide-panel-header h3 {\n font-size: var(--mj-text-base);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n}\n\n.slide-panel-header h3 i {\n color: var(--mj-brand-primary);\n}\n\n.slide-panel-close {\n width: 32px;\n height: 32px;\n border: none;\n border-radius: var(--mj-radius-md);\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all var(--mj-transition-base);\n}\n\n.slide-panel-close:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n/* Search box */\n.search-box {\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.search-input-wrapper {\n display: flex;\n align-items: center;\n gap: 10px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n padding: 8px 12px;\n transition: all var(--mj-transition-base);\n}\n\n.search-input-wrapper:focus-within {\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.search-input-wrapper i {\n color: var(--mj-text-muted);\n font-size: 14px;\n}\n\n.search-input-wrapper input {\n border: none;\n outline: none;\n background: transparent;\n font-size: 14px;\n color: var(--mj-text-primary);\n flex: 1;\n}\n\n.search-input-wrapper input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n/* Group selector */\n.group-selector {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n}\n\n.group-selector label {\n font-weight: var(--mj-font-medium);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.group-selector select {\n flex: 1;\n padding: 4px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n font-size: var(--mj-text-sm);\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n outline: none;\n cursor: pointer;\n}\n\n.new-group-input {\n flex: 1;\n padding: 4px 8px;\n border: 1px solid var(--mj-border-focus);\n border-radius: var(--mj-radius-sm);\n font-size: var(--mj-text-sm);\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n outline: none;\n}\n\n/* Panel results */\n.panel-results {\n flex: 1;\n overflow-y: auto;\n padding: 16px 20px;\n}\n\n.panel-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 40px;\n}\n\n.panel-section {\n margin-bottom: 20px;\n}\n\n.panel-section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 10px;\n padding-bottom: 6px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-section-title i:first-child {\n font-size: 12px;\n}\n\n.panel-section-title.collapsible {\n cursor: pointer;\n user-select: none;\n transition: color var(--mj-transition-base);\n}\n\n.panel-section-title.collapsible:hover {\n color: var(--mj-text-secondary);\n}\n\n.section-chevron {\n font-size: 10px;\n transition: transform 0.2s ease;\n}\n\n.panel-count {\n margin-left: auto;\n background: var(--mj-bg-surface-card);\n padding: 1px 6px;\n border-radius: 8px;\n font-size: 10px;\n color: var(--mj-text-disabled);\n}\n\n/* App hierarchy in panel */\n.panel-app-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 12px 6px 12px;\n margin-top: 8px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-app-header:first-child {\n margin-top: 0;\n}\n\n.panel-app-icon {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.panel-app-icon i {\n font-size: 14px;\n color: var(--panel-app-color);\n}\n\n.panel-app-name {\n font-size: 12px;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n/* Nav items under app \u2014 indented with left border accent */\n.panel-item.panel-nav-item {\n padding: 10px 12px 10px 32px;\n margin-left: 12px;\n border-left: 2px solid var(--mj-border-subtle);\n}\n\n.panel-item.panel-nav-item:last-of-type {\n border-left-color: transparent;\n}\n\n.panel-item.panel-nav-item:hover {\n border-left-color: var(--mj-brand-primary);\n}\n\n/* New group row */\n.new-group-row {\n padding: 0 20px 12px 20px;\n}\n\n.new-group-input {\n width: 100%;\n padding: 6px 10px;\n border: 1px solid var(--mj-border-focus);\n border-radius: var(--mj-radius-sm);\n font-size: var(--mj-text-sm);\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n outline: none;\n}\n\n.panel-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border-radius: var(--mj-radius-md);\n transition: all var(--mj-transition-base);\n cursor: pointer;\n}\n\n.panel-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.panel-item-icon {\n width: 36px;\n height: 36px;\n border-radius: var(--mj-radius-md);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.panel-item-icon i {\n font-size: 14px;\n}\n\n.panel-item-info {\n flex: 1;\n min-width: 0;\n}\n\n.panel-item-name {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-medium);\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.panel-item-sub {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.panel-item-action {\n flex-shrink: 0;\n}\n\n.panel-item-action button {\n padding: 4px 12px;\n border-radius: var(--mj-radius-sm);\n font-size: 12px;\n font-weight: var(--mj-font-semibold);\n cursor: pointer;\n transition: all var(--mj-transition-base);\n}\n\n.pin-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: 1px solid var(--mj-brand-primary);\n}\n\n.pin-btn:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.pinned-badge {\n background: transparent;\n color: var(--mj-status-success);\n border: 1px solid var(--mj-status-success);\n cursor: default !important;\n}\n\n\n/* ========================================\n RESPONSIVE DESIGN\n ======================================== */\n\n/* Tablet and smaller desktop */\n@media (max-width: 1200px) {\n .quick-access-sidebar {\n width: 280px;\n }\n\n .home-dashboard.sidebar-open .main-content {\n margin-right: 280px;\n }\n\n .apps-grid {\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n }\n}\n\n/* Tablet */\n@media (max-width: 992px) {\n .main-content {\n padding: 24px;\n }\n\n .greeting-section h1 {\n font-size: var(--mj-text-3xl);\n }\n\n /* Make sidebar an overlay on tablet */\n .quick-access-sidebar {\n position: fixed;\n top: 60px; /* Below shell header */\n right: 0;\n bottom: 0;\n width: 320px;\n z-index: 1000;\n box-shadow: -4px 0 20px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n }\n\n .home-dashboard.sidebar-open .main-content {\n margin-right: 0;\n }\n\n /* Show backdrop when sidebar is open on tablet */\n .home-dashboard.sidebar-open::after {\n content: '';\n position: fixed;\n top: 60px;\n left: 0;\n right: 320px;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 999;\n }\n}\n\n/* Mobile */\n@media (max-width: 768px) {\n .home-dashboard {\n height: auto;\n min-height: 100%;\n overflow: visible;\n }\n\n .main-content {\n padding: 20px;\n padding-bottom: 100px; /* Space for FAB button */\n overflow: visible;\n }\n\n .home-header {\n flex-direction: column;\n gap: 16px;\n margin-bottom: 24px;\n }\n\n .greeting-section h1 {\n font-size: var(--mj-text-2xl);\n }\n\n /* Full-width sidebar on mobile - positioned below top nav */\n .quick-access-sidebar {\n position: fixed;\n top: 60px; /* Below the shell header */\n right: 0;\n bottom: 0;\n width: 100%;\n max-width: 100%;\n z-index: 100; /* Below shell header */\n border-left: none;\n border-top: 1px solid var(--mj-border-default);\n }\n\n /* Add backdrop on mobile when sidebar is open */\n .home-dashboard.sidebar-open::before {\n content: '';\n position: fixed;\n top: 60px;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 99;\n }\n\n /* No ::after backdrop needed on mobile */\n .home-dashboard.sidebar-open::after {\n display: none;\n }\n\n .pin-grid {\n grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));\n gap: 12px;\n }\n\n .slide-panel {\n width: 100%;\n }\n\n .apps-grid {\n grid-template-columns: 1fr;\n gap: 16px;\n }\n\n .app-card {\n padding: 16px;\n }\n\n .app-icon {\n width: 44px;\n height: 44px;\n }\n\n .app-icon i {\n font-size: var(--mj-text-lg);\n }\n\n .app-name {\n font-size: var(--mj-text-sm);\n }\n\n .nav-preview {\n display: none;\n }\n\n /* Move FAB to bottom-right on mobile */\n .sidebar-fab-toggle {\n top: auto;\n bottom: 20px;\n right: 20px;\n width: 48px;\n height: 48px;\n font-size: var(--mj-text-lg);\n }\n}\n\n@media (max-width: 480px) {\n .main-content {\n padding: 16px;\n padding-bottom: 80px;\n }\n\n .greeting-section h1 {\n font-size: var(--mj-text-xl);\n }\n\n .greeting-section .date {\n font-size: var(--mj-text-sm);\n }\n\n .section-title {\n font-size: var(--mj-text-base);\n margin-bottom: 16px;\n }\n\n .sidebar-fab-toggle {\n bottom: 16px;\n right: 16px;\n width: 44px;\n height: 44px;\n font-size: var(--mj-text-base);\n }\n}\n"] }]
|
|
836
2358
|
}], () => [{ type: i1.ApplicationManager }, { type: i2.NavigationService }, { type: i2.RecentAccessService }, { type: i0.ChangeDetectorRef }], { appConfigDialog: [{
|
|
837
2359
|
type: ViewChild,
|
|
838
2360
|
args: ['appConfigDialog']
|