@memberjunction/ng-dashboards 4.4.0 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.js +6 -6
  2. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  3. package/dist/AI/components/agents/agent-editor.component.js +3 -3
  4. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
  6. package/dist/AI/components/charts/performance-heatmap.component.js +2 -2
  7. package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -1
  8. package/dist/AI/components/execution-monitoring.component.js +1 -1
  9. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  10. package/dist/AI/components/models/model-management.component.d.ts +3 -3
  11. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  12. package/dist/AI/components/models/model-management.component.js +3 -3
  13. package/dist/AI/components/models/model-management.component.js.map +1 -1
  14. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +2 -2
  15. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  16. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +2 -2
  17. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  18. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +4 -4
  19. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +1 -1
  20. package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +1 -1
  21. package/dist/AI/components/prompts/prompt-management.component.d.ts +5 -5
  22. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  23. package/dist/AI/components/prompts/prompt-management.component.js +11 -11
  24. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  25. package/dist/AI/components/prompts/prompt-version-control.component.d.ts +4 -4
  26. package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
  27. package/dist/AI/components/prompts/prompt-version-control.component.js +4 -4
  28. package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
  29. package/dist/AI/components/system/system-config-filter-panel.component.d.ts +3 -3
  30. package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +1 -1
  31. package/dist/AI/components/system/system-config-filter-panel.component.js.map +1 -1
  32. package/dist/AI/components/system/system-configuration.component.d.ts +6 -6
  33. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  34. package/dist/AI/components/system/system-configuration.component.js +1 -1
  35. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  36. package/dist/APIKeys/api-applications-panel.component.d.ts +6 -6
  37. package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
  38. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  39. package/dist/APIKeys/api-key-create-dialog.component.d.ts +2 -2
  40. package/dist/APIKeys/api-key-create-dialog.component.d.ts.map +1 -1
  41. package/dist/APIKeys/api-key-edit-panel.component.d.ts +5 -5
  42. package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
  43. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  44. package/dist/APIKeys/api-key-list.component.d.ts +8 -8
  45. package/dist/APIKeys/api-key-list.component.d.ts.map +1 -1
  46. package/dist/APIKeys/api-key-list.component.js.map +1 -1
  47. package/dist/APIKeys/api-keys-resource.component.d.ts +6 -6
  48. package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
  49. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  50. package/dist/APIKeys/api-scopes-panel.component.d.ts +8 -8
  51. package/dist/APIKeys/api-scopes-panel.component.d.ts.map +1 -1
  52. package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
  53. package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
  54. package/dist/Actions/components/actions-list-view.component.d.ts +7 -7
  55. package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -1
  56. package/dist/Actions/components/actions-list-view.component.js +3 -3
  57. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  58. package/dist/Actions/components/actions-overview.component.d.ts +8 -8
  59. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  60. package/dist/Actions/components/actions-overview.component.js +7 -7
  61. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  62. package/dist/Actions/components/categories-list-view.component.d.ts +4 -4
  63. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  64. package/dist/Actions/components/categories-list-view.component.js +3 -3
  65. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  66. package/dist/Actions/components/execution-monitoring.component.d.ts +6 -6
  67. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
  68. package/dist/Actions/components/execution-monitoring.component.js +4 -4
  69. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  70. package/dist/Actions/components/explorer/action-breadcrumb.component.d.ts +2 -2
  71. package/dist/Actions/components/explorer/action-breadcrumb.component.d.ts.map +1 -1
  72. package/dist/Actions/components/explorer/action-breadcrumb.component.js.map +1 -1
  73. package/dist/Actions/components/explorer/action-card.component.d.ts +2 -2
  74. package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -1
  75. package/dist/Actions/components/explorer/action-card.component.js +2 -2
  76. package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
  77. package/dist/Actions/components/explorer/action-explorer.component.d.ts +7 -7
  78. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  79. package/dist/Actions/components/explorer/action-explorer.component.js +4 -4
  80. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  81. package/dist/Actions/components/explorer/action-list-item.component.d.ts +2 -2
  82. package/dist/Actions/components/explorer/action-list-item.component.d.ts.map +1 -1
  83. package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -1
  84. package/dist/Actions/components/explorer/action-tree-panel.component.d.ts +5 -5
  85. package/dist/Actions/components/explorer/action-tree-panel.component.d.ts.map +1 -1
  86. package/dist/Actions/components/explorer/action-tree-panel.component.js.map +1 -1
  87. package/dist/Actions/components/explorer/new-action-panel.component.d.ts +3 -3
  88. package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -1
  89. package/dist/Actions/components/explorer/new-action-panel.component.js +2 -2
  90. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  91. package/dist/Actions/components/explorer/new-category-panel.component.d.ts +3 -3
  92. package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -1
  93. package/dist/Actions/components/explorer/new-category-panel.component.js +1 -1
  94. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  95. package/dist/Actions/components/scheduled-actions.component.js +1 -1
  96. package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
  97. package/dist/Communication/communication-logs-resource.component.d.ts +3 -3
  98. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  99. package/dist/Communication/communication-logs-resource.component.js +1 -1
  100. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  101. package/dist/Communication/communication-monitor-resource.component.d.ts +4 -4
  102. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  103. package/dist/Communication/communication-monitor-resource.component.js +6 -6
  104. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  105. package/dist/Communication/communication-providers-resource.component.d.ts +4 -4
  106. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  107. package/dist/Communication/communication-providers-resource.component.js +5 -5
  108. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  109. package/dist/Communication/communication-runs-resource.component.d.ts +2 -2
  110. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  111. package/dist/Communication/communication-runs-resource.component.js +4 -4
  112. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  113. package/dist/Communication/communication-templates-resource.component.d.ts +3 -3
  114. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  115. package/dist/Communication/communication-templates-resource.component.js +5 -5
  116. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  117. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  118. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +1 -1
  119. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
  120. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +13 -13
  121. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  122. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +1 -1
  123. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  124. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +8 -8
  125. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  126. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +1 -1
  127. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  128. package/dist/ComponentStudio/services/component-version.service.d.ts +1 -1
  129. package/dist/ComponentStudio/services/component-version.service.js +3 -3
  130. package/dist/ComponentStudio/services/component-version.service.js.map +1 -1
  131. package/dist/Credentials/components/credentials-audit-resource.component.d.ts +2 -2
  132. package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
  133. package/dist/Credentials/components/credentials-audit-resource.component.js +1 -1
  134. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  135. package/dist/Credentials/components/credentials-categories-resource.component.d.ts +6 -6
  136. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  137. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  138. package/dist/Credentials/components/credentials-list-resource.component.d.ts +18 -18
  139. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  140. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  141. package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
  142. package/dist/Credentials/components/credentials-overview-resource.component.js +1 -1
  143. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  144. package/dist/Credentials/components/credentials-types-resource.component.d.ts +4 -4
  145. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  146. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  147. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +7 -7
  148. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  149. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +2 -2
  150. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  151. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +9 -9
  152. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
  153. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +1 -1
  154. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  155. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +3 -3
  156. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
  157. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +60 -2
  158. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
  159. package/dist/DataExplorer/components/view-selector/view-selector.component.js +454 -107
  160. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
  161. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +81 -2
  162. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  163. package/dist/DataExplorer/data-explorer-dashboard.component.js +557 -185
  164. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  165. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  166. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  167. package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
  168. package/dist/DataExplorer/services/explorer-state.service.js +6 -6
  169. package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
  170. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  171. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  172. package/dist/Home/home-dashboard.component.d.ts +8 -8
  173. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  174. package/dist/Home/home-dashboard.component.js +1 -1
  175. package/dist/Home/home-dashboard.component.js.map +1 -1
  176. package/dist/Lists/components/lists-browse-resource.component.d.ts +7 -7
  177. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  178. package/dist/Lists/components/lists-browse-resource.component.js +8 -8
  179. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  180. package/dist/Lists/components/lists-categories-resource.component.d.ts +10 -10
  181. package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
  182. package/dist/Lists/components/lists-categories-resource.component.js +3 -3
  183. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  184. package/dist/Lists/components/lists-my-lists-resource.component.d.ts +9 -9
  185. package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
  186. package/dist/Lists/components/lists-my-lists-resource.component.js +7 -7
  187. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  188. package/dist/Lists/components/lists-operations-resource.component.d.ts +6 -6
  189. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  190. package/dist/Lists/components/lists-operations-resource.component.js +4 -4
  191. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  192. package/dist/Lists/services/list-set-operations.service.d.ts +2 -2
  193. package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
  194. package/dist/Lists/services/list-set-operations.service.js +2 -2
  195. package/dist/Lists/services/list-set-operations.service.js.map +1 -1
  196. package/dist/MCP/components/mcp-connection-dialog.component.d.ts +2 -2
  197. package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -1
  198. package/dist/MCP/components/mcp-connection-dialog.component.js +1 -1
  199. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  200. package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
  201. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  202. package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
  203. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  204. package/dist/Scheduling/components/scheduling-jobs.component.js +1 -1
  205. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  206. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  207. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  208. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  209. package/dist/Testing/components/testing-explorer.component.d.ts +4 -4
  210. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  211. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  212. package/dist/Testing/services/testing-instrumentation.service.js.map +1 -1
  213. package/dist/VersionHistory/components/diff-resource.component.d.ts +5 -5
  214. package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
  215. package/dist/VersionHistory/components/diff-resource.component.js +3 -3
  216. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  217. package/dist/VersionHistory/components/labels-resource.component.d.ts +7 -7
  218. package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
  219. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  220. package/dist/VersionHistory/components/restore-resource.component.d.ts +4 -4
  221. package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
  222. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  223. package/package.json +38 -38
@@ -1,7 +1,8 @@
1
- import { Component, Input, Output, EventEmitter } from '@angular/core';
1
+ import { Component, Input, Output, EventEmitter, ViewEncapsulation } from '@angular/core';
2
2
  import { Metadata, RunView } from '@memberjunction/core';
3
3
  import { Subject } from 'rxjs';
4
4
  import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/forms";
5
6
  const _forTrack0 = ($index, $item) => $item.id;
6
7
  function ViewSelectorComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
7
8
  const _r1 = i0.ɵɵgetCurrentView();
@@ -15,116 +16,291 @@ function ViewSelectorComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
15
16
  i0.ɵɵelementEnd();
16
17
  } }
17
18
  function ViewSelectorComponent_Conditional_9_Conditional_5_Template(rf, ctx) { if (rf & 1) {
18
- i0.ɵɵelement(0, "i", 20);
19
+ i0.ɵɵelementStart(0, "span", 20);
20
+ i0.ɵɵtext(1);
21
+ i0.ɵɵelementEnd();
22
+ } if (rf & 2) {
23
+ const ctx_r1 = i0.ɵɵnextContext(2);
24
+ i0.ɵɵadvance();
25
+ i0.ɵɵtextInterpolate(ctx_r1.entity.DisplayNameOrName);
26
+ } }
27
+ function ViewSelectorComponent_Conditional_9_Conditional_18_Template(rf, ctx) { if (rf & 1) {
28
+ i0.ɵɵelement(0, "i", 32);
29
+ } }
30
+ function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_6_Template(rf, ctx) { if (rf & 1) {
31
+ i0.ɵɵelementStart(0, "span", 44);
32
+ i0.ɵɵtext(1, "Default");
33
+ i0.ɵɵelementEnd();
34
+ } }
35
+ function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_7_Template(rf, ctx) { if (rf & 1) {
36
+ i0.ɵɵelementStart(0, "div", 45);
37
+ i0.ɵɵtext(1);
38
+ i0.ɵɵelementEnd();
39
+ } if (rf & 2) {
40
+ const view_r5 = i0.ɵɵnextContext().$implicit;
41
+ i0.ɵɵadvance();
42
+ i0.ɵɵtextInterpolate(view_r5.entity.Description);
43
+ } }
44
+ function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_8_Conditional_1_Template(rf, ctx) { if (rf & 1) {
45
+ i0.ɵɵelementStart(0, "span");
46
+ i0.ɵɵelement(1, "i", 54);
47
+ i0.ɵɵtext(2);
48
+ i0.ɵɵelementEnd();
49
+ } if (rf & 2) {
50
+ const view_r5 = i0.ɵɵnextContext(2).$implicit;
51
+ const ctx_r1 = i0.ɵɵnextContext(3);
52
+ i0.ɵɵadvance(2);
53
+ i0.ɵɵtextInterpolate2(" ", ctx_r1.getViewFilterCount(view_r5), " filter", ctx_r1.getViewFilterCount(view_r5) !== 1 ? "s" : "");
54
+ } }
55
+ function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_8_Conditional_2_Template(rf, ctx) { if (rf & 1) {
56
+ i0.ɵɵelementStart(0, "span");
57
+ i0.ɵɵelement(1, "i", 55);
58
+ i0.ɵɵtext(2);
59
+ i0.ɵɵelementEnd();
60
+ } if (rf & 2) {
61
+ const view_r5 = i0.ɵɵnextContext(2).$implicit;
62
+ const ctx_r1 = i0.ɵɵnextContext(3);
63
+ i0.ɵɵadvance(2);
64
+ i0.ɵɵtextInterpolate2(" ", ctx_r1.getViewColumnCount(view_r5), " col", ctx_r1.getViewColumnCount(view_r5) !== 1 ? "s" : "");
19
65
  } }
