@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.
Files changed (99) hide show
  1. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +102 -0
  2. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -0
  3. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +583 -0
  4. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -0
  5. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +148 -0
  6. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -0
  7. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +773 -0
  8. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -0
  9. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +241 -0
  10. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -0
  11. package/dist/AI/components/vectors/vector-management-resource.component.js +1782 -0
  12. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -0
  13. package/dist/AI/index.d.ts +3 -0
  14. package/dist/AI/index.d.ts.map +1 -1
  15. package/dist/AI/index.js +6 -0
  16. package/dist/AI/index.js.map +1 -1
  17. package/dist/AI/services/ai-instrumentation.service.d.ts +50 -7
  18. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  19. package/dist/AI/services/ai-instrumentation.service.js +161 -193
  20. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  21. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +11 -0
  22. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  23. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +57 -0
  24. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  25. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +1 -1
  26. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +10 -2
  27. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  28. package/dist/DataExplorer/data-explorer-dashboard.component.js +35 -11
  29. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  30. package/dist/DataExplorer/data-explorer-resource.component.d.ts +1 -0
  31. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  32. package/dist/DataExplorer/data-explorer-resource.component.js +8 -4
  33. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  34. package/dist/Home/home-dashboard.component.d.ts +181 -1
  35. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  36. package/dist/Home/home-dashboard.component.js +1704 -182
  37. package/dist/Home/home-dashboard.component.js.map +1 -1
  38. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +121 -0
  39. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -0
  40. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +1058 -0
  41. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -0
  42. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.d.ts +56 -0
  43. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.d.ts.map +1 -0
  44. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.js +291 -0
  45. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.js.map +1 -0
  46. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +85 -0
  47. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +1 -0
  48. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +461 -0
  49. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +1 -0
  50. package/dist/KnowledgeHub/index.d.ts +4 -0
  51. package/dist/KnowledgeHub/index.d.ts.map +1 -0
  52. package/dist/KnowledgeHub/index.js +5 -0
  53. package/dist/KnowledgeHub/index.js.map +1 -0
  54. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  55. package/dist/QueryBrowser/query-browser-resource.component.js +5 -1
  56. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  57. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  58. package/dist/SystemDiagnostics/system-diagnostics.component.js +1 -0
  59. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  60. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +7 -1
  61. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
  62. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +63 -8
  63. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
  64. package/dist/Testing/components/testing-dashboard-tab.component.d.ts +9 -1
  65. package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
  66. package/dist/Testing/components/testing-dashboard-tab.component.js +109 -62
  67. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  68. package/dist/Testing/components/testing-explorer.component.d.ts +2 -1
  69. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  70. package/dist/Testing/components/testing-explorer.component.js +241 -200
  71. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  72. package/dist/Testing/components/testing-runs-resource.component.d.ts +7 -1
  73. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
  74. package/dist/Testing/components/testing-runs-resource.component.js +63 -8
  75. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
  76. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
  77. package/dist/Testing/components/testing-runs.component.js +7 -5
  78. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  79. package/dist/Testing/testing-dashboard.component.d.ts +9 -1
  80. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  81. package/dist/Testing/testing-dashboard.component.js +128 -59
  82. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  83. package/dist/ai-dashboards.module.d.ts +26 -19
  84. package/dist/ai-dashboards.module.d.ts.map +1 -1
  85. package/dist/ai-dashboards.module.js +40 -5
  86. package/dist/ai-dashboards.module.js.map +1 -1
  87. package/dist/core-dashboards.module.d.ts +1 -0
  88. package/dist/core-dashboards.module.d.ts.map +1 -1
  89. package/dist/core-dashboards.module.js +3 -0
  90. package/dist/core-dashboards.module.js.map +1 -1
  91. package/dist/public-api.d.ts +4 -1
  92. package/dist/public-api.d.ts.map +1 -1
  93. package/dist/public-api.js +5 -1
  94. package/dist/public-api.js.map +1 -1
  95. package/dist/testing-dashboards.module.d.ts +5 -4
  96. package/dist/testing-dashboards.module.d.ts.map +1 -1
  97. package/dist/testing-dashboards.module.js +4 -0
  98. package/dist/testing-dashboards.module.js.map +1 -1
  99. 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 "@progress/kendo-angular-buttons";
