@memberjunction/ng-dashboards 6.2.0-edge.3 → 6.2.0-edge.4

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 (177) hide show
  1. package/dist/AI/components/analytics/realtime/realtime-transcripts-data.d.ts +4 -3
  2. package/dist/AI/components/analytics/realtime/realtime-transcripts-data.d.ts.map +1 -1
  3. package/dist/AI/components/analytics/realtime/realtime-transcripts-data.js +8 -5
  4. package/dist/AI/components/analytics/realtime/realtime-transcripts-data.js.map +1 -1
  5. package/dist/AI/components/duplicates/compare-value.component.d.ts +67 -0
  6. package/dist/AI/components/duplicates/compare-value.component.d.ts.map +1 -0
  7. package/dist/AI/components/duplicates/compare-value.component.js +168 -0
  8. package/dist/AI/components/duplicates/compare-value.component.js.map +1 -0
  9. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +49 -3
  10. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  11. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +287 -169
  12. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  13. package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts +77 -0
  14. package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts.map +1 -0
  15. package/dist/AI/components/duplicates/duplicate-detection-run-scope.js +116 -0
  16. package/dist/AI/components/duplicates/duplicate-detection-run-scope.js.map +1 -0
  17. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +1 -0
  18. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  19. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +16 -4
  20. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  21. package/dist/AI/components/tags/tags-resource.component.d.ts +2 -0
  22. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  23. package/dist/AI/components/tags/tags-resource.component.js +12 -6
  24. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  25. package/dist/AI/components/vectors/vector-index-auto.d.ts +29 -0
  26. package/dist/AI/components/vectors/vector-index-auto.d.ts.map +1 -0
  27. package/dist/AI/components/vectors/vector-index-auto.js +59 -0
  28. package/dist/AI/components/vectors/vector-index-auto.js.map +1 -0
  29. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +9 -0
  30. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  31. package/dist/AI/components/vectors/vector-management-resource.component.js +65 -20
  32. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  33. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  34. package/dist/Actions/components/actions-overview.component.js +7 -3
  35. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  36. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  37. package/dist/Actions/components/categories-list-view.component.js +3 -2
  38. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  39. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  40. package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
  41. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  42. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +0 -3
  43. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
  44. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +5 -14
  45. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
  46. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  47. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +1 -0
  48. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  49. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  50. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +1 -0
  51. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  52. package/dist/Credentials/components/credentials-list-resource.component.d.ts +2 -0
  53. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  54. package/dist/Credentials/components/credentials-list-resource.component.js +12 -10
  55. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  56. package/dist/DashboardBrowser/dashboard-browser-agent-context.d.ts +14 -43
  57. package/dist/DashboardBrowser/dashboard-browser-agent-context.d.ts.map +1 -1
  58. package/dist/DashboardBrowser/dashboard-browser-agent-context.js +6 -29
  59. package/dist/DashboardBrowser/dashboard-browser-agent-context.js.map +1 -1
  60. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +174 -321
  61. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  62. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +522 -1195
  63. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  64. package/dist/DashboardBrowser/dashboard-library-filter.d.ts +116 -0
  65. package/dist/DashboardBrowser/dashboard-library-filter.d.ts.map +1 -0
  66. package/dist/DashboardBrowser/dashboard-library-filter.js +277 -0
  67. package/dist/DashboardBrowser/dashboard-library-filter.js.map +1 -0
  68. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +1 -1
  69. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  70. package/dist/DashboardBrowser/dashboards-agent-tools.d.ts +26 -0
  71. package/dist/DashboardBrowser/dashboards-agent-tools.d.ts.map +1 -0
  72. package/dist/DashboardBrowser/dashboards-agent-tools.js +32 -0
  73. package/dist/DashboardBrowser/dashboards-agent-tools.js.map +1 -0
  74. package/dist/DashboardBrowser/dashboards-categories-resource.component.d.ts +58 -0
  75. package/dist/DashboardBrowser/dashboards-categories-resource.component.d.ts.map +1 -0
  76. package/dist/DashboardBrowser/dashboards-categories-resource.component.js +391 -0
  77. package/dist/DashboardBrowser/dashboards-categories-resource.component.js.map +1 -0
  78. package/dist/DashboardBrowser/dashboards-categories.helpers.d.ts +37 -0
  79. package/dist/DashboardBrowser/dashboards-categories.helpers.d.ts.map +1 -0
  80. package/dist/DashboardBrowser/dashboards-categories.helpers.js +68 -0
  81. package/dist/DashboardBrowser/dashboards-categories.helpers.js.map +1 -0
  82. package/dist/DashboardEditor/dashboard-editor.component.d.ts +295 -0
  83. package/dist/DashboardEditor/dashboard-editor.component.d.ts.map +1 -0
  84. package/dist/DashboardEditor/dashboard-editor.component.js +1022 -0
  85. package/dist/DashboardEditor/dashboard-editor.component.js.map +1 -0
  86. package/dist/DashboardEditor/dashboard-editor.types.d.ts +23 -0
  87. package/dist/DashboardEditor/dashboard-editor.types.d.ts.map +1 -0
  88. package/dist/DashboardEditor/dashboard-editor.types.js +3 -0
  89. package/dist/DashboardEditor/dashboard-editor.types.js.map +1 -0
  90. package/dist/DashboardEditor/dashboard-viewer-factory.d.ts +11 -0
  91. package/dist/DashboardEditor/dashboard-viewer-factory.d.ts.map +1 -0
  92. package/dist/DashboardEditor/dashboard-viewer-factory.js +17 -0
  93. package/dist/DashboardEditor/dashboard-viewer-factory.js.map +1 -0
  94. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +26 -0
  95. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  96. package/dist/DataExplorer/data-explorer-dashboard.component.js +302 -219
  97. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  98. package/dist/DataExplorer/services/explorer-state.service.d.ts +1 -1
  99. package/dist/DataExplorer/services/explorer-state.service.js +2 -5
  100. package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
  101. package/dist/FormBuilder/form-builder-resource.component.d.ts +0 -14
  102. package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -1
  103. package/dist/FormBuilder/form-builder-resource.component.js +7 -29
  104. package/dist/FormBuilder/form-builder-resource.component.js.map +1 -1
  105. package/dist/Home/home-agent-context.d.ts +29 -10
  106. package/dist/Home/home-agent-context.d.ts.map +1 -1
  107. package/dist/Home/home-agent-context.js +50 -24
  108. package/dist/Home/home-agent-context.js.map +1 -1
  109. package/dist/Home/home-dashboard-switcher.component.d.ts +95 -0
  110. package/dist/Home/home-dashboard-switcher.component.d.ts.map +1 -0
  111. package/dist/Home/home-dashboard-switcher.component.js +442 -0
  112. package/dist/Home/home-dashboard-switcher.component.js.map +1 -0
  113. package/dist/Home/home-dashboard.component.d.ts +330 -17
  114. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  115. package/dist/Home/home-dashboard.component.js +1702 -1014
  116. package/dist/Home/home-dashboard.component.js.map +1 -1
  117. package/dist/Home/home-menus.d.ts +38 -0
  118. package/dist/Home/home-menus.d.ts.map +1 -0
  119. package/dist/Home/home-menus.js +53 -0
  120. package/dist/Home/home-menus.js.map +1 -0
  121. package/dist/Home/home-pinned-dashboards.d.ts +33 -0
  122. package/dist/Home/home-pinned-dashboards.d.ts.map +1 -0
  123. package/dist/Home/home-pinned-dashboards.js +76 -0
  124. package/dist/Home/home-pinned-dashboards.js.map +1 -0
  125. package/dist/PredictiveStudio/components/ps-production.component.d.ts +5 -1
  126. package/dist/PredictiveStudio/components/ps-production.component.d.ts.map +1 -1
  127. package/dist/PredictiveStudio/components/ps-production.component.js +64 -41
  128. package/dist/PredictiveStudio/components/ps-production.component.js.map +1 -1
  129. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  130. package/dist/QueryBrowser/query-browser-resource.component.js +3 -2
  131. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  132. package/dist/RealtimeRecordings/realtime-recordings-dashboard.component.js +2 -2
  133. package/dist/RealtimeRecordings/realtime-recordings-dashboard.component.js.map +1 -1
  134. package/dist/TelephonyOperations/telephony-operations-dashboard.component.d.ts +1 -0
  135. package/dist/TelephonyOperations/telephony-operations-dashboard.component.d.ts.map +1 -1
  136. package/dist/TelephonyOperations/telephony-operations-dashboard.component.js +7 -0
  137. package/dist/TelephonyOperations/telephony-operations-dashboard.component.js.map +1 -1
  138. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  139. package/dist/Testing/components/testing-explorer.component.js +7 -7
  140. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  141. package/dist/ai-dashboards.module.d.ts +21 -20
  142. package/dist/ai-dashboards.module.d.ts.map +1 -1
  143. package/dist/ai-dashboards.module.js +4 -1
  144. package/dist/ai-dashboards.module.js.map +1 -1
  145. package/dist/core-dashboards.module.d.ts +69 -62
  146. package/dist/core-dashboards.module.d.ts.map +1 -1
  147. package/dist/core-dashboards.module.js +22 -2
  148. package/dist/core-dashboards.module.js.map +1 -1
  149. package/dist/data-explorer-dashboards.module.d.ts +1 -1
  150. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  151. package/dist/data-explorer-dashboards.module.js +3 -1
  152. package/dist/data-explorer-dashboards.module.js.map +1 -1
  153. package/dist/public-api.d.ts +2 -0
  154. package/dist/public-api.d.ts.map +1 -1
  155. package/dist/public-api.js +3 -0
  156. package/dist/public-api.js.map +1 -1
  157. package/dist/shared/dashboard-library-changes.d.ts +23 -0
  158. package/dist/shared/dashboard-library-changes.d.ts.map +1 -0
  159. package/dist/shared/dashboard-library-changes.js +26 -0
  160. package/dist/shared/dashboard-library-changes.js.map +1 -0
  161. package/dist/shared/dashboard-owner-names.d.ts +17 -0
  162. package/dist/shared/dashboard-owner-names.d.ts.map +1 -0
  163. package/dist/shared/dashboard-owner-names.js +65 -0
  164. package/dist/shared/dashboard-owner-names.js.map +1 -0
  165. package/dist/shared/dashboard-recents.d.ts +34 -0
  166. package/dist/shared/dashboard-recents.d.ts.map +1 -0
  167. package/dist/shared/dashboard-recents.js +87 -0
  168. package/dist/shared/dashboard-recents.js.map +1 -0
  169. package/dist/shared/dashboards-app-install.d.ts +59 -0
  170. package/dist/shared/dashboards-app-install.d.ts.map +1 -0
  171. package/dist/shared/dashboards-app-install.js +97 -0
  172. package/dist/shared/dashboards-app-install.js.map +1 -0
  173. package/dist/shared/dashboards-app.helpers.d.ts +42 -0
  174. package/dist/shared/dashboards-app.helpers.d.ts.map +1 -0
  175. package/dist/shared/dashboards-app.helpers.js +143 -0
  176. package/dist/shared/dashboards-app.helpers.js.map +1 -0
  177. package/package.json +69 -68
@@ -4,13 +4,16 @@ 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, Input, Output, EventEmitter, HostListener, ViewChild } from '@angular/core';
7
+ var DataExplorerDashboardComponent_1;
8
+ import { Component, Input, Output, EventEmitter, HostListener, ViewChild, inject } from '@angular/core';
8
9
  import { trigger, transition, style, animate } from '@angular/animations';
9
10
  import { Subject } from 'rxjs';
10
11
  import { takeUntil, debounceTime } from 'rxjs/operators';
11
12
  import { BaseDashboard } from '@memberjunction/ng-shared';
12
- import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
13
- import { CompositeKey, RunView, EntityFieldTSType } from '@memberjunction/core';
13
+ import { ApplicationManager } from '@memberjunction/ng-base-application';
14
+ import { MJNotificationService } from '@memberjunction/ng-notifications';
15
+ import { IndexByUUID, RegisterClass, UUIDMap, UUIDsEqual } from '@memberjunction/global';
16
+ import { CompositeKey, RunView, EntityFieldTSType, LogError } from '@memberjunction/core';
14
17
  // CompositeKey is used via buildCompositeKey from ng-entity-viewer
15
18
  import { UserInfoEngine } from '@memberjunction/core-entities';
16
19
  import { ViewWorkspaceComponent, buildCompositeKey, buildPkString } from '@memberjunction/ng-entity-viewer';
@@ -18,6 +21,7 @@ import { UserViewEngine } from '@memberjunction/core-entities';
18
21
  import { MJEventType, MJGlobal } from '@memberjunction/global';
19
22
  import { buildDataExplorerAgentContext, isValidViewMode, isValidEntityBrowserMode, entityDisplayName, resolveEntityByName, resolveRecordSelection } from './data-explorer-agent-context';
20
23
  import { validateStringParam, validateEnumParam, validateNonNegativeNumberParam, VALID_ENTITY_BROWSER_MODES_FOR_VALIDATION } from '../shared/agent-tool-validation';
24
+ import { DASHBOARDS_LIBRARY_NAV_ITEM, EnsureDashboardsApp } from '../shared/dashboards-app.helpers';
21
25
  import * as i0 from "@angular/core";
22
26
  import * as i1 from "./services/explorer-state.service";
23
27
  import * as i2 from "@memberjunction/ng-shared-generic";
@@ -34,7 +38,7 @@ const _forTrack3 = ($index, $item) => $item.userFavoriteId;
34
38
  const _forTrack4 = ($index, $item) => $item.applicationId;
35
39
  function DataExplorerDashboardComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
36
40
  const _r1 = i0.ɵɵgetCurrentView();
37
- i0.ɵɵelementStart(0, "div", 15)(1, "mj-explorer-navigation-panel", 16);
41
+ i0.ɵɵelementStart(0, "div", 16)(1, "mj-explorer-navigation-panel", 17);
38
42
  i0.ɵɵlistener("entitySelected", function DataExplorerDashboardComponent_Conditional_1_Template_mj_explorer_navigation_panel_entitySelected_1_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onEntitySelected($event)); })("toggleCollapse", function DataExplorerDashboardComponent_Conditional_1_Template_mj_explorer_navigation_panel_toggleCollapse_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleNavigationPanel()); })("sectionToggled", function DataExplorerDashboardComponent_Conditional_1_Template_mj_explorer_navigation_panel_sectionToggled_1_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.stateService.toggleSection($event)); })("openRecord", function DataExplorerDashboardComponent_Conditional_1_Template_mj_explorer_navigation_panel_openRecord_1_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenRecordFromNav($event)); })("selectRecord", function DataExplorerDashboardComponent_Conditional_1_Template_mj_explorer_navigation_panel_selectRecord_1_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSelectRecordFromNav($event)); })("expandAndFocus", function DataExplorerDashboardComponent_Conditional_1_Template_mj_explorer_navigation_panel_expandAndFocus_1_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onExpandAndFocus($event)); });
39
43
  i0.ɵɵelementEnd()();
40
44
  } if (rf & 2) {
@@ -46,23 +50,23 @@ function DataExplorerDashboardComponent_Conditional_1_Template(rf, ctx) { if (rf
46
50
  i0.ɵɵproperty("entities", ctx_r1.entities)("appEntityGroups", ctx_r1.appEntityGroups)("selectedEntityName", ctx_r1.state.selectedEntityName)("favorites", ctx_r1.state.favorites)("recentItems", ctx_r1.state.recentItems)("collapsed", ctx_r1.state.navigationPanelCollapsed)("allowedEntityNames", ctx_r1.allowedEntityNames)("favoritesSectionExpanded", ctx_r1.state.favoritesSectionExpanded)("recentSectionExpanded", ctx_r1.state.recentSectionExpanded)("entitiesSectionExpanded", ctx_r1.state.entitiesSectionExpanded)("viewsSectionExpanded", ctx_r1.state.viewsSectionExpanded);
47
51
  } }
48
52
  function DataExplorerDashboardComponent_Conditional_3_For_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
49
- i0.ɵɵelement(0, "i", 21);
53
+ i0.ɵɵelement(0, "i", 22);
50
54
  } if (rf & 2) {
51
55
  const crumb_r5 = i0.ɵɵnextContext().$implicit;
52
56
  i0.ɵɵclassMap(crumb_r5.icon);
53
57
  } }
54
58
  function DataExplorerDashboardComponent_Conditional_3_For_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
55
- i0.ɵɵelement(0, "i", 20);
59
+ i0.ɵɵelement(0, "i", 21);
56
60
  } }
57
61
  function DataExplorerDashboardComponent_Conditional_3_For_2_Template(rf, ctx) { if (rf & 1) {
58
62
  const _r3 = i0.ɵɵgetCurrentView();
59
- i0.ɵɵelementStart(0, "span", 17);
63
+ i0.ɵɵelementStart(0, "span", 18);
60
64
  i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_3_For_2_Template_span_click_0_listener() { const ctx_r3 = i0.ɵɵrestoreView(_r3); const crumb_r5 = ctx_r3.$implicit; const ɵ$index_13_r6 = ctx_r3.$index; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onBreadcrumbClick(crumb_r5, ɵ$index_13_r6)); });
61
- i0.ɵɵconditionalCreate(1, DataExplorerDashboardComponent_Conditional_3_For_2_Conditional_1_Template, 1, 2, "i", 18);
62
- i0.ɵɵelementStart(2, "span", 19);
65
+ i0.ɵɵconditionalCreate(1, DataExplorerDashboardComponent_Conditional_3_For_2_Conditional_1_Template, 1, 2, "i", 19);
66
+ i0.ɵɵelementStart(2, "span", 20);
63
67
  i0.ɵɵtext(3);
64
68
  i0.ɵɵelementEnd()();
65
- i0.ɵɵconditionalCreate(4, DataExplorerDashboardComponent_Conditional_3_For_2_Conditional_4_Template, 1, 0, "i", 20);
69
+ i0.ɵɵconditionalCreate(4, DataExplorerDashboardComponent_Conditional_3_For_2_Conditional_4_Template, 1, 0, "i", 21);
66
70
  } if (rf & 2) {
67
71
  const crumb_r5 = ctx.$implicit;
68
72
  const ɵ$index_13_r6 = ctx.$index;
@@ -86,7 +90,7 @@ function DataExplorerDashboardComponent_Conditional_3_Template(rf, ctx) { if (rf
86
90
  i0.ɵɵrepeater(ctx_r1.breadcrumbs);
87
91
  } }
88
92
  function DataExplorerDashboardComponent_Conditional_6_Conditional_3_Template(rf, ctx) { if (rf & 1) {
89
- i0.ɵɵelementStart(0, "span", 24);
93
+ i0.ɵɵelementStart(0, "span", 25);
90
94
  i0.ɵɵtext(1);
91
95
  i0.ɵɵpipe(2, "number");
92
96
  i0.ɵɵpipe(3, "number");
@@ -97,7 +101,7 @@ function DataExplorerDashboardComponent_Conditional_6_Conditional_3_Template(rf,
97
101
  i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(2, 2, ctx_r1.filteredRecordCount), " of ", i0.ɵɵpipeBind1(3, 4, ctx_r1.totalRecordCount), " records");
98
102
  } }
99
103
  function DataExplorerDashboardComponent_Conditional_6_Conditional_4_Template(rf, ctx) { if (rf & 1) {
100
- i0.ɵɵelementStart(0, "span", 24);
104
+ i0.ɵɵelementStart(0, "span", 25);
101
105
  i0.ɵɵtext(1);
102
106
  i0.ɵɵpipe(2, "number");
103
107
  i0.ɵɵelementEnd();
@@ -107,11 +111,11 @@ function DataExplorerDashboardComponent_Conditional_6_Conditional_4_Template(rf,
107
111
  i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind1(2, 1, ctx_r1.totalRecordCount), " records");
108
112
  } }
109
113
  function DataExplorerDashboardComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
110
- i0.ɵɵelement(0, "i", 22);
111
- i0.ɵɵelementStart(1, "h2", 23);
114
+ i0.ɵɵelement(0, "i", 23);
115
+ i0.ɵɵelementStart(1, "h2", 24);
112
116
  i0.ɵɵtext(2);
113
117
  i0.ɵɵelementEnd();
114
- i0.ɵɵconditionalCreate(3, DataExplorerDashboardComponent_Conditional_6_Conditional_3_Template, 4, 6, "span", 24)(4, DataExplorerDashboardComponent_Conditional_6_Conditional_4_Template, 3, 3, "span", 24);
118
+ i0.ɵɵconditionalCreate(3, DataExplorerDashboardComponent_Conditional_6_Conditional_3_Template, 4, 6, "span", 25)(4, DataExplorerDashboardComponent_Conditional_6_Conditional_4_Template, 3, 3, "span", 25);
115
119
  } if (rf & 2) {
116
120
  const ctx_r1 = i0.ɵɵnextContext();
117
121
  i0.ɵɵclassMap(ctx_r1.getEntityIcon(ctx_r1.selectedEntity));
@@ -121,17 +125,17 @@ function DataExplorerDashboardComponent_Conditional_6_Template(rf, ctx) { if (rf
121
125
  i0.ɵɵconditional(ctx_r1.debouncedFilterText && ctx_r1.filteredRecordCount !== ctx_r1.totalRecordCount ? 3 : 4);
122
126
  } }
123
127
  function DataExplorerDashboardComponent_Conditional_7_Conditional_0_Template(rf, ctx) { if (rf & 1) {
124
- i0.ɵɵelement(0, "i", 22);
128
+ i0.ɵɵelement(0, "i", 23);
125
129
  } if (rf & 2) {
126
130
  const ctx_r1 = i0.ɵɵnextContext(2);
127
131
  i0.ɵɵclassMap(ctx_r1.displayIcon);
128
132
  } }
129
133
  function DataExplorerDashboardComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
130
- i0.ɵɵconditionalCreate(0, DataExplorerDashboardComponent_Conditional_7_Conditional_0_Template, 1, 2, "i", 25);
131
- i0.ɵɵelementStart(1, "h2", 23);
134
+ i0.ɵɵconditionalCreate(0, DataExplorerDashboardComponent_Conditional_7_Conditional_0_Template, 1, 2, "i", 26);
135
+ i0.ɵɵelementStart(1, "h2", 24);
132
136
  i0.ɵɵtext(2);
133
137
  i0.ɵɵelementEnd();
134
- i0.ɵɵelementStart(3, "span", 24);
138
+ i0.ɵɵelementStart(3, "span", 25);
135
139
  i0.ɵɵtext(4);
136
140
  i0.ɵɵelementEnd();
137
141
  } if (rf & 2) {
@@ -144,19 +148,19 @@ function DataExplorerDashboardComponent_Conditional_7_Template(rf, ctx) { if (rf
144
148
  } }
145
149
  function DataExplorerDashboardComponent_Conditional_9_Conditional_4_Template(rf, ctx) { if (rf & 1) {
146
150
  const _r10 = i0.ɵɵgetCurrentView();
147
- i0.ɵɵelementStart(0, "button", 29);
151
+ i0.ɵɵelementStart(0, "button", 30);
148
152
  i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_9_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.clearRecordFilter()); });
149
- i0.ɵɵelement(1, "i", 30);
153
+ i0.ɵɵelement(1, "i", 31);
150
154
  i0.ɵɵelementEnd();
151
155
  } }
152
156
  function DataExplorerDashboardComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