20
- function ViewSelectorComponent_Conditional_9_Conditional_7_For_8_Conditional_4_Template(rf, ctx) { if (rf & 1) {
21
- i0.ɵɵelement(0, "i", 36);
66
+ function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_8_Conditional_3_Template(rf, ctx) { if (rf & 1) {
67
+ i0.ɵɵelementStart(0, "span");
68
+ i0.ɵɵelement(1, "i", 56);
69
+ i0.ɵɵtext(2);
70
+ i0.ɵɵelementEnd();
71
+ } if (rf & 2) {
72
+ const view_r5 = i0.ɵɵnextContext(2).$implicit;
73
+ const ctx_r1 = i0.ɵɵnextContext(3);
74
+ i0.ɵɵadvance(2);
75
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.getViewSortInfo(view_r5));
22
76
  } }
23
- function ViewSelectorComponent_Conditional_9_Conditional_7_For_8_Conditional_5_Template(rf, ctx) { if (rf & 1) {
24
- i0.ɵɵelement(0, "i", 37);
77
+ function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_8_Template(rf, ctx) { if (rf & 1) {
78
+ i0.ɵɵelementStart(0, "div", 46);
79
+ i0.ɵɵconditionalCreate(1, ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_8_Conditional_1_Template, 3, 2, "span");
80
+ i0.ɵɵconditionalCreate(2, ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_8_Conditional_2_Template, 3, 2, "span");
81
+ i0.ɵɵconditionalCreate(3, ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_8_Conditional_3_Template, 3, 1, "span");
82
+ i0.ɵɵelementEnd();
83
+ } if (rf & 2) {
84
+ const view_r5 = i0.ɵɵnextContext().$implicit;
85
+ const ctx_r1 = i0.ɵɵnextContext(3);
86
+ i0.ɵɵadvance();
87
+ i0.ɵɵconditional(ctx_r1.getViewFilterCount(view_r5) > 0 ? 1 : -1);
88
+ i0.ɵɵadvance();
89
+ i0.ɵɵconditional(ctx_r1.getViewColumnCount(view_r5) > 0 ? 2 : -1);
90
+ i0.ɵɵadvance();
91
+ i0.ɵɵconditional(ctx_r1.getViewSortInfo(view_r5) ? 3 : -1);
25
92
  } }
26
- function ViewSelectorComponent_Conditional_9_Conditional_7_For_8_Conditional_6_Template(rf, ctx) { if (rf & 1) {
27
- i0.ɵɵelement(0, "i", 20);
93
+ function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_16_Template(rf, ctx) { if (rf & 1) {
94
+ i0.ɵɵelement(0, "i", 32);
28
95
  } }
29
- function ViewSelectorComponent_Conditional_9_Conditional_7_For_8_Template(rf, ctx) { if (rf & 1) {
96
+ function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Template(rf, ctx) { if (rf & 1) {
30
97
  const _r4 = i0.ɵɵgetCurrentView();
31
- i0.ɵɵelementStart(0, "div", 34);
32
- i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Conditional_7_For_8_Template_div_click_0_listener() { const view_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.selectView(view_r5)); });
33
- i0.ɵɵelement(1, "i", 35);
34
- i0.ɵɵelementStart(2, "span", 19);
35
- i0.ɵɵtext(3);
98
+ i0.ɵɵelementStart(0, "div", 27);
99
+ i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Template_div_click_0_listener() { const view_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.selectView(view_r5)); });
100
+ i0.ɵɵelementStart(1, "div", 28);
101
+ i0.ɵɵelement(2, "i", 43);
102
+ i0.ɵɵelementEnd();
103
+ i0.ɵɵelementStart(3, "div", 30)(4, "div", 31);
104
+ i0.ɵɵtext(5);
105
+ i0.ɵɵconditionalCreate(6, ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_6_Template, 2, 0, "span", 44);
106
+ i0.ɵɵelementEnd();
107
+ i0.ɵɵconditionalCreate(7, ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_7_Template, 2, 1, "div", 45);
108
+ i0.ɵɵconditionalCreate(8, ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_8_Template, 4, 3, "div", 46);
36
109
  i0.ɵɵelementEnd();
37
- i0.ɵɵconditionalCreate(4, ViewSelectorComponent_Conditional_9_Conditional_7_For_8_Conditional_4_Template, 1, 0, "i", 36);
38
- i0.ɵɵconditionalCreate(5, ViewSelectorComponent_Conditional_9_Conditional_7_For_8_Conditional_5_Template, 1, 0, "i", 37);
39
- i0.ɵɵconditionalCreate(6, ViewSelectorComponent_Conditional_9_Conditional_7_For_8_Conditional_6_Template, 1, 0, "i", 20);
110
+ i0.ɵɵelementStart(9, "div", 47)(10, "button", 48);
111
+ i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Template_button_click_10_listener($event) { const view_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onDuplicateView(view_r5.id, $event)); });
112
+ i0.ɵɵelement(11, "i", 49);
113
+ i0.ɵɵelementEnd();
114
+ i0.ɵɵelementStart(12, "button", 50);
115
+ i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Template_button_click_12_listener($event) { const view_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onConfigureViewById(view_r5.id, $event)); });
116
+ i0.ɵɵelement(13, "i", 51);
117
+ i0.ɵɵelementEnd();
118
+ i0.ɵɵelementStart(14, "button", 52);
119
+ i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Template_button_click_14_listener($event) { const view_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onOpenViewInTab(view_r5.id, $event)); });
120
+ i0.ɵɵelement(15, "i", 53);
121
+ i0.ɵɵelementEnd()();
122
+ i0.ɵɵconditionalCreate(16, ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_16_Template, 1, 0, "i", 32);
40
123
  i0.ɵɵelementEnd();
41
124
  } if (rf & 2) {
42
125
  const view_r5 = ctx.$implicit;
43
126
  const ctx_r1 = i0.ɵɵnextContext(3);
44
- i0.ɵɵclassProp("selected", ctx_r1.selectedViewId === view_r5.id);
45
- i0.ɵɵadvance(3);
46
- i0.ɵɵtextInterpolate(view_r5.name);
127
+ i0.ɵɵclassProp("active", ctx_r1.selectedViewId === view_r5.id);
47
128
  i0.ɵɵadvance();
48
- i0.ɵɵconditional(view_r5.isShared ? 4 : -1);
129
+ i0.ɵɵclassProp("active", ctx_r1.selectedViewId === view_r5.id);
130
+ i0.ɵɵadvance(4);
131
+ i0.ɵɵtextInterpolate1(" ", view_r5.name, " ");
49
132
  i0.ɵɵadvance();
50
- i0.ɵɵconditional(view_r5.isDefault ? 5 : -1);
133
+ i0.ɵɵconditional(view_r5.isDefault ? 6 : -1);
51
134
  i0.ɵɵadvance();
52
- i0.ɵɵconditional(ctx_r1.selectedViewId === view_r5.id ? 6 : -1);
135
+ i0.ɵɵconditional(view_r5.entity.Description ? 7 : -1);
136
+ i0.ɵɵadvance();
137
+ i0.ɵɵconditional(ctx_r1.getViewFilterCount(view_r5) > 0 || ctx_r1.getViewColumnCount(view_r5) > 0 || ctx_r1.getViewSortInfo(view_r5) ? 8 : -1);
138
+ i0.ɵɵadvance(8);
139
+ i0.ɵɵconditional(ctx_r1.selectedViewId === view_r5.id ? 16 : -1);
53
140
  } }
54
- function ViewSelectorComponent_Conditional_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
55
- i0.ɵɵelementStart(0, "div", 22)(1, "div", 29);
56
- i0.ɵɵelement(2, "i", 30);
57
- i0.ɵɵelementStart(3, "span", 31);
141
+ function ViewSelectorComponent_Conditional_9_Conditional_19_Template(rf, ctx) { if (rf & 1) {
142
+ i0.ɵɵelementStart(0, "div", 26)(1, "div", 39);
143
+ i0.ɵɵelement(2, "i", 40);
144
+ i0.ɵɵelementStart(3, "span");
58
145
  i0.ɵɵtext(4, "My Views");
59
146
  i0.ɵɵelementEnd();
60
- i0.ɵɵelementStart(5, "span", 32);
147
+ i0.ɵɵelementStart(5, "span", 41);
61
148
  i0.ɵɵtext(6);
62
149
  i0.ɵɵelementEnd()();
63
- i0.ɵɵrepeaterCreate(7, ViewSelectorComponent_Conditional_9_Conditional_7_For_8_Template, 7, 6, "div", 33, _forTrack0);
150
+ i0.ɵɵrepeaterCreate(7, ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Template, 17, 9, "div", 42, _forTrack0);
64
151
  i0.ɵɵelementEnd();
65
152
  } if (rf & 2) {
66
153
  const ctx_r1 = i0.ɵɵnextContext(2);
67
154
  i0.ɵɵadvance(6);
68
- i0.ɵɵtextInterpolate(ctx_r1.myViews.length);
155
+ i0.ɵɵtextInterpolate(ctx_r1.filteredMyViews.length);
156
+ i0.ɵɵadvance();
157
+ i0.ɵɵrepeater(ctx_r1.filteredMyViews);
158
+ } }
159
+ function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_6_Template(rf, ctx) { if (rf & 1) {
160
+ i0.ɵɵelementStart(0, "span", 60);
161
+ i0.ɵɵtext(1, "View Only");
162
+ i0.ɵɵelementEnd();
163
+ } }
164
+ function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_7_Template(rf, ctx) { if (rf & 1) {
165
+ i0.ɵɵelementStart(0, "span", 61);
166
+ i0.ɵɵtext(1, "Can Edit");
167
+ i0.ɵɵelementEnd();
168
+ } }
169
+ function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_8_Template(rf, ctx) { if (rf & 1) {
170
+ i0.ɵɵelementStart(0, "div", 45);
171
+ i0.ɵɵtext(1);
172
+ i0.ɵɵelementEnd();
173
+ } if (rf & 2) {
174
+ const view_r7 = i0.ɵɵnextContext().$implicit;
69
175
  i0.ɵɵadvance();
70
- i0.ɵɵrepeater(ctx_r1.myViews);
176
+ i0.ɵɵtextInterpolate(view_r7.entity.Description);
71
177
  } }
72
- function ViewSelectorComponent_Conditional_9_Conditional_8_For_8_Conditional_4_Template(rf, ctx) { if (rf & 1) {
73
- i0.ɵɵelement(0, "i", 39);
178
+ function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_9_Conditional_1_Template(rf, ctx) { if (rf & 1) {
179
+ i0.ɵɵelementStart(0, "span");
180
+ i0.ɵɵelement(1, "i", 54);
181
+ i0.ɵɵtext(2);
182
+ i0.ɵɵelementEnd();
183
+ } if (rf & 2) {
184
+ const view_r7 = i0.ɵɵnextContext(2).$implicit;
185
+ const ctx_r1 = i0.ɵɵnextContext(3);
186
+ i0.ɵɵadvance(2);
187
+ i0.ɵɵtextInterpolate2(" ", ctx_r1.getViewFilterCount(view_r7), " filter", ctx_r1.getViewFilterCount(view_r7) !== 1 ? "s" : "");
74
188
  } }
75
- function ViewSelectorComponent_Conditional_9_Conditional_8_For_8_Conditional_5_Template(rf, ctx) { if (rf & 1) {
76
- i0.ɵɵelement(0, "i", 20);
189
+ function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_9_Conditional_2_Template(rf, ctx) { if (rf & 1) {
190
+ i0.ɵɵelementStart(0, "span");
191
+ i0.ɵɵelement(1, "i", 55);
192
+ i0.ɵɵtext(2);
193
+ i0.ɵɵelementEnd();
194
+ } if (rf & 2) {
195
+ const view_r7 = i0.ɵɵnextContext(2).$implicit;
196
+ const ctx_r1 = i0.ɵɵnextContext(3);
197
+ i0.ɵɵadvance(2);
198
+ i0.ɵɵtextInterpolate2(" ", ctx_r1.getViewColumnCount(view_r7), " col", ctx_r1.getViewColumnCount(view_r7) !== 1 ? "s" : "");
77
199
  } }
78
- function ViewSelectorComponent_Conditional_9_Conditional_8_For_8_Template(rf, ctx) { if (rf & 1) {
200
+ function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_9_Template(rf, ctx) { if (rf & 1) {
201
+ i0.ɵɵelementStart(0, "div", 46);
202
+ i0.ɵɵconditionalCreate(1, ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_9_Conditional_1_Template, 3, 2, "span");
203
+ i0.ɵɵconditionalCreate(2, ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_9_Conditional_2_Template, 3, 2, "span");
204
+ i0.ɵɵelementEnd();
205
+ } if (rf & 2) {
206
+ const view_r7 = i0.ɵɵnextContext().$implicit;
207
+ const ctx_r1 = i0.ɵɵnextContext(3);
208
+ i0.ɵɵadvance();
209
+ i0.ɵɵconditional(ctx_r1.getViewFilterCount(view_r7) > 0 ? 1 : -1);
210
+ i0.ɵɵadvance();
211
+ i0.ɵɵconditional(ctx_r1.getViewColumnCount(view_r7) > 0 ? 2 : -1);
212
+ } }
213
+ function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_13_Template(rf, ctx) { if (rf & 1) {
214
+ const _r8 = i0.ɵɵgetCurrentView();
215
+ i0.ɵɵelementStart(0, "button", 50);
216
+ i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_13_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r8); const view_r7 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onConfigureViewById(view_r7.id, $event)); });
217
+ i0.ɵɵelement(1, "i", 51);
218
+ i0.ɵɵelementEnd();
219
+ } }
220
+ function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_14_Template(rf, ctx) { if (rf & 1) {
221
+ i0.ɵɵelement(0, "i", 32);
222
+ } }
223
+ function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Template(rf, ctx) { if (rf & 1) {
79
224
  const _r6 = i0.ɵɵgetCurrentView();
80
- i0.ɵɵelementStart(0, "div", 34);
81
- i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Conditional_8_For_8_Template_div_click_0_listener() { const view_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.selectView(view_r7)); });
82
- i0.ɵɵelement(1, "i", 35);
83
- i0.ɵɵelementStart(2, "span", 19);
84
- i0.ɵɵtext(3);
225
+ i0.ɵɵelementStart(0, "div", 27);
226
+ i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Template_div_click_0_listener() { const view_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.selectView(view_r7)); });
227
+ i0.ɵɵelementStart(1, "div", 58);
228
+ i0.ɵɵelement(2, "i", 59);
229
+ i0.ɵɵelementEnd();
230
+ i0.ɵɵelementStart(3, "div", 30)(4, "div", 31);
231
+ i0.ɵɵtext(5);
232
+ i0.ɵɵconditionalCreate(6, ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_6_Template, 2, 0, "span", 60)(7, ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_7_Template, 2, 0, "span", 61);
85
233
  i0.ɵɵelementEnd();