19
- import * as i4 from "@memberjunction/ng-shared-generic";
20
- import * as i5 from "@memberjunction/ng-explorer-settings";
21
- import * as i6 from "@angular/common";
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(1, "mj-loading", 11);
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 HomeDashboardComponent_Conditional_9_For_6_Conditional_7_Template(rf, ctx) { if (rf & 1) {
29
- i0.ɵɵelementStart(0, "p", 22);
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 appData_r3 = i0.ɵɵnextContext().$implicit;
844
+ const appData_r49 = i0.ɵɵnextContext().$implicit;
34
845
  i0.ɵɵadvance();
35
- i0.ɵɵtextInterpolate(appData_r3.app.Description);
846
+ i0.ɵɵtextInterpolate(appData_r49.app.Description);
36
847
  } }
37
- function HomeDashboardComponent_Conditional_9_For_6_Conditional_8_For_2_Template(rf, ctx) { if (rf & 1) {
38
- i0.ɵɵelementStart(0, "div", 26);
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 item_r5 = ctx.$implicit;
855
+ const item_r50 = ctx.$implicit;
45
856
  i0.ɵɵadvance();
46
- i0.ɵɵclassMap(item_r5.Icon);
857
+ i0.ɵɵclassMap(item_r50.Icon);
47
858
  i0.ɵɵadvance(2);
48
- i0.ɵɵtextInterpolate(item_r5.Label);
859
+ i0.ɵɵtextInterpolate(item_r50.Label);
49
860
  } }
50
- function HomeDashboardComponent_Conditional_9_For_6_Conditional_8_Conditional_3_Template(rf, ctx) { if (rf & 1) {
51
- i0.ɵɵelementStart(0, "span", 27);
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 appData_r3 = i0.ɵɵnextContext(2).$implicit;
866
+ const appData_r49 = i0.ɵɵnextContext(2).$implicit;
56
867
  i0.ɵɵadvance();
57
- i0.ɵɵtextInterpolate1(" +", appData_r3.moreItemsCount, " more ");
868
+ i0.ɵɵtextInterpolate1(" +", appData_r49.moreItemsCount, " more ");
58
869
  } }
59
- function HomeDashboardComponent_Conditional_9_For_6_Conditional_8_Template(rf, ctx) { if (rf & 1) {
60
- i0.ɵɵelementStart(0, "div", 23);
61
- i0.ɵɵrepeaterCreate(1, HomeDashboardComponent_Conditional_9_For_6_Conditional_8_For_2_Template, 4, 3, "div", 26, i0.ɵɵcomponentInstance().trackByNavItem, true);
62
- i0.ɵɵconditionalCreate(3, HomeDashboardComponent_Conditional_9_For_6_Conditional_8_Conditional_3_Template, 2, 1, "span", 27);
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 appData_r3 = i0.ɵɵnextContext().$implicit;
876
+ const appData_r49 = i0.ɵɵnextContext().$implicit;
66
877
  i0.ɵɵadvance();
67
- i0.ɵɵrepeater(appData_r3.navItemsPreview);
878
+ i0.ɵɵrepeater(appData_r49.navItemsPreview);
68
879
  i0.ɵɵadvance(2);
69
- i0.ɵɵconditional(appData_r3.showMoreItems ? 3 : -1);
880
+ i0.ɵɵconditional(appData_r49.showMoreItems ? 3 : -1);
70
881
  } }
71
- function HomeDashboardComponent_Conditional_9_For_6_Template(rf, ctx) { if (rf & 1) {
72
- const _r2 = i0.ɵɵgetCurrentView();
73
- i0.ɵɵelementStart(0, "div", 17);
74
- i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_9_For_6_Template_div_click_0_listener() { const appData_r3 = i0.ɵɵrestoreView(_r2).$implicit; const ctx_r3 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r3.onAppClick(appData_r3.app)); });
75
- i0.ɵɵelementStart(1, "div", 18)(2, "div", 19);
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", 20)(5, "h3", 21);
889
+ i0.ɵɵelementStart(4, "div", 125)(5, "h3", 126);
79
890
  i0.ɵɵtext(6);