153
157
  const _r8 = i0.ɵɵgetCurrentView();
154
158
  i0.ɵɵelementStart(0, "div", 8);
155
- i0.ɵɵelement(1, "i", 26);
156
- i0.ɵɵelementStart(2, "input", 27, 0);
159
+ i0.ɵɵelement(1, "i", 27);
160
+ i0.ɵɵelementStart(2, "input", 28, 0);
157
161
  i0.ɵɵlistener("input", function DataExplorerDashboardComponent_Conditional_9_Template_input_input_2_listener() { i0.ɵɵrestoreView(_r8); const filterInput_r9 = i0.ɵɵreference(3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onFilterInputChanged(filterInput_r9.value)); });
158
162
  i0.ɵɵelementEnd();
159
- i0.ɵɵconditionalCreate(4, DataExplorerDashboardComponent_Conditional_9_Conditional_4_Template, 2, 0, "button", 28);
163
+ i0.ɵɵconditionalCreate(4, DataExplorerDashboardComponent_Conditional_9_Conditional_4_Template, 2, 0, "button", 29);
160
164
  i0.ɵɵelementEnd();
161
165
  } if (rf & 2) {
162
166
  const ctx_r1 = i0.ɵɵnextContext();
@@ -167,7 +171,7 @@ function DataExplorerDashboardComponent_Conditional_9_Template(rf, ctx) { if (rf
167
171
  } }
168
172
  function DataExplorerDashboardComponent_Conditional_11_Template(rf, ctx) { }
169
173
  function DataExplorerDashboardComponent_Conditional_12_Conditional_2_Template(rf, ctx) { if (rf & 1) {
170
- i0.ɵɵelementStart(0, "span", 33);
174
+ i0.ɵɵelementStart(0, "span", 34);
171
175
  i0.ɵɵtext(1);
172
176
  i0.ɵɵelementEnd();
173
177
  } if (rf & 2) {
@@ -177,10 +181,10 @@ function DataExplorerDashboardComponent_Conditional_12_Conditional_2_Template(rf
177
181
  } }
178
182
  function DataExplorerDashboardComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
179
183
  const _r11 = i0.ɵɵgetCurrentView();
180
- i0.ɵɵelementStart(0, "button", 31);
184
+ i0.ɵɵelementStart(0, "button", 32);
181
185
  i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_12_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleQuickAccessPanel()); });
182
- i0.ɵɵelement(1, "i", 32);
183
- i0.ɵɵconditionalCreate(2, DataExplorerDashboardComponent_Conditional_12_Conditional_2_Template, 2, 1, "span", 33);
186
+ i0.ɵɵelement(1, "i", 33);
187
+ i0.ɵɵconditionalCreate(2, DataExplorerDashboardComponent_Conditional_12_Conditional_2_Template, 2, 1, "span", 34);
184
188
  i0.ɵɵelementEnd();
185
189
  } if (rf & 2) {
186
190
  const ctx_r1 = i0.ɵɵnextContext();
@@ -188,182 +192,203 @@ function DataExplorerDashboardComponent_Conditional_12_Template(rf, ctx) { if (r
188
192
  i0.ɵɵadvance(2);
189
193
  i0.ɵɵconditional(ctx_r1.recentRecords.length + ctx_r1.favoriteRecords.length > 0 ? 2 : -1);
190
194
  } }
191
- function DataExplorerDashboardComponent_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
192
- i0.ɵɵelementStart(0, "div", 34);
193
- i0.ɵɵelement(1, "mj-loading", 35);
195
+ function DataExplorerDashboardComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
196
+ const _r12 = i0.ɵɵgetCurrentView();
197
+ i0.ɵɵelementStart(0, "div", 35);
198
+ i0.ɵɵelement(1, "i", 36);
199
+ i0.ɵɵelementStart(2, "span")(3, "b");
200
+ i0.ɵɵtext(4, "Dashboards moved.");
194
201
  i0.ɵɵelementEnd();
202
+ i0.ɵɵtext(5, " They now live in the Dashboards app.");
203
+ i0.ɵɵelementEnd();
204
+ i0.ɵɵelementStart(6, "button", 37);
205
+ i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_13_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OpenDashboardsApp()); });
206
+ i0.ɵɵtext(7, "Open Dashboards");
207
+ i0.ɵɵelementEnd();
208
+ i0.ɵɵelementStart(8, "button", 38);
209
+ i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_13_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.DismissDashboardsMovedBanner()); });
210
+ i0.ɵɵtext(9, "Got it");
211
+ i0.ɵɵelementEnd()();
212
+ } if (rf & 2) {
213
+ const ctx_r1 = i0.ɵɵnextContext();
214
+ i0.ɵɵclassProp("panel-open", ctx_r1.State.quickAccessPanelOpen && !ctx_r1.SelectedEntity && !ctx_r1.IsLoadingEntities);
195
215
  } }
196
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
197
- const _r13 = i0.ɵɵgetCurrentView();
198
- i0.ɵɵelementStart(0, "button", 61);
199
- i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.entityFilterText = ""); });
200
- i0.ɵɵelement(1, "i", 30);
216
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_1_Template(rf, ctx) { if (rf & 1) {
217
+ i0.ɵɵelementStart(0, "div", 39);
218
+ i0.ɵɵelement(1, "mj-loading", 40);
201
219
  i0.ɵɵelementEnd();
202
220
  } }
203
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
204
- i0.ɵɵelementStart(0, "span", 42);
221
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
222
+ const _r14 = i0.ɵɵgetCurrentView();
223
+ i0.ɵɵelementStart(0, "button", 66);
224
+ i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.entityFilterText = ""); });
225
+ i0.ɵɵelement(1, "i", 31);
226
+ i0.ɵɵelementEnd();
227
+ } }
228
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
229
+ i0.ɵɵelementStart(0, "span", 47);
205
230
  i0.ɵɵtext(1, "/");
206
231
  i0.ɵɵelementEnd();
207
232
  } }
208
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_11_Template(rf, ctx) { if (rf & 1) {
233
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_11_Template(rf, ctx) { if (rf & 1) {
209
234
  i0.ɵɵtext(0);
210
235
  } if (rf & 2) {
211
236
  const ctx_r1 = i0.ɵɵnextContext(3);
212
237
  i0.ɵɵtextInterpolate1(" across ", ctx_r1.applicationCount, " apps ");
213
238
  } }
214
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_19_For_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
215
- i0.ɵɵelementStart(0, "span", 67);
239
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_19_For_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
240
+ i0.ɵɵelementStart(0, "span", 72);
216
241
  i0.ɵɵtext(1);
217
242
  i0.ɵɵelementEnd();
218
243
  } if (rf & 2) {
219
- const entity_r15 = i0.ɵɵnextContext().$implicit;
244
+ const entity_r16 = i0.ɵɵnextContext().$implicit;
220
245
  i0.ɵɵadvance();
221
- i0.ɵɵtextInterpolate(entity_r15.Description);
246
+ i0.ɵɵtextInterpolate(entity_r16.Description);
222
247
  } }
223
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_19_For_2_Template(rf, ctx) { if (rf & 1) {
224
- const _r14 = i0.ɵɵgetCurrentView();
225
- i0.ɵɵelementStart(0, "div", 63);
226
- i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_19_For_2_Template_div_click_0_listener() { const entity_r15 = i0.ɵɵrestoreView(_r14).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.onEntitySelected(entity_r15)); });
227
- i0.ɵɵelementStart(1, "div", 64);
248
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_19_For_2_Template(rf, ctx) { if (rf & 1) {
249
+ const _r15 = i0.ɵɵgetCurrentView();
250
+ i0.ɵɵelementStart(0, "div", 68);
251
+ i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_19_For_2_Template_div_click_0_listener() { const entity_r16 = i0.ɵɵrestoreView(_r15).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.onEntitySelected(entity_r16)); });
252
+ i0.ɵɵelementStart(1, "div", 69);
228
253
  i0.ɵɵelement(2, "i");
229
254
  i0.ɵɵelementEnd();
230
- i0.ɵɵelementStart(3, "div", 65)(4, "span", 66);
255
+ i0.ɵɵelementStart(3, "div", 70)(4, "span", 71);
231
256
  i0.ɵɵtext(5);
232
257
  i0.ɵɵelementEnd();
233
- i0.ɵɵconditionalCreate(6, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_19_For_2_Conditional_6_Template, 2, 1, "span", 67);
258
+ i0.ɵɵconditionalCreate(6, DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_19_For_2_Conditional_6_Template, 2, 1, "span", 72);
234
259
  i0.ɵɵelementEnd();
235
- i0.ɵɵelementStart(7, "button", 68);
236
- i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_19_For_2_Template_button_click_7_listener($event) { const entity_r15 = i0.ɵɵrestoreView(_r14).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleEntityFavorite(entity_r15, $event)); });
260
+ i0.ɵɵelementStart(7, "button", 73);
261
+ i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_19_For_2_Template_button_click_7_listener($event) { const entity_r16 = i0.ɵɵrestoreView(_r15).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleEntityFavorite(entity_r16, $event)); });
237
262
  i0.ɵɵelement(8, "i");
238
263
  i0.ɵɵelementEnd()();
239
264
  } if (rf & 2) {
240
- const entity_r15 = ctx.$implicit;
265
+ const entity_r16 = ctx.$implicit;
241
266
  const ctx_r1 = i0.ɵɵnextContext(4);
242
- i0.ɵɵproperty("title", entity_r15.Description || entity_r15.DisplayNameOrName);
267
+ i0.ɵɵproperty("title", entity_r16.Description || entity_r16.DisplayNameOrName);
243
268
  i0.ɵɵadvance(2);
244
- i0.ɵɵclassMap(ctx_r1.getEntityIcon(entity_r15));
269
+ i0.ɵɵclassMap(ctx_r1.getEntityIcon(entity_r16));
245
270
  i0.ɵɵadvance(3);
246
- i0.ɵɵtextInterpolate(entity_r15.DisplayNameOrName);
271
+ i0.ɵɵtextInterpolate(entity_r16.DisplayNameOrName);
247
272
  i0.ɵɵadvance();
248
- i0.ɵɵconditional(entity_r15.Description ? 6 : -1);
273
+ i0.ɵɵconditional(entity_r16.Description ? 6 : -1);
249
274
  i0.ɵɵadvance();
250
- i0.ɵɵclassProp("favorited", ctx_r1.isEntityFavorited(entity_r15));
251
- i0.ɵɵproperty("title", ctx_r1.isEntityFavorited(entity_r15) ? "Remove from favorites" : "Add to favorites");
275
+ i0.ɵɵclassProp("favorited", ctx_r1.isEntityFavorited(entity_r16));
276
+ i0.ɵɵproperty("title", ctx_r1.isEntityFavorited(entity_r16) ? "Remove from favorites" : "Add to favorites");
252
277
  i0.ɵɵadvance();
253
- i0.ɵɵclassMap(ctx_r1.isEntityFavorited(entity_r15) ? "fa-solid fa-star" : "fa-regular fa-star");
278
+ i0.ɵɵclassMap(ctx_r1.isEntityFavorited(entity_r16) ? "fa-solid fa-star" : "fa-regular fa-star");
254
279
  } }
255
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_19_Template(rf, ctx) { if (rf & 1) {
256
- i0.ɵɵelementStart(0, "div", 49);
257
- i0.ɵɵrepeaterCreate(1, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_19_For_2_Template, 9, 10, "div", 62, _forTrack2);
280
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_19_Template(rf, ctx) { if (rf & 1) {
281
+ i0.ɵɵelementStart(0, "div", 54);
282
+ i0.ɵɵrepeaterCreate(1, DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_19_For_2_Template, 9, 10, "div", 67, _forTrack2);
258
283
  i0.ɵɵelementEnd();
259
284
  } if (rf & 2) {
260
285
  const ctx_r1 = i0.ɵɵnextContext(3);
261
286
  i0.ɵɵadvance();
262
287
  i0.ɵɵrepeater(ctx_r1.flatFilteredEntities);
263
288
  } }
264
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Conditional_6_Template(rf, ctx) { if (rf & 1) {
265
- i0.ɵɵelementStart(0, "span", 67);
289
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Conditional_6_Template(rf, ctx) { if (rf & 1) {
290
+ i0.ɵɵelementStart(0, "span", 72);
266
291
  i0.ɵɵtext(1);
267
292
  i0.ɵɵelementEnd();
268
293
  } if (rf & 2) {
269
- const entity_r19 = i0.ɵɵnextContext().$implicit;
294
+ const entity_r20 = i0.ɵɵnextContext().$implicit;
270
295
  i0.ɵɵadvance();
271
- i0.ɵɵtextInterpolate(entity_r19.Description);
296
+ i0.ɵɵtextInterpolate(entity_r20.Description);
272
297
  } }
273
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Template(rf, ctx) { if (rf & 1) {
274
- const _r18 = i0.ɵɵgetCurrentView();
275
- i0.ɵɵelementStart(0, "div", 63);
276
- i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Template_div_click_0_listener() { const entity_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r1 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r1.onEntitySelected(entity_r19)); });
277
- i0.ɵɵelementStart(1, "div", 64);
298
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Template(rf, ctx) { if (rf & 1) {
299
+ const _r19 = i0.ɵɵgetCurrentView();
300
+ i0.ɵɵelementStart(0, "div", 68);
301
+ i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Template_div_click_0_listener() { const entity_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r1 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r1.onEntitySelected(entity_r20)); });
302
+ i0.ɵɵelementStart(1, "div", 69);
278
303
  i0.ɵɵelement(2, "i");
279
304
  i0.ɵɵelementEnd();
280
- i0.ɵɵelementStart(3, "div", 65)(4, "span", 66);
305
+ i0.ɵɵelementStart(3, "div", 70)(4, "span", 71);
281
306
  i0.ɵɵtext(5);
282
307
  i0.ɵɵelementEnd();
283
- i0.ɵɵconditionalCreate(6, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Conditional_6_Template, 2, 1, "span", 67);
308
+ i0.ɵɵconditionalCreate(6, DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Conditional_6_Template, 2, 1, "span", 72);
284
309
  i0.ɵɵelementEnd();
285
- i0.ɵɵelementStart(7, "button", 68);
286
- i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Template_button_click_7_listener($event) { const entity_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r1 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r1.toggleEntityFavorite(entity_r19, $event)); });
310
+ i0.ɵɵelementStart(7, "button", 73);
311
+ i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Template_button_click_7_listener($event) { const entity_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r1 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r1.toggleEntityFavorite(entity_r20, $event)); });
287
312
  i0.ɵɵelement(8, "i");
288
313
  i0.ɵɵelementEnd()();
289
314
  } if (rf & 2) {
290
- const entity_r19 = ctx.$implicit;
315
+ const entity_r20 = ctx.$implicit;
291
316
  const ctx_r1 = i0.ɵɵnextContext(6);
292
- i0.ɵɵproperty("title", entity_r19.Description || entity_r19.DisplayNameOrName);
317
+ i0.ɵɵproperty("title", entity_r20.Description || entity_r20.DisplayNameOrName);
293
318
  i0.ɵɵadvance(2);
294
- i0.ɵɵclassMap(ctx_r1.getEntityIcon(entity_r19));
319
+ i0.ɵɵclassMap(ctx_r1.getEntityIcon(entity_r20));
295
320
  i0.ɵɵadvance(3);
296
- i0.ɵɵtextInterpolate(entity_r19.DisplayNameOrName);
321
+ i0.ɵɵtextInterpolate(entity_r20.DisplayNameOrName);
297
322
  i0.ɵɵadvance();
298
- i0.ɵɵconditional(entity_r19.Description ? 6 : -1);
323
+ i0.ɵɵconditional(entity_r20.Description ? 6 : -1);
299
324
  i0.ɵɵadvance();
300
- i0.ɵɵclassProp("favorited", ctx_r1.isEntityFavorited(entity_r19));
301
- i0.ɵɵproperty("title", ctx_r1.isEntityFavorited(entity_r19) ? "Remove from favorites" : "Add to favorites");
325
+ i0.ɵɵclassProp("favorited", ctx_r1.isEntityFavorited(entity_r20));
326
+ i0.ɵɵproperty("title", ctx_r1.isEntityFavorited(entity_r20) ? "Remove from favorites" : "Add to favorites");
302
327
  i0.ɵɵadvance();
303
- i0.ɵɵclassMap(ctx_r1.isEntityFavorited(entity_r19) ? "fa-solid fa-star" : "fa-regular fa-star");
328
+ i0.ɵɵclassMap(ctx_r1.isEntityFavorited(entity_r20) ? "fa-solid fa-star" : "fa-regular fa-star");
304
329
  } }
305
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Conditional_9_Template(rf, ctx) { if (rf & 1) {
306
- i0.ɵɵelementStart(0, "div", 75)(1, "div", 49);
307
- i0.ɵɵrepeaterCreate(2, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Template, 9, 10, "div", 62, _forTrack2);
330
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_20_For_1_Conditional_9_Template(rf, ctx) { if (rf & 1) {
331
+ i0.ɵɵelementStart(0, "div", 80)(1, "div", 54);
332
+ i0.ɵɵrepeaterCreate(2, DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Template, 9, 10, "div", 67, _forTrack2);
308
333
  i0.ɵɵelementEnd()();
309
334
  } if (rf & 2) {
310
- const group_r17 = i0.ɵɵnextContext().$implicit;
335
+ const group_r18 = i0.ɵɵnextContext().$implicit;
311
336
  i0.ɵɵadvance(2);
312
- i0.ɵɵrepeater(group_r17.entities);
337
+ i0.ɵɵrepeater(group_r18.entities);
313
338
  } }
314
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Template(rf, ctx) { if (rf & 1) {
315
- const _r16 = i0.ɵɵgetCurrentView();
316
- i0.ɵɵelementStart(0, "div", 69)(1, "div", 70);
317
- i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Template_div_click_1_listener() { const group_r17 = i0.ɵɵrestoreView(_r16).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleAppGroup(group_r17.applicationId)); });
318
- i0.ɵɵelementStart(2, "div", 71);
339
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_20_For_1_Template(rf, ctx) { if (rf & 1) {
340
+ const _r17 = i0.ɵɵgetCurrentView();
341
+ i0.ɵɵelementStart(0, "div", 74)(1, "div", 75);
342
+ i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_20_For_1_Template_div_click_1_listener() { const group_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleAppGroup(group_r18.applicationId)); });
343
+ i0.ɵɵelementStart(2, "div", 76);
319
344
  i0.ɵɵelement(3, "i");
320
345
  i0.ɵɵelementEnd();
321
- i0.ɵɵelementStart(4, "span", 72);
346
+ i0.ɵɵelementStart(4, "span", 77);
322
347
  i0.ɵɵtext(5);
323
348
  i0.ɵɵelementEnd();
324
- i0.ɵɵelementStart(6, "span", 73);
349
+ i0.ɵɵelementStart(6, "span", 78);
325
350
  i0.ɵɵtext(7);
326
351
  i0.ɵɵelementEnd();
327
- i0.ɵɵelement(8, "i", 74);
352
+ i0.ɵɵelement(8, "i", 79);
328
353
  i0.ɵɵelementEnd();
329
- i0.ɵɵconditionalCreate(9, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Conditional_9_Template, 4, 0, "div", 75);
354
+ i0.ɵɵconditionalCreate(9, DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_20_For_1_Conditional_9_Template, 4, 0, "div", 80);
330
355
  i0.ɵɵelementEnd();
331
356
  } if (rf & 2) {
332
- const group_r17 = ctx.$implicit;
357
+ const group_r18 = ctx.$implicit;
333
358
  i0.ɵɵadvance(2);
334
- i0.ɵɵstyleProp("background", group_r17.applicationColor ? group_r17.applicationColor + "15" : null)("color", group_r17.applicationColor || null);
359
+ i0.ɵɵstyleProp("background", group_r18.applicationColor ? group_r18.applicationColor + "15" : null)("color", group_r18.applicationColor || null);
335
360
  i0.ɵɵadvance();
336
- i0.ɵɵclassMap(group_r17.applicationIcon || "fa-solid fa-folder");
361
+ i0.ɵɵclassMap(group_r18.applicationIcon || "fa-solid fa-folder");
337
362
  i0.ɵɵadvance(2);
338
- i0.ɵɵtextInterpolate(group_r17.applicationName);
363
+ i0.ɵɵtextInterpolate(group_r18.applicationName);
339
364
  i0.ɵɵadvance(2);
340
- i0.ɵɵtextInterpolate(group_r17.entities.length);
365
+ i0.ɵɵtextInterpolate(group_r18.entities.length);
341
366
  i0.ɵɵadvance();
342
- i0.ɵɵclassProp("expanded", group_r17.isExpanded);
367
+ i0.ɵɵclassProp("expanded", group_r18.isExpanded);
343
368
  i0.ɵɵadvance();
344
- i0.ɵɵconditional(group_r17.isExpanded ? 9 : -1);
369
+ i0.ɵɵconditional(group_r18.isExpanded ? 9 : -1);
345
370
  } }
346
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_Template(rf, ctx) { if (rf & 1) {
347
- i0.ɵɵrepeaterCreate(0, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Template, 10, 11, "div", 69, _forTrack4);
371
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_20_Template(rf, ctx) { if (rf & 1) {
372
+ i0.ɵɵrepeaterCreate(0, DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_20_For_1_Template, 10, 11, "div", 74, _forTrack4);
348
373
  } if (rf & 2) {
349
374
  const ctx_r1 = i0.ɵɵnextContext(3);
350
375
  i0.ɵɵrepeater(ctx_r1.filteredAppEntityGroups);
351
376
  } }
352
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
353
- i0.ɵɵelement(0, "mj-empty-state", 50);
377
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
378
+ i0.ɵɵelement(0, "mj-empty-state", 55);
354
379
  } if (rf & 2) {
355
380
  const ctx_r1 = i0.ɵɵnextContext(3);
356
381
  i0.ɵɵproperty("Message", ctx_r1.NoEntityResultsMessage);
357
382
  } }