86
- i0.ɵɵconditionalCreate(4, ViewSelectorComponent_Conditional_9_Conditional_8_For_8_Conditional_4_Template, 1, 0, "i", 39);
87
- i0.ɵɵconditionalCreate(5, ViewSelectorComponent_Conditional_9_Conditional_8_For_8_Conditional_5_Template, 1, 0, "i", 20);
234
+ i0.ɵɵconditionalCreate(8, ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_8_Template, 2, 1, "div", 45);
235
+ i0.ɵɵconditionalCreate(9, ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_9_Template, 3, 2, "div", 46);
236
+ i0.ɵɵelementEnd();
237
+ i0.ɵɵelementStart(10, "div", 47)(11, "button", 62);
238
+ i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Template_button_click_11_listener($event) { const view_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onDuplicateView(view_r7.id, $event)); });
239
+ i0.ɵɵelement(12, "i", 49);
240
+ i0.ɵɵelementEnd();
241
+ i0.ɵɵconditionalCreate(13, ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_13_Template, 2, 0, "button", 63);
242
+ i0.ɵɵelementEnd();
243
+ i0.ɵɵconditionalCreate(14, ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_14_Template, 1, 0, "i", 32);
88
244
  i0.ɵɵelementEnd();
89
245
  } if (rf & 2) {
90
246
  const view_r7 = ctx.$implicit;
91
247
  const ctx_r1 = i0.ɵɵnextContext(3);
92
- i0.ɵɵclassProp("selected", ctx_r1.selectedViewId === view_r7.id);
93
- i0.ɵɵadvance(3);
94
- i0.ɵɵtextInterpolate(view_r7.name);
248
+ i0.ɵɵclassProp("active", ctx_r1.selectedViewId === view_r7.id);
249
+ i0.ɵɵadvance(5);
250
+ i0.ɵɵtextInterpolate1(" ", view_r7.name, " ");
95
251
  i0.ɵɵadvance();
96
- i0.ɵɵconditional(!view_r7.userCanEdit ? 4 : -1);
252
+ i0.ɵɵconditional(!view_r7.userCanEdit ? 6 : 7);
253
+ i0.ɵɵadvance(2);
254
+ i0.ɵɵconditional(view_r7.entity.Description ? 8 : -1);
97
255
  i0.ɵɵadvance();
98
- i0.ɵɵconditional(ctx_r1.selectedViewId === view_r7.id ? 5 : -1);
256
+ i0.ɵɵconditional(ctx_r1.getViewFilterCount(view_r7) > 0 || ctx_r1.getViewColumnCount(view_r7) > 0 ? 9 : -1);
257
+ i0.ɵɵadvance(4);
258
+ i0.ɵɵconditional(view_r7.userCanEdit ? 13 : -1);
259
+ i0.ɵɵadvance();
260
+ i0.ɵɵconditional(ctx_r1.selectedViewId === view_r7.id ? 14 : -1);
99
261
  } }
100
- function ViewSelectorComponent_Conditional_9_Conditional_8_Template(rf, ctx) { if (rf & 1) {
101
- i0.ɵɵelementStart(0, "div", 22)(1, "div", 29);
102
- i0.ɵɵelement(2, "i", 38);
103
- i0.ɵɵelementStart(3, "span", 31);
104
- i0.ɵɵtext(4, "Shared Views");
262
+ function ViewSelectorComponent_Conditional_9_Conditional_20_Template(rf, ctx) { if (rf & 1) {
263
+ i0.ɵɵelementStart(0, "div", 26)(1, "div", 39);
264
+ i0.ɵɵelement(2, "i", 57);
265
+ i0.ɵɵelementStart(3, "span");
266
+ i0.ɵɵtext(4, "Shared With Me");
105
267
  i0.ɵɵelementEnd();
106
- i0.ɵɵelementStart(5, "span", 32);
268
+ i0.ɵɵelementStart(5, "span", 41);
107
269
  i0.ɵɵtext(6);
108
270
  i0.ɵɵelementEnd()();
109
- i0.ɵɵrepeaterCreate(7, ViewSelectorComponent_Conditional_9_Conditional_8_For_8_Template, 6, 5, "div", 33, _forTrack0);
271
+ i0.ɵɵrepeaterCreate(7, ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Template, 15, 8, "div", 42, _forTrack0);
110
272
  i0.ɵɵelementEnd();
111
273
  } if (rf & 2) {
112
274
  const ctx_r1 = i0.ɵɵnextContext(2);
113
275
  i0.ɵɵadvance(6);
114
- i0.ɵɵtextInterpolate(ctx_r1.sharedViews.length);
276
+ i0.ɵɵtextInterpolate(ctx_r1.filteredSharedViews.length);
115
277
  i0.ɵɵadvance();
116
- i0.ɵɵrepeater(ctx_r1.sharedViews);
278
+ i0.ɵɵrepeater(ctx_r1.filteredSharedViews);
279
+ } }
280
+ function ViewSelectorComponent_Conditional_9_Conditional_21_Template(rf, ctx) { if (rf & 1) {
281
+ i0.ɵɵelementStart(0, "div", 33);
282
+ i0.ɵɵelement(1, "i", 64);
283
+ i0.ɵɵelementStart(2, "div", 65)(3, "strong");
284
+ i0.ɵɵtext(4, "No saved views yet");
285
+ i0.ɵɵelementEnd();
286
+ i0.ɵɵelementStart(5, "span");
287
+ i0.ɵɵtext(6, "Save your current configuration as a view");
288
+ i0.ɵɵelementEnd()()();
117
289
  } }
118
- function ViewSelectorComponent_Conditional_9_Conditional_9_Template(rf, ctx) { if (rf & 1) {
119
- i0.ɵɵelementStart(0, "div", 23);
120
- i0.ɵɵelement(1, "i", 40);
290
+ function ViewSelectorComponent_Conditional_9_Conditional_22_Template(rf, ctx) { if (rf & 1) {
291
+ i0.ɵɵelementStart(0, "div", 33);
292
+ i0.ɵɵelement(1, "i", 66);
121
293
  i0.ɵɵelementStart(2, "span");
122
- i0.ɵɵtext(3, "No saved views yet");
294
+ i0.ɵɵtext(3);
123
295
  i0.ɵɵelementEnd()();
296
+ } if (rf & 2) {
297
+ const ctx_r1 = i0.ɵɵnextContext(2);
298
+ i0.ɵɵadvance(3);
299
+ i0.ɵɵtextInterpolate1("No views match \"", ctx_r1.searchText, "\"");
124
300
  } }
125
- function ViewSelectorComponent_Conditional_9_Conditional_10_Template(rf, ctx) { if (rf & 1) {
126
- i0.ɵɵelementStart(0, "div", 24);
127
- i0.ɵɵelement(1, "i", 41);
301
+ function ViewSelectorComponent_Conditional_9_Conditional_23_Template(rf, ctx) { if (rf & 1) {
302
+ i0.ɵɵelementStart(0, "div", 34);
303
+ i0.ɵɵelement(1, "i", 67);
128
304
  i0.ɵɵelementStart(2, "span");
129
305
  i0.ɵɵtext(3, "Loading views...");
130
306
  i0.ɵɵelementEnd()();
@@ -132,53 +308,75 @@ function ViewSelectorComponent_Conditional_9_Conditional_10_Template(rf, ctx) {
132
308
  function ViewSelectorComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
133
309
  const _r3 = i0.ɵɵgetCurrentView();
134
310
  i0.ɵɵelementStart(0, "div", 8)(1, "div", 17);
135
- i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Template_div_click_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.selectDefault()); });
136
311
  i0.ɵɵelement(2, "i", 18);
137
312
  i0.ɵɵelementStart(3, "span", 19);
138
- i0.ɵɵtext(4, "(Default)");
139
- i0.ɵɵelementEnd();
140
- i0.ɵɵconditionalCreate(5, ViewSelectorComponent_Conditional_9_Conditional_5_Template, 1, 0, "i", 20);
141
- i0.ɵɵelementEnd();
142
- i0.ɵɵelement(6, "div", 21);
143
- i0.ɵɵconditionalCreate(7, ViewSelectorComponent_Conditional_9_Conditional_7_Template, 9, 1, "div", 22);
144
- i0.ɵɵconditionalCreate(8, ViewSelectorComponent_Conditional_9_Conditional_8_Template, 9, 1, "div", 22);
145
- i0.ɵɵconditionalCreate(9, ViewSelectorComponent_Conditional_9_Conditional_9_Template, 4, 0, "div", 23);
146
- i0.ɵɵconditionalCreate(10, ViewSelectorComponent_Conditional_9_Conditional_10_Template, 4, 0, "div", 24);
147
- i0.ɵɵelement(11, "div", 21);
148
- i0.ɵɵelementStart(12, "div", 25)(13, "button", 26);
149
- i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSaveView()); });
150
- i0.ɵɵelement(14, "i", 27);
151
- i0.ɵɵelementStart(15, "span");
152
- i0.ɵɵtext(16, "Save View");
313
+ i0.ɵɵtext(4, "Views");
314
+ i0.ɵɵelementEnd();
315
+ i0.ɵɵconditionalCreate(5, ViewSelectorComponent_Conditional_9_Conditional_5_Template, 2, 1, "span", 20);
316
+ i0.ɵɵelementStart(6, "button", 21);
317
+ i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.closeDropdown()); });
318
+ i0.ɵɵelement(7, "i", 22);
319
+ i0.ɵɵelementEnd()();
320
+ i0.ɵɵelementStart(8, "div", 23)(9, "input", 24);
321
+ i0.ɵɵtwoWayListener("ngModelChange", function ViewSelectorComponent_Conditional_9_Template_input_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.searchText, $event) || (ctx_r1.searchText = $event); return i0.ɵɵresetView($event); });
322
+ i0.ɵɵlistener("keydown.escape", function ViewSelectorComponent_Conditional_9_Template_input_keydown_escape_9_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.searchText = ""); });
323
+ i0.ɵɵelementEnd()();
324
+ i0.ɵɵelementStart(10, "div", 25)(11, "div", 26)(12, "div", 27);
325
+ i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Template_div_click_12_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.selectDefault()); });
326
+ i0.ɵɵelementStart(13, "div", 28);
327
+ i0.ɵɵelement(14, "i", 29);
328
+ i0.ɵɵelementEnd();
329
+ i0.ɵɵelementStart(15, "div", 30)(16, "div", 31);
330
+ i0.ɵɵtext(17, "(Default)");
331
+ i0.ɵɵelementEnd()();
332
+ i0.ɵɵconditionalCreate(18, ViewSelectorComponent_Conditional_9_Conditional_18_Template, 1, 0, "i", 32);
153
333
  i0.ɵɵelementEnd()();