80
891
  i0.ɵɵelementEnd();
81
- i0.ɵɵconditionalCreate(7, HomeDashboardComponent_Conditional_9_For_6_Conditional_7_Template, 2, 1, "p", 22);
82
- i0.ɵɵconditionalCreate(8, HomeDashboardComponent_Conditional_9_For_6_Conditional_8_Template, 4, 1, "div", 23);
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", 24);
85
- i0.ɵɵelement(10, "i", 25);
895
+ i0.ɵɵelementStart(9, "div", 129);
896
+ i0.ɵɵelement(10, "i", 130);
86
897
  i0.ɵɵelementEnd()();
87
898
  } if (rf & 2) {
88
- const appData_r3 = ctx.$implicit;
89
- i0.ɵɵstyleProp("--app-color", appData_r3.color);
899
+ const appData_r49 = ctx.$implicit;
900
+ i0.ɵɵstyleProp("--app-color", appData_r49.color);
90
901
  i0.ɵɵadvance(3);
91
- i0.ɵɵclassMap(appData_r3.icon);
902
+ i0.ɵɵclassMap(appData_r49.icon);
92
903
  i0.ɵɵadvance(3);
93
- i0.ɵɵtextInterpolate(appData_r3.app.Name);
904
+ i0.ɵɵtextInterpolate(appData_r49.app.Name);
94
905
  i0.ɵɵadvance();
95
- i0.ɵɵconditional(appData_r3.app.Description ? 7 : -1);
906
+ i0.ɵɵconditional(appData_r49.app.Description ? 7 : -1);
96
907
  i0.ɵɵadvance();
97
- i0.ɵɵconditional(appData_r3.navItemsCount > 0 ? 8 : -1);
908
+ i0.ɵɵconditional(appData_r49.navItemsCount > 0 ? 8 : -1);
98
909
  } }
99
- function HomeDashboardComponent_Conditional_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
100
- const _r6 = i0.ɵɵgetCurrentView();
101
- i0.ɵɵelementStart(0, "div", 16)(1, "div", 28);
102
- i0.ɵɵelement(2, "i", 29);
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", 30);
111
- i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_9_Conditional_7_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r6); const ctx_r3 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r3.openConfigDialog()); });
112
- i0.ɵɵelement(8, "i", 31);
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 HomeDashboardComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
117
- i0.ɵɵelementStart(0, "div", 7)(1, "h2", 12);
118
- i0.ɵɵelement(2, "i", 13);
119
- i0.ɵɵtext(3, " Your Applications ");
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", 14);
122
- i0.ɵɵrepeaterCreate(5, HomeDashboardComponent_Conditional_9_For_6_Template, 11, 7, "div", 15, i0.ɵɵcomponentInstance().trackByApp, true);
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, HomeDashboardComponent_Conditional_9_Conditional_7_Template, 10, 0, "div", 16);
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 ctx_r3 = i0.ɵɵnextContext();
938
+ const ctx_r2 = i0.ɵɵnextContext();
128
939
  i0.ɵɵadvance(5);
129
- i0.ɵɵrepeater(ctx_r3.appsDisplayData);
940
+ i0.ɵɵrepeater(ctx_r2.appsDisplayData);
130
941
  i0.ɵɵadvance(2);
131
- i0.ɵɵconditional(ctx_r3.apps.length === 0 ? 7 : -1);
942
+ i0.ɵɵconditional(ctx_r2.apps.length === 0 ? 7 : -1);
132
943
  } }
133
- function HomeDashboardComponent_Conditional_10_Conditional_8_For_8_Template(rf, ctx) { if (rf & 1) {
134
- const _r8 = i0.ɵɵgetCurrentView();
135
- i0.ɵɵelementStart(0, "div", 46);
136
- i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_10_Conditional_8_For_8_Template_div_click_0_listener() { const notification_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r3 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r3.onNotificationClick(notification_r9)); });
137
- i0.ɵɵelementStart(1, "div", 47)(2, "span", 48);
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", 49);
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 notification_r9 = ctx.$implicit;
956
+ const notification_r54 = ctx.$implicit;
146
957
  i0.ɵɵadvance(3);