358
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_22_Template(rf, ctx) { if (rf & 1) {
359
- i0.ɵɵelement(0, "mj-empty-state", 51);
383
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_22_Template(rf, ctx) { if (rf & 1) {
384
+ i0.ɵɵelement(0, "mj-empty-state", 56);
360
385
  } }
361
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_ng_template_31_Template(rf, ctx) { if (rf & 1) {
362
- i0.ɵɵelement(0, "i", 76);
386
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_ng_template_31_Template(rf, ctx) { if (rf & 1) {
387
+ i0.ɵɵelement(0, "i", 81);
363
388
  i0.ɵɵelementStart(1, "span");
364
389
  i0.ɵɵtext(2, "Recent Records");
365
390
  i0.ɵɵelementEnd();
366
- i0.ɵɵelementStart(3, "span", 77);
391
+ i0.ɵɵelementStart(3, "span", 82);
367
392
  i0.ɵɵtext(4);
368
393
  i0.ɵɵelementEnd();
369
394
  } if (rf & 2) {
@@ -371,45 +396,45 @@ function DataExplorerDashboardComponent_Conditional_14_Conditional_2_ng_template
371
396
  i0.ɵɵadvance(4);
372
397
  i0.ɵɵtextInterpolate(ctx_r1.quickAccessRecentRecords.length);
373
398
  } }
374
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_33_Template(rf, ctx) { if (rf & 1) {
375
- const _r20 = i0.ɵɵgetCurrentView();
376
- i0.ɵɵelementStart(0, "div", 78);
377
- i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_33_Template_div_click_0_listener() { const record_r21 = i0.ɵɵrestoreView(_r20).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onRecentRecordClick(record_r21)); });
378
- i0.ɵɵelementStart(1, "div", 79);
399
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_For_33_Template(rf, ctx) { if (rf & 1) {
400
+ const _r21 = i0.ɵɵgetCurrentView();
401
+ i0.ɵɵelementStart(0, "div", 83);
402
+ i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_15_Conditional_2_For_33_Template_div_click_0_listener() { const record_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onRecentRecordClick(record_r22)); });
403
+ i0.ɵɵelementStart(1, "div", 84);
379
404
  i0.ɵɵelement(2, "i");
380
405
  i0.ɵɵelementEnd();
381
- i0.ɵɵelementStart(3, "div", 80)(4, "div", 81);
406
+ i0.ɵɵelementStart(3, "div", 85)(4, "div", 86);
382
407
  i0.ɵɵtext(5);
383
408
  i0.ɵɵelementEnd();
384
- i0.ɵɵelementStart(6, "div", 82);
409
+ i0.ɵɵelementStart(6, "div", 87);
385
410
  i0.ɵɵtext(7);
386
411
  i0.ɵɵelementEnd()();
387
- i0.ɵɵelementStart(8, "span", 83);
412
+ i0.ɵɵelementStart(8, "span", 88);
388
413
  i0.ɵɵtext(9);
389
414
  i0.ɵɵelementEnd()();
390
415
  } if (rf & 2) {
391
- const record_r21 = ctx.$implicit;
416
+ const record_r22 = ctx.$implicit;
392
417
  const ctx_r1 = i0.ɵɵnextContext(3);
393
418
  i0.ɵɵadvance(2);
394
- i0.ɵɵclassMap(ctx_r1.getEntityIconById(record_r21.entityId));
419
+ i0.ɵɵclassMap(ctx_r1.getEntityIconById(record_r22.entityId));
395
420
  i0.ɵɵadvance(3);
396
- i0.ɵɵtextInterpolate(record_r21.recordName || record_r21.recordId);
421
+ i0.ɵɵtextInterpolate(record_r22.recordName || record_r22.recordId);
397
422
  i0.ɵɵadvance(2);
398
- i0.ɵɵtextInterpolate(ctx_r1.getEntityDisplayName(record_r21.entityName));
423
+ i0.ɵɵtextInterpolate(ctx_r1.getEntityDisplayName(record_r22.entityName));
399
424
  i0.ɵɵadvance(2);
400
- i0.ɵɵtextInterpolate(record_r21.relativeTime);
425
+ i0.ɵɵtextInterpolate(record_r22.relativeTime);
401
426
  } }
402
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_34_Template(rf, ctx) { if (rf & 1) {
403
- i0.ɵɵelementStart(0, "div", 60);
427
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_34_Template(rf, ctx) { if (rf & 1) {
428
+ i0.ɵɵelementStart(0, "div", 65);
404
429
  i0.ɵɵtext(1, "No recent records");
405
430
  i0.ɵɵelementEnd();
406
431
  } }
407
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_ng_template_36_Template(rf, ctx) { if (rf & 1) {
408
- i0.ɵɵelement(0, "i", 84);
432
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_ng_template_36_Template(rf, ctx) { if (rf & 1) {
433
+ i0.ɵɵelement(0, "i", 89);
409
434
  i0.ɵɵelementStart(1, "span");
410
435
  i0.ɵɵtext(2, "Recent Record Types");
411
436
  i0.ɵɵelementEnd();
412
- i0.ɵɵelementStart(3, "span", 77);
437
+ i0.ɵɵelementStart(3, "span", 82);
413
438
  i0.ɵɵtext(4);
414
439
  i0.ɵɵelementEnd();
415
440
  } if (rf & 2) {
@@ -417,35 +442,35 @@ function DataExplorerDashboardComponent_Conditional_14_Conditional_2_ng_template
417
442
  i0.ɵɵadvance(4);
418
443
  i0.ɵɵtextInterpolate(ctx_r1.quickAccessRecentEntities.length);
419
444
  } }
420
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_38_Template(rf, ctx) { if (rf & 1) {
421
- const _r22 = i0.ɵɵgetCurrentView();
422
- i0.ɵɵelementStart(0, "div", 78);
423
- i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_38_Template_div_click_0_listener() { const entity_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onEntitySelected(entity_r23)); });
424
- i0.ɵɵelementStart(1, "div", 79);
445
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_For_38_Template(rf, ctx) { if (rf & 1) {
446
+ const _r23 = i0.ɵɵgetCurrentView();
447
+ i0.ɵɵelementStart(0, "div", 83);
448
+ i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_15_Conditional_2_For_38_Template_div_click_0_listener() { const entity_r24 = i0.ɵɵrestoreView(_r23).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onEntitySelected(entity_r24)); });
449
+ i0.ɵɵelementStart(1, "div", 84);
425
450
  i0.ɵɵelement(2, "i");
426
451
  i0.ɵɵelementEnd();
427
- i0.ɵɵelementStart(3, "div", 80)(4, "div", 81);
452
+ i0.ɵɵelementStart(3, "div", 85)(4, "div", 86);
428
453
  i0.ɵɵtext(5);
429
454
  i0.ɵɵelementEnd()()();
430
455
  } if (rf & 2) {
431
- const entity_r23 = ctx.$implicit;
456
+ const entity_r24 = ctx.$implicit;
432
457
  const ctx_r1 = i0.ɵɵnextContext(3);
433
458
  i0.ɵɵadvance(2);
434
- i0.ɵɵclassMap(ctx_r1.getEntityIcon(entity_r23));
459
+ i0.ɵɵclassMap(ctx_r1.getEntityIcon(entity_r24));
435
460
  i0.ɵɵadvance(3);
436
- i0.ɵɵtextInterpolate(entity_r23.DisplayNameOrName);
461
+ i0.ɵɵtextInterpolate(entity_r24.DisplayNameOrName);
437
462
  } }
438
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_39_Template(rf, ctx) { if (rf & 1) {
439
- i0.ɵɵelementStart(0, "div", 60);
463
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_39_Template(rf, ctx) { if (rf & 1) {
464
+ i0.ɵɵelementStart(0, "div", 65);
440
465
  i0.ɵɵtext(1, "No recent record types");
441
466
  i0.ɵɵelementEnd();
442
467
  } }
443
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_ng_template_41_Template(rf, ctx) { if (rf & 1) {
444
- i0.ɵɵelement(0, "i", 85);
468
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_ng_template_41_Template(rf, ctx) { if (rf & 1) {
469
+ i0.ɵɵelement(0, "i", 90);
445
470
  i0.ɵɵelementStart(1, "span");
446
471
  i0.ɵɵtext(2, "Favorite Records");
447
472
  i0.ɵɵelementEnd();
448
- i0.ɵɵelementStart(3, "span", 77);
473
+ i0.ɵɵelementStart(3, "span", 82);
449
474
  i0.ɵɵtext(4);
450
475
  i0.ɵɵelementEnd();
451
476
  } if (rf & 2) {
@@ -453,85 +478,85 @@ function DataExplorerDashboardComponent_Conditional_14_Conditional_2_ng_template
453
478
  i0.ɵɵadvance(4);
454
479
  i0.ɵɵtextInterpolate(ctx_r1.quickAccessFavoriteRecords.length);
455
480
  } }
456
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_43_Template(rf, ctx) { if (rf & 1) {
457
- const _r24 = i0.ɵɵgetCurrentView();
458
- i0.ɵɵelementStart(0, "div", 78);
459
- i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_43_Template_div_click_0_listener() { const record_r25 = i0.ɵɵrestoreView(_r24).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onFavoriteRecordClick(record_r25)); });
460
- i0.ɵɵelementStart(1, "div", 79);
481
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_For_43_Template(rf, ctx) { if (rf & 1) {
482
+ const _r25 = i0.ɵɵgetCurrentView();
483
+ i0.ɵɵelementStart(0, "div", 83);
484
+ i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_15_Conditional_2_For_43_Template_div_click_0_listener() { const record_r26 = i0.ɵɵrestoreView(_r25).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onFavoriteRecordClick(record_r26)); });
485
+ i0.ɵɵelementStart(1, "div", 84);
461
486
  i0.ɵɵelement(2, "i");
462
487
  i0.ɵɵelementEnd();
463
- i0.ɵɵelementStart(3, "div", 80)(4, "div", 81);
488
+ i0.ɵɵelementStart(3, "div", 85)(4, "div", 86);
464
489
  i0.ɵɵtext(5);
465
490
  i0.ɵɵelementEnd();
466
- i0.ɵɵelementStart(6, "div", 82);
491
+ i0.ɵɵelementStart(6, "div", 87);
467
492
  i0.ɵɵtext(7);
468
493
  i0.ɵɵelementEnd()()();
469
494
  } if (rf & 2) {
470
- const record_r25 = ctx.$implicit;
495
+ const record_r26 = ctx.$implicit;
471
496
  const ctx_r1 = i0.ɵɵnextContext(3);
472
497
  i0.ɵɵadvance(2);
473
- i0.ɵɵclassMap(ctx_r1.getEntityIconById(record_r25.entityId));
498
+ i0.ɵɵclassMap(ctx_r1.getEntityIconById(record_r26.entityId));
474
499
  i0.ɵɵadvance(3);
475
- i0.ɵɵtextInterpolate(record_r25.recordName || record_r25.recordId);
500
+ i0.ɵɵtextInterpolate(record_r26.recordName || record_r26.recordId);
476
501
  i0.ɵɵadvance(2);
477
- i0.ɵɵtextInterpolate(ctx_r1.getEntityDisplayName(record_r25.entityName));
502
+ i0.ɵɵtextInterpolate(ctx_r1.getEntityDisplayName(record_r26.entityName));
478
503
  } }
479
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_44_Template(rf, ctx) { if (rf & 1) {
480
- i0.ɵɵelementStart(0, "div", 60);
504
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_44_Template(rf, ctx) { if (rf & 1) {
505
+ i0.ɵɵelementStart(0, "div", 65);
481
506
  i0.ɵɵtext(1, "No favorite records");
482
507
  i0.ɵɵelementEnd();
483
508
  } }
484
- function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template(rf, ctx) { if (rf & 1) {
485
- const _r12 = i0.ɵɵgetCurrentView();
486
- i0.ɵɵelementStart(0, "div", 36)(1, "div", 37)(2, "div", 38);
487
- i0.ɵɵelement(3, "i", 39);
488
- i0.ɵɵelementStart(4, "input", 40, 0);
489
- i0.ɵɵtwoWayListener("ngModelChange", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.entityFilterText, $event) || (ctx_r1.entityFilterText = $event); return i0.ɵɵresetView($event); });
509
+ function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Template(rf, ctx) { if (rf & 1) {
510
+ const _r13 = i0.ɵɵgetCurrentView();
511
+ i0.ɵɵelementStart(0, "div", 41)(1, "div", 42)(2, "div", 43);
512
+ i0.ɵɵelement(3, "i", 44);
513
+ i0.ɵɵelementStart(4, "input", 45, 0);
514
+ i0.ɵɵtwoWayListener("ngModelChange", function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.entityFilterText, $event) || (ctx_r1.entityFilterText = $event); return i0.ɵɵresetView($event); });
490
515
  i0.ɵɵelementEnd();
491
- i0.ɵɵconditionalCreate(6, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_6_Template, 2, 0, "button", 41)(7, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_7_Template, 2, 0, "span", 42);
516
+ i0.ɵɵconditionalCreate(6, DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_6_Template, 2, 0, "button", 46)(7, DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_7_Template, 2, 0, "span", 47);
492
517
  i0.ɵɵelementEnd();
493
- i0.ɵɵelementStart(8, "div", 43)(9, "span", 44);
518
+ i0.ɵɵelementStart(8, "div", 48)(9, "span", 49);
494
519
  i0.ɵɵtext(10);
495
- i0.ɵɵconditionalCreate(11, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_11_Template, 1, 1);
520
+ i0.ɵɵconditionalCreate(11, DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_11_Template, 1, 1);
496
521
  i0.ɵɵelementEnd();
497
- i0.ɵɵelementStart(12, "div", 45)(13, "button", 46);
498
- i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.setHomeViewMode("all")); });
522
+ i0.ɵɵelementStart(12, "div", 50)(13, "button", 51);
523
+ i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.setHomeViewMode("all")); });
499
524
  i0.ɵɵtext(14, " All Data ");
500
525
  i0.ɵɵelementEnd();
501
- i0.ɵɵelementStart(15, "button", 46);
502
- i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.setHomeViewMode("favorites")); });
503
- i0.ɵɵelement(16, "i", 47);
526
+ i0.ɵɵelementStart(15, "button", 51);
527
+ i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.setHomeViewMode("favorites")); });
528
+ i0.ɵɵelement(16, "i", 52);
504
529
  i0.ɵɵtext(17, " My Favorites ");
505
530
  i0.ɵɵelementEnd()()()();
506
- i0.ɵɵelementStart(18, "div", 48);
507
- i0.ɵɵconditionalCreate(19, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_19_Template, 3, 0, "div", 49)(20, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_Template, 2, 0);
508
- i0.ɵɵconditionalCreate(21, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_21_Template, 1, 1, "mj-empty-state", 50);
509
- i0.ɵɵconditionalCreate(22, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_22_Template, 1, 0, "mj-empty-state", 51);
531
+ i0.ɵɵelementStart(18, "div", 53);
532
+ i0.ɵɵconditionalCreate(19, DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_19_Template, 3, 0, "div", 54)(20, DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_20_Template, 2, 0);
533
+ i0.ɵɵconditionalCreate(21, DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_21_Template, 1, 1, "mj-empty-state", 55);
534
+ i0.ɵɵconditionalCreate(22, DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_22_Template, 1, 0, "mj-empty-state", 56);
510
535
  i0.ɵɵelementEnd()();
511
- i0.ɵɵelementStart(23, "div", 52)(24, "div", 53)(25, "h3");
536
+ i0.ɵɵelementStart(23, "div", 57)(24, "div", 58)(25, "h3");
512
537
  i0.ɵɵtext(26, "Quick Access");
513
538
  i0.ɵɵelementEnd();
514
- i0.ɵɵelementStart(27, "button", 54);
515
- i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template_button_click_27_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleQuickAccessPanel()); });
516
- i0.ɵɵelement(28, "i", 55);
539
+ i0.ɵɵelementStart(27, "button", 59);
540
+ i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Template_button_click_27_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleQuickAccessPanel()); });
541
+ i0.ɵɵelement(28, "i", 60);
517
542
  i0.ɵɵelementEnd()();
518
- i0.ɵɵelementStart(29, "div", 56)(30, "mj-accordion-panel", 57);
519
- i0.ɵɵlistener("ExpandedChange", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template_mj_accordion_panel_ExpandedChange_30_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleQuickAccessSection("recentRecords")); });
520
- i0.ɵɵtemplate(31, DataExplorerDashboardComponent_Conditional_14_Conditional_2_ng_template_31_Template, 5, 1, "ng-template", 58);
521
- i0.ɵɵrepeaterCreate(32, DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_33_Template, 10, 5, "div", 59, _forTrack1);
522
- i0.ɵɵconditionalCreate(34, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_34_Template, 2, 0, "div", 60);
543
+ i0.ɵɵelementStart(29, "div", 61)(30, "mj-accordion-panel", 62);
544
+ i0.ɵɵlistener("ExpandedChange", function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Template_mj_accordion_panel_ExpandedChange_30_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleQuickAccessSection("recentRecords")); });
545
+ i0.ɵɵtemplate(31, DataExplorerDashboardComponent_Conditional_15_Conditional_2_ng_template_31_Template, 5, 1, "ng-template", 63);
546
+ i0.ɵɵrepeaterCreate(32, DataExplorerDashboardComponent_Conditional_15_Conditional_2_For_33_Template, 10, 5, "div", 64, _forTrack1);
547
+ i0.ɵɵconditionalCreate(34, DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_34_Template, 2, 0, "div", 65);
523
548
  i0.ɵɵelementEnd();
524
- i0.ɵɵelementStart(35, "mj-accordion-panel", 57);
525
- i0.ɵɵlistener("ExpandedChange", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template_mj_accordion_panel_ExpandedChange_35_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleQuickAccessSection("recentEntities")); });
526
- i0.ɵɵtemplate(36, DataExplorerDashboardComponent_Conditional_14_Conditional_2_ng_template_36_Template, 5, 1, "ng-template", 58);
527
- i0.ɵɵrepeaterCreate(37, DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_38_Template, 6, 3, "div", 59, _forTrack2);
528
- i0.ɵɵconditionalCreate(39, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_39_Template, 2, 0, "div", 60);
549
+ i0.ɵɵelementStart(35, "mj-accordion-panel", 62);
550
+ i0.ɵɵlistener("ExpandedChange", function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Template_mj_accordion_panel_ExpandedChange_35_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleQuickAccessSection("recentEntities")); });
551
+ i0.ɵɵtemplate(36, DataExplorerDashboardComponent_Conditional_15_Conditional_2_ng_template_36_Template, 5, 1, "ng-template", 63);
552
+ i0.ɵɵrepeaterCreate(37, DataExplorerDashboardComponent_Conditional_15_Conditional_2_For_38_Template, 6, 3, "div", 64, _forTrack2);
553
+ i0.ɵɵconditionalCreate(39, DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_39_Template, 2, 0, "div", 65);
529
554
  i0.ɵɵelementEnd();
530
- i0.ɵɵelementStart(40, "mj-accordion-panel", 57);
531
- i0.ɵɵlistener("ExpandedChange", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template_mj_accordion_panel_ExpandedChange_40_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleQuickAccessSection("favoriteRecords")); });
532
- i0.ɵɵtemplate(41, DataExplorerDashboardComponent_Conditional_14_Conditional_2_ng_template_41_Template, 5, 1, "ng-template", 58);
533
- i0.ɵɵrepeaterCreate(42, DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_43_Template, 8, 4, "div", 59, _forTrack3);
534
- i0.ɵɵconditionalCreate(44, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_44_Template, 2, 0, "div", 60);
555
+ i0.ɵɵelementStart(40, "mj-accordion-panel", 62);
556
+ i0.ɵɵlistener("ExpandedChange", function DataExplorerDashboardComponent_Conditional_15_Conditional_2_Template_mj_accordion_panel_ExpandedChange_40_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleQuickAccessSection("favoriteRecords")); });
557
+ i0.ɵɵtemplate(41, DataExplorerDashboardComponent_Conditional_15_Conditional_2_ng_template_41_Template, 5, 1, "ng-template", 63);
558
+ i0.ɵɵrepeaterCreate(42, DataExplorerDashboardComponent_Conditional_15_Conditional_2_For_43_Template, 8, 4, "div", 64, _forTrack3);
559
+ i0.ɵɵconditionalCreate(44, DataExplorerDashboardComponent_Conditional_15_Conditional_2_Conditional_44_Template, 2, 0, "div", 65);
535
560
  i0.ɵɵelementEnd()()();
536
561
  } if (rf & 2) {
537
562
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -575,28 +600,28 @@ function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template(rf
575
600
  i0.ɵɵadvance(2);
576
601
  i0.ɵɵconditional(ctx_r1.quickAccessFavoriteRecords.length === 0 ? 44 : -1);
577
602
  } }
578
- function DataExplorerDashboardComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
579
- i0.ɵɵelementStart(0, "div", 12);
580
- i0.ɵɵconditionalCreate(1, DataExplorerDashboardComponent_Conditional_14_Conditional_1_Template, 2, 0, "div", 34)(2, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template, 45, 21);
603
+ function DataExplorerDashboardComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
604
+ i0.ɵɵelementStart(0, "div", 13);
605
+ i0.ɵɵconditionalCreate(1, DataExplorerDashboardComponent_Conditional_15_Conditional_1_Template, 2, 0, "div", 39)(2, DataExplorerDashboardComponent_Conditional_15_Conditional_2_Template, 45, 21);
581
606
  i0.ɵɵelementEnd();
582
607
  } if (rf & 2) {
583
608
  const ctx_r1 = i0.ɵɵnextContext();
584
609
  i0.ɵɵadvance();
585
610
  i0.ɵɵconditional(ctx_r1.isLoadingEntities ? 1 : 2);
586
611
  } }
587
- function DataExplorerDashboardComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
588
- const _r26 = i0.ɵɵgetCurrentView();
589
- i0.ɵɵelementStart(0, "mj-view-workspace", 86);
590
- i0.ɵɵlistener("SelectedViewChange", function DataExplorerDashboardComponent_Conditional_15_Template_mj_view_workspace_SelectedViewChange_0_listener($event) { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onWorkspaceViewSelected($event)); })("ViewSelected", function DataExplorerDashboardComponent_Conditional_15_Template_mj_view_workspace_ViewSelected_0_listener($event) { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onWorkspaceViewSelected($event)); })("OpenViewInTabRequested", function DataExplorerDashboardComponent_Conditional_15_Template_mj_view_workspace_OpenViewInTabRequested_0_listener($event) { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenInTabRequested($event)); })("OpenRecordRequested", function DataExplorerDashboardComponent_Conditional_15_Template_mj_view_workspace_OpenRecordRequested_0_listener($event) { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onWorkspaceOpenRecord($event)); })("OpenRelatedRecordRequested", function DataExplorerDashboardComponent_Conditional_15_Template_mj_view_workspace_OpenRelatedRecordRequested_0_listener($event) { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenRelatedRecordRequested($event)); })("CreateNewRecordRequested", function DataExplorerDashboardComponent_Conditional_15_Template_mj_view_workspace_CreateNewRecordRequested_0_listener($event) { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCreateNewRecordRequested($event)); })("RecordSelected", function DataExplorerDashboardComponent_Conditional_15_Template_mj_view_workspace_RecordSelected_0_listener($event) { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onViewerRecordSelected($event)); })("AfterViewSave", function DataExplorerDashboardComponent_Conditional_15_Template_mj_view_workspace_AfterViewSave_0_listener() { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onWorkspaceViewSaved()); })("AfterViewDelete", function DataExplorerDashboardComponent_Conditional_15_Template_mj_view_workspace_AfterViewDelete_0_listener() { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onWorkspaceViewSaved()); })("FilterTextChanged", function DataExplorerDashboardComponent_Conditional_15_Template_mj_view_workspace_FilterTextChanged_0_listener($event) { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onFilterTextChanged($event)); })("DataLoaded", function DataExplorerDashboardComponent_Conditional_15_Template_mj_view_workspace_DataLoaded_0_listener($event) { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onDataLoaded($event)); })("FilteredCountChanged", function DataExplorerDashboardComponent_Conditional_15_Template_mj_view_workspace_FilteredCountChanged_0_listener($event) { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onFilteredCountChanged($event)); });
612
+ function DataExplorerDashboardComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
613
+ const _r27 = i0.ɵɵgetCurrentView();
614
+ i0.ɵɵelementStart(0, "mj-view-workspace", 91);
615
+ i0.ɵɵlistener("SelectedViewChange", function DataExplorerDashboardComponent_Conditional_16_Template_mj_view_workspace_SelectedViewChange_0_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onWorkspaceViewSelected($event)); })("ViewSelected", function DataExplorerDashboardComponent_Conditional_16_Template_mj_view_workspace_ViewSelected_0_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onWorkspaceViewSelected($event)); })("OpenViewInTabRequested", function DataExplorerDashboardComponent_Conditional_16_Template_mj_view_workspace_OpenViewInTabRequested_0_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenInTabRequested($event)); })("OpenRecordRequested", function DataExplorerDashboardComponent_Conditional_16_Template_mj_view_workspace_OpenRecordRequested_0_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onWorkspaceOpenRecord($event)); })("OpenRelatedRecordRequested", function DataExplorerDashboardComponent_Conditional_16_Template_mj_view_workspace_OpenRelatedRecordRequested_0_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenRelatedRecordRequested($event)); })("CreateNewRecordRequested", function DataExplorerDashboardComponent_Conditional_16_Template_mj_view_workspace_CreateNewRecordRequested_0_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCreateNewRecordRequested($event)); })("RecordSelected", function DataExplorerDashboardComponent_Conditional_16_Template_mj_view_workspace_RecordSelected_0_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onViewerRecordSelected($event)); })("AfterViewSave", function DataExplorerDashboardComponent_Conditional_16_Template_mj_view_workspace_AfterViewSave_0_listener() { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onWorkspaceViewSaved()); })("AfterViewDelete", function DataExplorerDashboardComponent_Conditional_16_Template_mj_view_workspace_AfterViewDelete_0_listener() { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onWorkspaceViewSaved()); })("FilterTextChanged", function DataExplorerDashboardComponent_Conditional_16_Template_mj_view_workspace_FilterTextChanged_0_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onFilterTextChanged($event)); })("DataLoaded", function DataExplorerDashboardComponent_Conditional_16_Template_mj_view_workspace_DataLoaded_0_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onDataLoaded($event)); })("FilteredCountChanged", function DataExplorerDashboardComponent_Conditional_16_Template_mj_view_workspace_FilteredCountChanged_0_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onFilteredCountChanged($event)); });
591
616
  i0.ɵɵelementEnd();