154
- i0.ɵɵelementStart(17, "button", 28);
155
- i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSaveAsNewView()); });
156
- i0.ɵɵelement(18, "i", 13);
157
- i0.ɵɵelementStart(19, "span");
158
- i0.ɵɵtext(20, "Save As New");
334
+ i0.ɵɵconditionalCreate(19, ViewSelectorComponent_Conditional_9_Conditional_19_Template, 9, 1, "div", 26);
335
+ i0.ɵɵconditionalCreate(20, ViewSelectorComponent_Conditional_9_Conditional_20_Template, 9, 1, "div", 26);
336
+ i0.ɵɵconditionalCreate(21, ViewSelectorComponent_Conditional_9_Conditional_21_Template, 7, 0, "div", 33);
337
+ i0.ɵɵconditionalCreate(22, ViewSelectorComponent_Conditional_9_Conditional_22_Template, 4, 1, "div", 33);
338
+ i0.ɵɵconditionalCreate(23, ViewSelectorComponent_Conditional_9_Conditional_23_Template, 4, 0, "div", 34);
339
+ i0.ɵɵelementEnd();
340
+ i0.ɵɵelementStart(24, "div", 35)(25, "button", 36);
341
+ i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Template_button_click_25_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onQuickSave()); });
342
+ i0.ɵɵelement(26, "i", 13);
343
+ i0.ɵɵelementStart(27, "span");
344
+ i0.ɵɵtext(28, "New View");
345
+ i0.ɵɵelementEnd()();
346
+ i0.ɵɵelementStart(29, "button", 37);
347
+ i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Template_button_click_29_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onResetToDefault()); });
348
+ i0.ɵɵelement(30, "i", 38);
349
+ i0.ɵɵelementStart(31, "span");
350
+ i0.ɵɵtext(32, "Reset to Default");
159
351
  i0.ɵɵelementEnd()()()();
160
352
  } if (rf & 2) {
161
353
  const ctx_r1 = i0.ɵɵnextContext();
162
- i0.ɵɵadvance();
163
- i0.ɵɵclassProp("selected", !ctx_r1.selectedViewId);
354
+ i0.ɵɵadvance(5);
355
+ i0.ɵɵconditional(ctx_r1.entity ? 5 : -1);
164
356
  i0.ɵɵadvance(4);
165
- i0.ɵɵconditional(!ctx_r1.selectedViewId ? 5 : -1);
166
- i0.ɵɵadvance(2);
167
- i0.ɵɵconditional(ctx_r1.myViews.length > 0 ? 7 : -1);
357
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.searchText);
358
+ i0.ɵɵadvance(3);
359
+ i0.ɵɵclassProp("active", !ctx_r1.selectedViewId);
168
360
  i0.ɵɵadvance();
169
- i0.ɵɵconditional(ctx_r1.sharedViews.length > 0 ? 8 : -1);
361
+ i0.ɵɵclassProp("active", !ctx_r1.selectedViewId);
362
+ i0.ɵɵadvance(5);
363
+ i0.ɵɵconditional(!ctx_r1.selectedViewId ? 18 : -1);
170
364
  i0.ɵɵadvance();
171
- i0.ɵɵconditional(!ctx_r1.hasViews && !ctx_r1.isLoading ? 9 : -1);
365
+ i0.ɵɵconditional(ctx_r1.filteredMyViews.length > 0 ? 19 : -1);
172
366
  i0.ɵɵadvance();
173
- i0.ɵɵconditional(ctx_r1.isLoading ? 10 : -1);
174
- i0.ɵɵadvance(3);
175
- i0.ɵɵproperty("disabled", !ctx_r1.viewModified && !ctx_r1.selectedViewId);
367
+ i0.ɵɵconditional(ctx_r1.filteredSharedViews.length > 0 ? 20 : -1);
368
+ i0.ɵɵadvance();
369
+ i0.ɵɵconditional(!ctx_r1.hasViews && !ctx_r1.isLoading ? 21 : -1);
370
+ i0.ɵɵadvance();
371
+ i0.ɵɵconditional(ctx_r1.hasViews && ctx_r1.filteredMyViews.length === 0 && ctx_r1.filteredSharedViews.length === 0 && ctx_r1.searchText ? 22 : -1);
372
+ i0.ɵɵadvance();
373
+ i0.ɵɵconditional(ctx_r1.isLoading ? 23 : -1);
176
374
  } }
177
375
  function ViewSelectorComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
178
- const _r8 = i0.ɵɵgetCurrentView();
179
- i0.ɵɵelementStart(0, "button", 42);
180
- i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_10_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenInTab()); });
181
- i0.ɵɵelement(1, "i", 43);
376
+ const _r9 = i0.ɵɵgetCurrentView();
377
+ i0.ɵɵelementStart(0, "button", 68);
378
+ i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_10_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenInTab()); });
379
+ i0.ɵɵelement(1, "i", 69);
182
380
  i0.ɵɵelementEnd();
183
381
  } }
184
382
  /**
@@ -232,12 +430,26 @@ export class ViewSelectorComponent {
232
430
  * Emitted when user wants to export data to Excel
233
431
  */
234
432
  exportRequested = new EventEmitter();
433
+ /**
434
+ * Emitted when user wants to duplicate a view (F-005)
435
+ */
436
+ duplicateViewRequested = new EventEmitter();
437
+ /**
438
+ * Emitted when user wants to use the quick save dialog (F-001)
439
+ * Emits true when user explicitly requested "Save As New", false for general save
440
+ */
441
+ quickSaveRequested = new EventEmitter();
442
+ /**
443
+ * Emitted when user wants to revert to saved state (F-007)
444
+ */
445
+ revertRequested = new EventEmitter();
235
446
  // Internal state
236
447
  isLoading = false;
237
448
  isDropdownOpen = false;
238
449
  myViews = [];
239
450
  sharedViews = [];
240
451
  selectedView = null;
452
+ searchText = '';
241
453
  destroy$ = new Subject();
242
454
  metadata = new Metadata();