147
- i0.ɵɵtextInterpolate(notification_r9.Title);
958
+ i0.ɵɵtextInterpolate(notification_r54.Title);
148
959
  i0.ɵɵadvance(2);
149
- i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind3(6, 3, notification_r9.Message, 0, 40), "", ((notification_r9.Message == null ? null : notification_r9.Message.length) || 0) > 40 ? "..." : "");
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 HomeDashboardComponent_Conditional_10_Conditional_8_Template(rf, ctx) { if (rf & 1) {
152
- i0.ɵɵelementStart(0, "div", 37)(1, "h4", 41);
153
- i0.ɵɵelement(2, "i", 42);
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", 43);
966
+ i0.ɵɵelementStart(4, "span", 147);
156
967
  i0.ɵɵtext(5);
157
968
  i0.ɵɵelementEnd()();
158
- i0.ɵɵelementStart(6, "div", 44);
159
- i0.ɵɵrepeaterCreate(7, HomeDashboardComponent_Conditional_10_Conditional_8_For_8_Template, 7, 7, "div", 45, i0.ɵɵcomponentInstance().trackByNotification, true);
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 ctx_r3 = i0.ɵɵnextContext(2);
973
+ const ctx_r2 = i0.ɵɵnextContext(2);
163
974
  i0.ɵɵadvance(5);
164
- i0.ɵɵtextInterpolate(ctx_r3.unreadNotifications.length);
975
+ i0.ɵɵtextInterpolate(ctx_r2.unreadNotifications.length);
165
976
  i0.ɵɵadvance(2);
166
- i0.ɵɵrepeater(ctx_r3.unreadNotifications);
977
+ i0.ɵɵrepeater(ctx_r2.unreadNotifications);
167
978
  } }
168
- function HomeDashboardComponent_Conditional_10_Conditional_9_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
169
- const _r10 = i0.ɵɵgetCurrentView();
170
- i0.ɵɵelementStart(0, "div", 53);
171
- i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_10_Conditional_9_Conditional_4_For_2_Template_div_click_0_listener() { const favorite_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r3 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r3.onFavoriteClick(favorite_r11)); });
172
- i0.ɵɵelementStart(1, "div", 54);
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", 47)(4, "span", 48);
986
+ i0.ɵɵelementStart(3, "div", 151)(4, "span", 152);
176
987
  i0.ɵɵtext(5);
177
988
  i0.ɵɵelementEnd();
178
- i0.ɵɵelementStart(6, "span", 49);
989
+ i0.ɵɵelementStart(6, "span", 153);
179
990
  i0.ɵɵtext(7);
180
991
  i0.ɵɵelementEnd()()();
181
992
  } if (rf & 2) {
182
- const favorite_r11 = ctx.$implicit;
183
- const ctx_r3 = i0.ɵɵnextContext(4);
993
+ const favorite_r56 = ctx.$implicit;
994
+ const ctx_r2 = i0.ɵɵnextContext(4);
184
995
  i0.ɵɵadvance(2);
185
- i0.ɵɵclassMap(ctx_r3.getEntityIconByName(favorite_r11.Entity));
996
+ i0.ɵɵclassMap(ctx_r2.getEntityIconByName(favorite_r56.Entity));
186
997
  i0.ɵɵadvance(3);
187
- i0.ɵɵtextInterpolate(ctx_r3.getFavoriteDisplayName(favorite_r11));
998
+ i0.ɵɵtextInterpolate(ctx_r2.getFavoriteDisplayName(favorite_r56));
188
999
  i0.ɵɵadvance(2);
189
- i0.ɵɵtextInterpolate(favorite_r11.Entity);
1000
+ i0.ɵɵtextInterpolate(favorite_r56.Entity);
190
1001
  } }
191
- function HomeDashboardComponent_Conditional_10_Conditional_9_Conditional_4_Template(rf, ctx) { if (rf & 1) {
192
- i0.ɵɵelementStart(0, "div", 44);
193
- i0.ɵɵrepeaterCreate(1, HomeDashboardComponent_Conditional_10_Conditional_9_Conditional_4_For_2_Template, 8, 4, "div", 52, i0.ɵɵcomponentInstance().trackByFavorite, true);
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 ctx_r3 = i0.ɵɵnextContext(3);
1007
+ const ctx_r2 = i0.ɵɵnextContext(3);
197
1008
  i0.ɵɵadvance();
198
- i0.ɵɵrepeater(ctx_r3.favorites);
1009
+ i0.ɵɵrepeater(ctx_r2.favorites);
199
1010
  } }