592
617
  } if (rf & 2) {
593
618
  const ctx_r1 = i0.ɵɵnextContext();
594
619
  i0.ɵɵproperty("Entity", ctx_r1.selectedEntity)("AutoSaveView", true)("SelectedView", ctx_r1.selectedViewEntity)("FilterText", ctx_r1.debouncedFilterText)("SelectedRecordId", ctx_r1.state.selectedRecordId)("ViewerConfig", ctx_r1.viewerConfig);
595
620
  } }
596
- function DataExplorerDashboardComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
597
- const _r27 = i0.ɵɵgetCurrentView();
598
- i0.ɵɵelementStart(0, "div", 87)(1, "mj-entity-record-detail-panel", 88);
599
- i0.ɵɵlistener("close", function DataExplorerDashboardComponent_Conditional_16_Template_mj_entity_record_detail_panel_close_1_listener() { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onDetailPanelClosed()); })("openRecord", function DataExplorerDashboardComponent_Conditional_16_Template_mj_entity_record_detail_panel_openRecord_1_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenRecord($event)); })("navigateToRelated", function DataExplorerDashboardComponent_Conditional_16_Template_mj_entity_record_detail_panel_navigateToRelated_1_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onNavigateToRelated($event)); })("openRelatedRecord", function DataExplorerDashboardComponent_Conditional_16_Template_mj_entity_record_detail_panel_openRelatedRecord_1_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenRelatedRecord($event)); })("openForeignKeyRecord", function DataExplorerDashboardComponent_Conditional_16_Template_mj_entity_record_detail_panel_openForeignKeyRecord_1_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenForeignKeyRecord($event)); });
621
+ function DataExplorerDashboardComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
622
+ const _r28 = i0.ɵɵgetCurrentView();
623
+ i0.ɵɵelementStart(0, "div", 92)(1, "mj-entity-record-detail-panel", 93);
624
+ i0.ɵɵlistener("close", function DataExplorerDashboardComponent_Conditional_17_Template_mj_entity_record_detail_panel_close_1_listener() { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onDetailPanelClosed()); })("openRecord", function DataExplorerDashboardComponent_Conditional_17_Template_mj_entity_record_detail_panel_openRecord_1_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenRecord($event)); })("navigateToRelated", function DataExplorerDashboardComponent_Conditional_17_Template_mj_entity_record_detail_panel_navigateToRelated_1_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onNavigateToRelated($event)); })("openRelatedRecord", function DataExplorerDashboardComponent_Conditional_17_Template_mj_entity_record_detail_panel_openRelatedRecord_1_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenRelatedRecord($event)); })("openForeignKeyRecord", function DataExplorerDashboardComponent_Conditional_17_Template_mj_entity_record_detail_panel_openForeignKeyRecord_1_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenForeignKeyRecord($event)); });
600
625
  i0.ɵɵelementEnd()();