243
455
  constructor(cdr) {
@@ -277,7 +489,7 @@ export class ViewSelectorComponent {
277
489
  const rv = new RunView();
278
490
  // Load all views for this entity that the user owns OR that are shared
279
491
  const result = await rv.RunView({
280
- EntityName: 'User Views',
492
+ EntityName: 'MJ: User Views',
281
493
  ExtraFilter: `EntityID = '${this.entity.ID}' AND (UserID = '${userId}' OR IsShared = 1)`,
282
494
  OrderBy: 'Name',
283
495
  ResultType: 'entity_object'
@@ -361,6 +573,7 @@ export class ViewSelectorComponent {
361
573
  */
362
574
  closeDropdown() {
363
575
  this.isDropdownOpen = false;
576
+ this.searchText = '';
364
577
  this.cdr.detectChanges();
365
578
  }
366
579
  /**
@@ -387,10 +600,10 @@ export class ViewSelectorComponent {
387
600
  this.closeDropdown();
388
601
  }
389
602
  /**
390
- * Request to save as a new view
603
+ * Request to save as a new view - opens Quick Save dialog in "Save As New" mode
391
604
  */
392
605
  onSaveAsNewView() {
393
- this.saveViewRequested.emit({ saveAsNew: true });
606
+ this.quickSaveRequested.emit(true);
394
607
  this.closeDropdown();
395
608
  }
396
609
  /**
@@ -426,6 +639,27 @@ export class ViewSelectorComponent {
426
639
  onExport() {
427
640
  this.exportRequested.emit();
428
641
  }
642
+ /**
643
+ * Request to duplicate a view (F-005)
644
+ */
645
+ onDuplicateView(viewId, event) {
646
+ event.stopPropagation(); // Don't select the view
647
+ this.duplicateViewRequested.emit(viewId);
648
+ this.closeDropdown();
649
+ }
650
+ /**
651
+ * Request to open the quick save dialog (F-001)
652
+ */
653
+ onQuickSave() {
654
+ this.quickSaveRequested.emit(false);
655
+ this.closeDropdown();
656
+ }
657
+ /**
658
+ * Request to revert view to saved state (F-007)
659
+ */
660
+ onRevert() {
661
+ this.revertRequested.emit();
662
+ }
429
663
  /**
430
664
  * Check if there are any views to show
431
665
  */
@@ -444,8 +678,115 @@ export class ViewSelectorComponent {
444
678
  onClickOutside(event) {
445
679
  this.closeDropdown();
446
680
  }
681
+ // ========================================
682
+ // RICH VIEW PANEL: Search & Metadata
683
+ // ========================================
684
+ /**
685
+ * My views filtered by search text
686
+ */
687
+ get filteredMyViews() {
688
+ if (!this.searchText.trim())
689
+ return this.myViews;
690
+ const term = this.searchText.toLowerCase();
691
+ return this.myViews.filter(v => v.name.toLowerCase().includes(term) ||
692
+ (v.entity.Description || '').toLowerCase().includes(term));
693
+ }
694
+ /**
695
+ * Shared views filtered by search text
696
+ */
697
+ get filteredSharedViews() {
698
+ if (!this.searchText.trim())
699
+ return this.sharedViews;
700
+ const term = this.searchText.toLowerCase();
701
+ return this.sharedViews.filter(v => v.name.toLowerCase().includes(term) ||
702
+ (v.entity.Description || '').toLowerCase().includes(term));
703
+ }
704
+ /**
705
+ * Get the number of filters configured in a view by parsing its FilterState
706
+ */
707
+ getViewFilterCount(view) {
708
+ try {
709
+ const filterState = view.entity.FilterState;
710
+ if (!filterState)
711
+ return 0;
712
+ const parsed = JSON.parse(filterState);
713
+ if (parsed?.filters?.length)
714
+ return parsed.filters.length;
715
+ // CompositeFilterDescriptor format
716
+ if (parsed?.logic && parsed?.filters)
717
+ return parsed.filters.length;
718
+ return 0;
719
+ }
720
+ catch {
721
+ return 0;
722
+ }
723
+ }
724
+ /**
725
+ * Get the number of visible columns in a view by parsing GridState
726
+ */
727
+ getViewColumnCount(view) {
728
+ try {
729
+ const gridState = view.entity.GridState;
730
+ if (!gridState)
731
+ return 0;
732
+ const parsed = JSON.parse(gridState);
733
+ if (Array.isArray(parsed)) {
734
+ return parsed.filter((c) => !c['hidden']).length;
735
+ }
736
+ return 0;
737
+ }
738
+ catch {
739
+ return 0;
740
+ }
741
+ }
742
+ /**
743
+ * Get sort info string from a view's SortState
744
+ */
745
+ getViewSortInfo(view) {
746
+ try {
747
+ const sortState = view.entity.SortState;
748
+ if (!sortState)
749
+ return '';
750
+ const parsed = JSON.parse(sortState);
751
+ if (Array.isArray(parsed) && parsed.length > 0) {
752
+ return `${parsed.length} sort${parsed.length > 1 ? 's' : ''}`;
753
+ }
754
+ return '';
755
+ }
756
+ catch {
757
+ return '';
758
+ }
759
+ }
760
+ /**
761
+ * Select a specific view and open the config panel for it
762
+ */
763
+ onConfigureViewById(viewId, event) {
764
+ event.stopPropagation();
765
+ // First select the view, then open config
766
+ const item = this.myViews.find(v => v.id === viewId) || this.sharedViews.find(v => v.id === viewId);
767
+ if (item) {
768
+ this.selectedView = item.entity;
769
+ this.viewSelected.emit({ viewId: item.id, view: item.entity });
770
+ }
771
+ this.configureViewRequested.emit();
772
+ this.closeDropdown();
773
+ }
774
+ /**
775
+ * Open a specific view in a new tab
776
+ */
777
+ onOpenViewInTab(viewId, event) {
778
+ event.stopPropagation();
779
+ this.openInTabRequested.emit(viewId);
780
+ this.closeDropdown();
781
+ }
782
+ /**
783
+ * Reset to default view (select no view)
784
+ */
785
+ onResetToDefault() {
786
+ this.selectDefault();
787
+ }
447
788
  static ɵfac = function ViewSelectorComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ViewSelectorComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
448
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ViewSelectorComponent, selectors: [["mj-view-selector"]], inputs: { entity: "entity", selectedViewId: "selectedViewId", viewModified: "viewModified" }, outputs: { viewSelected: "viewSelected", saveViewRequested: "saveViewRequested", manageViewsRequested: "manageViewsRequested", openInTabRequested: "openInTabRequested", configureViewRequested: "configureViewRequested", createNewRecordRequested: "createNewRecordRequested", exportRequested: "exportRequested" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 17, vars: 12, consts: [[1, "view-selector-container"], [1, "dropdown-backdrop"], [1, "view-selector-wrapper"], ["title", "Select a saved view", 1, "view-selector-button", 3, "click", "disabled"], [1, "fa-solid", "fa-layer-group", "view-icon"], [1, "view-name"], ["title", "View has unsaved changes", 1, "modified-indicator"], [1, "fa-solid", "fa-chevron-down", "dropdown-arrow"], [1, "dropdown-panel"], ["title", "Open this view in a new tab", 1, "open-in-tab-button"], ["title", "Configure view settings (columns, filters, sorting)", 1, "configure-view-button", 3, "click"], [1, "fa-solid", "fa-sliders-h"], ["title", "Create new record", 1, "create-record-button", 3, "click"], [1, "fa-solid", "fa-plus"], ["title", "Export to Excel", 1, "export-button", 3, "click"], [1, "fa-solid", "fa-file-excel"], [1, "dropdown-backdrop", 3, "click"], [1, "dropdown-item", "default-option", 3, "click"], [1, "fa-solid", "fa-table", "item-icon"], [1, "item-name"], [1, "fa-solid", "fa-check", "selected-check"], [1, "dropdown-divider"], [1, "dropdown-section"], [1, "empty-views-message"], [1, "loading-views"], [1, "dropdown-actions"], ["title", "Save current configuration", 1, "action-button", 3, "click", "disabled"], [1, "fa-solid", "fa-save"], ["title", "Save as a new view", 1, "action-button", 3, "click"], [1, "section-header"], [1, "fa-solid", "fa-user", "section-icon"], [1, "section-title"], [1, "section-count"], [1, "dropdown-item", "view-item", 3, "selected"], [1, "dropdown-item", "view-item", 3, "click"], [1, "fa-solid", "fa-layer-group", "item-icon"], ["title", "Shared with others", 1, "fa-solid", "fa-share-alt", "shared-indicator"], ["title", "Default view for this entity", 1, "fa-solid", "fa-star", "default-indicator"], [1, "fa-solid", "fa-users", "section-icon"], ["title", "View-only access", 1, "fa-solid", "fa-lock", "readonly-indicator"], [1, "fa-solid", "fa-info-circle"], [1, "fa-solid", "fa-spinner", "fa-spin"], ["title", "Open this view in a new tab", 1, "open-in-tab-button", 3, "click"], [1, "fa-solid", "fa-external-link-alt"]], template: function ViewSelectorComponent_Template(rf, ctx) { if (rf & 1) {
789
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ViewSelectorComponent, selectors: [["mj-view-selector"]], inputs: { entity: "entity", selectedViewId: "selectedViewId", viewModified: "viewModified" }, outputs: { viewSelected: "viewSelected", saveViewRequested: "saveViewRequested", manageViewsRequested: "manageViewsRequested", openInTabRequested: "openInTabRequested", configureViewRequested: "configureViewRequested", createNewRecordRequested: "createNewRecordRequested", exportRequested: "exportRequested", duplicateViewRequested: "duplicateViewRequested", quickSaveRequested: "quickSaveRequested", revertRequested: "revertRequested" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 17, vars: 12, consts: [[1, "vs-container"], [1, "vs-backdrop"], [1, "vs-wrapper"], ["title", "Select a saved view", 1, "vs-button", 3, "click", "disabled"], [1, "fa-solid", "fa-layer-group", "vs-btn-icon"], [1, "vs-btn-name"], ["title", "View has unsaved changes", 1, "vs-modified-dot"], [1, "fa-solid", "fa-chevron-down", "vs-arrow"], [1, "vs-panel"], ["title", "Open this view in a new tab", 1, "vs-icon-btn"], ["title", "Configure view settings (columns, filters, sorting)", 1, "vs-icon-btn", 3, "click"], [1, "fa-solid", "fa-sliders-h"], ["title", "Create new record", 1, "vs-icon-btn", 3, "click"], [1, "fa-solid", "fa-plus"], ["title", "Export to Excel", 1, "vs-icon-btn", "vs-export-btn", 3, "click"], [1, "fa-solid", "fa-file-excel"], [1, "vs-backdrop", 3, "click"], [1, "vs-panel-header"], [1, "fa-solid", "fa-table-list", "vs-header-icon"], [1, "vs-panel-title"], [1, "vs-entity-badge"], ["title", "Close", 1, "vs-close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "vs-panel-search"], ["type", "text", "placeholder", "Search views...", 1, "vs-search-input", 3, "ngModelChange", "keydown.escape", "ngModel"], [1, "vs-panel-body"], [1, "vs-section"], [1, "vs-card", 3, "click"], [1, "vs-card-icon"], [1, "fa-solid", "fa-table"], [1, "vs-card-content"], [1, "vs-card-name"], [1, "fa-solid", "fa-check", "vs-card-check"], [1, "vs-empty-message"], [1, "vs-loading"], [1, "vs-panel-footer"], ["title", "Save current view configuration", 1, "vs-panel-btn", "primary", 3, "click"], ["title", "Reset to default view", 1, "vs-panel-btn", 3, "click"], [1, "fa-solid", "fa-arrow-rotate-left"], [1, "vs-section-header"], [1, "fa-solid", "fa-user"], [1, "vs-section-count"], [1, "vs-card", 3, "active"], [1, "fa-solid", "fa-table-list"], [1, "vs-default-badge"], [1, "vs-card-desc"], [1, "vs-card-meta"], [1, "vs-card-actions"], ["title", "Duplicate", 1, "vs-action-btn", 3, "click"], [1, "fa-regular", "fa-copy"], ["title", "Configure", 1, "vs-action-btn", 3, "click"], [1, "fa-solid", "fa-sliders"], ["title", "Open in Tab", 1, "vs-action-btn", 3, "click"], [1, "fa-solid", "fa-up-right-from-square"], [1, "fa-solid", "fa-filter"], [1, "fa-solid", "fa-table-columns"], [1, "fa-solid", "fa-arrow-down-short-wide"], [1, "fa-solid", "fa-share-nodes"], [1, "vs-card-icon", "shared"], [1, "fa-solid", "fa-users"], [1, "vs-shared-badge"], [1, "vs-shared-badge", "editable"], ["title", "Duplicate as My View", 1, "vs-action-btn", 3, "click"], ["title", "Configure", 1, "vs-action-btn"], [1, "fa-solid", "fa-bookmark"], [1, "vs-empty-text"], [1, "fa-solid", "fa-search"], [1, "fa-solid", "fa-spinner", "fa-spin"], ["title", "Open this view in a new tab", 1, "vs-icon-btn", 3, "click"], [1, "fa-solid", "fa-external-link-alt"]], template: function ViewSelectorComponent_Template(rf, ctx) { if (rf & 1) {
449
790
  i0.ɵɵelementStart(0, "div", 0);
450
791
  i0.ɵɵconditionalCreate(1, ViewSelectorComponent_Conditional_1_Template, 1, 0, "div", 1);
451
792
  i0.ɵɵelementStart(2, "div", 2)(3, "button", 3);
@@ -457,7 +798,7 @@ export class ViewSelectorComponent {
457
798
  i0.ɵɵconditionalCreate(7, ViewSelectorComponent_Conditional_7_Template, 2, 0, "span", 6);
458
799
  i0.ɵɵelement(8, "i", 7);
459
800
  i0.ɵɵelementEnd();
460
- i0.ɵɵconditionalCreate(9, ViewSelectorComponent_Conditional_9_Template, 21, 8, "div", 8);
801
+ i0.ɵɵconditionalCreate(9, ViewSelectorComponent_Conditional_9_Template, 33, 12, "div", 8);
461
802
  i0.ɵɵelementEnd();
462
803
  i0.ɵɵconditionalCreate(10, ViewSelectorComponent_Conditional_10_Template, 2, 0, "button", 9);
463
804
  i0.ɵɵelementStart(11, "button", 10);
@@ -488,11 +829,11 @@ export class ViewSelectorComponent {
488
829
  i0.ɵɵconditional(ctx.isDropdownOpen ? 9 : -1);
489
830
  i0.ɵɵadvance();
490
831
  i0.ɵɵconditional(ctx.selectedViewId ? 10 : -1);
491
- } }, styles: ["\n\n.view-selector-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n position: relative;\n}\n\n\n\n.dropdown-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.view-selector-wrapper[_ngcontent-%COMP%] {\n position: relative;\n}\n\n\n\n.view-selector-button[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: var(--background-alt, #f5f5f5);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--text-primary, #333);\n transition: all 0.15s ease;\n min-width: 140px;\n max-width: 280px;\n}\n\n.view-selector-button[_ngcontent-%COMP%]:hover {\n background: var(--background-hover, #e8e8e8);\n border-color: var(--border-color-hover, #ccc);\n}\n\n.view-selector-button[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.view-selector-button.open[_ngcontent-%COMP%] {\n background: var(--background-active, #e0e0e0);\n border-color: var(--primary-color, #007bff);\n}\n\n.view-selector-button.modified[_ngcontent-%COMP%] {\n border-color: var(--warning-color, #f59e0b);\n}\n\n.view-icon[_ngcontent-%COMP%] {\n color: var(--text-secondary, #666);\n font-size: 12px;\n}\n\n.view-name[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: left;\n}\n\n.modified-indicator[_ngcontent-%COMP%] {\n color: var(--warning-color, #f59e0b);\n font-weight: bold;\n font-size: 18px;\n line-height: 1;\n}\n\n.dropdown-arrow[_ngcontent-%COMP%] {\n color: var(--text-secondary, #666);\n font-size: 10px;\n transition: transform 0.2s ease;\n}\n\n.dropdown-arrow.rotated[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n}\n\n\n\n.dropdown-panel[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n min-width: 280px;\n max-width: 360px;\n max-height: 400px;\n overflow-y: auto;\n background: var(--background-panel, #fff);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 8px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n z-index: 1000;\n}\n\n\n\n.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}\n\n.dropdown-item[_ngcontent-%COMP%]:hover {\n background: var(--background-hover, #f5f5f5);\n}\n\n.dropdown-item.selected[_ngcontent-%COMP%] {\n background: var(--primary-light, #e6f0ff);\n}\n\n.dropdown-item.selected[_ngcontent-%COMP%]:hover {\n background: var(--primary-light-hover, #d6e4f9);\n}\n\n.default-option[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.item-icon[_ngcontent-%COMP%] {\n color: var(--text-secondary, #666);\n font-size: 13px;\n width: 16px;\n text-align: center;\n}\n\n.item-name[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n}\n\n.shared-indicator[_ngcontent-%COMP%], \n.default-indicator[_ngcontent-%COMP%], \n.readonly-indicator[_ngcontent-%COMP%] {\n color: var(--text-tertiary, #999);\n font-size: 11px;\n}\n\n.default-indicator[_ngcontent-%COMP%] {\n color: var(--warning-color, #f59e0b);\n}\n\n.selected-check[_ngcontent-%COMP%] {\n color: var(--primary-color, #007bff);\n font-size: 12px;\n}\n\n\n\n.dropdown-section[_ngcontent-%COMP%] {\n padding: 4px 0;\n}\n\n.section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px 6px;\n font-size: 11px;\n font-weight: 600;\n color: var(--text-tertiary, #999);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-icon[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.section-title[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.section-count[_ngcontent-%COMP%] {\n background: var(--background-alt, #f0f0f0);\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 10px;\n}\n\n\n\n.dropdown-divider[_ngcontent-%COMP%] {\n height: 1px;\n background: var(--border-color-light, #eee);\n margin: 4px 0;\n}\n\n\n\n.empty-views-message[_ngcontent-%COMP%], \n.loading-views[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 20px;\n color: var(--text-tertiary, #999);\n font-size: 13px;\n}\n\n\n\n.dropdown-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n padding: 10px 14px;\n}\n\n.action-button[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 8px 12px;\n background: var(--background-alt, #f5f5f5);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 6px;\n cursor: pointer;\n font-size: 12px;\n color: var(--text-primary, #333);\n transition: all 0.15s ease;\n}\n\n.action-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--background-hover, #e8e8e8);\n border-color: var(--border-color-hover, #ccc);\n}\n\n.action-button[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.action-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n\n\n.open-in-tab-button[_ngcontent-%COMP%], \n.configure-view-button[_ngcontent-%COMP%], \n.create-record-button[_ngcontent-%COMP%], \n.export-button[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: var(--background-alt, #f5f5f5);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 6px;\n cursor: pointer;\n color: var(--text-secondary, #666);\n transition: all 0.15s ease;\n}\n\n.open-in-tab-button[_ngcontent-%COMP%]:hover, \n.configure-view-button[_ngcontent-%COMP%]:hover, \n.create-record-button[_ngcontent-%COMP%]:hover, \n.export-button[_ngcontent-%COMP%]:hover {\n background: var(--background-hover, #e8e8e8);\n border-color: var(--border-color-hover, #ccc);\n color: var(--primary-color, #007bff);\n}\n\n.open-in-tab-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.configure-view-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.create-record-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.export-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n.export-button[_ngcontent-%COMP%]:hover {\n color: #217346; \n\n}\n\n\n\n@media (max-width: 768px) {\n .view-selector-button[_ngcontent-%COMP%] {\n min-width: 100px;\n max-width: 180px;\n padding: 6px 10px;\n }\n\n .dropdown-panel[_ngcontent-%COMP%] {\n min-width: 240px;\n max-width: calc(100vw - 32px);\n }\n\n .dropdown-actions[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n}"] });
832
+ } }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel], styles: ["/* ========================================\n VIEW SELECTOR - All classes prefixed vs-\n to avoid conflicts (ViewEncapsulation.None)\n ======================================== */\n\n/* Container */\n.vs-container {\n display: flex;\n align-items: center;\n gap: 4px;\n position: relative;\n}\n\n/* Backdrop for closing panel */\n.vs-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.vs-wrapper {\n position: relative;\n}\n\n/* Main Button */\n.vs-button {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: var(--background-alt, #f5f5f5);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 4px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--text-primary, #333);\n transition: all 0.15s ease;\n min-width: 140px;\n max-width: 280px;\n}\n\n.vs-button:hover {\n border-color: #5c6bc0;\n background: #f3f4fa;\n}\n\n.vs-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.vs-button.open {\n border-color: #5c6bc0;\n background: #f3f4fa;\n}\n\n.vs-button.modified {\n border-color: #f57c00;\n}\n\n.vs-btn-icon {\n color: #5c6bc0;\n font-size: 12px;\n}\n\n.vs-btn-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: left;\n}\n\n.vs-modified-dot {\n color: #f57c00;\n font-weight: bold;\n font-size: 18px;\n line-height: 1;\n}\n\n.vs-arrow {\n color: #999;\n font-size: 10px;\n transition: transform 0.2s ease;\n}\n\n.vs-arrow.rotated {\n transform: rotate(180deg);\n}\n\n/* ========================================\n RICH VIEW PANEL\n Styles ported directly from prototype\n ======================================== */\n\n/* Reset inherited styles inside panel */\n.vs-panel,\n.vs-panel * {\n box-sizing: border-box;\n line-height: 1.5;\n text-align: left;\n}\n\n.vs-panel {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n width: 400px;\n max-width: calc(100vw - 40px);\n background: #fff;\n border: 1px solid #e0e0e0;\n border-radius: 12px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.16);\n z-index: 1000;\n overflow: hidden;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 13px;\n color: #333;\n}\n\n/* Panel Header */\n.vs-panel-header {\n padding: 16px 20px;\n display: flex;\n align-items: center;\n gap: 12px;\n border-bottom: 1px solid #f0f0f0;\n}\n\n.vs-header-icon {\n color: #5c6bc0;\n font-size: 14px;\n}\n\n.vs-panel-title {\n font-size: 15px;\n font-weight: 600;\n color: #333;\n}\n\n.vs-entity-badge {\n font-size: 11px;\n font-weight: 500;\n background: #e8eaf6;\n color: #5c6bc0;\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.vs-close-btn {\n margin-left: auto;\n background: none;\n border: none;\n cursor: pointer;\n color: #999;\n font-size: 16px;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.vs-close-btn:hover {\n color: #333;\n}\n\n/* Panel Search */\n.vs-panel-search {\n padding: 12px 20px;\n border-bottom: 1px solid #f0f0f0;\n}\n\n.vs-search-input {\n width: 100%;\n padding: 6px 12px 6px 32px;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n font-size: 13px;\n background: #f5f5f5 url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' fill='%23999'%3E%3Cpath d='M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208z'/%3E%3C/svg%3E\") no-repeat 10px center;\n background-size: 14px;\n box-sizing: border-box;\n font-family: inherit;\n}\n\n.vs-search-input:focus {\n outline: none;\n border-color: #5c6bc0;\n}\n\n.vs-search-input::placeholder {\n color: #999;\n}\n\n/* Panel Body */\n.vs-panel-body {\n max-height: 400px;\n overflow-y: auto;\n}\n\n/* View Section */\n.vs-section {\n padding: 8px 0;\n}\n\n.vs-section-header {\n padding: 6px 20px;\n font-size: 11px;\n font-weight: 700;\n color: #999;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.vs-section-header i {\n font-size: 10px;\n}\n\n.vs-section-count {\n background: #e0e0e0;\n padding: 0 6px;\n border-radius: 8px;\n font-size: 10px;\n}\n\n/* View Card */\n.vs-card {\n padding: 10px 20px;\n cursor: pointer;\n transition: background 0.1s;\n display: flex;\n align-items: flex-start;\n gap: 12px;\n}\n\n.vs-card:hover {\n background: #f3f4fa;\n}\n\n.vs-card.active {\n background: #e8eaf6;\n border-left: 3px solid #5c6bc0;\n padding-left: 17px;\n}\n\n/* View Card Icon */\n.vs-card-icon {\n width: 32px;\n height: 32px;\n border-radius: 6px;\n background: #f5f5f5;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #999;\n font-size: 14px;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n.vs-card-icon.active {\n background: #5c6bc0;\n color: white;\n}\n\n.vs-card-icon.shared {\n background: #f5f5f5;\n color: #999;\n}\n\n/* View Card Content */\n.vs-card-content {\n flex: 1;\n min-width: 0;\n padding-top: 4px;\n}\n\n.vs-card-name {\n font-size: 13px;\n font-weight: 500;\n color: #333;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.vs-card.active .vs-card-name {\n color: #5c6bc0;\n font-weight: 600;\n}\n\n.vs-default-badge {\n font-size: 9px;\n font-weight: 600;\n background: #e8f5e9;\n color: #43a047;\n padding: 1px 5px;\n border-radius: 6px;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.vs-shared-badge {\n font-size: 9px;\n font-weight: 600;\n background: #e8eaf6;\n color: #5c6bc0;\n padding: 1px 5px;\n border-radius: 6px;\n}\n\n.vs-shared-badge.editable {\n background: #e8f5e9;\n color: #43a047;\n}\n\n.vs-card-desc {\n font-size: 12px;\n color: #999;\n margin-top: 2px;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.vs-card-meta {\n display: flex;\n gap: 10px;\n margin-top: 4px;\n font-size: 11px;\n color: #999;\n}\n\n.vs-card-meta span {\n display: flex;\n align-items: center;\n gap: 3px;\n}\n\n.vs-card-meta i {\n font-size: 10px;\n}\n\n/* View Card Check */\n.vs-card-check {\n color: #5c6bc0;\n font-size: 12px;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n/* View Card Actions (hover reveal) */\n.vs-card-actions {\n display: flex;\n gap: 2px;\n opacity: 0;\n transition: opacity 0.15s;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n.vs-card:hover .vs-card-actions {\n opacity: 1;\n}\n\n.vs-action-btn {\n width: 26px;\n height: 26px;\n border-radius: 4px;\n border: none;\n background: none;\n cursor: pointer;\n color: #999;\n font-size: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.vs-action-btn:hover {\n background: #f5f5f5;\n color: #333;\n}\n\n/* Empty State */\n.vs-empty-message {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px;\n color: #999;\n font-size: 13px;\n}\n\n.vs-empty-message i {\n font-size: 16px;\n opacity: 0.5;\n}\n\n.vs-empty-text {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.vs-empty-text strong {\n color: #666;\n font-size: 13px;\n}\n\n.vs-empty-text span {\n font-size: 12px;\n}\n\n/* Loading */\n.vs-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 20px;\n color: #999;\n font-size: 13px;\n text-align: center;\n}\n\n/* Panel Footer */\n.vs-panel-footer {\n padding: 12px 20px;\n border-top: 1px solid #f0f0f0;\n display: flex;\n gap: 8px;\n}\n\n.vs-panel-btn {\n flex: 1;\n padding: 8px 12px;\n border-radius: 4px;\n border: 1px solid #e0e0e0;\n background: #fff;\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n color: #666;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n transition: all 0.15s;\n font-family: inherit;\n text-align: center;\n}\n\n.vs-panel-btn:hover {\n border-color: #5c6bc0;\n color: #5c6bc0;\n}\n\n.vs-panel-btn.primary {\n background: #5c6bc0;\n color: white;\n border-color: #5c6bc0;\n}\n\n.vs-panel-btn.primary:hover {\n background: #4a59b0;\n}\n\n.vs-panel-btn i {\n font-size: 11px;\n}\n\n/* ========================================\n ICON BUTTONS (outside panel)\n ======================================== */\n\n.vs-icon-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: var(--background-alt, #f5f5f5);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 6px;\n cursor: pointer;\n color: var(--text-secondary, #666);\n transition: all 0.15s ease;\n}\n\n.vs-icon-btn:hover {\n background: var(--background-hover, #e8e8e8);\n border-color: var(--border-color-hover, #ccc);\n color: #5c6bc0;\n}\n\n.vs-icon-btn i {\n font-size: 12px;\n}\n\n.vs-export-btn:hover {\n color: #217346;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .vs-button {\n min-width: 100px;\n max-width: 180px;\n padding: 6px 10px;\n }\n\n .vs-panel {\n width: calc(100vw - 32px);\n max-width: 400px;\n }\n}\n"], encapsulation: 2 });
492
833
  }
493
834
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ViewSelectorComponent, [{
494
835
  type: Component,
495
- args: [{ standalone: false, selector: 'mj-view-selector', template: "<div class=\"view-selector-container\">\n <!-- Backdrop for closing dropdown -->\n @if (isDropdownOpen) {\n <div class=\"dropdown-backdrop\" (click)=\"closeDropdown()\"></div>\n }\n\n <!-- Main View Selector Button -->\n <div class=\"view-selector-wrapper\">\n <button\n class=\"view-selector-button\"\n [class.modified]=\"viewModified\"\n [class.open]=\"isDropdownOpen\"\n (click)=\"toggleDropdown()\"\n [disabled]=\"isLoading\"\n title=\"Select a saved view\">\n <i class=\"fa-solid fa-layer-group view-icon\"></i>\n <span class=\"view-name\">{{ displayName }}</span>\n @if (viewModified) {\n <span class=\"modified-indicator\" title=\"View has unsaved changes\">\u2022</span>\n }\n <i class=\"fa-solid fa-chevron-down dropdown-arrow\" [class.rotated]=\"isDropdownOpen\"></i>\n </button>\n\n <!-- Dropdown Panel -->\n @if (isDropdownOpen) {\n <div class=\"dropdown-panel\">\n <!-- Default Option -->\n <div\n class=\"dropdown-item default-option\"\n [class.selected]=\"!selectedViewId\"\n (click)=\"selectDefault()\">\n <i class=\"fa-solid fa-table item-icon\"></i>\n <span class=\"item-name\">(Default)</span>\n @if (!selectedViewId) {\n <i class=\"fa-solid fa-check selected-check\"></i>\n }\n </div>\n\n <div class=\"dropdown-divider\"></div>\n\n <!-- My Views Section -->\n @if (myViews.length > 0) {\n <div class=\"dropdown-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-user section-icon\"></i>\n <span class=\"section-title\">My Views</span>\n <span class=\"section-count\">{{ myViews.length }}</span>\n </div>\n @for (view of myViews; track view.id) {\n <div\n class=\"dropdown-item view-item\"\n [class.selected]=\"selectedViewId === view.id\"\n (click)=\"selectView(view)\">\n <i class=\"fa-solid fa-layer-group item-icon\"></i>\n <span class=\"item-name\">{{ view.name }}</span>\n @if (view.isShared) {\n <i class=\"fa-solid fa-share-alt shared-indicator\" title=\"Shared with others\"></i>\n }\n @if (view.isDefault) {\n <i class=\"fa-solid fa-star default-indicator\" title=\"Default view for this entity\"></i>\n }\n @if (selectedViewId === view.id) {\n <i class=\"fa-solid fa-check selected-check\"></i>\n }\n </div>\n }\n </div>\n }\n\n <!-- Shared Views Section -->\n @if (sharedViews.length > 0) {\n <div class=\"dropdown-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-users section-icon\"></i>\n <span class=\"section-title\">Shared Views</span>\n <span class=\"section-count\">{{ sharedViews.length }}</span>\n </div>\n @for (view of sharedViews; track view.id) {\n <div\n class=\"dropdown-item view-item\"\n [class.selected]=\"selectedViewId === view.id\"\n (click)=\"selectView(view)\">\n <i class=\"fa-solid fa-layer-group item-icon\"></i>\n <span class=\"item-name\">{{ view.name }}</span>\n @if (!view.userCanEdit) {\n <i class=\"fa-solid fa-lock readonly-indicator\" title=\"View-only access\"></i>\n }\n @if (selectedViewId === view.id) {\n <i class=\"fa-solid fa-check selected-check\"></i>\n }\n </div>\n }\n </div>\n }\n\n <!-- No Views Message -->\n @if (!hasViews && !isLoading) {\n <div class=\"empty-views-message\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>No saved views yet</span>\n </div>\n }\n\n <!-- Loading Indicator -->\n @if (isLoading) {\n <div class=\"loading-views\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading views...</span>\n </div>\n }\n\n <div class=\"dropdown-divider\"></div>\n\n <!-- Actions Section -->\n <div class=\"dropdown-actions\">\n <button\n class=\"action-button\"\n (click)=\"onSaveView()\"\n [disabled]=\"!viewModified && !selectedViewId\"\n title=\"Save current configuration\">\n <i class=\"fa-solid fa-save\"></i>\n <span>Save View</span>\n </button>\n <button\n class=\"action-button\"\n (click)=\"onSaveAsNewView()\"\n title=\"Save as a new view\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>Save As New</span>\n </button>\n </div>\n </div>\n }\n </div>\n\n <!-- Open in Tab Button (only visible when a view is selected) -->\n @if (selectedViewId) {\n <button\n class=\"open-in-tab-button\"\n (click)=\"onOpenInTab()\"\n title=\"Open this view in a new tab\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n </button>\n }\n\n <!-- Configure View Button -->\n <button\n class=\"configure-view-button\"\n (click)=\"onConfigureView()\"\n title=\"Configure view settings (columns, filters, sorting)\">\n <i class=\"fa-solid fa-sliders-h\"></i>\n </button>\n\n <!-- Create New Record Button -->\n <button\n class=\"create-record-button\"\n (click)=\"onCreateNewRecord()\"\n title=\"Create new record\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n\n <!-- Export Button -->\n <button\n class=\"export-button\"\n (click)=\"onExport()\"\n title=\"Export to Excel\">\n <i class=\"fa-solid fa-file-excel\"></i>\n </button>\n</div>\n", styles: ["/* View Selector Container */\n.view-selector-container {\n display: flex;\n align-items: center;\n gap: 4px;\n position: relative;\n}\n\n/* Backdrop for closing dropdown */\n.dropdown-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.view-selector-wrapper {\n position: relative;\n}\n\n/* Main Button */\n.view-selector-button {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: var(--background-alt, #f5f5f5);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--text-primary, #333);\n transition: all 0.15s ease;\n min-width: 140px;\n max-width: 280px;\n}\n\n.view-selector-button:hover {\n background: var(--background-hover, #e8e8e8);\n border-color: var(--border-color-hover, #ccc);\n}\n\n.view-selector-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.view-selector-button.open {\n background: var(--background-active, #e0e0e0);\n border-color: var(--primary-color, #007bff);\n}\n\n.view-selector-button.modified {\n border-color: var(--warning-color, #f59e0b);\n}\n\n.view-icon {\n color: var(--text-secondary, #666);\n font-size: 12px;\n}\n\n.view-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: left;\n}\n\n.modified-indicator {\n color: var(--warning-color, #f59e0b);\n font-weight: bold;\n font-size: 18px;\n line-height: 1;\n}\n\n.dropdown-arrow {\n color: var(--text-secondary, #666);\n font-size: 10px;\n transition: transform 0.2s ease;\n}\n\n.dropdown-arrow.rotated {\n transform: rotate(180deg);\n}\n\n/* Dropdown Panel */\n.dropdown-panel {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n min-width: 280px;\n max-width: 360px;\n max-height: 400px;\n overflow-y: auto;\n background: var(--background-panel, #fff);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 8px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n z-index: 1000;\n}\n\n/* Dropdown Items */\n.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}\n\n.dropdown-item:hover {\n background: var(--background-hover, #f5f5f5);\n}\n\n.dropdown-item.selected {\n background: var(--primary-light, #e6f0ff);\n}\n\n.dropdown-item.selected:hover {\n background: var(--primary-light-hover, #d6e4f9);\n}\n\n.default-option {\n font-weight: 500;\n}\n\n.item-icon {\n color: var(--text-secondary, #666);\n font-size: 13px;\n width: 16px;\n text-align: center;\n}\n\n.item-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n}\n\n.shared-indicator,\n.default-indicator,\n.readonly-indicator {\n color: var(--text-tertiary, #999);\n font-size: 11px;\n}\n\n.default-indicator {\n color: var(--warning-color, #f59e0b);\n}\n\n.selected-check {\n color: var(--primary-color, #007bff);\n font-size: 12px;\n}\n\n/* Dropdown Sections */\n.dropdown-section {\n padding: 4px 0;\n}\n\n.section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px 6px;\n font-size: 11px;\n font-weight: 600;\n color: var(--text-tertiary, #999);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-icon {\n font-size: 10px;\n}\n\n.section-title {\n flex: 1;\n}\n\n.section-count {\n background: var(--background-alt, #f0f0f0);\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 10px;\n}\n\n/* Dropdown Divider */\n.dropdown-divider {\n height: 1px;\n background: var(--border-color-light, #eee);\n margin: 4px 0;\n}\n\n/* Empty State */\n.empty-views-message,\n.loading-views {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 20px;\n color: var(--text-tertiary, #999);\n font-size: 13px;\n}\n\n/* Actions Section */\n.dropdown-actions {\n display: flex;\n gap: 8px;\n padding: 10px 14px;\n}\n\n.action-button {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 8px 12px;\n background: var(--background-alt, #f5f5f5);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 6px;\n cursor: pointer;\n font-size: 12px;\n color: var(--text-primary, #333);\n transition: all 0.15s ease;\n}\n\n.action-button:hover:not(:disabled) {\n background: var(--background-hover, #e8e8e8);\n border-color: var(--border-color-hover, #ccc);\n}\n\n.action-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.action-button i {\n font-size: 11px;\n}\n\n/* Open in Tab Button */\n.open-in-tab-button,\n.configure-view-button,\n.create-record-button,\n.export-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: var(--background-alt, #f5f5f5);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 6px;\n cursor: pointer;\n color: var(--text-secondary, #666);\n transition: all 0.15s ease;\n}\n\n.open-in-tab-button:hover,\n.configure-view-button:hover,\n.create-record-button:hover,\n.export-button:hover {\n background: var(--background-hover, #e8e8e8);\n border-color: var(--border-color-hover, #ccc);\n color: var(--primary-color, #007bff);\n}\n\n.open-in-tab-button i,\n.configure-view-button i,\n.create-record-button i,\n.export-button i {\n font-size: 12px;\n}\n\n/* Excel export button special color on hover */\n.export-button:hover {\n color: #217346; /* Excel green */\n}\n\n/* Responsive Adjustments */\n@media (max-width: 768px) {\n .view-selector-button {\n min-width: 100px;\n max-width: 180px;\n padding: 6px 10px;\n }\n\n .dropdown-panel {\n min-width: 240px;\n max-width: calc(100vw - 32px);\n }\n\n .dropdown-actions {\n flex-direction: column;\n }\n}\n"] }]
836
+ args: [{ standalone: false, selector: 'mj-view-selector', encapsulation: ViewEncapsulation.None, template: "<div class=\"vs-container\">\n <!-- Backdrop for closing panel -->\n @if (isDropdownOpen) {\n <div class=\"vs-backdrop\" (click)=\"closeDropdown()\"></div>\n }\n\n <!-- Main View Selector Button -->\n <div class=\"vs-wrapper\">\n <button\n class=\"vs-button\"\n [class.modified]=\"viewModified\"\n [class.open]=\"isDropdownOpen\"\n (click)=\"toggleDropdown()\"\n [disabled]=\"isLoading\"\n title=\"Select a saved view\">\n <i class=\"fa-solid fa-layer-group vs-btn-icon\"></i>\n <span class=\"vs-btn-name\">{{ displayName }}</span>\n @if (viewModified) {\n <span class=\"vs-modified-dot\" title=\"View has unsaved changes\">\u2022</span>\n }\n <i class=\"fa-solid fa-chevron-down vs-arrow\" [class.rotated]=\"isDropdownOpen\"></i>\n </button>\n\n <!-- Rich View Panel -->\n @if (isDropdownOpen) {\n <div class=\"vs-panel\">\n <!-- Panel Header -->\n <div class=\"vs-panel-header\">\n <i class=\"fa-solid fa-table-list vs-header-icon\"></i>\n <span class=\"vs-panel-title\">Views</span>\n @if (entity) {\n <span class=\"vs-entity-badge\">{{ entity.DisplayNameOrName }}</span>\n }\n <button class=\"vs-close-btn\" (click)=\"closeDropdown()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Search -->\n <div class=\"vs-panel-search\">\n <input\n type=\"text\"\n class=\"vs-search-input\"\n placeholder=\"Search views...\"\n [(ngModel)]=\"searchText\"\n (keydown.escape)=\"searchText = ''\"\n />\n </div>\n\n <!-- Panel Body -->\n <div class=\"vs-panel-body\">\n <!-- Default Option -->\n <div class=\"vs-section\">\n <div\n class=\"vs-card\"\n [class.active]=\"!selectedViewId\"\n (click)=\"selectDefault()\">\n <div class=\"vs-card-icon\" [class.active]=\"!selectedViewId\">\n <i class=\"fa-solid fa-table\"></i>\n </div>\n <div class=\"vs-card-content\">\n <div class=\"vs-card-name\">(Default)</div>\n </div>\n @if (!selectedViewId) {\n <i class=\"fa-solid fa-check vs-card-check\"></i>\n }\n </div>\n </div>\n\n <!-- My Views Section -->\n @if (filteredMyViews.length > 0) {\n <div class=\"vs-section\">\n <div class=\"vs-section-header\">\n <i class=\"fa-solid fa-user\"></i>\n <span>My Views</span>\n <span class=\"vs-section-count\">{{ filteredMyViews.length }}</span>\n </div>\n @for (view of filteredMyViews; track view.id) {\n <div\n class=\"vs-card\"\n [class.active]=\"selectedViewId === view.id\"\n (click)=\"selectView(view)\">\n <div class=\"vs-card-icon\" [class.active]=\"selectedViewId === view.id\">\n <i class=\"fa-solid fa-table-list\"></i>\n </div>\n <div class=\"vs-card-content\">\n <div class=\"vs-card-name\">\n {{ view.name }}\n @if (view.isDefault) {\n <span class=\"vs-default-badge\">Default</span>\n }\n </div>\n @if (view.entity.Description) {\n <div class=\"vs-card-desc\">{{ view.entity.Description }}</div>\n }\n @if (getViewFilterCount(view) > 0 || getViewColumnCount(view) > 0 || getViewSortInfo(view)) {\n <div class=\"vs-card-meta\">\n @if (getViewFilterCount(view) > 0) {\n <span><i class=\"fa-solid fa-filter\"></i> {{ getViewFilterCount(view) }} filter{{ getViewFilterCount(view) !== 1 ? 's' : '' }}</span>\n }\n @if (getViewColumnCount(view) > 0) {\n <span><i class=\"fa-solid fa-table-columns\"></i> {{ getViewColumnCount(view) }} col{{ getViewColumnCount(view) !== 1 ? 's' : '' }}</span>\n }\n @if (getViewSortInfo(view)) {\n <span><i class=\"fa-solid fa-arrow-down-short-wide\"></i> {{ getViewSortInfo(view) }}</span>\n }\n </div>\n }\n </div>\n <div class=\"vs-card-actions\">\n <button\n class=\"vs-action-btn\"\n (click)=\"onDuplicateView(view.id, $event)\"\n title=\"Duplicate\">\n <i class=\"fa-regular fa-copy\"></i>\n </button>\n <button\n class=\"vs-action-btn\"\n (click)=\"onConfigureViewById(view.id, $event)\"\n title=\"Configure\">\n <i class=\"fa-solid fa-sliders\"></i>\n </button>\n <button\n class=\"vs-action-btn\"\n (click)=\"onOpenViewInTab(view.id, $event)\"\n title=\"Open in Tab\">\n <i class=\"fa-solid fa-up-right-from-square\"></i>\n </button>\n </div>\n @if (selectedViewId === view.id) {\n <i class=\"fa-solid fa-check vs-card-check\"></i>\n }\n </div>\n }\n </div>\n }\n\n <!-- Shared Views Section -->\n @if (filteredSharedViews.length > 0) {\n <div class=\"vs-section\">\n <div class=\"vs-section-header\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n <span>Shared With Me</span>\n <span class=\"vs-section-count\">{{ filteredSharedViews.length }}</span>\n </div>\n @for (view of filteredSharedViews; track view.id) {\n <div\n class=\"vs-card\"\n [class.active]=\"selectedViewId === view.id\"\n (click)=\"selectView(view)\">\n <div class=\"vs-card-icon shared\">\n <i class=\"fa-solid fa-users\"></i>\n </div>\n <div class=\"vs-card-content\">\n <div class=\"vs-card-name\">\n {{ view.name }}\n @if (!view.userCanEdit) {\n <span class=\"vs-shared-badge\">View Only</span>\n } @else {\n <span class=\"vs-shared-badge editable\">Can Edit</span>\n }\n </div>\n @if (view.entity.Description) {\n <div class=\"vs-card-desc\">{{ view.entity.Description }}</div>\n }\n @if (getViewFilterCount(view) > 0 || getViewColumnCount(view) > 0) {\n <div class=\"vs-card-meta\">\n @if (getViewFilterCount(view) > 0) {\n <span><i class=\"fa-solid fa-filter\"></i> {{ getViewFilterCount(view) }} filter{{ getViewFilterCount(view) !== 1 ? 's' : '' }}</span>\n }\n @if (getViewColumnCount(view) > 0) {\n <span><i class=\"fa-solid fa-table-columns\"></i> {{ getViewColumnCount(view) }} col{{ getViewColumnCount(view) !== 1 ? 's' : '' }}</span>\n }\n </div>\n }\n </div>\n <div class=\"vs-card-actions\">\n <button\n class=\"vs-action-btn\"\n (click)=\"onDuplicateView(view.id, $event)\"\n title=\"Duplicate as My View\">\n <i class=\"fa-regular fa-copy\"></i>\n </button>\n @if (view.userCanEdit) {\n <button\n class=\"vs-action-btn\"\n (click)=\"onConfigureViewById(view.id, $event)\"\n title=\"Configure\">\n <i class=\"fa-solid fa-sliders\"></i>\n </button>\n }\n </div>\n @if (selectedViewId === view.id) {\n <i class=\"fa-solid fa-check vs-card-check\"></i>\n }\n </div>\n }\n </div>\n }\n\n <!-- No Views Message -->\n @if (!hasViews && !isLoading) {\n <div class=\"vs-empty-message\">\n <i class=\"fa-solid fa-bookmark\"></i>\n <div class=\"vs-empty-text\">\n <strong>No saved views yet</strong>\n <span>Save your current configuration as a view</span>\n </div>\n </div>\n }\n\n <!-- No Search Results -->\n @if (hasViews && filteredMyViews.length === 0 && filteredSharedViews.length === 0 && searchText) {\n <div class=\"vs-empty-message\">\n <i class=\"fa-solid fa-search\"></i>\n <span>No views match \"{{ searchText }}\"</span>\n </div>\n }\n\n <!-- Loading Indicator -->\n @if (isLoading) {\n <div class=\"vs-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading views...</span>\n </div>\n }\n </div>\n\n <!-- Panel Footer -->\n <div class=\"vs-panel-footer\">\n <button\n class=\"vs-panel-btn primary\"\n (click)=\"onQuickSave()\"\n title=\"Save current view configuration\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New View</span>\n </button>\n <button\n class=\"vs-panel-btn\"\n (click)=\"onResetToDefault()\"\n title=\"Reset to default view\">\n <i class=\"fa-solid fa-arrow-rotate-left\"></i>\n <span>Reset to Default</span>\n </button>\n </div>\n </div>\n }\n </div>\n\n <!-- Open in Tab Button (only visible when a view is selected) -->\n @if (selectedViewId) {\n <button\n class=\"vs-icon-btn\"\n (click)=\"onOpenInTab()\"\n title=\"Open this view in a new tab\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n </button>\n }\n\n <!-- Configure View Button -->\n <button\n class=\"vs-icon-btn\"\n (click)=\"onConfigureView()\"\n title=\"Configure view settings (columns, filters, sorting)\">\n <i class=\"fa-solid fa-sliders-h\"></i>\n </button>\n\n <!-- Create New Record Button -->\n <button\n class=\"vs-icon-btn\"\n (click)=\"onCreateNewRecord()\"\n title=\"Create new record\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n\n <!-- Export Button -->\n <button\n class=\"vs-icon-btn vs-export-btn\"\n (click)=\"onExport()\"\n title=\"Export to Excel\">\n <i class=\"fa-solid fa-file-excel\"></i>\n </button>\n</div>\n", styles: ["/* ========================================\n VIEW SELECTOR - All classes prefixed vs-\n to avoid conflicts (ViewEncapsulation.None)\n ======================================== */\n\n/* Container */\n.vs-container {\n display: flex;\n align-items: center;\n gap: 4px;\n position: relative;\n}\n\n/* Backdrop for closing panel */\n.vs-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.vs-wrapper {\n position: relative;\n}\n\n/* Main Button */\n.vs-button {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: var(--background-alt, #f5f5f5);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 4px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--text-primary, #333);\n transition: all 0.15s ease;\n min-width: 140px;\n max-width: 280px;\n}\n\n.vs-button:hover {\n border-color: #5c6bc0;\n background: #f3f4fa;\n}\n\n.vs-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.vs-button.open {\n border-color: #5c6bc0;\n background: #f3f4fa;\n}\n\n.vs-button.modified {\n border-color: #f57c00;\n}\n\n.vs-btn-icon {\n color: #5c6bc0;\n font-size: 12px;\n}\n\n.vs-btn-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: left;\n}\n\n.vs-modified-dot {\n color: #f57c00;\n font-weight: bold;\n font-size: 18px;\n line-height: 1;\n}\n\n.vs-arrow {\n color: #999;\n font-size: 10px;\n transition: transform 0.2s ease;\n}\n\n.vs-arrow.rotated {\n transform: rotate(180deg);\n}\n\n/* ========================================\n RICH VIEW PANEL\n Styles ported directly from prototype\n ======================================== */\n\n/* Reset inherited styles inside panel */\n.vs-panel,\n.vs-panel * {\n box-sizing: border-box;\n line-height: 1.5;\n text-align: left;\n}\n\n.vs-panel {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n width: 400px;\n max-width: calc(100vw - 40px);\n background: #fff;\n border: 1px solid #e0e0e0;\n border-radius: 12px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.16);\n z-index: 1000;\n overflow: hidden;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 13px;\n color: #333;\n}\n\n/* Panel Header */\n.vs-panel-header {\n padding: 16px 20px;\n display: flex;\n align-items: center;\n gap: 12px;\n border-bottom: 1px solid #f0f0f0;\n}\n\n.vs-header-icon {\n color: #5c6bc0;\n font-size: 14px;\n}\n\n.vs-panel-title {\n font-size: 15px;\n font-weight: 600;\n color: #333;\n}\n\n.vs-entity-badge {\n font-size: 11px;\n font-weight: 500;\n background: #e8eaf6;\n color: #5c6bc0;\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.vs-close-btn {\n margin-left: auto;\n background: none;\n border: none;\n cursor: pointer;\n color: #999;\n font-size: 16px;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.vs-close-btn:hover {\n color: #333;\n}\n\n/* Panel Search */\n.vs-panel-search {\n padding: 12px 20px;\n border-bottom: 1px solid #f0f0f0;\n}\n\n.vs-search-input {\n width: 100%;\n padding: 6px 12px 6px 32px;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n font-size: 13px;\n background: #f5f5f5 url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' fill='%23999'%3E%3Cpath d='M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208z'/%3E%3C/svg%3E\") no-repeat 10px center;\n background-size: 14px;\n box-sizing: border-box;\n font-family: inherit;\n}\n\n.vs-search-input:focus {\n outline: none;\n border-color: #5c6bc0;\n}\n\n.vs-search-input::placeholder {\n color: #999;\n}\n\n/* Panel Body */\n.vs-panel-body {\n max-height: 400px;\n overflow-y: auto;\n}\n\n/* View Section */\n.vs-section {\n padding: 8px 0;\n}\n\n.vs-section-header {\n padding: 6px 20px;\n font-size: 11px;\n font-weight: 700;\n color: #999;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.vs-section-header i {\n font-size: 10px;\n}\n\n.vs-section-count {\n background: #e0e0e0;\n padding: 0 6px;\n border-radius: 8px;\n font-size: 10px;\n}\n\n/* View Card */\n.vs-card {\n padding: 10px 20px;\n cursor: pointer;\n transition: background 0.1s;\n display: flex;\n align-items: flex-start;\n gap: 12px;\n}\n\n.vs-card:hover {\n background: #f3f4fa;\n}\n\n.vs-card.active {\n background: #e8eaf6;\n border-left: 3px solid #5c6bc0;\n padding-left: 17px;\n}\n\n/* View Card Icon */\n.vs-card-icon {\n width: 32px;\n height: 32px;\n border-radius: 6px;\n background: #f5f5f5;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #999;\n font-size: 14px;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n.vs-card-icon.active {\n background: #5c6bc0;\n color: white;\n}\n\n.vs-card-icon.shared {\n background: #f5f5f5;\n color: #999;\n}\n\n/* View Card Content */\n.vs-card-content {\n flex: 1;\n min-width: 0;\n padding-top: 4px;\n}\n\n.vs-card-name {\n font-size: 13px;\n font-weight: 500;\n color: #333;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.vs-card.active .vs-card-name {\n color: #5c6bc0;\n font-weight: 600;\n}\n\n.vs-default-badge {\n font-size: 9px;\n font-weight: 600;\n background: #e8f5e9;\n color: #43a047;\n padding: 1px 5px;\n border-radius: 6px;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.vs-shared-badge {\n font-size: 9px;\n font-weight: 600;\n background: #e8eaf6;\n color: #5c6bc0;\n padding: 1px 5px;\n border-radius: 6px;\n}\n\n.vs-shared-badge.editable {\n background: #e8f5e9;\n color: #43a047;\n}\n\n.vs-card-desc {\n font-size: 12px;\n color: #999;\n margin-top: 2px;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.vs-card-meta {\n display: flex;\n gap: 10px;\n margin-top: 4px;\n font-size: 11px;\n color: #999;\n}\n\n.vs-card-meta span {\n display: flex;\n align-items: center;\n gap: 3px;\n}\n\n.vs-card-meta i {\n font-size: 10px;\n}\n\n/* View Card Check */\n.vs-card-check {\n color: #5c6bc0;\n font-size: 12px;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n/* View Card Actions (hover reveal) */\n.vs-card-actions {\n display: flex;\n gap: 2px;\n opacity: 0;\n transition: opacity 0.15s;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n.vs-card:hover .vs-card-actions {\n opacity: 1;\n}\n\n.vs-action-btn {\n width: 26px;\n height: 26px;\n border-radius: 4px;\n border: none;\n background: none;\n cursor: pointer;\n color: #999;\n font-size: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.vs-action-btn:hover {\n background: #f5f5f5;\n color: #333;\n}\n\n/* Empty State */\n.vs-empty-message {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px;\n color: #999;\n font-size: 13px;\n}\n\n.vs-empty-message i {\n font-size: 16px;\n opacity: 0.5;\n}\n\n.vs-empty-text {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.vs-empty-text strong {\n color: #666;\n font-size: 13px;\n}\n\n.vs-empty-text span {\n font-size: 12px;\n}\n\n/* Loading */\n.vs-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 20px;\n color: #999;\n font-size: 13px;\n text-align: center;\n}\n\n/* Panel Footer */\n.vs-panel-footer {\n padding: 12px 20px;\n border-top: 1px solid #f0f0f0;\n display: flex;\n gap: 8px;\n}\n\n.vs-panel-btn {\n flex: 1;\n padding: 8px 12px;\n border-radius: 4px;\n border: 1px solid #e0e0e0;\n background: #fff;\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n color: #666;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n transition: all 0.15s;\n font-family: inherit;\n text-align: center;\n}\n\n.vs-panel-btn:hover {\n border-color: #5c6bc0;\n color: #5c6bc0;\n}\n\n.vs-panel-btn.primary {\n background: #5c6bc0;\n color: white;\n border-color: #5c6bc0;\n}\n\n.vs-panel-btn.primary:hover {\n background: #4a59b0;\n}\n\n.vs-panel-btn i {\n font-size: 11px;\n}\n\n/* ========================================\n ICON BUTTONS (outside panel)\n ======================================== */\n\n.vs-icon-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: var(--background-alt, #f5f5f5);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 6px;\n cursor: pointer;\n color: var(--text-secondary, #666);\n transition: all 0.15s ease;\n}\n\n.vs-icon-btn:hover {\n background: var(--background-hover, #e8e8e8);\n border-color: var(--border-color-hover, #ccc);\n color: #5c6bc0;\n}\n\n.vs-icon-btn i {\n font-size: 12px;\n}\n\n.vs-export-btn:hover {\n color: #217346;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .vs-button {\n min-width: 100px;\n max-width: 180px;\n padding: 6px 10px;\n }\n\n .vs-panel {\n width: calc(100vw - 32px);\n max-width: 400px;\n }\n}\n"] }]
496
837
  }], () => [{ type: i0.ChangeDetectorRef }], { entity: [{
497
838
  type: Input
498
839
  }], selectedViewId: [{
@@ -513,6 +854,12 @@ export class ViewSelectorComponent {
513
854
  type: Output
514
855
  }], exportRequested: [{
515
856
  type: Output
857
+ }], duplicateViewRequested: [{
858
+ type: Output
859
+ }], quickSaveRequested: [{
860
+ type: Output
861
+ }], revertRequested: [{
862
+ type: Output
516
863
  }] }); })();
517
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ViewSelectorComponent, { className: "ViewSelectorComponent", filePath: "src/DataExplorer/components/view-selector/view-selector.component.ts", lineNumber: 51 }); })();
864
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ViewSelectorComponent, { className: "ViewSelectorComponent", filePath: "src/DataExplorer/components/view-selector/view-selector.component.ts", lineNumber: 52 }); })();
518
865
  //# sourceMappingURL=view-selector.component.js.map