200
- function HomeDashboardComponent_Conditional_10_Conditional_9_Conditional_5_Template(rf, ctx) { if (rf & 1) {
201
- i0.ɵɵelementStart(0, "div", 51);
202
- i0.ɵɵelement(1, "i", 55);
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 HomeDashboardComponent_Conditional_10_Conditional_9_Template(rf, ctx) { if (rf & 1) {
208
- i0.ɵɵelementStart(0, "div", 38)(1, "h4", 41);
209
- i0.ɵɵelement(2, "i", 50);
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, HomeDashboardComponent_Conditional_10_Conditional_9_Conditional_4_Template, 3, 0, "div", 44);
213
- i0.ɵɵconditionalCreate(5, HomeDashboardComponent_Conditional_10_Conditional_9_Conditional_5_Template, 4, 0, "div", 51);
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 ctx_r3 = i0.ɵɵnextContext(2);
1027
+ const ctx_r2 = i0.ɵɵnextContext(2);
217
1028
  i0.ɵɵadvance(4);
218
- i0.ɵɵconditional(!ctx_r3.favoritesLoading ? 4 : -1);
1029
+ i0.ɵɵconditional(!ctx_r2.favoritesLoading ? 4 : -1);
219
1030
  i0.ɵɵadvance();
220
- i0.ɵɵconditional(ctx_r3.favoritesLoading ? 5 : -1);
1031
+ i0.ɵɵconditional(ctx_r2.favoritesLoading ? 5 : -1);
221
1032
  } }
222
- function HomeDashboardComponent_Conditional_10_Conditional_10_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
223
- const _r12 = i0.ɵɵgetCurrentView();
224
- i0.ɵɵelementStart(0, "div", 58);
225
- i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_10_Conditional_10_Conditional_4_For_2_Template_div_click_0_listener() { const item_r13 = i0.ɵɵrestoreView(_r12).$implicit; const ctx_r3 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r3.onRecentClick(item_r13)); });
226
- i0.ɵɵelementStart(1, "div", 54);
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", 47)(4, "span", 48);
1040
+ i0.ɵɵelementStart(3, "div", 151)(4, "span", 152);
230
1041
  i0.ɵɵtext(5);
231
1042
  i0.ɵɵelementEnd();
232
- i0.ɵɵelementStart(6, "span", 49);
1043
+ i0.ɵɵelementStart(6, "span", 153);
233
1044
  i0.ɵɵtext(7);
234
1045
  i0.ɵɵelementEnd()()();
235
1046
  } if (rf & 2) {
236
- const item_r13 = ctx.$implicit;
237
- const ctx_r3 = i0.ɵɵnextContext(4);
1047
+ const item_r58 = ctx.$implicit;
1048
+ const ctx_r2 = i0.ɵɵnextContext(4);
238
1049
  i0.ɵɵadvance(2);
239
- i0.ɵɵclassMap(ctx_r3.getEntityIconByName(item_r13.entityName));
1050
+ i0.ɵɵclassMap(ctx_r2.getEntityIconByName(item_r58.entityName));
240
1051
  i0.ɵɵadvance(3);
241
- i0.ɵɵtextInterpolate(item_r13.recordName || item_r13.recordId);
1052
+ i0.ɵɵtextInterpolate(item_r58.recordName || item_r58.recordId);
242
1053
  i0.ɵɵadvance(2);
243
- i0.ɵɵtextInterpolate2("", item_r13.entityName, " \u00B7 ", ctx_r3.formatDate(item_r13.latestAt));
1054
+ i0.ɵɵtextInterpolate2("", item_r58.entityName, " \u00B7 ", ctx_r2.formatDate(item_r58.latestAt));
244
1055
  } }