601
626
  } if (rf & 2) {
602
627
  const ctx_r1 = i0.ɵɵnextContext();
@@ -618,12 +643,14 @@ const DATA_EXPLORER_DEFAULT_PAGE_SIZE = 100;
618
643
  * which handles data loading, filtering, and view mode switching.
619
644
  */
620
645
  let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extends BaseDashboard {
646
+ static { DataExplorerDashboardComponent_1 = this; }
621
647
  StateService;
622
648
  cdr;
623
649
  recentAccessService;
624
650
  ngZone;
625
651
  destroy$ = new Subject();
626
652
  metadata = this.ProviderToUse;
653
+ appManager = inject(ApplicationManager);
627
654
  /** Reference to the filter input for keyboard shortcuts */
628
655
  FilterInputRef;
629
656
  /** @deprecated Use {@link FilterInputRef}. */
@@ -736,6 +763,19 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
736
763
  set entities(value) {
737
764
  this.Entities = value;
738
765
  }
766
+ entitiesIndexSource = null;
767
+ entitiesIndex = new UUIDMap();
768
+ /**
769
+ * Entities keyed by ID, rebuilt only when Entities is replaced (it is never mutated in place),
770
+ * so the per-render RecentEntities / FavoriteEntities getters don't scan every entity per item.
771
+ */
772
+ get entitiesByID() {
773
+ if (this.entitiesIndexSource !== this.Entities) {
774
+ this.entitiesIndex = IndexByUUID(this.Entities);
775
+ this.entitiesIndexSource = this.Entities;
776
+ }
777
+ return this.entitiesIndex;
778
+ }
739
779
  // Application entity groups for the home view (Concept D)
740
780
  AppEntityGroups = [];
741
781
  /** @deprecated Use {@link AppEntityGroups}. */
@@ -893,6 +933,17 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
893
933
  set recentRecordsEntityFilter(value) {
894
934
  this.RecentRecordsEntityFilter = value;
895
935
  }
936
+ /** User setting that records the dismissal of the "Dashboards moved" banner. */
937
+ static DASHBOARDS_MOVED_KEY = 'DataExplorer.DashboardsMovedBanner';
938
+ /** True until the user dismisses the "Dashboards moved" banner. ngOnInit sets it from the user's settings. */
939
+ dashboardsMovedBannerOpen = false;
940
+ /**
941
+ * Shows the "Dashboards moved" banner on the Data tab, with or without a selected entity.
942
+ * An explorer that has an entity filter (an application's own scoped explorer) never shows it.
943
+ */
944
+ get ShowDashboardsMovedBanner() {
945
+ return this.dashboardsMovedBannerOpen && !this.EntityFilter;
946
+ }
896
947
  async GetResourceDisplayName(data) {
897
948
  return "Data Explorer";
898
949
  }
@@ -988,7 +1039,7 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
988
1039
  get RecentEntities() {
989
1040
  return this.State.recentEntityAccesses
990
1041
  .slice(0, 5)
991
- .map(r => this.Entities.find(e => UUIDsEqual(e.ID, r.entityId)))
1042
+ .map(r => this.entitiesByID.Get(r.entityId))
992
1043
  .filter((e) => e !== undefined);
993
1044
  }
994
1045
  /** @deprecated Use {@link RecentEntities}. */
@@ -1000,7 +1051,7 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
1000
1051
  */
1001
1052
  get FavoriteEntities() {
1002
1053
  return this.State.favoriteEntities
1003
- .map(f => this.Entities.find(e => UUIDsEqual(e.ID, f.entityId)))
1054
+ .map(f => this.entitiesByID.Get(f.entityId))
1004
1055
  .filter((e) => e !== undefined);
1005
1056
  }
1006
1057
  /** @deprecated Use {@link FavoriteEntities}. */
@@ -1180,6 +1231,7 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
1180
1231
  // This prevents race conditions where we try to load default view settings
1181
1232
  // before the user settings have been loaded from the server
1182
1233
  await UserInfoEngine.Instance.Config(false);
1234
+ this.dashboardsMovedBannerOpen = !this.isDashboardsMovedBannerDismissed();
1183
1235
  // Read initial query params — prefer params forwarded from the resource wrapper
1184
1236
  // (which has Data.Configuration.queryParams from the shell), then fall back to
1185
1237
  // this component's own GetQueryParams() for cases where the dashboard is used standalone.
@@ -3064,6 +3116,34 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
3064
3116
  toggleShowAllEntities() {
3065
3117
  return this.ToggleShowAllEntities();
3066
3118
  }
3119
+ /**
3120
+ * Opens the Library page of the Dashboards app. First installs or re-enables the app for the
3121
+ * user when necessary. When the app cannot be opened, tells the user to try again or ask for access.
3122
+ */
3123
+ async OpenDashboardsApp() {
3124
+ const app = await EnsureDashboardsApp(this.appManager);
3125
+ if (app) {
3126
+ await this.navigationService.SwitchToApp(app.ID, DASHBOARDS_LIBRARY_NAV_ITEM);
3127
+ }
3128
+ else {
3129
+ MJNotificationService.Instance.CreateSimpleNotification('Could not open the Dashboards app. Try again, or ask your administrator for access.', 'warning', 4000);
3130
+ }
3131
+ }
3132
+ /** Hides the "Dashboards moved" banner and saves the dismissal in the user's settings. */
3133
+ async DismissDashboardsMovedBanner() {
3134
+ this.dashboardsMovedBannerOpen = false;
3135
+ await UserInfoEngine.Instance.SetSetting(DataExplorerDashboardComponent_1.DASHBOARDS_MOVED_KEY, 'dismissed');
3136
+ }
3137
+ /** True when the user dismissed the "Dashboards moved" banner, or when the user's settings cannot be read. */
3138
+ isDashboardsMovedBannerDismissed() {
3139
+ try {
3140
+ return UserInfoEngine.Instance.GetSetting(DataExplorerDashboardComponent_1.DASHBOARDS_MOVED_KEY) === 'dismissed';
3141
+ }
3142
+ catch (error) {
3143
+ LogError(`Data Explorer: cannot read the Dashboards moved banner setting: ${error instanceof Error ? error.message : String(error)}`);
3144
+ return true;
3145
+ }
3146
+ }
3067
3147
  // ========================================
3068
3148
  // Concept D: Application Groups + Quick Access Panel
3069
3149
  // ========================================
@@ -3310,7 +3390,7 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
3310
3390
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.ViewWorkspaceRef = _t.first);
3311
3391
  } }, hostBindings: function DataExplorerDashboardComponent_HostBindings(rf, ctx) { if (rf & 1) {
3312
3392
  i0.ɵɵlistener("keydown", function DataExplorerDashboardComponent_keydown_HostBindingHandler($event) { return ctx.handleKeyboardShortcut($event); }, i0.ɵɵresolveDocument);
3313
- } }, inputs: { EntityFilter: "EntityFilter", entityFilter: "entityFilter", DeepLink: "DeepLink", deepLink: "deepLink", ContextName: "ContextName", contextName: "contextName", ContextIcon: "ContextIcon", contextIcon: "contextIcon", InitialQueryParams: "InitialQueryParams", initialQueryParams: "initialQueryParams" }, outputs: { DisplayNameChanged: "DisplayNameChanged" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 17, vars: 12, consts: [["filterInput", ""], [1, "data-explorer-container"], [1, "navigation-panel", 3, "collapsed", "width"], [1, "content-area"], [1, "breadcrumb-bar"], [1, "content-header"], [1, "header-left"], [1, "header-center"], [1, "smart-filter-container"], [1, "header-right"], ["title", "Recents & Favorites", 1, "header-action-btn", 3, "active"], [1, "content-body"], [1, "home-view-concept-d"], [3, "Entity", "AutoSaveView", "SelectedView", "FilterText", "SelectedRecordId", "ViewerConfig"], [1, "detail-panel", 3, "width"], [1, "navigation-panel"], [3, "entitySelected", "toggleCollapse", "sectionToggled", "openRecord", "selectRecord", "expandAndFocus", "entities", "appEntityGroups", "selectedEntityName", "favorites", "recentItems", "collapsed", "allowedEntityNames", "favoritesSectionExpanded", "recentSectionExpanded", "entitiesSectionExpanded", "viewsSectionExpanded"], [1, "breadcrumb-item", 3, "click", "title"], [1, "breadcrumb-icon", 3, "class"], [1, "breadcrumb-label"], [1, "fa-solid", "fa-chevron-right", "breadcrumb-separator"], [1, "breadcrumb-icon"], [1, "entity-icon"], [1, "entity-title"], [1, "record-count"], [1, "entity-icon", 3, "class"], [1, "fa-solid", "fa-search", "filter-icon"], ["type", "text", "placeholder", "Filter records... (press / to focus)", 1, "smart-filter-input", 3, "input", "value"], [1, "clear-filter-btn"], [1, "clear-filter-btn", 3, "click"], [1, "fa-solid", "fa-times"], ["title", "Recents & Favorites", 1, "header-action-btn", 3, "click"], [1, "fa-solid", "fa-clock-rotate-left"], [1, "qa-badge"], [1, "loading-state"], ["text", "Loading your data...", "size", "medium"], [1, "home-main-area"], [1, "search-hero"], [1, "search-hero-container"], [1, "fa-solid", "fa-magnifying-glass", "search-hero-icon"], ["type", "text", "placeholder", "Search your data...", 1, "search-hero-input", 3, "ngModelChange", "ngModel"], [1, "search-hero-clear"], [1, "search-hero-shortcut"], [1, "search-meta-row"], [1, "search-entity-count"], [1, "pill-toggle"], [1, "pill-btn", 3, "click"], [1, "fa-solid", "fa-star"], [1, "entity-groups-area"], [1, "entity-item-grid"], ["Variant", "no-results", "Title", "No matches found", 3, "Message"], ["Icon", "fa-solid fa-database", "Title", "Nothing here yet", "Message", "This app doesn't have any data set up yet. An administrator can add data for you to explore here."], [1, "quick-access-panel"], [1, "qa-header"], [1, "qa-close-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "qa-body"], [3, "ExpandedChange", "Expanded"], ["mjAccordionTitle", ""], [1, "qa-item"], [1, "qa-empty"], [1, "search-hero-clear", 3, "click"], [1, "entity-item", 3, "title"], [1, "entity-item", 3, "click", "title"], [1, "entity-item-icon"], [1, "entity-item-text"], [1, "entity-item-name"], [1, "entity-item-desc"], [1, "entity-item-fav", 3, "click", "title"], [1, "app-group"], [1, "app-group-header", 3, "click"], [1, "app-group-icon"], [1, "app-group-name"], [1, "app-group-count"], [1, "fa-solid", "fa-chevron-right", "app-group-chevron"], [1, "app-group-entities"], [1, "fa-solid", "fa-clock-rotate-left", "qa-section-icon"], [1, "mj-accordion-badge", "mj-accordion-badge--right"], [1, "qa-item", 3, "click"], [1, "qa-item-icon"], [1, "qa-item-info"], [1, "qa-item-name"], [1, "qa-item-meta"], [1, "qa-item-time"], [1, "fa-solid", "fa-table", "qa-section-icon"], [1, "fa-solid", "fa-star", "qa-section-icon", 2, "color", "var(--mj-status-warning)"], [3, "SelectedViewChange", "ViewSelected", "OpenViewInTabRequested", "OpenRecordRequested", "OpenRelatedRecordRequested", "CreateNewRecordRequested", "RecordSelected", "AfterViewSave", "AfterViewDelete", "FilterTextChanged", "DataLoaded", "FilteredCountChanged", "Entity", "AutoSaveView", "SelectedView", "FilterText", "SelectedRecordId", "ViewerConfig"], [1, "detail-panel"], [3, "close", "openRecord", "navigateToRelated", "openRelatedRecord", "openForeignKeyRecord", "entity", "record"]], template: function DataExplorerDashboardComponent_Template(rf, ctx) { if (rf & 1) {
3393
+ } }, inputs: { EntityFilter: "EntityFilter", entityFilter: "entityFilter", DeepLink: "DeepLink", deepLink: "deepLink", ContextName: "ContextName", contextName: "contextName", ContextIcon: "ContextIcon", contextIcon: "contextIcon", InitialQueryParams: "InitialQueryParams", initialQueryParams: "initialQueryParams" }, outputs: { DisplayNameChanged: "DisplayNameChanged" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 18, vars: 13, consts: [["filterInput", ""], [1, "data-explorer-container"], [1, "navigation-panel", 3, "collapsed", "width"], [1, "content-area"], [1, "breadcrumb-bar"], [1, "content-header"], [1, "header-left"], [1, "header-center"], [1, "smart-filter-container"], [1, "header-right"], ["title", "Recents & Favorites", 1, "header-action-btn", 3, "active"], ["role", "status", 1, "dx-moved-banner", 3, "panel-open"], [1, "content-body"], [1, "home-view-concept-d"], [3, "Entity", "AutoSaveView", "SelectedView", "FilterText", "SelectedRecordId", "ViewerConfig"], [1, "detail-panel", 3, "width"], [1, "navigation-panel"], [3, "entitySelected", "toggleCollapse", "sectionToggled", "openRecord", "selectRecord", "expandAndFocus", "entities", "appEntityGroups", "selectedEntityName", "favorites", "recentItems", "collapsed", "allowedEntityNames", "favoritesSectionExpanded", "recentSectionExpanded", "entitiesSectionExpanded", "viewsSectionExpanded"], [1, "breadcrumb-item", 3, "click", "title"], [1, "breadcrumb-icon", 3, "class"], [1, "breadcrumb-label"], [1, "fa-solid", "fa-chevron-right", "breadcrumb-separator"], [1, "breadcrumb-icon"], [1, "entity-icon"], [1, "entity-title"], [1, "record-count"], [1, "entity-icon", 3, "class"], [1, "fa-solid", "fa-search", "filter-icon"], ["type", "text", "placeholder", "Filter records... (press / to focus)", 1, "smart-filter-input", 3, "input", "value"], [1, "clear-filter-btn"], [1, "clear-filter-btn", 3, "click"], [1, "fa-solid", "fa-times"], ["title", "Recents & Favorites", 1, "header-action-btn", 3, "click"], [1, "fa-solid", "fa-clock-rotate-left"], [1, "qa-badge"], ["role", "status", 1, "dx-moved-banner"], ["aria-hidden", "true", 1, "fa-solid", "fa-gauge-high"], ["mjButton", "", "size", "sm", 3, "click"], ["mjButton", "", "size", "sm", "variant", "flat", 3, "click"], [1, "loading-state"], ["text", "Loading your data...", "size", "medium"], [1, "home-main-area"], [1, "search-hero"], [1, "search-hero-container"], [1, "fa-solid", "fa-magnifying-glass", "search-hero-icon"], ["type", "text", "placeholder", "Search your data...", 1, "search-hero-input", 3, "ngModelChange", "ngModel"], [1, "search-hero-clear"], [1, "search-hero-shortcut"], [1, "search-meta-row"], [1, "search-entity-count"], [1, "pill-toggle"], [1, "pill-btn", 3, "click"], [1, "fa-solid", "fa-star"], [1, "entity-groups-area"], [1, "entity-item-grid"], ["Variant", "no-results", "Title", "No matches found", 3, "Message"], ["Icon", "fa-solid fa-database", "Title", "Nothing here yet", "Message", "This app doesn't have any data set up yet. An administrator can add data for you to explore here."], [1, "quick-access-panel"], [1, "qa-header"], [1, "qa-close-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "qa-body"], [3, "ExpandedChange", "Expanded"], ["mjAccordionTitle", ""], [1, "qa-item"], [1, "qa-empty"], [1, "search-hero-clear", 3, "click"], [1, "entity-item", 3, "title"], [1, "entity-item", 3, "click", "title"], [1, "entity-item-icon"], [1, "entity-item-text"], [1, "entity-item-name"], [1, "entity-item-desc"], [1, "entity-item-fav", 3, "click", "title"], [1, "app-group"], [1, "app-group-header", 3, "click"], [1, "app-group-icon"], [1, "app-group-name"], [1, "app-group-count"], [1, "fa-solid", "fa-chevron-right", "app-group-chevron"], [1, "app-group-entities"], [1, "fa-solid", "fa-clock-rotate-left", "qa-section-icon"], [1, "mj-accordion-badge", "mj-accordion-badge--right"], [1, "qa-item", 3, "click"], [1, "qa-item-icon"], [1, "qa-item-info"], [1, "qa-item-name"], [1, "qa-item-meta"], [1, "qa-item-time"], [1, "fa-solid", "fa-table", "qa-section-icon"], [1, "fa-solid", "fa-star", "qa-section-icon", 2, "color", "var(--mj-status-warning)"], [3, "SelectedViewChange", "ViewSelected", "OpenViewInTabRequested", "OpenRecordRequested", "OpenRelatedRecordRequested", "CreateNewRecordRequested", "RecordSelected", "AfterViewSave", "AfterViewDelete", "FilterTextChanged", "DataLoaded", "FilteredCountChanged", "Entity", "AutoSaveView", "SelectedView", "FilterText", "SelectedRecordId", "ViewerConfig"], [1, "detail-panel"], [3, "close", "openRecord", "navigateToRelated", "openRelatedRecord", "openForeignKeyRecord", "entity", "record"]], template: function DataExplorerDashboardComponent_Template(rf, ctx) { if (rf & 1) {
3314
3394
  i0.ɵɵelementStart(0, "div", 1);
3315
3395
  i0.ɵɵconditionalCreate(1, DataExplorerDashboardComponent_Conditional_1_Template, 2, 16, "div", 2);
3316
3396
  i0.ɵɵelementStart(2, "div", 3);
@@ -3325,10 +3405,11 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
3325
3405
  i0.ɵɵconditionalCreate(11, DataExplorerDashboardComponent_Conditional_11_Template, 0, 0);
3326
3406
  i0.ɵɵconditionalCreate(12, DataExplorerDashboardComponent_Conditional_12_Template, 3, 3, "button", 10);
3327
3407
  i0.ɵɵelementEnd()();
3328
- i0.ɵɵelementStart(13, "div", 11);
3329
- i0.ɵɵconditionalCreate(14, DataExplorerDashboardComponent_Conditional_14_Template, 3, 1, "div", 12)(15, DataExplorerDashboardComponent_Conditional_15_Template, 1, 6, "mj-view-workspace", 13);
3408
+ i0.ɵɵconditionalCreate(13, DataExplorerDashboardComponent_Conditional_13_Template, 10, 2, "div", 11);
3409
+ i0.ɵɵelementStart(14, "div", 12);
3410
+ i0.ɵɵconditionalCreate(15, DataExplorerDashboardComponent_Conditional_15_Template, 3, 1, "div", 13)(16, DataExplorerDashboardComponent_Conditional_16_Template, 1, 6, "mj-view-workspace", 14);
3330
3411
  i0.ɵɵelementEnd()();
3331
- i0.ɵɵconditionalCreate(16, DataExplorerDashboardComponent_Conditional_16_Template, 2, 4, "div", 14);
3412
+ i0.ɵɵconditionalCreate(17, DataExplorerDashboardComponent_Conditional_17_Template, 2, 4, "div", 15);
3332
3413
  i0.ɵɵelementEnd();
3333
3414
  } if (rf & 2) {
3334
3415
  i0.ɵɵadvance();
@@ -3346,12 +3427,14 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
3346
3427
  i0.ɵɵadvance();
3347
3428
  i0.ɵɵconditional(!ctx.selectedEntity ? 12 : -1);
3348
3429
  i0.ɵɵadvance();
3430
+ i0.ɵɵconditional(ctx.ShowDashboardsMovedBanner ? 13 : -1);
3431
+ i0.ɵɵadvance();
3349
3432
  i0.ɵɵclassProp("home-content", ctx.isAtHomeLevel);
3350
3433
  i0.ɵɵadvance();
3351
- i0.ɵɵconditional(!ctx.selectedEntity ? 14 : 15);
3434
+ i0.ɵɵconditional(!ctx.selectedEntity ? 15 : 16);
3352
3435
  i0.ɵɵadvance(2);
3353
- i0.ɵɵconditional(ctx.state.detailPanelOpen && ctx.selectedRecord ? 16 : -1);
3354
- } }, dependencies: [i3.DefaultValueAccessor, i3.NgControlStatus, i3.NgModel, i4.MJEmptyStateComponent, i4.MJAccordionPanelComponent, i4.MJAccordionTitleDirective, i5.EntityRecordDetailPanelComponent, i5.ViewWorkspaceComponent, i2.LoadingComponent, i6.NavigationPanelComponent, i7.DecimalPipe], styles: [".data-explorer-container[_ngcontent-%COMP%] {\n display: flex;\n height: 100%;\n width: 100%;\n background: var(--mj-bg-surface-card);\n overflow: hidden;\n}\n\n.navigation-panel[_ngcontent-%COMP%] {\n flex-shrink: 0;\n height: 100%;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n transition: width 0.2s ease-in-out;\n overflow: hidden;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.04);\n}\n.navigation-panel.collapsed[_ngcontent-%COMP%] {\n width: 48px;\n}\n\n.content-area[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n height: 100%;\n min-width: 0;\n overflow: hidden;\n background: var(--mj-bg-surface-card);\n}\n\n\n.breadcrumb-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n font-size: 13px;\n min-height: 40px;\n}\n\n.breadcrumb-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-text-secondary);\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.15s ease;\n max-width: 200px;\n}\n\n.breadcrumb-item.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.breadcrumb-item.clickable[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n}\n\n.breadcrumb-item.current[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-weight: 500;\n cursor: default;\n}\n\n.breadcrumb-icon[_ngcontent-%COMP%] {\n font-size: 12px;\n flex-shrink: 0;\n}\n\n.breadcrumb-label[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.breadcrumb-separator[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-border-strong);\n flex-shrink: 0;\n}\n\n.content-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n gap: 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n position: relative;\n z-index: 2; \n}\n\n.header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n flex-wrap: wrap;\n}\n\n\n.header-left[_ngcontent-%COMP%] mj-view-selector {\n margin-left: 8px;\n}\n\n.entity-icon[_ngcontent-%COMP%] {\n font-size: 20px;\n color: var(--mj-brand-primary);\n}\n\n.entity-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.record-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.header-center[_ngcontent-%COMP%] {\n flex: 1;\n max-width: 600px;\n}\n\n.smart-filter-container[_ngcontent-%COMP%] {\n position: relative;\n width: 100%;\n}\n\n.smart-filter-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 40px 10px 16px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 8px;\n font-size: 14px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n transition: all 0.15s ease;\n}\n.smart-filter-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n.smart-filter-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted);\n}\n\n.clear-filter-btn[_ngcontent-%COMP%] {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n.clear-filter-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n.header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n flex-shrink: 0;\n}\n\n.view-mode-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 3px;\n}\n\n.toggle-btn[_ngcontent-%COMP%] {\n width: 36px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n.toggle-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n.toggle-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n\n.header-action-btn[_ngcontent-%COMP%] {\n position: relative;\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n margin-left: 8px;\n}\n.header-action-btn[_ngcontent-%COMP%]:hover:not(.disabled) {\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.header-action-btn.disabled[_ngcontent-%COMP%] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.header-action-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n.selection-badge[_ngcontent-%COMP%] {\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 11px;\n font-weight: 600;\n border-radius: 9px;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n}\n\n\n.date-field-selector-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n position: relative;\n}\n\n.date-field-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n background: transparent;\n}\n\n.date-field-selector-wrapper[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.date-field-selector-button[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-primary);\n transition: all 0.15s ease;\n min-width: 120px;\n max-width: 200px;\n}\n\n.date-field-selector-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.date-field-selector-button[_ngcontent-%COMP%]:disabled {\n cursor: default;\n opacity: 0.8;\n}\n\n.date-field-selector-button.open[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-active);\n border-color: var(--mj-brand-primary);\n}\n\n.date-field-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 12px;\n}\n\n.date-field-name[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: left;\n}\n\n.date-field-arrow[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 10px;\n transition: transform 0.2s ease;\n}\n\n.date-field-arrow.rotated[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n}\n\n.date-field-dropdown-panel[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n min-width: 180px;\n max-width: 280px;\n max-height: 300px;\n overflow-y: auto;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n z-index: 1000;\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n cursor: pointer;\n transition: background 0.1s ease;\n font-size: 13px;\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.date-field-dropdown-item.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.date-field-dropdown-item.selected[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%] .item-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 13px;\n width: 16px;\n text-align: center;\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%] .item-name[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%] .selected-check[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n\n\n.view-specific-controls[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n border: 1px solid var(--mj-border-subtle);\n}\n\n.view-specific-btn[_ngcontent-%COMP%] {\n width: 30px;\n height: 30px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.view-specific-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-hover);\n}\n\n\n.timeline-orientation-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 3px;\n}\n\n.content-body[_ngcontent-%COMP%] {\n display: flex;\n flex: 1 1 0%;\n overflow: hidden;\n \n\n\n\n\n\n\n\n isolation: isolate;\n position: relative; \n z-index: 3; \n}\n\n.loading-container[_ngcontent-%COMP%], \n.loading-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n gap: 16px;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n font-size: 32px;\n color: var(--mj-brand-primary);\n}\n\n.loading-message[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n\n\n\n\n\n.home-view-concept-d[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n overflow: hidden;\n}\n\n.home-main-area[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n transition: margin-right 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.home-main-area.panel-open[_ngcontent-%COMP%] {\n margin-right: 320px;\n}\n\n\n\n\n\n.search-hero[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n padding: 36px 40px 24px;\n text-align: center;\n}\n\n.search-hero-container[_ngcontent-%COMP%] {\n position: relative;\n max-width: 600px;\n margin: 0 auto;\n}\n\n.search-hero-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 14px 18px 14px 44px;\n font-size: 15px;\n border: 2px solid var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n outline: none;\n transition: all 0.2s;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);\n font-family: inherit;\n}\n\n.search-hero-input[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 12px 40px rgba(0, 0, 0, 0.1), 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.search-hero-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-primary);\n}\n\n.search-hero-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 16px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-primary);\n font-size: 15px;\n pointer-events: none;\n}\n\n.search-hero-shortcut[_ngcontent-%COMP%] {\n position: absolute;\n right: 14px;\n top: 50%;\n transform: translateY(-50%);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n padding: 2px 7px;\n border-radius: 5px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.search-hero-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 14px;\n top: 50%;\n transform: translateY(-50%);\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.search-hero-clear[_ngcontent-%COMP%]:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n\n.search-meta-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n margin-top: 16px;\n}\n\n.search-entity-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.pill-toggle[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n}\n\n.pill-btn[_ngcontent-%COMP%] {\n padding: 6px 16px;\n border-radius: 20px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n font-size: 13px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n font-family: inherit;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.pill-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.pill-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.pill-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n\n\n\n\n.entity-groups-area[_ngcontent-%COMP%] {\n padding: 12px 40px 60px;\n max-width: 1200px;\n margin: 0 auto;\n}\n\n.app-group[_ngcontent-%COMP%] {\n margin-bottom: 4px;\n}\n\n.app-group-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 14px;\n cursor: pointer;\n border-radius: 8px;\n transition: background 0.12s;\n user-select: none;\n}\n\n.app-group-header[_ngcontent-%COMP%]:hover {\n background: rgba(0, 0, 0, 0.025);\n}\n\n.app-group-icon[_ngcontent-%COMP%] {\n width: 38px;\n height: 38px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 17px;\n flex-shrink: 0;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.app-group-name[_ngcontent-%COMP%] {\n font-size: 21px;\n font-weight: 600;\n flex: 1;\n}\n\n.app-group-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n padding: 2px 9px;\n border-radius: 10px;\n}\n\n.app-group-chevron[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 12px;\n transition: transform 0.2s;\n}\n\n.app-group-chevron.expanded[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n}\n\n.app-group-entities[_ngcontent-%COMP%] {\n padding: 4px 14px 10px 60px;\n}\n\n\n\n\n\n.entity-item-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n gap: 12px;\n}\n\n.entity-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 10px 14px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.12s;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.entity-item[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, var(--mj-bg-surface));\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.entity-item-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n}\n\n.entity-item[_ngcontent-%COMP%]:hover .entity-item-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.entity-item-text[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.entity-item-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.entity-item-desc[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.3;\n}\n\n.entity-item-fav[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n opacity: 0;\n transition: opacity 0.12s;\n font-size: 11px;\n cursor: pointer;\n flex-shrink: 0;\n background: none;\n border: none;\n padding: 4px;\n align-self: center;\n}\n\n.entity-item[_ngcontent-%COMP%]:hover .entity-item-fav[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.entity-item-fav.favorited[_ngcontent-%COMP%] {\n opacity: 1;\n color: var(--mj-status-warning);\n}\n\n\n\n\n\n.quick-access-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 60px;\n right: 0;\n width: 320px;\n height: calc(100% - 60px);\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n z-index: 50;\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n flex-direction: column;\n}\n\n.quick-access-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n.qa-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.qa-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n margin: 0;\n}\n\n.qa-close-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 14px;\n padding: 4px;\n border-radius: 4px;\n}\n\n.qa-close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.qa-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n}\n\n.qa-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.08s;\n}\n\n.qa-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.qa-item-icon[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n flex-shrink: 0;\n}\n\n.qa-item-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.qa-item-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.qa-item-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.qa-item-time[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.qa-empty[_ngcontent-%COMP%] {\n padding: 20px 16px;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n\n.qa-badge[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n padding: 0 5px;\n border-radius: 8px;\n min-width: 16px;\n text-align: center;\n}\n\n.detail-panel[_ngcontent-%COMP%] {\n flex-shrink: 0;\n height: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -4px 0 16px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n animation: _ngcontent-%COMP%_slideIn 0.2s ease-out;\n display: flex;\n flex-direction: column;\n}\n\n.detail-panel[_ngcontent-%COMP%] mj-entity-record-detail-panel[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n@keyframes _ngcontent-%COMP%_slideIn {\n from {\n transform: translateX(100%);\n opacity: 0;\n }\n to {\n transform: translateX(0);\n opacity: 1;\n }\n}\n\n\n.detail-panel-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.detail-action-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: none;\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.detail-action-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n.detail-action-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n[_nghost-%COMP%] mj-explorer-grid-view, \n[_nghost-%COMP%] mj-explorer-cards-view {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n\n\n\n\n\n.content-header.home-header[_ngcontent-%COMP%] {\n border-bottom: none;\n background: transparent;\n box-shadow: none;\n padding: 16px 24px 8px;\n}\n\n.content-body.home-content[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n\n.filter-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 14px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-muted);\n font-size: 14px;\n pointer-events: none;\n}\n\n.smart-filter-container[_ngcontent-%COMP%] .smart-filter-input[_ngcontent-%COMP%] {\n padding-left: 40px;\n}\n\n\n\n\n\n.view-mode-toggle[_ngcontent-%COMP%] .toggle-btn[_ngcontent-%COMP%] {\n width: auto;\n padding: 0 12px;\n gap: 6px;\n}\n\n.toggle-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 500;\n}\n\n\n\n\n\n@media (max-width: 1200px) {\n .entity-item-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n }\n}\n\n@media (max-width: 900px) {\n .content-header[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n gap: 12px;\n }\n\n .header-center[_ngcontent-%COMP%] {\n order: 3;\n flex-basis: 100%;\n max-width: 100%;\n }\n\n .search-hero[_ngcontent-%COMP%] {\n padding: 24px 16px 16px;\n }\n\n .entity-groups-area[_ngcontent-%COMP%] {\n padding: 8px 16px 40px;\n }\n\n .app-group-entities[_ngcontent-%COMP%] {\n padding-left: 36px;\n }\n\n .home-main-area.panel-open[_ngcontent-%COMP%] {\n margin-right: 0;\n }\n\n .quick-access-panel[_ngcontent-%COMP%] {\n width: 100%;\n }\n}\n\n@media (max-width: 600px) {\n .data-explorer-container[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .navigation-panel[_ngcontent-%COMP%] {\n display: none;\n }\n\n .content-header[_ngcontent-%COMP%] {\n padding: 12px 16px;\n }\n\n .content-body[_ngcontent-%COMP%] {\n padding: 12px 16px;\n }\n\n .entity-item-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .view-mode-toggle[_ngcontent-%COMP%] {\n display: none;\n }\n\n .app-group-name[_ngcontent-%COMP%] {\n font-size: 17px;\n }\n\n .entity-item-name[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n}"], data: { animation: [
3436
+ i0.ɵɵconditional(ctx.state.detailPanelOpen && ctx.selectedRecord ? 17 : -1);
3437
+ } }, dependencies: [i3.DefaultValueAccessor, i3.NgControlStatus, i3.NgModel, i4.MJEmptyStateComponent, i4.MJAccordionPanelComponent, i4.MJAccordionTitleDirective, i4.MJButtonDirective, i5.EntityRecordDetailPanelComponent, i5.ViewWorkspaceComponent, i2.LoadingComponent, i6.NavigationPanelComponent, i7.DecimalPipe], styles: [".data-explorer-container[_ngcontent-%COMP%] {\n display: flex;\n height: 100%;\n width: 100%;\n background: var(--mj-bg-surface-card);\n overflow: hidden;\n}\n\n.navigation-panel[_ngcontent-%COMP%] {\n flex-shrink: 0;\n height: 100%;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n transition: width 0.2s ease-in-out;\n overflow: hidden;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.04);\n}\n.navigation-panel.collapsed[_ngcontent-%COMP%] {\n width: 48px;\n}\n\n.content-area[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n height: 100%;\n min-width: 0;\n overflow: hidden;\n background: var(--mj-bg-surface-card);\n}\n\n\n.breadcrumb-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n font-size: 13px;\n min-height: 40px;\n}\n\n.breadcrumb-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-text-secondary);\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.15s ease;\n max-width: 200px;\n}\n\n.breadcrumb-item.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.breadcrumb-item.clickable[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n}\n\n.breadcrumb-item.current[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-weight: 500;\n cursor: default;\n}\n\n.breadcrumb-icon[_ngcontent-%COMP%] {\n font-size: 12px;\n flex-shrink: 0;\n}\n\n.breadcrumb-label[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.breadcrumb-separator[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-border-strong);\n flex-shrink: 0;\n}\n\n.content-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n gap: 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n position: relative;\n z-index: 2; \n}\n\n.header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n flex-wrap: wrap;\n}\n\n\n.header-left[_ngcontent-%COMP%] mj-view-selector {\n margin-left: 8px;\n}\n\n.entity-icon[_ngcontent-%COMP%] {\n font-size: 20px;\n color: var(--mj-brand-primary);\n}\n\n.entity-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.record-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.header-center[_ngcontent-%COMP%] {\n flex: 1;\n max-width: 600px;\n}\n\n.smart-filter-container[_ngcontent-%COMP%] {\n position: relative;\n width: 100%;\n}\n\n.smart-filter-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 40px 10px 16px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 8px;\n font-size: 14px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n transition: all 0.15s ease;\n}\n.smart-filter-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n.smart-filter-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted);\n}\n\n.clear-filter-btn[_ngcontent-%COMP%] {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n.clear-filter-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n.header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n flex-shrink: 0;\n}\n\n.view-mode-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 3px;\n}\n\n.toggle-btn[_ngcontent-%COMP%] {\n width: 36px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n.toggle-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n.toggle-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n\n.header-action-btn[_ngcontent-%COMP%] {\n position: relative;\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n margin-left: 8px;\n}\n.header-action-btn[_ngcontent-%COMP%]:hover:not(.disabled) {\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.header-action-btn.disabled[_ngcontent-%COMP%] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.header-action-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n.selection-badge[_ngcontent-%COMP%] {\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 11px;\n font-weight: 600;\n border-radius: 9px;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n}\n\n\n.date-field-selector-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n position: relative;\n}\n\n.date-field-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n background: transparent;\n}\n\n.date-field-selector-wrapper[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.date-field-selector-button[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-primary);\n transition: all 0.15s ease;\n min-width: 120px;\n max-width: 200px;\n}\n\n.date-field-selector-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.date-field-selector-button[_ngcontent-%COMP%]:disabled {\n cursor: default;\n opacity: 0.8;\n}\n\n.date-field-selector-button.open[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-active);\n border-color: var(--mj-brand-primary);\n}\n\n.date-field-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 12px;\n}\n\n.date-field-name[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: left;\n}\n\n.date-field-arrow[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 10px;\n transition: transform 0.2s ease;\n}\n\n.date-field-arrow.rotated[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n}\n\n.date-field-dropdown-panel[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n min-width: 180px;\n max-width: 280px;\n max-height: 300px;\n overflow-y: auto;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n z-index: 1000;\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n cursor: pointer;\n transition: background 0.1s ease;\n font-size: 13px;\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.date-field-dropdown-item.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.date-field-dropdown-item.selected[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%] .item-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 13px;\n width: 16px;\n text-align: center;\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%] .item-name[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%] .selected-check[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n\n\n.view-specific-controls[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n border: 1px solid var(--mj-border-subtle);\n}\n\n.view-specific-btn[_ngcontent-%COMP%] {\n width: 30px;\n height: 30px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.view-specific-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-hover);\n}\n\n\n.timeline-orientation-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 3px;\n}\n\n.content-body[_ngcontent-%COMP%] {\n display: flex;\n flex: 1 1 0%;\n overflow: hidden;\n \n\n\n\n\n\n\n\n isolation: isolate;\n position: relative; \n z-index: 3; \n}\n\n\n\n\n\n\n.dx-moved-banner[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n flex-shrink: 0;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n margin: 12px 24px;\n border-radius: 10px;\n background: var(--mj-status-info-bg);\n color: var(--mj-status-info-text);\n font-size: 13px;\n transition: margin-right 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n\n.content-header.home-header[_ngcontent-%COMP%] + .dx-moved-banner[_ngcontent-%COMP%] {\n margin-top: 0;\n}\n\n\n.dx-moved-banner.panel-open[_ngcontent-%COMP%] {\n margin-right: 344px;\n}\n\n\n.dx-moved-banner[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n flex: 1 1 200px;\n}\n\n.loading-container[_ngcontent-%COMP%], \n.loading-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n gap: 16px;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n font-size: 32px;\n color: var(--mj-brand-primary);\n}\n\n.loading-message[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n\n\n\n\n\n.home-view-concept-d[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n overflow: hidden;\n}\n\n.home-main-area[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n transition: margin-right 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.home-main-area.panel-open[_ngcontent-%COMP%] {\n margin-right: 320px;\n}\n\n\n\n\n\n.search-hero[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n padding: 36px 40px 24px;\n text-align: center;\n}\n\n.search-hero-container[_ngcontent-%COMP%] {\n position: relative;\n max-width: 600px;\n margin: 0 auto;\n}\n\n.search-hero-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 14px 18px 14px 44px;\n font-size: 15px;\n border: 2px solid var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n outline: none;\n transition: all 0.2s;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);\n font-family: inherit;\n}\n\n.search-hero-input[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 12px 40px rgba(0, 0, 0, 0.1), 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.search-hero-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-primary);\n}\n\n.search-hero-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 16px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-primary);\n font-size: 15px;\n pointer-events: none;\n}\n\n.search-hero-shortcut[_ngcontent-%COMP%] {\n position: absolute;\n right: 14px;\n top: 50%;\n transform: translateY(-50%);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n padding: 2px 7px;\n border-radius: 5px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.search-hero-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 14px;\n top: 50%;\n transform: translateY(-50%);\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.search-hero-clear[_ngcontent-%COMP%]:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n\n.search-meta-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n margin-top: 16px;\n}\n\n.search-entity-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.pill-toggle[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n}\n\n.pill-btn[_ngcontent-%COMP%] {\n padding: 6px 16px;\n border-radius: 20px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n font-size: 13px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n font-family: inherit;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.pill-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.pill-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.pill-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n\n\n\n\n.entity-groups-area[_ngcontent-%COMP%] {\n padding: 12px 40px 60px;\n max-width: 1200px;\n margin: 0 auto;\n}\n\n.app-group[_ngcontent-%COMP%] {\n margin-bottom: 4px;\n}\n\n.app-group-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 14px;\n cursor: pointer;\n border-radius: 8px;\n transition: background 0.12s;\n user-select: none;\n}\n\n.app-group-header[_ngcontent-%COMP%]:hover {\n background: rgba(0, 0, 0, 0.025);\n}\n\n.app-group-icon[_ngcontent-%COMP%] {\n width: 38px;\n height: 38px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 17px;\n flex-shrink: 0;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.app-group-name[_ngcontent-%COMP%] {\n font-size: 21px;\n font-weight: 600;\n flex: 1;\n}\n\n.app-group-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n padding: 2px 9px;\n border-radius: 10px;\n}\n\n.app-group-chevron[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 12px;\n transition: transform 0.2s;\n}\n\n.app-group-chevron.expanded[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n}\n\n.app-group-entities[_ngcontent-%COMP%] {\n padding: 4px 14px 10px 60px;\n}\n\n\n\n\n\n.entity-item-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n gap: 12px;\n}\n\n.entity-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 10px 14px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.12s;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.entity-item[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, var(--mj-bg-surface));\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.entity-item-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n}\n\n.entity-item[_ngcontent-%COMP%]:hover .entity-item-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.entity-item-text[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.entity-item-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.entity-item-desc[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.3;\n}\n\n.entity-item-fav[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n opacity: 0;\n transition: opacity 0.12s;\n font-size: 11px;\n cursor: pointer;\n flex-shrink: 0;\n background: none;\n border: none;\n padding: 4px;\n align-self: center;\n}\n\n.entity-item[_ngcontent-%COMP%]:hover .entity-item-fav[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.entity-item-fav.favorited[_ngcontent-%COMP%] {\n opacity: 1;\n color: var(--mj-status-warning);\n}\n\n\n\n\n\n.quick-access-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 60px;\n right: 0;\n width: 320px;\n height: calc(100% - 60px);\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n z-index: 50;\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n flex-direction: column;\n}\n\n.quick-access-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n.qa-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.qa-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n margin: 0;\n}\n\n.qa-close-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 14px;\n padding: 4px;\n border-radius: 4px;\n}\n\n.qa-close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.qa-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n}\n\n.qa-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.08s;\n}\n\n.qa-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.qa-item-icon[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n flex-shrink: 0;\n}\n\n.qa-item-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.qa-item-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.qa-item-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.qa-item-time[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.qa-empty[_ngcontent-%COMP%] {\n padding: 20px 16px;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n\n.qa-badge[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n padding: 0 5px;\n border-radius: 8px;\n min-width: 16px;\n text-align: center;\n}\n\n.detail-panel[_ngcontent-%COMP%] {\n flex-shrink: 0;\n height: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -4px 0 16px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n animation: _ngcontent-%COMP%_slideIn 0.2s ease-out;\n display: flex;\n flex-direction: column;\n}\n\n.detail-panel[_ngcontent-%COMP%] mj-entity-record-detail-panel[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n@keyframes _ngcontent-%COMP%_slideIn {\n from {\n transform: translateX(100%);\n opacity: 0;\n }\n to {\n transform: translateX(0);\n opacity: 1;\n }\n}\n\n\n.detail-panel-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.detail-action-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: none;\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.detail-action-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n.detail-action-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n[_nghost-%COMP%] mj-explorer-grid-view, \n[_nghost-%COMP%] mj-explorer-cards-view {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n\n\n\n\n\n.content-header.home-header[_ngcontent-%COMP%] {\n border-bottom: none;\n background: transparent;\n box-shadow: none;\n padding: 16px 24px 8px;\n}\n\n.content-body.home-content[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n\n.filter-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 14px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-muted);\n font-size: 14px;\n pointer-events: none;\n}\n\n.smart-filter-container[_ngcontent-%COMP%] .smart-filter-input[_ngcontent-%COMP%] {\n padding-left: 40px;\n}\n\n\n\n\n\n.view-mode-toggle[_ngcontent-%COMP%] .toggle-btn[_ngcontent-%COMP%] {\n width: auto;\n padding: 0 12px;\n gap: 6px;\n}\n\n.toggle-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 500;\n}\n\n\n\n\n\n@media (max-width: 1200px) {\n .entity-item-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n }\n}\n\n@media (max-width: 900px) {\n .content-header[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n gap: 12px;\n }\n\n .header-center[_ngcontent-%COMP%] {\n order: 3;\n flex-basis: 100%;\n max-width: 100%;\n }\n\n .search-hero[_ngcontent-%COMP%] {\n padding: 24px 16px 16px;\n }\n\n .entity-groups-area[_ngcontent-%COMP%] {\n padding: 8px 16px 40px;\n }\n\n .app-group-entities[_ngcontent-%COMP%] {\n padding-left: 36px;\n }\n\n .home-main-area.panel-open[_ngcontent-%COMP%] {\n margin-right: 0;\n }\n\n .quick-access-panel[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n \n .dx-moved-banner.panel-open[_ngcontent-%COMP%] {\n margin-right: 24px;\n }\n}\n\n@media (max-width: 600px) {\n .data-explorer-container[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .navigation-panel[_ngcontent-%COMP%] {\n display: none;\n }\n\n .content-header[_ngcontent-%COMP%] {\n padding: 12px 16px;\n }\n\n .content-body[_ngcontent-%COMP%] {\n padding: 12px 16px;\n }\n\n \n .content-header[_ngcontent-%COMP%]:not(.home-header) + .dx-moved-banner[_ngcontent-%COMP%] {\n margin-left: 16px;\n margin-right: 16px;\n }\n\n .entity-item-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .view-mode-toggle[_ngcontent-%COMP%] {\n display: none;\n }\n\n .app-group-name[_ngcontent-%COMP%] {\n font-size: 17px;\n }\n\n .entity-item-name[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n}"], data: { animation: [
3355
3438
  trigger('slideInLeft', [
3356
3439
  transition(':enter', [
3357
3440
  style({ transform: 'translateX(-100%)', opacity: 0 }),
@@ -3363,7 +3446,7 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
3363
3446
  ])
3364
3447
  ] } });
3365
3448
  };
3366
- DataExplorerDashboardComponent = __decorate([
3449
+ DataExplorerDashboardComponent = DataExplorerDashboardComponent_1 = __decorate([
3367
3450
  RegisterClass(BaseDashboard, 'DataExplorer')
3368
3451
  ], DataExplorerDashboardComponent);
3369
3452
  export { DataExplorerDashboardComponent };
@@ -3379,7 +3462,7 @@ export { DataExplorerDashboardComponent };
3379
3462
  animate('200ms ease-in', style({ transform: 'translateX(-100%)', opacity: 0 }))
3380
3463
  ])
3381
3464
  ])