245
- function HomeDashboardComponent_Conditional_10_Conditional_10_Conditional_4_Template(rf, ctx) { if (rf & 1) {
246
- i0.ɵɵelementStart(0, "div", 44);
247
- i0.ɵɵrepeaterCreate(1, HomeDashboardComponent_Conditional_10_Conditional_10_Conditional_4_For_2_Template, 8, 5, "div", 57, i0.ɵɵcomponentInstance().trackByRecent, true);
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 ctx_r3 = i0.ɵɵnextContext(3);
1061
+ const ctx_r2 = i0.ɵɵnextContext(3);
251
1062
  i0.ɵɵadvance();
252
- i0.ɵɵrepeater(ctx_r3.recentItems);
1063
+ i0.ɵɵrepeater(ctx_r2.recentItems);
253
1064
  } }
254
- function HomeDashboardComponent_Conditional_10_Conditional_10_Conditional_5_Template(rf, ctx) { if (rf & 1) {
255
- i0.ɵɵelementStart(0, "div", 51);
256
- i0.ɵɵelement(1, "i", 55);
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 HomeDashboardComponent_Conditional_10_Conditional_10_Template(rf, ctx) { if (rf & 1) {
262
- i0.ɵɵelementStart(0, "div", 39)(1, "h4", 41);
263
- i0.ɵɵelement(2, "i", 56);
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, HomeDashboardComponent_Conditional_10_Conditional_10_Conditional_4_Template, 3, 0, "div", 44);
267
- i0.ɵɵconditionalCreate(5, HomeDashboardComponent_Conditional_10_Conditional_10_Conditional_5_Template, 4, 0, "div", 51);
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 ctx_r3 = i0.ɵɵnextContext(2);
1081
+ const ctx_r2 = i0.ɵɵnextContext(2);
271
1082
  i0.ɵɵadvance(4);
272
- i0.ɵɵconditional(!ctx_r3.recentsLoading ? 4 : -1);
1083
+ i0.ɵɵconditional(!ctx_r2.recentsLoading ? 4 : -1);
273
1084
  i0.ɵɵadvance();
274
- i0.ɵɵconditional(ctx_r3.recentsLoading ? 5 : -1);
1085
+ i0.ɵɵconditional(ctx_r2.recentsLoading ? 5 : -1);
275
1086
  } }
276
- function HomeDashboardComponent_Conditional_10_Conditional_11_Template(rf, ctx) { if (rf & 1) {
277
- i0.ɵɵelementStart(0, "div", 40);
278
- i0.ɵɵelement(1, "i", 59);
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 HomeDashboardComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
284
- const _r7 = i0.ɵɵgetCurrentView();
285
- i0.ɵɵelementStart(0, "div", 8)(1, "div", 32)(2, "h3");
286
- i0.ɵɵelement(3, "i", 33);
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", 34);
290
- i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_10_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r7); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.toggleSidebar()); });
291
- i0.ɵɵelement(6, "i", 35);
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", 36);
294
- i0.ɵɵconditionalCreate(8, HomeDashboardComponent_Conditional_10_Conditional_8_Template, 9, 1, "div", 37);
295
- i0.ɵɵconditionalCreate(9, HomeDashboardComponent_Conditional_10_Conditional_9_Template, 6, 2, "div", 38);
296
- i0.ɵɵconditionalCreate(10, HomeDashboardComponent_Conditional_10_Conditional_10_Template, 6, 2, "div", 39);
297
- i0.ɵɵconditionalCreate(11, HomeDashboardComponent_Conditional_10_Conditional_11_Template, 4, 0, "div", 40);
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 ctx_r3 = i0.ɵɵnextContext();
1111
+ const ctx_r2 = i0.ɵɵnextContext();
301
1112
  i0.ɵɵadvance(8);
302
- i0.ɵɵconditional(ctx_r3.unreadNotifications.length > 0 ? 8 : -1);
1113
+ i0.ɵɵconditional(ctx_r2.unreadNotifications.length > 0 ? 8 : -1);
303
1114
  i0.ɵɵadvance();
304
- i0.ɵɵconditional(ctx_r3.favorites.length > 0 || ctx_r3.favoritesLoading ? 9 : -1);
1115
+ i0.ɵɵconditional(ctx_r2.favorites.length > 0 || ctx_r2.favoritesLoading ? 9 : -1);
305
1116
  i0.ɵɵadvance();