3382
- ], template: "<div class=\"data-explorer-container\">\n <!-- Navigation Panel (Left) - Hidden at home level, animated -->\n @if (!isAtHomeLevel) {\n <div\n class=\"navigation-panel\"\n [class.collapsed]=\"state.navigationPanelCollapsed\"\n [style.width.px]=\"state.navigationPanelCollapsed ? 48 : state.navigationPanelWidth\"\n [@slideInLeft]>\n\n <mj-explorer-navigation-panel\n [entities]=\"entities\"\n [appEntityGroups]=\"appEntityGroups\"\n [selectedEntityName]=\"state.selectedEntityName\"\n [favorites]=\"state.favorites\"\n [recentItems]=\"state.recentItems\"\n [collapsed]=\"state.navigationPanelCollapsed\"\n [allowedEntityNames]=\"allowedEntityNames\"\n [favoritesSectionExpanded]=\"state.favoritesSectionExpanded\"\n [recentSectionExpanded]=\"state.recentSectionExpanded\"\n [entitiesSectionExpanded]=\"state.entitiesSectionExpanded\"\n [viewsSectionExpanded]=\"state.viewsSectionExpanded\"\n (entitySelected)=\"onEntitySelected($event)\"\n (toggleCollapse)=\"toggleNavigationPanel()\"\n (sectionToggled)=\"stateService.toggleSection($event)\"\n (openRecord)=\"onOpenRecordFromNav($event)\"\n (selectRecord)=\"onSelectRecordFromNav($event)\"\n (expandAndFocus)=\"onExpandAndFocus($event)\">\n </mj-explorer-navigation-panel>\n </div>\n }\n\n <!-- Main Content Area -->\n <div class=\"content-area\">\n <!-- Breadcrumb Bar - Hidden at home level -->\n @if (!isAtHomeLevel && breadcrumbs.length > 0) {\n <div class=\"breadcrumb-bar\">\n @for (crumb of breadcrumbs; track crumb.label; let i = $index; let last = $last) {\n <span\n class=\"breadcrumb-item\"\n [class.clickable]=\"!last\"\n [class.current]=\"last\"\n (click)=\"onBreadcrumbClick(crumb, i)\"\n [title]=\"crumb.label\">\n @if (crumb.icon) {\n <i [class]=\"crumb.icon\" class=\"breadcrumb-icon\"></i>\n }\n <span class=\"breadcrumb-label\">{{ crumb.label }}</span>\n </span>\n @if (!last) {\n <i class=\"fa-solid fa-chevron-right breadcrumb-separator\"></i>\n }\n }\n </div>\n }\n\n <!-- Header -->\n <div class=\"content-header\" [class.home-header]=\"isAtHomeLevel\">\n <div class=\"header-left\">\n @if (selectedEntity) {\n <i [class]=\"getEntityIcon(selectedEntity)\" class=\"entity-icon\"></i>\n <h2 class=\"entity-title\">{{ selectedEntity.DisplayNameOrName }}</h2>\n @if (debouncedFilterText && filteredRecordCount !== totalRecordCount) {\n <span class=\"record-count\">{{ filteredRecordCount | number }} of {{ totalRecordCount | number }} records</span>\n } @else {\n <span class=\"record-count\">{{ totalRecordCount | number }} records</span>\n }\n\n <!-- View selector + view header now live inside mj-view-workspace (below). -->\n <!-- Add-to-List is now owned inside the grid plug-in renderer (it hosts its own dialog). -->\n } @else {\n @if (displayIcon) {\n <i [class]=\"displayIcon\" class=\"entity-icon\"></i>\n }\n <h2 class=\"entity-title\">{{ displayTitle }}</h2>\n <span class=\"record-count\">{{ entities.length }} record types available</span>\n }\n </div>\n\n <div class=\"header-center\">\n @if (selectedEntity) {\n <div class=\"smart-filter-container\">\n <i class=\"fa-solid fa-search filter-icon\"></i>\n <input\n #filterInput\n type=\"text\"\n class=\"smart-filter-input\"\n placeholder=\"Filter records... (press / to focus)\"\n [value]=\"liveFilterText\"\n (input)=\"onFilterInputChanged(filterInput.value)\"\n />\n @if (liveFilterText) {\n <button class=\"clear-filter-btn\" (click)=\"clearRecordFilter()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n }\n <!-- Home-level search moved to search hero section -->\n </div>\n\n <div class=\"header-right\">\n @if (selectedEntity) {\n <!-- View-type switcher AND all view-specific controls (timeline date/orientation/sort,\n map render mode, etc.) now live inside the plug-in renderers hosted by\n mj-view-workspace. Nothing view-type-specific lives in this header anymore. -->\n }\n @if (!selectedEntity) {\n <!-- Quick Access panel toggle -->\n <button\n class=\"header-action-btn\"\n [class.active]=\"state.quickAccessPanelOpen\"\n (click)=\"toggleQuickAccessPanel()\"\n title=\"Recents & Favorites\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n @if (recentRecords.length + favoriteRecords.length > 0) {\n <span class=\"qa-badge\">{{ recentRecords.length + favoriteRecords.length }}</span>\n }\n </button>\n }\n </div>\n </div>\n\n <!-- Content Body - Using mj-entity-viewer composite -->\n <div class=\"content-body\" [class.home-content]=\"isAtHomeLevel\">\n @if (!selectedEntity) {\n <!-- Concept D: Application Groups + Search-First Home View -->\n <div class=\"home-view-concept-d\">\n @if (isLoadingEntities) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading your data...\" size=\"medium\"></mj-loading>\n </div>\n } @else {\n <div class=\"home-main-area\" [class.panel-open]=\"state.quickAccessPanelOpen\">\n <!-- Search Hero -->\n <div class=\"search-hero\">\n <div class=\"search-hero-container\">\n <i class=\"fa-solid fa-magnifying-glass search-hero-icon\"></i>\n <input\n #filterInput\n type=\"text\"\n class=\"search-hero-input\"\n placeholder=\"Search your data...\"\n [(ngModel)]=\"entityFilterText\"\n />\n @if (entityFilterText) {\n <button class=\"search-hero-clear\" (click)=\"entityFilterText = ''\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n } @else {\n <span class=\"search-hero-shortcut\">/</span>\n }\n </div>\n\n <!-- Meta row: entity count + All/Favorites pills -->\n <div class=\"search-meta-row\">\n <span class=\"search-entity-count\">\n {{ filteredEntityCount }} record types\n @if (applicationCount > 0) {\n across {{ applicationCount }} apps\n }\n </span>\n <div class=\"pill-toggle\">\n <button\n class=\"pill-btn\"\n [class.active]=\"state.homeViewMode === 'all'\"\n (click)=\"setHomeViewMode('all')\">\n All Data\n </button>\n <button\n class=\"pill-btn\"\n [class.active]=\"state.homeViewMode === 'favorites'\"\n (click)=\"setHomeViewMode('favorites')\">\n <i class=\"fa-solid fa-star\"></i> My Favorites\n </button>\n </div>\n </div>\n </div>\n\n <!-- Entity Groups Area -->\n <div class=\"entity-groups-area\">\n @if (entityFilter?.applicationId) {\n <!-- Single-app mode: flat entity grid (no grouping) -->\n <div class=\"entity-item-grid\">\n @for (entity of flatFilteredEntities; track entity.ID) {\n <div\n class=\"entity-item\"\n (click)=\"onEntitySelected(entity)\"\n [title]=\"entity.Description || entity.DisplayNameOrName\">\n <div class=\"entity-item-icon\">\n <i [class]=\"getEntityIcon(entity)\"></i>\n </div>\n <div class=\"entity-item-text\">\n <span class=\"entity-item-name\">{{ entity.DisplayNameOrName }}</span>\n @if (entity.Description) {\n <span class=\"entity-item-desc\">{{ entity.Description }}</span>\n }\n </div>\n <button\n class=\"entity-item-fav\"\n [class.favorited]=\"isEntityFavorited(entity)\"\n (click)=\"toggleEntityFavorite(entity, $event)\"\n [title]=\"isEntityFavorited(entity) ? 'Remove from favorites' : 'Add to favorites'\">\n <i [class]=\"isEntityFavorited(entity) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n </div>\n }\n </div>\n } @else {\n <!-- Multi-app mode: grouped by application -->\n @for (group of filteredAppEntityGroups; track group.applicationId) {\n <div class=\"app-group\">\n <div class=\"app-group-header\" (click)=\"toggleAppGroup(group.applicationId)\">\n <div\n class=\"app-group-icon\"\n [style.background]=\"group.applicationColor ? group.applicationColor + '15' : null\"\n [style.color]=\"group.applicationColor || null\">\n <i [class]=\"group.applicationIcon || 'fa-solid fa-folder'\"></i>\n </div>\n <span class=\"app-group-name\">{{ group.applicationName }}</span>\n <span class=\"app-group-count\">{{ group.entities.length }}</span>\n <i class=\"fa-solid fa-chevron-right app-group-chevron\"\n [class.expanded]=\"group.isExpanded\"></i>\n </div>\n @if (group.isExpanded) {\n <div class=\"app-group-entities\">\n <div class=\"entity-item-grid\">\n @for (entity of group.entities; track entity.ID) {\n <div\n class=\"entity-item\"\n (click)=\"onEntitySelected(entity)\"\n [title]=\"entity.Description || entity.DisplayNameOrName\">\n <div class=\"entity-item-icon\">\n <i [class]=\"getEntityIcon(entity)\"></i>\n </div>\n <div class=\"entity-item-text\">\n <span class=\"entity-item-name\">{{ entity.DisplayNameOrName }}</span>\n @if (entity.Description) {\n <span class=\"entity-item-desc\">{{ entity.Description }}</span>\n }\n </div>\n <button\n class=\"entity-item-fav\"\n [class.favorited]=\"isEntityFavorited(entity)\"\n (click)=\"toggleEntityFavorite(entity, $event)\"\n [title]=\"isEntityFavorited(entity) ? 'Remove from favorites' : 'Add to favorites'\">\n <i [class]=\"isEntityFavorited(entity) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n\n <!-- No results -->\n @if (filteredEntityCount === 0 && entities.length > 0) {\n <mj-empty-state Variant=\"no-results\"\n Title=\"No matches found\"\n [Message]=\"NoEntityResultsMessage\" />\n }\n @if (entities.length === 0) {\n <mj-empty-state Icon=\"fa-solid fa-database\"\n Title=\"Nothing here yet\"\n Message=\"This app doesn't have any data set up yet. An administrator can add data for you to explore here.\" />\n }\n </div>\n </div>\n\n <!-- Quick Access Panel (right slide-in) -->\n <div class=\"quick-access-panel\" [class.open]=\"state.quickAccessPanelOpen\">\n <div class=\"qa-header\">\n <h3>Quick Access</h3>\n <button class=\"qa-close-btn\" (click)=\"toggleQuickAccessPanel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"qa-body\">\n <!-- Recent Records (max 3) -->\n <mj-accordion-panel [Expanded]=\"isQuickAccessSectionExpanded('recentRecords')\" (ExpandedChange)=\"toggleQuickAccessSection('recentRecords')\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-clock-rotate-left qa-section-icon\"></i>\n <span>Recent Records</span>\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{ quickAccessRecentRecords.length }}</span>\n </ng-template>\n @for (record of quickAccessRecentRecords; track record.entityId + '|' + record.recordId) {\n <div class=\"qa-item\" (click)=\"onRecentRecordClick(record)\">\n <div class=\"qa-item-icon\">\n <i [class]=\"getEntityIconById(record.entityId)\"></i>\n </div>\n <div class=\"qa-item-info\">\n <div class=\"qa-item-name\">{{ record.recordName || record.recordId }}</div>\n <div class=\"qa-item-meta\">{{ getEntityDisplayName(record.entityName) }}</div>\n </div>\n <span class=\"qa-item-time\">{{ record.relativeTime }}</span>\n </div>\n }\n @if (quickAccessRecentRecords.length === 0) {\n <div class=\"qa-empty\">No recent records</div>\n }\n </mj-accordion-panel>\n\n <!-- Recent Entities (max 3) -->\n <mj-accordion-panel [Expanded]=\"isQuickAccessSectionExpanded('recentEntities')\" (ExpandedChange)=\"toggleQuickAccessSection('recentEntities')\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-table qa-section-icon\"></i>\n <span>Recent Record Types</span>\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{ quickAccessRecentEntities.length }}</span>\n </ng-template>\n @for (entity of quickAccessRecentEntities; track entity.ID) {\n <div class=\"qa-item\" (click)=\"onEntitySelected(entity)\">\n <div class=\"qa-item-icon\">\n <i [class]=\"getEntityIcon(entity)\"></i>\n </div>\n <div class=\"qa-item-info\">\n <div class=\"qa-item-name\">{{ entity.DisplayNameOrName }}</div>\n </div>\n </div>\n }\n @if (quickAccessRecentEntities.length === 0) {\n <div class=\"qa-empty\">No recent record types</div>\n }\n </mj-accordion-panel>\n\n <!-- Favorite Records (max 3) -->\n <mj-accordion-panel [Expanded]=\"isQuickAccessSectionExpanded('favoriteRecords')\" (ExpandedChange)=\"toggleQuickAccessSection('favoriteRecords')\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-star qa-section-icon\" style=\"color: var(--mj-status-warning);\"></i>\n <span>Favorite Records</span>\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{ quickAccessFavoriteRecords.length }}</span>\n </ng-template>\n @for (record of quickAccessFavoriteRecords; track record.userFavoriteId) {\n <div class=\"qa-item\" (click)=\"onFavoriteRecordClick(record)\">\n <div class=\"qa-item-icon\">\n <i [class]=\"getEntityIconById(record.entityId)\"></i>\n </div>\n <div class=\"qa-item-info\">\n <div class=\"qa-item-name\">{{ record.recordName || record.recordId }}</div>\n <div class=\"qa-item-meta\">{{ getEntityDisplayName(record.entityName) }}</div>\n </div>\n </div>\n }\n @if (quickAccessFavoriteRecords.length === 0) {\n <div class=\"qa-empty\">No favorite records</div>\n }\n </mj-accordion-panel>\n </div>\n </div>\n }\n </div>\n } @else {\n <!--\n mj-view-workspace owns the saved-view lifecycle (select / save / duplicate / rename /\n delete / revert / quick-save) and the inner data renderer. Every view type is now a\n self-contained plug-in: view-type-specific features (export / add-to-list / delete /\n grid-state / timeline + map controls) live INSIDE the plug-in renderers and no longer\n bubble through the workspace. The dashboard only handles navigation (open record / open\n related record / create new record) + the generic filter/data-load/count signals + URL\n and view-CRUD state sync. AutoSaveView=true \u2192 the workspace persists view CRUD itself.\n -->\n <mj-view-workspace\n [Entity]=\"selectedEntity\"\n [AutoSaveView]=\"true\"\n [SelectedView]=\"selectedViewEntity\"\n [FilterText]=\"debouncedFilterText\"\n [SelectedRecordId]=\"state.selectedRecordId\"\n [ViewerConfig]=\"viewerConfig\"\n (SelectedViewChange)=\"onWorkspaceViewSelected($event)\"\n (ViewSelected)=\"onWorkspaceViewSelected($event)\"\n (OpenViewInTabRequested)=\"onOpenInTabRequested($event)\"\n (OpenRecordRequested)=\"onWorkspaceOpenRecord($event)\"\n (OpenRelatedRecordRequested)=\"onOpenRelatedRecordRequested($event)\"\n (CreateNewRecordRequested)=\"onCreateNewRecordRequested($event)\"\n (RecordSelected)=\"onViewerRecordSelected($event)\"\n (AfterViewSave)=\"onWorkspaceViewSaved()\"\n (AfterViewDelete)=\"onWorkspaceViewSaved()\"\n (FilterTextChanged)=\"onFilterTextChanged($event)\"\n (DataLoaded)=\"onDataLoaded($event)\"\n (FilteredCountChanged)=\"onFilteredCountChanged($event)\">\n </mj-view-workspace>\n }\n </div>\n </div>\n\n <!-- Detail Panel (Right - Slide In) -->\n @if (state.detailPanelOpen && selectedRecord) {\n <div class=\"detail-panel\" [style.width.px]=\"state.detailPanelWidth\">\n <mj-entity-record-detail-panel\n [entity]=\"detailPanelEntity\"\n [record]=\"selectedRecord\"\n (close)=\"onDetailPanelClosed()\"\n (openRecord)=\"onOpenRecord($event)\"\n (navigateToRelated)=\"onNavigateToRelated($event)\"\n (openRelatedRecord)=\"onOpenRelatedRecord($event)\"\n (openForeignKeyRecord)=\"onOpenForeignKeyRecord($event)\">\n </mj-entity-record-detail-panel>\n </div>\n }\n\n <!-- View config panel, filter dialog, quick-save/duplicate/shared-view-warning dialogs\n now live inside mj-view-workspace (the saved-view lifecycle moved there).\n Export + Add-to-List dialogs now live inside the grid plug-in renderer (it hosts its own\n Generic dialogs), so they are no longer rendered at the dashboard level. -->\n</div>\n", styles: [".data-explorer-container {\n display: flex;\n height: 100%;\n width: 100%;\n background: var(--mj-bg-surface-card);\n overflow: hidden;\n}\n\n.navigation-panel {\n flex-shrink: 0;\n height: 100%;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n transition: width 0.2s ease-in-out;\n overflow: hidden;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.04);\n}\n.navigation-panel.collapsed {\n width: 48px;\n}\n\n.content-area {\n flex: 1;\n display: flex;\n flex-direction: column;\n height: 100%;\n min-width: 0;\n overflow: hidden;\n background: var(--mj-bg-surface-card);\n}\n\n/* Breadcrumb Bar */\n.breadcrumb-bar {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n font-size: 13px;\n min-height: 40px;\n}\n\n.breadcrumb-item {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-text-secondary);\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.15s ease;\n max-width: 200px;\n}\n\n.breadcrumb-item.clickable {\n cursor: pointer;\n}\n\n.breadcrumb-item.clickable:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n}\n\n.breadcrumb-item.current {\n color: var(--mj-text-primary);\n font-weight: 500;\n cursor: default;\n}\n\n.breadcrumb-icon {\n font-size: 12px;\n flex-shrink: 0;\n}\n\n.breadcrumb-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.breadcrumb-separator {\n font-size: 10px;\n color: var(--mj-border-strong);\n flex-shrink: 0;\n}\n\n.content-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n gap: 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n position: relative;\n z-index: 2; /* Above sibling .content-body so header dropdowns render on top of grid/map content */\n}\n\n.header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n flex-wrap: wrap;\n}\n\n/* View Selector within header */\n.header-left ::ng-deep mj-view-selector {\n margin-left: 8px;\n}\n\n.entity-icon {\n font-size: 20px;\n color: var(--mj-brand-primary);\n}\n\n.entity-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.record-count {\n font-size: 13px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.header-center {\n flex: 1;\n max-width: 600px;\n}\n\n.smart-filter-container {\n position: relative;\n width: 100%;\n}\n\n.smart-filter-input {\n width: 100%;\n padding: 10px 40px 10px 16px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 8px;\n font-size: 14px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n transition: all 0.15s ease;\n}\n.smart-filter-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n.smart-filter-input::placeholder {\n color: var(--mj-text-muted);\n}\n\n.clear-filter-btn {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n.clear-filter-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n.header-right {\n display: flex;\n align-items: center;\n gap: 16px;\n flex-shrink: 0;\n}\n\n.view-mode-toggle {\n display: flex;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 3px;\n}\n\n.toggle-btn {\n width: 36px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n.toggle-btn:hover {\n color: var(--mj-text-primary);\n}\n.toggle-btn.active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* Header Action Button (Add to List, etc.) */\n.header-action-btn {\n position: relative;\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n margin-left: 8px;\n}\n.header-action-btn:hover:not(.disabled) {\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.header-action-btn.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.header-action-btn i {\n font-size: 14px;\n}\n.selection-badge {\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 11px;\n font-weight: 600;\n border-radius: 9px;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n}\n\n/* Timeline Date Field Selector - Styled Dropdown */\n.date-field-selector-container {\n display: flex;\n align-items: center;\n position: relative;\n}\n\n.date-field-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n background: transparent;\n}\n\n.date-field-selector-wrapper {\n position: relative;\n}\n\n.date-field-selector-button {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-primary);\n transition: all 0.15s ease;\n min-width: 120px;\n max-width: 200px;\n}\n\n.date-field-selector-button:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.date-field-selector-button:disabled {\n cursor: default;\n opacity: 0.8;\n}\n\n.date-field-selector-button.open {\n background: var(--mj-bg-surface-active);\n border-color: var(--mj-brand-primary);\n}\n\n.date-field-icon {\n color: var(--mj-text-secondary);\n font-size: 12px;\n}\n\n.date-field-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: left;\n}\n\n.date-field-arrow {\n color: var(--mj-text-secondary);\n font-size: 10px;\n transition: transform 0.2s ease;\n}\n\n.date-field-arrow.rotated {\n transform: rotate(180deg);\n}\n\n.date-field-dropdown-panel {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n min-width: 180px;\n max-width: 280px;\n max-height: 300px;\n overflow-y: auto;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n z-index: 1000;\n}\n\n.date-field-dropdown-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n cursor: pointer;\n transition: background 0.1s ease;\n font-size: 13px;\n}\n\n.date-field-dropdown-item:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.date-field-dropdown-item.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.date-field-dropdown-item.selected:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n}\n\n.date-field-dropdown-item .item-icon {\n color: var(--mj-text-secondary);\n font-size: 13px;\n width: 16px;\n text-align: center;\n}\n\n.date-field-dropdown-item .item-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.date-field-dropdown-item .selected-check {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n/* View-specific controls \u2014 contextual controls for the active view mode.\n Positioned LEFT of the view mode toggle with a subtle visual separator. */\n.view-specific-controls {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n border: 1px solid var(--mj-border-subtle);\n}\n\n.view-specific-btn {\n width: 30px;\n height: 30px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.view-specific-btn:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-hover);\n}\n\n/* Legacy \u2014 keep for backward compat but no longer used in template */\n.timeline-orientation-toggle {\n display: flex;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 3px;\n}\n\n.content-body {\n display: flex;\n flex: 1 1 0%;\n overflow: hidden;\n /* Contain the body's stacking context. The view components inside (grid\n option menus, the map's Leaflet panes/toolbar, etc.) use z-index values up\n to ~1000; .content-header sits at z-index 2 (kept below the shell header \u2014\n see #2701). Without this, those body z-indices leak into the shared context\n and paint over the header's own dropdowns (view-selector, date-field).\n `isolation: isolate` flattens all body z-indices into one context beneath\n the header. Safe because modals + the detail panel render at the dashboard\n root (outside .content-body), so they still overlay everything. */\n isolation: isolate;\n position: relative; /* added */\n z-index: 3; /* added \u2014 higher than .content-header's z-index: 2 */\n}\n\n.loading-container,\n.loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n gap: 16px;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n}\n\n.loading-spinner {\n font-size: 32px;\n color: var(--mj-brand-primary);\n}\n\n.loading-message {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n\n/* ============================================\n CONCEPT D: HOME VIEW LAYOUT\n ============================================ */\n\n.home-view-concept-d {\n flex: 1;\n display: flex;\n overflow: hidden;\n}\n\n.home-main-area {\n flex: 1;\n overflow-y: auto;\n transition: margin-right 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.home-main-area.panel-open {\n margin-right: 320px;\n}\n\n/* ============================================\n SEARCH HERO\n ============================================ */\n\n.search-hero {\n background: var(--mj-bg-surface);\n padding: 36px 40px 24px;\n text-align: center;\n}\n\n.search-hero-container {\n position: relative;\n max-width: 600px;\n margin: 0 auto;\n}\n\n.search-hero-input {\n width: 100%;\n padding: 14px 18px 14px 44px;\n font-size: 15px;\n border: 2px solid var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n outline: none;\n transition: all 0.2s;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);\n font-family: inherit;\n}\n\n.search-hero-input:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 12px 40px rgba(0, 0, 0, 0.1), 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.search-hero-input::placeholder {\n color: var(--mj-text-primary);\n}\n\n.search-hero-icon {\n position: absolute;\n left: 16px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-primary);\n font-size: 15px;\n pointer-events: none;\n}\n\n.search-hero-shortcut {\n position: absolute;\n right: 14px;\n top: 50%;\n transform: translateY(-50%);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n padding: 2px 7px;\n border-radius: 5px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.search-hero-clear {\n position: absolute;\n right: 14px;\n top: 50%;\n transform: translateY(-50%);\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.search-hero-clear:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n/* Meta row: entity count + pills */\n.search-meta-row {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n margin-top: 16px;\n}\n\n.search-entity-count {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.pill-toggle {\n display: flex;\n gap: 6px;\n}\n\n.pill-btn {\n padding: 6px 16px;\n border-radius: 20px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n font-size: 13px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n font-family: inherit;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.pill-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.pill-btn.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.pill-btn i {\n font-size: 11px;\n}\n\n/* ============================================\n APPLICATION GROUPS\n ============================================ */\n\n.entity-groups-area {\n padding: 12px 40px 60px;\n max-width: 1200px;\n margin: 0 auto;\n}\n\n.app-group {\n margin-bottom: 4px;\n}\n\n.app-group-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 14px;\n cursor: pointer;\n border-radius: 8px;\n transition: background 0.12s;\n user-select: none;\n}\n\n.app-group-header:hover {\n background: rgba(0, 0, 0, 0.025);\n}\n\n.app-group-icon {\n width: 38px;\n height: 38px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 17px;\n flex-shrink: 0;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.app-group-name {\n font-size: 21px;\n font-weight: 600;\n flex: 1;\n}\n\n.app-group-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n padding: 2px 9px;\n border-radius: 10px;\n}\n\n.app-group-chevron {\n color: var(--mj-text-muted);\n font-size: 12px;\n transition: transform 0.2s;\n}\n\n.app-group-chevron.expanded {\n transform: rotate(90deg);\n}\n\n.app-group-entities {\n padding: 4px 14px 10px 60px;\n}\n\n/* ============================================\n ENTITY ITEM GRID (pills)\n ============================================ */\n\n.entity-item-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n gap: 12px;\n}\n\n.entity-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 10px 14px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.12s;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.entity-item:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, var(--mj-bg-surface));\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.entity-item-icon {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n}\n\n.entity-item:hover .entity-item-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.entity-item-text {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.entity-item-name {\n font-size: 14px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.entity-item-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.3;\n}\n\n.entity-item-fav {\n color: var(--mj-text-muted);\n opacity: 0;\n transition: opacity 0.12s;\n font-size: 11px;\n cursor: pointer;\n flex-shrink: 0;\n background: none;\n border: none;\n padding: 4px;\n align-self: center;\n}\n\n.entity-item:hover .entity-item-fav {\n opacity: 1;\n}\n\n.entity-item-fav.favorited {\n opacity: 1;\n color: var(--mj-status-warning);\n}\n\n/* ============================================\n QUICK ACCESS PANEL (right slide-in)\n ============================================ */\n\n.quick-access-panel {\n position: fixed;\n top: 60px;\n right: 0;\n width: 320px;\n height: calc(100% - 60px);\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n z-index: 50;\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n flex-direction: column;\n}\n\n.quick-access-panel.open {\n transform: translateX(0);\n}\n\n.qa-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.qa-header h3 {\n font-size: 14px;\n font-weight: 600;\n margin: 0;\n}\n\n.qa-close-btn {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 14px;\n padding: 4px;\n border-radius: 4px;\n}\n\n.qa-close-btn:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.qa-body {\n flex: 1;\n overflow-y: auto;\n}\n\n.qa-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.08s;\n}\n\n.qa-item:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.qa-item-icon {\n width: 28px;\n height: 28px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n flex-shrink: 0;\n}\n\n.qa-item-info {\n flex: 1;\n min-width: 0;\n}\n\n.qa-item-name {\n font-size: 13px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.qa-item-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.qa-item-time {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.qa-empty {\n padding: 20px 16px;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n/* Quick Access toggle button badge */\n.qa-badge {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n padding: 0 5px;\n border-radius: 8px;\n min-width: 16px;\n text-align: center;\n}\n\n.detail-panel {\n flex-shrink: 0;\n height: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -4px 0 16px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n animation: slideIn 0.2s ease-out;\n display: flex;\n flex-direction: column;\n}\n\n.detail-panel mj-entity-record-detail-panel {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n@keyframes slideIn {\n from {\n transform: translateX(100%);\n opacity: 0;\n }\n to {\n transform: translateX(0);\n opacity: 1;\n }\n}\n\n/* Detail Panel Actions Bar */\n.detail-panel-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.detail-action-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: none;\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.detail-action-btn:hover {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n.detail-action-btn i {\n font-size: 12px;\n}\n\n:host ::ng-deep mj-explorer-grid-view,\n:host ::ng-deep mj-explorer-cards-view {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n/* ============================================\n HOME SCREEN STYLES\n ============================================ */\n\n/* Home-level header adjustments */\n.content-header.home-header {\n border-bottom: none;\n background: transparent;\n box-shadow: none;\n padding: 16px 24px 8px;\n}\n\n.content-body.home-content {\n padding: 0;\n}\n\n/* Smart filter with search icon (entity-level filter) */\n.filter-icon {\n position: absolute;\n left: 14px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-muted);\n font-size: 14px;\n pointer-events: none;\n}\n\n.smart-filter-container .smart-filter-input {\n padding-left: 40px;\n}\n\n/* ============================================\n VIEW MODE TOGGLE OVERRIDES\n ============================================ */\n\n.view-mode-toggle .toggle-btn {\n width: auto;\n padding: 0 12px;\n gap: 6px;\n}\n\n.toggle-label {\n font-size: 12px;\n font-weight: 500;\n}\n\n/* ============================================\n RESPONSIVE STYLES\n ============================================ */\n\n@media (max-width: 1200px) {\n .entity-item-grid {\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n }\n}\n\n@media (max-width: 900px) {\n .content-header {\n flex-wrap: wrap;\n gap: 12px;\n }\n\n .header-center {\n order: 3;\n flex-basis: 100%;\n max-width: 100%;\n }\n\n .search-hero {\n padding: 24px 16px 16px;\n }\n\n .entity-groups-area {\n padding: 8px 16px 40px;\n }\n\n .app-group-entities {\n padding-left: 36px;\n }\n\n .home-main-area.panel-open {\n margin-right: 0;\n }\n\n .quick-access-panel {\n width: 100%;\n }\n}\n\n@media (max-width: 600px) {\n .data-explorer-container {\n flex-direction: column;\n }\n\n .navigation-panel {\n display: none;\n }\n\n .content-header {\n padding: 12px 16px;\n }\n\n .content-body {\n padding: 12px 16px;\n }\n\n .entity-item-grid {\n grid-template-columns: 1fr;\n }\n\n .view-mode-toggle {\n display: none;\n }\n\n .app-group-name {\n font-size: 17px;\n }\n\n .entity-item-name {\n font-size: 14px;\n }\n}\n"] }]
3465
+ ], template: "<div class=\"data-explorer-container\">\n <!-- Navigation Panel (Left) - Hidden at home level, animated -->\n @if (!isAtHomeLevel) {\n <div\n class=\"navigation-panel\"\n [class.collapsed]=\"state.navigationPanelCollapsed\"\n [style.width.px]=\"state.navigationPanelCollapsed ? 48 : state.navigationPanelWidth\"\n [@slideInLeft]>\n\n <mj-explorer-navigation-panel\n [entities]=\"entities\"\n [appEntityGroups]=\"appEntityGroups\"\n [selectedEntityName]=\"state.selectedEntityName\"\n [favorites]=\"state.favorites\"\n [recentItems]=\"state.recentItems\"\n [collapsed]=\"state.navigationPanelCollapsed\"\n [allowedEntityNames]=\"allowedEntityNames\"\n [favoritesSectionExpanded]=\"state.favoritesSectionExpanded\"\n [recentSectionExpanded]=\"state.recentSectionExpanded\"\n [entitiesSectionExpanded]=\"state.entitiesSectionExpanded\"\n [viewsSectionExpanded]=\"state.viewsSectionExpanded\"\n (entitySelected)=\"onEntitySelected($event)\"\n (toggleCollapse)=\"toggleNavigationPanel()\"\n (sectionToggled)=\"stateService.toggleSection($event)\"\n (openRecord)=\"onOpenRecordFromNav($event)\"\n (selectRecord)=\"onSelectRecordFromNav($event)\"\n (expandAndFocus)=\"onExpandAndFocus($event)\">\n </mj-explorer-navigation-panel>\n </div>\n }\n\n <!-- Main Content Area -->\n <div class=\"content-area\">\n <!-- Breadcrumb Bar - Hidden at home level -->\n @if (!isAtHomeLevel && breadcrumbs.length > 0) {\n <div class=\"breadcrumb-bar\">\n @for (crumb of breadcrumbs; track crumb.label; let i = $index; let last = $last) {\n <span\n class=\"breadcrumb-item\"\n [class.clickable]=\"!last\"\n [class.current]=\"last\"\n (click)=\"onBreadcrumbClick(crumb, i)\"\n [title]=\"crumb.label\">\n @if (crumb.icon) {\n <i [class]=\"crumb.icon\" class=\"breadcrumb-icon\"></i>\n }\n <span class=\"breadcrumb-label\">{{ crumb.label }}</span>\n </span>\n @if (!last) {\n <i class=\"fa-solid fa-chevron-right breadcrumb-separator\"></i>\n }\n }\n </div>\n }\n\n <!-- Header -->\n <div class=\"content-header\" [class.home-header]=\"isAtHomeLevel\">\n <div class=\"header-left\">\n @if (selectedEntity) {\n <i [class]=\"getEntityIcon(selectedEntity)\" class=\"entity-icon\"></i>\n <h2 class=\"entity-title\">{{ selectedEntity.DisplayNameOrName }}</h2>\n @if (debouncedFilterText && filteredRecordCount !== totalRecordCount) {\n <span class=\"record-count\">{{ filteredRecordCount | number }} of {{ totalRecordCount | number }} records</span>\n } @else {\n <span class=\"record-count\">{{ totalRecordCount | number }} records</span>\n }\n\n <!-- View selector + view header now live inside mj-view-workspace (below). -->\n <!-- Add-to-List is now owned inside the grid plug-in renderer (it hosts its own dialog). -->\n } @else {\n @if (displayIcon) {\n <i [class]=\"displayIcon\" class=\"entity-icon\"></i>\n }\n <h2 class=\"entity-title\">{{ displayTitle }}</h2>\n <span class=\"record-count\">{{ entities.length }} record types available</span>\n }\n </div>\n\n <div class=\"header-center\">\n @if (selectedEntity) {\n <div class=\"smart-filter-container\">\n <i class=\"fa-solid fa-search filter-icon\"></i>\n <input\n #filterInput\n type=\"text\"\n class=\"smart-filter-input\"\n placeholder=\"Filter records... (press / to focus)\"\n [value]=\"liveFilterText\"\n (input)=\"onFilterInputChanged(filterInput.value)\"\n />\n @if (liveFilterText) {\n <button class=\"clear-filter-btn\" (click)=\"clearRecordFilter()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n }\n <!-- Home-level search moved to search hero section -->\n </div>\n\n <div class=\"header-right\">\n @if (selectedEntity) {\n <!-- View-type switcher AND all view-specific controls (timeline date/orientation/sort,\n map render mode, etc.) now live inside the plug-in renderers hosted by\n mj-view-workspace. Nothing view-type-specific lives in this header anymore. -->\n }\n @if (!selectedEntity) {\n <!-- Quick Access panel toggle -->\n <button\n class=\"header-action-btn\"\n [class.active]=\"state.quickAccessPanelOpen\"\n (click)=\"toggleQuickAccessPanel()\"\n title=\"Recents & Favorites\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n @if (recentRecords.length + favoriteRecords.length > 0) {\n <span class=\"qa-badge\">{{ recentRecords.length + favoriteRecords.length }}</span>\n }\n </button>\n }\n </div>\n </div>\n\n <!-- Dashboards moved banner: shows with or without a selected entity.\n panel-open makes room for the Quick Access panel, which shows only on the loaded home view. -->\n @if (ShowDashboardsMovedBanner) {\n <div class=\"dx-moved-banner\" role=\"status\"\n [class.panel-open]=\"State.quickAccessPanelOpen && !SelectedEntity && !IsLoadingEntities\">\n <i class=\"fa-solid fa-gauge-high\" aria-hidden=\"true\"></i>\n <span><b>Dashboards moved.</b> They now live in the Dashboards app.</span>\n <button mjButton size=\"sm\" (click)=\"OpenDashboardsApp()\">Open Dashboards</button>\n <button mjButton size=\"sm\" variant=\"flat\" (click)=\"DismissDashboardsMovedBanner()\">Got it</button>\n </div>\n }\n\n <!-- Content Body - Using mj-entity-viewer composite -->\n <div class=\"content-body\" [class.home-content]=\"isAtHomeLevel\">\n @if (!selectedEntity) {\n <!-- Concept D: Application Groups + Search-First Home View -->\n <div class=\"home-view-concept-d\">\n @if (isLoadingEntities) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading your data...\" size=\"medium\"></mj-loading>\n </div>\n } @else {\n <div class=\"home-main-area\" [class.panel-open]=\"state.quickAccessPanelOpen\">\n <!-- Search Hero -->\n <div class=\"search-hero\">\n <div class=\"search-hero-container\">\n <i class=\"fa-solid fa-magnifying-glass search-hero-icon\"></i>\n <input\n #filterInput\n type=\"text\"\n class=\"search-hero-input\"\n placeholder=\"Search your data...\"\n [(ngModel)]=\"entityFilterText\"\n />\n @if (entityFilterText) {\n <button class=\"search-hero-clear\" (click)=\"entityFilterText = ''\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n } @else {\n <span class=\"search-hero-shortcut\">/</span>\n }\n </div>\n\n <!-- Meta row: entity count + All/Favorites pills -->\n <div class=\"search-meta-row\">\n <span class=\"search-entity-count\">\n {{ filteredEntityCount }} record types\n @if (applicationCount > 0) {\n across {{ applicationCount }} apps\n }\n </span>\n <div class=\"pill-toggle\">\n <button\n class=\"pill-btn\"\n [class.active]=\"state.homeViewMode === 'all'\"\n (click)=\"setHomeViewMode('all')\">\n All Data\n </button>\n <button\n class=\"pill-btn\"\n [class.active]=\"state.homeViewMode === 'favorites'\"\n (click)=\"setHomeViewMode('favorites')\">\n <i class=\"fa-solid fa-star\"></i> My Favorites\n </button>\n </div>\n </div>\n </div>\n\n <!-- Entity Groups Area -->\n <div class=\"entity-groups-area\">\n @if (entityFilter?.applicationId) {\n <!-- Single-app mode: flat entity grid (no grouping) -->\n <div class=\"entity-item-grid\">\n @for (entity of flatFilteredEntities; track entity.ID) {\n <div\n class=\"entity-item\"\n (click)=\"onEntitySelected(entity)\"\n [title]=\"entity.Description || entity.DisplayNameOrName\">\n <div class=\"entity-item-icon\">\n <i [class]=\"getEntityIcon(entity)\"></i>\n </div>\n <div class=\"entity-item-text\">\n <span class=\"entity-item-name\">{{ entity.DisplayNameOrName }}</span>\n @if (entity.Description) {\n <span class=\"entity-item-desc\">{{ entity.Description }}</span>\n }\n </div>\n <button\n class=\"entity-item-fav\"\n [class.favorited]=\"isEntityFavorited(entity)\"\n (click)=\"toggleEntityFavorite(entity, $event)\"\n [title]=\"isEntityFavorited(entity) ? 'Remove from favorites' : 'Add to favorites'\">\n <i [class]=\"isEntityFavorited(entity) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n </div>\n }\n </div>\n } @else {\n <!-- Multi-app mode: grouped by application -->\n @for (group of filteredAppEntityGroups; track group.applicationId) {\n <div class=\"app-group\">\n <div class=\"app-group-header\" (click)=\"toggleAppGroup(group.applicationId)\">\n <div\n class=\"app-group-icon\"\n [style.background]=\"group.applicationColor ? group.applicationColor + '15' : null\"\n [style.color]=\"group.applicationColor || null\">\n <i [class]=\"group.applicationIcon || 'fa-solid fa-folder'\"></i>\n </div>\n <span class=\"app-group-name\">{{ group.applicationName }}</span>\n <span class=\"app-group-count\">{{ group.entities.length }}</span>\n <i class=\"fa-solid fa-chevron-right app-group-chevron\"\n [class.expanded]=\"group.isExpanded\"></i>\n </div>\n @if (group.isExpanded) {\n <div class=\"app-group-entities\">\n <div class=\"entity-item-grid\">\n @for (entity of group.entities; track entity.ID) {\n <div\n class=\"entity-item\"\n (click)=\"onEntitySelected(entity)\"\n [title]=\"entity.Description || entity.DisplayNameOrName\">\n <div class=\"entity-item-icon\">\n <i [class]=\"getEntityIcon(entity)\"></i>\n </div>\n <div class=\"entity-item-text\">\n <span class=\"entity-item-name\">{{ entity.DisplayNameOrName }}</span>\n @if (entity.Description) {\n <span class=\"entity-item-desc\">{{ entity.Description }}</span>\n }\n </div>\n <button\n class=\"entity-item-fav\"\n [class.favorited]=\"isEntityFavorited(entity)\"\n (click)=\"toggleEntityFavorite(entity, $event)\"\n [title]=\"isEntityFavorited(entity) ? 'Remove from favorites' : 'Add to favorites'\">\n <i [class]=\"isEntityFavorited(entity) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n\n <!-- No results -->\n @if (filteredEntityCount === 0 && entities.length > 0) {\n <mj-empty-state Variant=\"no-results\"\n Title=\"No matches found\"\n [Message]=\"NoEntityResultsMessage\" />\n }\n @if (entities.length === 0) {\n <mj-empty-state Icon=\"fa-solid fa-database\"\n Title=\"Nothing here yet\"\n Message=\"This app doesn't have any data set up yet. An administrator can add data for you to explore here.\" />\n }\n </div>\n </div>\n\n <!-- Quick Access Panel (right slide-in) -->\n <div class=\"quick-access-panel\" [class.open]=\"state.quickAccessPanelOpen\">\n <div class=\"qa-header\">\n <h3>Quick Access</h3>\n <button class=\"qa-close-btn\" (click)=\"toggleQuickAccessPanel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"qa-body\">\n <!-- Recent Records (max 3) -->\n <mj-accordion-panel [Expanded]=\"isQuickAccessSectionExpanded('recentRecords')\" (ExpandedChange)=\"toggleQuickAccessSection('recentRecords')\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-clock-rotate-left qa-section-icon\"></i>\n <span>Recent Records</span>\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{ quickAccessRecentRecords.length }}</span>\n </ng-template>\n @for (record of quickAccessRecentRecords; track record.entityId + '|' + record.recordId) {\n <div class=\"qa-item\" (click)=\"onRecentRecordClick(record)\">\n <div class=\"qa-item-icon\">\n <i [class]=\"getEntityIconById(record.entityId)\"></i>\n </div>\n <div class=\"qa-item-info\">\n <div class=\"qa-item-name\">{{ record.recordName || record.recordId }}</div>\n <div class=\"qa-item-meta\">{{ getEntityDisplayName(record.entityName) }}</div>\n </div>\n <span class=\"qa-item-time\">{{ record.relativeTime }}</span>\n </div>\n }\n @if (quickAccessRecentRecords.length === 0) {\n <div class=\"qa-empty\">No recent records</div>\n }\n </mj-accordion-panel>\n\n <!-- Recent Entities (max 3) -->\n <mj-accordion-panel [Expanded]=\"isQuickAccessSectionExpanded('recentEntities')\" (ExpandedChange)=\"toggleQuickAccessSection('recentEntities')\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-table qa-section-icon\"></i>\n <span>Recent Record Types</span>\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{ quickAccessRecentEntities.length }}</span>\n </ng-template>\n @for (entity of quickAccessRecentEntities; track entity.ID) {\n <div class=\"qa-item\" (click)=\"onEntitySelected(entity)\">\n <div class=\"qa-item-icon\">\n <i [class]=\"getEntityIcon(entity)\"></i>\n </div>\n <div class=\"qa-item-info\">\n <div class=\"qa-item-name\">{{ entity.DisplayNameOrName }}</div>\n </div>\n </div>\n }\n @if (quickAccessRecentEntities.length === 0) {\n <div class=\"qa-empty\">No recent record types</div>\n }\n </mj-accordion-panel>\n\n <!-- Favorite Records (max 3) -->\n <mj-accordion-panel [Expanded]=\"isQuickAccessSectionExpanded('favoriteRecords')\" (ExpandedChange)=\"toggleQuickAccessSection('favoriteRecords')\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-star qa-section-icon\" style=\"color: var(--mj-status-warning);\"></i>\n <span>Favorite Records</span>\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{ quickAccessFavoriteRecords.length }}</span>\n </ng-template>\n @for (record of quickAccessFavoriteRecords; track record.userFavoriteId) {\n <div class=\"qa-item\" (click)=\"onFavoriteRecordClick(record)\">\n <div class=\"qa-item-icon\">\n <i [class]=\"getEntityIconById(record.entityId)\"></i>\n </div>\n <div class=\"qa-item-info\">\n <div class=\"qa-item-name\">{{ record.recordName || record.recordId }}</div>\n <div class=\"qa-item-meta\">{{ getEntityDisplayName(record.entityName) }}</div>\n </div>\n </div>\n }\n @if (quickAccessFavoriteRecords.length === 0) {\n <div class=\"qa-empty\">No favorite records</div>\n }\n </mj-accordion-panel>\n </div>\n </div>\n }\n </div>\n } @else {\n <!--\n mj-view-workspace owns the saved-view lifecycle (select / save / duplicate / rename /\n delete / revert / quick-save) and the inner data renderer. Every view type is now a\n self-contained plug-in: view-type-specific features (export / add-to-list / delete /\n grid-state / timeline + map controls) live INSIDE the plug-in renderers and no longer\n bubble through the workspace. The dashboard only handles navigation (open record / open\n related record / create new record) + the generic filter/data-load/count signals + URL\n and view-CRUD state sync. AutoSaveView=true \u2192 the workspace persists view CRUD itself.\n -->\n <mj-view-workspace\n [Entity]=\"selectedEntity\"\n [AutoSaveView]=\"true\"\n [SelectedView]=\"selectedViewEntity\"\n [FilterText]=\"debouncedFilterText\"\n [SelectedRecordId]=\"state.selectedRecordId\"\n [ViewerConfig]=\"viewerConfig\"\n (SelectedViewChange)=\"onWorkspaceViewSelected($event)\"\n (ViewSelected)=\"onWorkspaceViewSelected($event)\"\n (OpenViewInTabRequested)=\"onOpenInTabRequested($event)\"\n (OpenRecordRequested)=\"onWorkspaceOpenRecord($event)\"\n (OpenRelatedRecordRequested)=\"onOpenRelatedRecordRequested($event)\"\n (CreateNewRecordRequested)=\"onCreateNewRecordRequested($event)\"\n (RecordSelected)=\"onViewerRecordSelected($event)\"\n (AfterViewSave)=\"onWorkspaceViewSaved()\"\n (AfterViewDelete)=\"onWorkspaceViewSaved()\"\n (FilterTextChanged)=\"onFilterTextChanged($event)\"\n (DataLoaded)=\"onDataLoaded($event)\"\n (FilteredCountChanged)=\"onFilteredCountChanged($event)\">\n </mj-view-workspace>\n }\n </div>\n </div>\n\n <!-- Detail Panel (Right - Slide In) -->\n @if (state.detailPanelOpen && selectedRecord) {\n <div class=\"detail-panel\" [style.width.px]=\"state.detailPanelWidth\">\n <mj-entity-record-detail-panel\n [entity]=\"detailPanelEntity\"\n [record]=\"selectedRecord\"\n (close)=\"onDetailPanelClosed()\"\n (openRecord)=\"onOpenRecord($event)\"\n (navigateToRelated)=\"onNavigateToRelated($event)\"\n (openRelatedRecord)=\"onOpenRelatedRecord($event)\"\n (openForeignKeyRecord)=\"onOpenForeignKeyRecord($event)\">\n </mj-entity-record-detail-panel>\n </div>\n }\n\n <!-- View config panel, filter dialog, quick-save/duplicate/shared-view-warning dialogs\n now live inside mj-view-workspace (the saved-view lifecycle moved there).\n Export + Add-to-List dialogs now live inside the grid plug-in renderer (it hosts its own\n Generic dialogs), so they are no longer rendered at the dashboard level. -->\n</div>\n", styles: [".data-explorer-container {\n display: flex;\n height: 100%;\n width: 100%;\n background: var(--mj-bg-surface-card);\n overflow: hidden;\n}\n\n.navigation-panel {\n flex-shrink: 0;\n height: 100%;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n transition: width 0.2s ease-in-out;\n overflow: hidden;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.04);\n}\n.navigation-panel.collapsed {\n width: 48px;\n}\n\n.content-area {\n flex: 1;\n display: flex;\n flex-direction: column;\n height: 100%;\n min-width: 0;\n overflow: hidden;\n background: var(--mj-bg-surface-card);\n}\n\n/* Breadcrumb Bar */\n.breadcrumb-bar {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n font-size: 13px;\n min-height: 40px;\n}\n\n.breadcrumb-item {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-text-secondary);\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.15s ease;\n max-width: 200px;\n}\n\n.breadcrumb-item.clickable {\n cursor: pointer;\n}\n\n.breadcrumb-item.clickable:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n}\n\n.breadcrumb-item.current {\n color: var(--mj-text-primary);\n font-weight: 500;\n cursor: default;\n}\n\n.breadcrumb-icon {\n font-size: 12px;\n flex-shrink: 0;\n}\n\n.breadcrumb-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.breadcrumb-separator {\n font-size: 10px;\n color: var(--mj-border-strong);\n flex-shrink: 0;\n}\n\n.content-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n gap: 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n position: relative;\n z-index: 2; /* Above sibling .content-body so header dropdowns render on top of grid/map content */\n}\n\n.header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n flex-wrap: wrap;\n}\n\n/* View Selector within header */\n.header-left ::ng-deep mj-view-selector {\n margin-left: 8px;\n}\n\n.entity-icon {\n font-size: 20px;\n color: var(--mj-brand-primary);\n}\n\n.entity-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.record-count {\n font-size: 13px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.header-center {\n flex: 1;\n max-width: 600px;\n}\n\n.smart-filter-container {\n position: relative;\n width: 100%;\n}\n\n.smart-filter-input {\n width: 100%;\n padding: 10px 40px 10px 16px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 8px;\n font-size: 14px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n transition: all 0.15s ease;\n}\n.smart-filter-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n.smart-filter-input::placeholder {\n color: var(--mj-text-muted);\n}\n\n.clear-filter-btn {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n.clear-filter-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n.header-right {\n display: flex;\n align-items: center;\n gap: 16px;\n flex-shrink: 0;\n}\n\n.view-mode-toggle {\n display: flex;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 3px;\n}\n\n.toggle-btn {\n width: 36px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n.toggle-btn:hover {\n color: var(--mj-text-primary);\n}\n.toggle-btn.active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* Header Action Button (Add to List, etc.) */\n.header-action-btn {\n position: relative;\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n margin-left: 8px;\n}\n.header-action-btn:hover:not(.disabled) {\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.header-action-btn.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.header-action-btn i {\n font-size: 14px;\n}\n.selection-badge {\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 11px;\n font-weight: 600;\n border-radius: 9px;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n}\n\n/* Timeline Date Field Selector - Styled Dropdown */\n.date-field-selector-container {\n display: flex;\n align-items: center;\n position: relative;\n}\n\n.date-field-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n background: transparent;\n}\n\n.date-field-selector-wrapper {\n position: relative;\n}\n\n.date-field-selector-button {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-primary);\n transition: all 0.15s ease;\n min-width: 120px;\n max-width: 200px;\n}\n\n.date-field-selector-button:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.date-field-selector-button:disabled {\n cursor: default;\n opacity: 0.8;\n}\n\n.date-field-selector-button.open {\n background: var(--mj-bg-surface-active);\n border-color: var(--mj-brand-primary);\n}\n\n.date-field-icon {\n color: var(--mj-text-secondary);\n font-size: 12px;\n}\n\n.date-field-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: left;\n}\n\n.date-field-arrow {\n color: var(--mj-text-secondary);\n font-size: 10px;\n transition: transform 0.2s ease;\n}\n\n.date-field-arrow.rotated {\n transform: rotate(180deg);\n}\n\n.date-field-dropdown-panel {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n min-width: 180px;\n max-width: 280px;\n max-height: 300px;\n overflow-y: auto;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n z-index: 1000;\n}\n\n.date-field-dropdown-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n cursor: pointer;\n transition: background 0.1s ease;\n font-size: 13px;\n}\n\n.date-field-dropdown-item:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.date-field-dropdown-item.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.date-field-dropdown-item.selected:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n}\n\n.date-field-dropdown-item .item-icon {\n color: var(--mj-text-secondary);\n font-size: 13px;\n width: 16px;\n text-align: center;\n}\n\n.date-field-dropdown-item .item-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.date-field-dropdown-item .selected-check {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n/* View-specific controls \u2014 contextual controls for the active view mode.\n Positioned LEFT of the view mode toggle with a subtle visual separator. */\n.view-specific-controls {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n border: 1px solid var(--mj-border-subtle);\n}\n\n.view-specific-btn {\n width: 30px;\n height: 30px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.view-specific-btn:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-hover);\n}\n\n/* Legacy \u2014 keep for backward compat but no longer used in template */\n.timeline-orientation-toggle {\n display: flex;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 3px;\n}\n\n.content-body {\n display: flex;\n flex: 1 1 0%;\n overflow: hidden;\n /* Contain the body's stacking context. The view components inside (grid\n option menus, the map's Leaflet panes/toolbar, etc.) use z-index values up\n to ~1000; .content-header sits at z-index 2 (kept below the shell header \u2014\n see #2701). Without this, those body z-indices leak into the shared context\n and paint over the header's own dropdowns (view-selector, date-field).\n `isolation: isolate` flattens all body z-indices into one context beneath\n the header. Safe because modals + the detail panel render at the dashboard\n root (outside .content-body), so they still overlay everything. */\n isolation: isolate;\n position: relative; /* added */\n z-index: 3; /* added \u2014 higher than .content-header's z-index: 2 */\n}\n\n/* ============================================\n DASHBOARDS MOVED BANNER\n ============================================ */\n\n/* Sits between .content-header and .content-body in the .content-area column. Side margins line up with the header text. */\n.dx-moved-banner {\n display: flex;\n flex-wrap: wrap;\n flex-shrink: 0;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n margin: 12px 24px;\n border-radius: 10px;\n background: var(--mj-status-info-bg);\n color: var(--mj-status-info-text);\n font-size: 13px;\n transition: margin-right 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n/* The home header has no bottom border and ends with its own padding. */\n.content-header.home-header + .dx-moved-banner {\n margin-top: 0;\n}\n\n/* The open Quick Access panel covers the right 320px, so the banner ends 24px before it. */\n.dx-moved-banner.panel-open {\n margin-right: 344px;\n}\n\n/* The text fills the free space. When less than 200px is free, the buttons go to a second line. */\n.dx-moved-banner span {\n flex: 1 1 200px;\n}\n\n.loading-container,\n.loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n gap: 16px;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n}\n\n.loading-spinner {\n font-size: 32px;\n color: var(--mj-brand-primary);\n}\n\n.loading-message {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n\n/* ============================================\n CONCEPT D: HOME VIEW LAYOUT\n ============================================ */\n\n.home-view-concept-d {\n flex: 1;\n display: flex;\n overflow: hidden;\n}\n\n.home-main-area {\n flex: 1;\n overflow-y: auto;\n transition: margin-right 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.home-main-area.panel-open {\n margin-right: 320px;\n}\n\n/* ============================================\n SEARCH HERO\n ============================================ */\n\n.search-hero {\n background: var(--mj-bg-surface);\n padding: 36px 40px 24px;\n text-align: center;\n}\n\n.search-hero-container {\n position: relative;\n max-width: 600px;\n margin: 0 auto;\n}\n\n.search-hero-input {\n width: 100%;\n padding: 14px 18px 14px 44px;\n font-size: 15px;\n border: 2px solid var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n outline: none;\n transition: all 0.2s;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);\n font-family: inherit;\n}\n\n.search-hero-input:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 12px 40px rgba(0, 0, 0, 0.1), 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.search-hero-input::placeholder {\n color: var(--mj-text-primary);\n}\n\n.search-hero-icon {\n position: absolute;\n left: 16px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-primary);\n font-size: 15px;\n pointer-events: none;\n}\n\n.search-hero-shortcut {\n position: absolute;\n right: 14px;\n top: 50%;\n transform: translateY(-50%);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n padding: 2px 7px;\n border-radius: 5px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.search-hero-clear {\n position: absolute;\n right: 14px;\n top: 50%;\n transform: translateY(-50%);\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.search-hero-clear:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n/* Meta row: entity count + pills */\n.search-meta-row {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n margin-top: 16px;\n}\n\n.search-entity-count {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.pill-toggle {\n display: flex;\n gap: 6px;\n}\n\n.pill-btn {\n padding: 6px 16px;\n border-radius: 20px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n font-size: 13px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n font-family: inherit;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.pill-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.pill-btn.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.pill-btn i {\n font-size: 11px;\n}\n\n/* ============================================\n APPLICATION GROUPS\n ============================================ */\n\n.entity-groups-area {\n padding: 12px 40px 60px;\n max-width: 1200px;\n margin: 0 auto;\n}\n\n.app-group {\n margin-bottom: 4px;\n}\n\n.app-group-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 14px;\n cursor: pointer;\n border-radius: 8px;\n transition: background 0.12s;\n user-select: none;\n}\n\n.app-group-header:hover {\n background: rgba(0, 0, 0, 0.025);\n}\n\n.app-group-icon {\n width: 38px;\n height: 38px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 17px;\n flex-shrink: 0;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.app-group-name {\n font-size: 21px;\n font-weight: 600;\n flex: 1;\n}\n\n.app-group-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n padding: 2px 9px;\n border-radius: 10px;\n}\n\n.app-group-chevron {\n color: var(--mj-text-muted);\n font-size: 12px;\n transition: transform 0.2s;\n}\n\n.app-group-chevron.expanded {\n transform: rotate(90deg);\n}\n\n.app-group-entities {\n padding: 4px 14px 10px 60px;\n}\n\n/* ============================================\n ENTITY ITEM GRID (pills)\n ============================================ */\n\n.entity-item-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n gap: 12px;\n}\n\n.entity-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 10px 14px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.12s;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.entity-item:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, var(--mj-bg-surface));\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.entity-item-icon {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n}\n\n.entity-item:hover .entity-item-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.entity-item-text {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.entity-item-name {\n font-size: 14px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.entity-item-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.3;\n}\n\n.entity-item-fav {\n color: var(--mj-text-muted);\n opacity: 0;\n transition: opacity 0.12s;\n font-size: 11px;\n cursor: pointer;\n flex-shrink: 0;\n background: none;\n border: none;\n padding: 4px;\n align-self: center;\n}\n\n.entity-item:hover .entity-item-fav {\n opacity: 1;\n}\n\n.entity-item-fav.favorited {\n opacity: 1;\n color: var(--mj-status-warning);\n}\n\n/* ============================================\n QUICK ACCESS PANEL (right slide-in)\n ============================================ */\n\n.quick-access-panel {\n position: fixed;\n top: 60px;\n right: 0;\n width: 320px;\n height: calc(100% - 60px);\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n z-index: 50;\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n flex-direction: column;\n}\n\n.quick-access-panel.open {\n transform: translateX(0);\n}\n\n.qa-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.qa-header h3 {\n font-size: 14px;\n font-weight: 600;\n margin: 0;\n}\n\n.qa-close-btn {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 14px;\n padding: 4px;\n border-radius: 4px;\n}\n\n.qa-close-btn:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.qa-body {\n flex: 1;\n overflow-y: auto;\n}\n\n.qa-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.08s;\n}\n\n.qa-item:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.qa-item-icon {\n width: 28px;\n height: 28px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n flex-shrink: 0;\n}\n\n.qa-item-info {\n flex: 1;\n min-width: 0;\n}\n\n.qa-item-name {\n font-size: 13px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.qa-item-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.qa-item-time {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.qa-empty {\n padding: 20px 16px;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n/* Quick Access toggle button badge */\n.qa-badge {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n padding: 0 5px;\n border-radius: 8px;\n min-width: 16px;\n text-align: center;\n}\n\n.detail-panel {\n flex-shrink: 0;\n height: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -4px 0 16px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n animation: slideIn 0.2s ease-out;\n display: flex;\n flex-direction: column;\n}\n\n.detail-panel mj-entity-record-detail-panel {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n@keyframes slideIn {\n from {\n transform: translateX(100%);\n opacity: 0;\n }\n to {\n transform: translateX(0);\n opacity: 1;\n }\n}\n\n/* Detail Panel Actions Bar */\n.detail-panel-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.detail-action-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: none;\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.detail-action-btn:hover {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n.detail-action-btn i {\n font-size: 12px;\n}\n\n:host ::ng-deep mj-explorer-grid-view,\n:host ::ng-deep mj-explorer-cards-view {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n/* ============================================\n HOME SCREEN STYLES\n ============================================ */\n\n/* Home-level header adjustments */\n.content-header.home-header {\n border-bottom: none;\n background: transparent;\n box-shadow: none;\n padding: 16px 24px 8px;\n}\n\n.content-body.home-content {\n padding: 0;\n}\n\n/* Smart filter with search icon (entity-level filter) */\n.filter-icon {\n position: absolute;\n left: 14px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-muted);\n font-size: 14px;\n pointer-events: none;\n}\n\n.smart-filter-container .smart-filter-input {\n padding-left: 40px;\n}\n\n/* ============================================\n VIEW MODE TOGGLE OVERRIDES\n ============================================ */\n\n.view-mode-toggle .toggle-btn {\n width: auto;\n padding: 0 12px;\n gap: 6px;\n}\n\n.toggle-label {\n font-size: 12px;\n font-weight: 500;\n}\n\n/* ============================================\n RESPONSIVE STYLES\n ============================================ */\n\n@media (max-width: 1200px) {\n .entity-item-grid {\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n }\n}\n\n@media (max-width: 900px) {\n .content-header {\n flex-wrap: wrap;\n gap: 12px;\n }\n\n .header-center {\n order: 3;\n flex-basis: 100%;\n max-width: 100%;\n }\n\n .search-hero {\n padding: 24px 16px 16px;\n }\n\n .entity-groups-area {\n padding: 8px 16px 40px;\n }\n\n .app-group-entities {\n padding-left: 36px;\n }\n\n .home-main-area.panel-open {\n margin-right: 0;\n }\n\n .quick-access-panel {\n width: 100%;\n }\n\n /* The Quick Access panel covers the full width here, so the banner keeps its normal margin. */\n .dx-moved-banner.panel-open {\n margin-right: 24px;\n }\n}\n\n@media (max-width: 600px) {\n .data-explorer-container {\n flex-direction: column;\n }\n\n .navigation-panel {\n display: none;\n }\n\n .content-header {\n padding: 12px 16px;\n }\n\n .content-body {\n padding: 12px 16px;\n }\n\n /* The entity header has 16px side padding here. The home header keeps 24px. */\n .content-header:not(.home-header) + .dx-moved-banner {\n margin-left: 16px;\n margin-right: 16px;\n }\n\n .entity-item-grid {\n grid-template-columns: 1fr;\n }\n\n .view-mode-toggle {\n display: none;\n }\n\n .app-group-name {\n font-size: 17px;\n }\n\n .entity-item-name {\n font-size: 14px;\n }\n}\n"] }]
3383
3466
  }], () => [{ type: i1.ExplorerStateService }, { type: i0.ChangeDetectorRef }, { type: i2.RecentAccessService }, { type: i0.NgZone }], { FilterInputRef: [{
3384
3467
  type: ViewChild,
3385
3468
  args: ['filterInput']
@@ -3412,5 +3495,5 @@ export { DataExplorerDashboardComponent };
3412
3495
  type: HostListener,
3413
3496
  args: ['document:keydown', ['$event']]
3414
3497
  }] }); })();
3415
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(DataExplorerDashboardComponent, { className: "DataExplorerDashboardComponent", filePath: "src/DataExplorer/data-explorer-dashboard.component.ts", lineNumber: 64 }); })();
3498
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(DataExplorerDashboardComponent, { className: "DataExplorerDashboardComponent", filePath: "src/DataExplorer/data-explorer-dashboard.component.ts", lineNumber: 67 }); })();
3416
3499
  //# sourceMappingURL=data-explorer-dashboard.component.js.map