306
- i0.ɵɵconditional(ctx_r3.recentItems.length > 0 || ctx_r3.recentsLoading ? 10 : -1);
1117
+ i0.ɵɵconditional(ctx_r2.recentItems.length > 0 || ctx_r2.recentsLoading ? 10 : -1);
307
1118
  i0.ɵɵadvance();
308
- i0.ɵɵconditional(!ctx_r3.favoritesLoading && !ctx_r3.recentsLoading && ctx_r3.unreadNotifications.length === 0 && ctx_r3.favorites.length === 0 && ctx_r3.recentItems.length === 0 ? 11 : -1);
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 HomeDashboardComponent_Conditional_11_Conditional_2_Template(rf, ctx) { if (rf & 1) {
311
- i0.ɵɵelementStart(0, "span", 61);
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 ctx_r3 = i0.ɵɵnextContext(2);
1126
+ const ctx_r2 = i0.ɵɵnextContext(2);
316
1127
  i0.ɵɵadvance();
317
- i0.ɵɵtextInterpolate(ctx_r3.unreadNotifications.length);
1128
+ i0.ɵɵtextInterpolate(ctx_r2.unreadNotifications.length);
318
1129
  } }
319
- function HomeDashboardComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
320
- const _r14 = i0.ɵɵgetCurrentView();
321
- i0.ɵɵelementStart(0, "button", 60);
322
- i0.ɵɵlistener("click", function HomeDashboardComponent_Conditional_11_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.toggleSidebar()); });
323
- i0.ɵɵelement(1, "i", 33);
324
- i0.ɵɵconditionalCreate(2, HomeDashboardComponent_Conditional_11_Conditional_2_Template, 2, 1, "span", 61);
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 ctx_r3 = i0.ɵɵnextContext();
1138
+ const ctx_r2 = i0.ɵɵnextContext();
328
1139
  i0.ɵɵadvance(2);
329
- i0.ɵɵconditional(ctx_r3.unreadNotifications.length > 0 ? 2 : -1);
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: 14, vars: 10, consts: [["appConfigDialog", ""], [1, "home-dashboard"], [1, "main-content"], [1, "home-header"], [1, "greeting-section"], [1, "date"], [1, "loading-container"], [1, "apps-section"], [1, "quick-access-sidebar"], ["title", "Quick Access", 1, "sidebar-fab-toggle"], [3, "ShowDialogChange", "ConfigSaved", "ShowDialog"], ["text", "Loading your applications...", "size", "large"], [1, "section-title"], [1, "fa-solid", "fa-grid-2"], [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, "fa-solid", "fa-xmark"], [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) {
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, 2, 0, "div", 6);
803
- i0.ɵɵconditionalCreate(9, HomeDashboardComponent_Conditional_9_Template, 8, 1, "div", 7);
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(10, HomeDashboardComponent_Conditional_10_Template, 12, 4, "div", 8);
806
- i0.ɵɵconditionalCreate(11, HomeDashboardComponent_Conditional_11_Template, 3, 1, "button", 9);
807
- i0.ɵɵelementStart(12, "mj-user-app-config", 10, 0);
808
- i0.ɵɵtwoWayListener("ShowDialogChange", function HomeDashboardComponent_Template_mj_user_app_config_ShowDialogChange_12_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showConfigDialog, $event) || (ctx.showConfigDialog = $event); return i0.ɵɵresetView($event); });
809
- i0.ɵɵlistener("ConfigSaved", function HomeDashboardComponent_Template_mj_user_app_config_ConfigSaved_12_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onConfigSaved()); });
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 ? 9 : -1);
2342
+ i0.ɵɵconditional(!ctx.isLoading ? 12 : -1);
821
2343
  i0.ɵɵadvance();
822
- i0.ɵɵconditional(ctx.hasSidebarContent ? 10 : -1);
2344
+ i0.ɵɵconditional(ctx.hasSidebarContent ? 13 : -1);
823
2345
  i0.ɵɵadvance();
824
- i0.ɵɵconditional(ctx.hasSidebarContent && !ctx.sidebarOpen ? 11 : -1);
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']