@memberjunction/ng-dashboards 4.0.0 → 4.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 (242) hide show
  1. package/README.md +102 -339
  2. package/dist/AI/components/agents/agent-configuration.component.js +1 -1
  3. package/dist/AI/components/agents/agent-editor.component.js +1 -1
  4. package/dist/AI/components/agents/agent-filter-panel.component.js +1 -1
  5. package/dist/AI/components/charts/performance-heatmap.component.js +1 -1
  6. package/dist/AI/components/charts/time-series-chart.component.js +1 -1
  7. package/dist/AI/components/execution-monitoring.component.js +1 -1
  8. package/dist/AI/components/models/model-management.component.js +1 -1
  9. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +1 -1
  10. package/dist/AI/components/prompts/prompt-filter-panel.component.js +1 -1
  11. package/dist/AI/components/prompts/prompt-management.component.js +1 -1
  12. package/dist/AI/components/prompts/prompt-version-control.component.js +1 -1
  13. package/dist/AI/components/system/system-config-filter-panel.component.js +1 -1
  14. package/dist/AI/components/system/system-configuration.component.js +1 -1
  15. package/dist/AI/components/widgets/kpi-card.component.js +1 -1
  16. package/dist/AI/components/widgets/live-execution-widget.component.js +1 -1
  17. package/dist/APIKeys/api-applications-panel.component.js +1 -1
  18. package/dist/APIKeys/api-key-create-dialog.component.js +1 -1
  19. package/dist/APIKeys/api-key-edit-panel.component.js +1 -1
  20. package/dist/APIKeys/api-key-list.component.js +1 -1
  21. package/dist/APIKeys/api-keys-resource.component.js +1 -1
  22. package/dist/APIKeys/api-scopes-panel.component.js +1 -1
  23. package/dist/APIKeys/api-usage-panel.component.js +1 -1
  24. package/dist/Actions/components/actions-list-view.component.js +1 -1
  25. package/dist/Actions/components/actions-overview.component.js +1 -1
  26. package/dist/Actions/components/categories-list-view.component.js +1 -1
  27. package/dist/Actions/components/code-management.component.js +1 -1
  28. package/dist/Actions/components/entity-integration.component.js +1 -1
  29. package/dist/Actions/components/execution-monitoring.component.js +1 -1
  30. package/dist/Actions/components/executions-list-view.component.js +1 -1
  31. package/dist/Actions/components/explorer/action-breadcrumb.component.js +1 -1
  32. package/dist/Actions/components/explorer/action-card.component.js +1 -1
  33. package/dist/Actions/components/explorer/action-explorer.component.js +1 -1
  34. package/dist/Actions/components/explorer/action-list-item.component.js +1 -1
  35. package/dist/Actions/components/explorer/action-toolbar.component.js +1 -1
  36. package/dist/Actions/components/explorer/action-tree-panel.component.js +1 -1
  37. package/dist/Actions/components/explorer/new-action-panel.component.js +1 -1
  38. package/dist/Actions/components/explorer/new-category-panel.component.js +1 -1
  39. package/dist/Actions/components/scheduled-actions.component.js +1 -1
  40. package/dist/Actions/components/security-permissions.component.js +1 -1
  41. package/dist/Communication/communication-dashboard.component.js +1 -1
  42. package/dist/Communication/communication-logs-resource.component.js +1 -1
  43. package/dist/Communication/communication-monitor-resource.component.js +1 -1
  44. package/dist/Communication/communication-providers-resource.component.js +1 -1
  45. package/dist/Communication/communication-runs-resource.component.js +1 -1
  46. package/dist/Communication/communication-templates-resource.component.js +1 -1
  47. package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -1
  48. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +1 -1
  49. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +1 -1
  50. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +1 -1
  51. package/dist/ComponentStudio/components/browser/component-browser.component.js +1 -1
  52. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +1 -1
  53. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +1 -1
  54. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +1 -1
  55. package/dist/ComponentStudio/components/editors/spec-editor.component.js +1 -1
  56. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +1 -1
  57. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +1 -1
  58. package/dist/ComponentStudio/components/text-import-dialog.component.js +1 -1
  59. package/dist/ComponentStudio/components/workspace/component-preview.component.js +1 -1
  60. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +1 -1
  61. package/dist/Credentials/components/credentials-audit-resource.component.js +1 -1
  62. package/dist/Credentials/components/credentials-categories-resource.component.js +1 -1
  63. package/dist/Credentials/components/credentials-list-resource.component.js +1 -1
  64. package/dist/Credentials/components/credentials-overview-resource.component.js +1 -1
  65. package/dist/Credentials/components/credentials-types-resource.component.js +1 -1
  66. package/dist/Credentials/credentials-dashboard.component.js +1 -1
  67. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +1 -1
  68. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +1 -1
  69. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +1 -1
  70. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +1 -1
  71. package/dist/DataExplorer/components/view-selector/view-selector.component.js +1 -1
  72. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +2 -0
  73. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  74. package/dist/DataExplorer/data-explorer-dashboard.component.js +35 -11
  75. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  76. package/dist/DataExplorer/data-explorer-resource.component.js +1 -1
  77. package/dist/EntityAdmin/entity-admin-dashboard.component.js +1 -1
  78. package/dist/Home/home-application.d.ts +109 -22
  79. package/dist/Home/home-application.d.ts.map +1 -1
  80. package/dist/Home/home-application.js +351 -66
  81. package/dist/Home/home-application.js.map +1 -1
  82. package/dist/Home/home-dashboard.component.d.ts +48 -8
  83. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  84. package/dist/Home/home-dashboard.component.js +140 -62
  85. package/dist/Home/home-dashboard.component.js.map +1 -1
  86. package/dist/Lists/components/lists-browse-resource.component.js +1 -1
  87. package/dist/Lists/components/lists-categories-resource.component.js +1 -1
  88. package/dist/Lists/components/lists-my-lists-resource.component.js +1 -1
  89. package/dist/Lists/components/lists-operations-resource.component.js +1 -1
  90. package/dist/Lists/components/venn-diagram/venn-diagram.component.js +1 -1
  91. package/dist/MCP/components/mcp-connection-dialog.component.js +1 -1
  92. package/dist/MCP/components/mcp-log-detail-panel.component.js +1 -1
  93. package/dist/MCP/components/mcp-server-dialog.component.js +1 -1
  94. package/dist/MCP/components/mcp-test-tool-dialog.component.js +1 -1
  95. package/dist/MCP/mcp-dashboard.component.js +1 -1
  96. package/dist/MCP/mcp-filter-panel.component.js +1 -1
  97. package/dist/MCP/mcp-resource.component.js +1 -1
  98. package/dist/QueryBrowser/query-browser-resource.component.js +1 -1
  99. package/dist/Scheduling/components/job-slideout.component.js +1 -1
  100. package/dist/Scheduling/components/scheduling-activity-resource.component.js +1 -1
  101. package/dist/Scheduling/components/scheduling-activity.component.js +1 -1
  102. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +1 -1
  103. package/dist/Scheduling/components/scheduling-jobs.component.js +1 -1
  104. package/dist/Scheduling/components/scheduling-overview-resource.component.js +1 -1
  105. package/dist/Scheduling/components/scheduling-overview.component.js +1 -1
  106. package/dist/Scheduling/scheduling-dashboard.component.js +1 -1
  107. package/dist/SystemDiagnostics/system-diagnostics.component.js +1 -1
  108. package/dist/Testing/components/testing-analytics-resource.component.js +1 -1
  109. package/dist/Testing/components/testing-analytics.component.js +1 -1
  110. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
  111. package/dist/Testing/components/testing-dashboard-tab.component.js +1 -1
  112. package/dist/Testing/components/testing-explorer-resource.component.js +1 -1
  113. package/dist/Testing/components/testing-explorer.component.js +1 -1
  114. package/dist/Testing/components/testing-review-resource.component.js +1 -1
  115. package/dist/Testing/components/testing-review.component.js +1 -1
  116. package/dist/Testing/components/testing-runs-resource.component.js +1 -1
  117. package/dist/Testing/components/testing-runs.component.js +1 -1
  118. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js +1 -1
  119. package/dist/Testing/components/widgets/suite-tree.component.js +2 -2
  120. package/dist/Testing/components/widgets/test-run-detail-panel.component.js +1 -1
  121. package/dist/Testing/testing-dashboard.component.js +1 -1
  122. package/dist/VersionHistory/components/diff-resource.component.js +1 -1
  123. package/dist/VersionHistory/components/graph-resource.component.js +1 -1
  124. package/dist/VersionHistory/components/labels-resource.component.js +1 -1
  125. package/dist/VersionHistory/components/restore-resource.component.js +1 -1
  126. package/package.json +38 -38
  127. package/dist/AI/ai-dashboard.component.d.ts +0 -62
  128. package/dist/AI/ai-dashboard.component.d.ts.map +0 -1
  129. package/dist/AI/ai-dashboard.component.js +0 -338
  130. package/dist/AI/ai-dashboard.component.js.map +0 -1
  131. package/dist/AI/components/models/model-management-v2.component.d.ts +0 -96
  132. package/dist/AI/components/models/model-management-v2.component.d.ts.map +0 -1
  133. package/dist/AI/components/models/model-management-v2.component.js +0 -981
  134. package/dist/AI/components/models/model-management-v2.component.js.map +0 -1
  135. package/dist/AI/components/prompts/prompt-management-v2.component.d.ts +0 -97
  136. package/dist/AI/components/prompts/prompt-management-v2.component.d.ts.map +0 -1
  137. package/dist/AI/components/prompts/prompt-management-v2.component.js +0 -811
  138. package/dist/AI/components/prompts/prompt-management-v2.component.js.map +0 -1
  139. package/dist/Actions/actions-management-dashboard.component.d.ts +0 -52
  140. package/dist/Actions/actions-management-dashboard.component.d.ts.map +0 -1
  141. package/dist/Actions/actions-management-dashboard.component.js +0 -308
  142. package/dist/Actions/actions-management-dashboard.component.js.map +0 -1
  143. package/dist/Credentials/components/credential-category-edit-panel.component.d.ts +0 -44
  144. package/dist/Credentials/components/credential-category-edit-panel.component.d.ts.map +0 -1
  145. package/dist/Credentials/components/credential-category-edit-panel.component.js +0 -456
  146. package/dist/Credentials/components/credential-category-edit-panel.component.js.map +0 -1
  147. package/dist/Credentials/components/credential-edit-panel.component.d.ts +0 -70
  148. package/dist/Credentials/components/credential-edit-panel.component.d.ts.map +0 -1
  149. package/dist/Credentials/components/credential-edit-panel.component.js +0 -694
  150. package/dist/Credentials/components/credential-edit-panel.component.js.map +0 -1
  151. package/dist/Credentials/components/credential-type-edit-panel.component.d.ts +0 -56
  152. package/dist/Credentials/components/credential-type-edit-panel.component.d.ts.map +0 -1
  153. package/dist/Credentials/components/credential-type-edit-panel.component.js +0 -563
  154. package/dist/Credentials/components/credential-type-edit-panel.component.js.map +0 -1
  155. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts +0 -245
  156. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts.map +0 -1
  157. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js +0 -1143
  158. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js.map +0 -1
  159. package/dist/EntityAdmin/components/entity-details.component.d.ts +0 -50
  160. package/dist/EntityAdmin/components/entity-details.component.d.ts.map +0 -1
  161. package/dist/EntityAdmin/components/entity-details.component.js +0 -680
  162. package/dist/EntityAdmin/components/entity-details.component.js.map +0 -1
  163. package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts +0 -31
  164. package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts.map +0 -1
  165. package/dist/EntityAdmin/components/entity-filter-panel.component.js +0 -160
  166. package/dist/EntityAdmin/components/entity-filter-panel.component.js.map +0 -1
  167. package/dist/EntityAdmin/components/erd-composite.component.d.ts +0 -73
  168. package/dist/EntityAdmin/components/erd-composite.component.d.ts.map +0 -1
  169. package/dist/EntityAdmin/components/erd-composite.component.js +0 -271
  170. package/dist/EntityAdmin/components/erd-composite.component.js.map +0 -1
  171. package/dist/EntityAdmin/components/erd-diagram.component.d.ts +0 -47
  172. package/dist/EntityAdmin/components/erd-diagram.component.d.ts.map +0 -1
  173. package/dist/EntityAdmin/components/erd-diagram.component.js +0 -618
  174. package/dist/EntityAdmin/components/erd-diagram.component.js.map +0 -1
  175. package/dist/Scheduling/components/scheduling-health-resource.component.d.ts +0 -20
  176. package/dist/Scheduling/components/scheduling-health-resource.component.d.ts.map +0 -1
  177. package/dist/Scheduling/components/scheduling-health-resource.component.js +0 -55
  178. package/dist/Scheduling/components/scheduling-health-resource.component.js.map +0 -1
  179. package/dist/Scheduling/components/scheduling-health.component.d.ts +0 -30
  180. package/dist/Scheduling/components/scheduling-health.component.d.ts.map +0 -1
  181. package/dist/Scheduling/components/scheduling-health.component.js +0 -315
  182. package/dist/Scheduling/components/scheduling-health.component.js.map +0 -1
  183. package/dist/Scheduling/components/scheduling-history-resource.component.d.ts +0 -20
  184. package/dist/Scheduling/components/scheduling-history-resource.component.d.ts.map +0 -1
  185. package/dist/Scheduling/components/scheduling-history-resource.component.js +0 -55
  186. package/dist/Scheduling/components/scheduling-history-resource.component.js.map +0 -1
  187. package/dist/Scheduling/components/scheduling-history.component.d.ts +0 -48
  188. package/dist/Scheduling/components/scheduling-history.component.d.ts.map +0 -1
  189. package/dist/Scheduling/components/scheduling-history.component.js +0 -377
  190. package/dist/Scheduling/components/scheduling-history.component.js.map +0 -1
  191. package/dist/Scheduling/components/scheduling-monitor-resource.component.d.ts +0 -20
  192. package/dist/Scheduling/components/scheduling-monitor-resource.component.d.ts.map +0 -1
  193. package/dist/Scheduling/components/scheduling-monitor-resource.component.js +0 -55
  194. package/dist/Scheduling/components/scheduling-monitor-resource.component.js.map +0 -1
  195. package/dist/Scheduling/components/scheduling-monitoring.component.d.ts +0 -37
  196. package/dist/Scheduling/components/scheduling-monitoring.component.d.ts.map +0 -1
  197. package/dist/Scheduling/components/scheduling-monitoring.component.js +0 -488
  198. package/dist/Scheduling/components/scheduling-monitoring.component.js.map +0 -1
  199. package/dist/Scheduling/components/scheduling-types-resource.component.d.ts +0 -20
  200. package/dist/Scheduling/components/scheduling-types-resource.component.d.ts.map +0 -1
  201. package/dist/Scheduling/components/scheduling-types-resource.component.js +0 -55
  202. package/dist/Scheduling/components/scheduling-types-resource.component.js.map +0 -1
  203. package/dist/Scheduling/components/scheduling-types.component.d.ts +0 -22
  204. package/dist/Scheduling/components/scheduling-types.component.d.ts.map +0 -1
  205. package/dist/Scheduling/components/scheduling-types.component.js +0 -165
  206. package/dist/Scheduling/components/scheduling-types.component.js.map +0 -1
  207. package/dist/Testing/components/testing-execution-resource.component.d.ts +0 -20
  208. package/dist/Testing/components/testing-execution-resource.component.d.ts.map +0 -1
  209. package/dist/Testing/components/testing-execution-resource.component.js +0 -55
  210. package/dist/Testing/components/testing-execution-resource.component.js.map +0 -1
  211. package/dist/Testing/components/testing-execution.component.d.ts +0 -71
  212. package/dist/Testing/components/testing-execution.component.d.ts.map +0 -1
  213. package/dist/Testing/components/testing-execution.component.js +0 -845
  214. package/dist/Testing/components/testing-execution.component.js.map +0 -1
  215. package/dist/Testing/components/testing-feedback-resource.component.d.ts +0 -20
  216. package/dist/Testing/components/testing-feedback-resource.component.d.ts.map +0 -1
  217. package/dist/Testing/components/testing-feedback-resource.component.js +0 -55
  218. package/dist/Testing/components/testing-feedback-resource.component.js.map +0 -1
  219. package/dist/Testing/components/testing-feedback.component.d.ts +0 -111
  220. package/dist/Testing/components/testing-feedback.component.d.ts.map +0 -1
  221. package/dist/Testing/components/testing-feedback.component.js +0 -1486
  222. package/dist/Testing/components/testing-feedback.component.js.map +0 -1
  223. package/dist/Testing/components/testing-overview-resource.component.d.ts +0 -20
  224. package/dist/Testing/components/testing-overview-resource.component.d.ts.map +0 -1
  225. package/dist/Testing/components/testing-overview-resource.component.js +0 -55
  226. package/dist/Testing/components/testing-overview-resource.component.js.map +0 -1
  227. package/dist/Testing/components/testing-overview.component.d.ts +0 -30
  228. package/dist/Testing/components/testing-overview.component.d.ts.map +0 -1
  229. package/dist/Testing/components/testing-overview.component.js +0 -361
  230. package/dist/Testing/components/testing-overview.component.js.map +0 -1
  231. package/dist/Testing/components/testing-version-comparison.component.d.ts +0 -62
  232. package/dist/Testing/components/testing-version-comparison.component.d.ts.map +0 -1
  233. package/dist/Testing/components/testing-version-comparison.component.js +0 -815
  234. package/dist/Testing/components/testing-version-comparison.component.js.map +0 -1
  235. package/dist/Testing/components/testing-version-resource.component.d.ts +0 -20
  236. package/dist/Testing/components/testing-version-resource.component.d.ts.map +0 -1
  237. package/dist/Testing/components/testing-version-resource.component.js +0 -55
  238. package/dist/Testing/components/testing-version-resource.component.js.map +0 -1
  239. package/dist/generic/base-dashboard.d.ts +0 -65
  240. package/dist/generic/base-dashboard.d.ts.map +0 -1
  241. package/dist/generic/base-dashboard.js +0 -74
  242. package/dist/generic/base-dashboard.js.map +0 -1
@@ -1,1143 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, HostListener } from '@angular/core';
2
- import { Metadata } from '@memberjunction/core';
3
- import { createEmptyFilter } from '@memberjunction/ng-filter-builder';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/forms";
6
- const _forTrack0 = ($index, $item) => $item.ID;
7
- const _forTrack1 = ($index, $item) => $item.fieldId;
8
- function ViewConfigPanelComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
9
- const _r1 = i0.ɵɵgetCurrentView();
10
- i0.ɵɵelementStart(0, "div", 19);
11
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_0_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onClose()); });
12
- i0.ɵɵelementEnd();
13
- } }
14
- function ViewConfigPanelComponent_Conditional_23_For_11_Template(rf, ctx) { if (rf & 1) {
15
- i0.ɵɵelementStart(0, "option", 25);
16
- i0.ɵɵtext(1);
17
- i0.ɵɵelementEnd();
18
- } if (rf & 2) {
19
- const field_r4 = ctx.$implicit;
20
- i0.ɵɵproperty("value", field_r4.Name);
21
- i0.ɵɵadvance();
22
- i0.ɵɵtextInterpolate(field_r4.DisplayNameOrName);
23
- } }
24
- function ViewConfigPanelComponent_Conditional_23_Conditional_12_Template(rf, ctx) { if (rf & 1) {
25
- const _r5 = i0.ɵɵgetCurrentView();
26
- i0.ɵɵelementStart(0, "div", 26)(1, "button", 36);
27
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_23_Conditional_12_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.sortDirection = "asc"); });
28
- i0.ɵɵelement(2, "i", 37);
29
- i0.ɵɵelementEnd();
30
- i0.ɵɵelementStart(3, "button", 38);
31
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_23_Conditional_12_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.sortDirection = "desc"); });
32
- i0.ɵɵelement(4, "i", 39);
33
- i0.ɵɵelementEnd()();
34
- } if (rf & 2) {
35
- const ctx_r1 = i0.ɵɵnextContext(2);
36
- i0.ɵɵadvance();
37
- i0.ɵɵclassProp("active", ctx_r1.sortDirection === "asc");
38
- i0.ɵɵadvance(2);
39
- i0.ɵɵclassProp("active", ctx_r1.sortDirection === "desc");
40
- } }
41
- function ViewConfigPanelComponent_Conditional_23_For_22_Template(rf, ctx) { if (rf & 1) {
42
- const _r6 = i0.ɵɵgetCurrentView();
43
- i0.ɵɵelementStart(0, "div", 40);
44
- i0.ɵɵlistener("dragstart", function ViewConfigPanelComponent_Conditional_23_For_22_Template_div_dragstart_0_listener($event) { const column_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onDragStart($event, column_r7)); })("dragover", function ViewConfigPanelComponent_Conditional_23_For_22_Template_div_dragover_0_listener($event) { const column_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onDragOver($event, column_r7)); })("drop", function ViewConfigPanelComponent_Conditional_23_For_22_Template_div_drop_0_listener($event) { const column_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onDrop($event, column_r7)); })("dragend", function ViewConfigPanelComponent_Conditional_23_For_22_Template_div_dragend_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onDragEnd()); });
45
- i0.ɵɵelementStart(1, "div", 41);
46
- i0.ɵɵelement(2, "i", 42);
47
- i0.ɵɵelementEnd();
48
- i0.ɵɵelementStart(3, "span", 43);
49
- i0.ɵɵtext(4);
50
- i0.ɵɵelementEnd();
51
- i0.ɵɵelementStart(5, "div", 44)(6, "button", 45);
52
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_23_For_22_Template_button_click_6_listener() { const column_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.moveColumnUp(column_r7)); });
53
- i0.ɵɵelement(7, "i", 46);
54
- i0.ɵɵelementEnd();
55
- i0.ɵɵelementStart(8, "button", 47);
56
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_23_For_22_Template_button_click_8_listener() { const column_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.moveColumnDown(column_r7)); });
57
- i0.ɵɵelement(9, "i", 48);
58
- i0.ɵɵelementEnd();
59
- i0.ɵɵelementStart(10, "button", 49);
60
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_23_For_22_Template_button_click_10_listener() { const column_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleColumnVisibility(column_r7)); });
61
- i0.ɵɵelement(11, "i", 32);
62
- i0.ɵɵelementEnd()()();
63
- } if (rf & 2) {
64
- const column_r7 = ctx.$implicit;
65
- const ɵ$index_92_r8 = ctx.$index;
66
- const ctx_r1 = i0.ɵɵnextContext(2);
67
- i0.ɵɵadvance(4);
68
- i0.ɵɵtextInterpolate(column_r7.displayName);
69
- i0.ɵɵadvance(2);
70
- i0.ɵɵproperty("disabled", ɵ$index_92_r8 === 0);
71
- i0.ɵɵadvance(2);
72
- i0.ɵɵproperty("disabled", ɵ$index_92_r8 === ctx_r1.visibleColumns.length - 1);
73
- } }
74
- function ViewConfigPanelComponent_Conditional_23_Conditional_23_Template(rf, ctx) { if (rf & 1) {
75
- i0.ɵɵelementStart(0, "div", 31);
76
- i0.ɵɵelement(1, "i", 50);
77
- i0.ɵɵelementStart(2, "span");
78
- i0.ɵɵtext(3, "No columns visible. Add columns from below.");
79
- i0.ɵɵelementEnd()();
80
- } }
81
- function ViewConfigPanelComponent_Conditional_23_Conditional_31_Template(rf, ctx) { if (rf & 1) {
82
- const _r9 = i0.ɵɵgetCurrentView();
83
- i0.ɵɵelementStart(0, "div", 33);
84
- i0.ɵɵelement(1, "i", 51);
85
- i0.ɵɵelementStart(2, "input", 52);
86
- i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_23_Conditional_31_Template_input_ngModelChange_2_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.columnSearchText, $event) || (ctx_r1.columnSearchText = $event); return i0.ɵɵresetView($event); });
87
- i0.ɵɵelementEnd()();
88
- } if (rf & 2) {
89
- const ctx_r1 = i0.ɵɵnextContext(2);
90
- i0.ɵɵadvance(2);
91
- i0.ɵɵtwoWayProperty("ngModel", ctx_r1.columnSearchText);
92
- } }
93
- function ViewConfigPanelComponent_Conditional_23_For_34_Template(rf, ctx) { if (rf & 1) {
94
- const _r10 = i0.ɵɵgetCurrentView();
95
- i0.ɵɵelementStart(0, "div", 35)(1, "span", 43);
96
- i0.ɵɵtext(2);
97
- i0.ɵɵelementEnd();
98
- i0.ɵɵelementStart(3, "button", 53);
99
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_23_For_34_Template_button_click_3_listener() { const column_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleColumnVisibility(column_r11)); });
100
- i0.ɵɵelement(4, "i", 54);
101
- i0.ɵɵelementEnd()();
102
- } if (rf & 2) {
103
- const column_r11 = ctx.$implicit;
104
- i0.ɵɵadvance(2);
105
- i0.ɵɵtextInterpolate(column_r11.displayName);
106
- } }
107
- function ViewConfigPanelComponent_Conditional_23_Conditional_35_Template(rf, ctx) { if (rf & 1) {
108
- i0.ɵɵelementStart(0, "div", 31);
109
- i0.ɵɵelement(1, "i", 55);
110
- i0.ɵɵelementStart(2, "span");
111
- i0.ɵɵtext(3, "All columns are visible");
112
- i0.ɵɵelementEnd()();
113
- } }
114
- function ViewConfigPanelComponent_Conditional_23_Template(rf, ctx) { if (rf & 1) {
115
- const _r3 = i0.ɵɵgetCurrentView();
116
- i0.ɵɵelementStart(0, "div", 13)(1, "div", 20)(2, "div", 21);
117
- i0.ɵɵelement(3, "i", 22);
118
- i0.ɵɵelementStart(4, "span");
119
- i0.ɵɵtext(5, "Default Sort");
120
- i0.ɵɵelementEnd()();
121
- i0.ɵɵelementStart(6, "div", 23)(7, "select", 24);
122
- i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_23_Template_select_ngModelChange_7_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.sortField, $event) || (ctx_r1.sortField = $event); return i0.ɵɵresetView($event); });
123
- i0.ɵɵelementStart(8, "option", 25);
124
- i0.ɵɵtext(9, "No default sort");
125
- i0.ɵɵelementEnd();
126
- i0.ɵɵrepeaterCreate(10, ViewConfigPanelComponent_Conditional_23_For_11_Template, 2, 2, "option", 25, _forTrack0);
127
- i0.ɵɵelementEnd();
128
- i0.ɵɵtemplate(12, ViewConfigPanelComponent_Conditional_23_Conditional_12_Template, 5, 4, "div", 26);
129
- i0.ɵɵelementEnd()();
130
- i0.ɵɵelementStart(13, "div", 20)(14, "div", 21);
131
- i0.ɵɵelement(15, "i", 27);
132
- i0.ɵɵelementStart(16, "span");
133
- i0.ɵɵtext(17, "Visible Columns");
134
- i0.ɵɵelementEnd();
135
- i0.ɵɵelementStart(18, "span", 28);
136
- i0.ɵɵtext(19);
137
- i0.ɵɵelementEnd()();
138
- i0.ɵɵelementStart(20, "div", 29);
139
- i0.ɵɵrepeaterCreate(21, ViewConfigPanelComponent_Conditional_23_For_22_Template, 12, 3, "div", 30, _forTrack1);
140
- i0.ɵɵtemplate(23, ViewConfigPanelComponent_Conditional_23_Conditional_23_Template, 4, 0, "div", 31);
141
- i0.ɵɵelementEnd()();
142
- i0.ɵɵelementStart(24, "div", 20)(25, "div", 21);
143
- i0.ɵɵelement(26, "i", 32);
144
- i0.ɵɵelementStart(27, "span");
145
- i0.ɵɵtext(28, "Hidden Columns");
146
- i0.ɵɵelementEnd();
147
- i0.ɵɵelementStart(29, "span", 28);
148
- i0.ɵɵtext(30);
149
- i0.ɵɵelementEnd()();
150
- i0.ɵɵtemplate(31, ViewConfigPanelComponent_Conditional_23_Conditional_31_Template, 3, 1, "div", 33);
151
- i0.ɵɵelementStart(32, "div", 34);
152
- i0.ɵɵrepeaterCreate(33, ViewConfigPanelComponent_Conditional_23_For_34_Template, 5, 1, "div", 35, _forTrack1);
153
- i0.ɵɵtemplate(35, ViewConfigPanelComponent_Conditional_23_Conditional_35_Template, 4, 0, "div", 31);
154
- i0.ɵɵelementEnd()()();
155
- } if (rf & 2) {
156
- const ctx_r1 = i0.ɵɵnextContext();
157
- i0.ɵɵadvance(7);
158
- i0.ɵɵtwoWayProperty("ngModel", ctx_r1.sortField);
159
- i0.ɵɵadvance();
160
- i0.ɵɵproperty("value", null);
161
- i0.ɵɵadvance(2);
162
- i0.ɵɵrepeater(ctx_r1.sortableFields);
163
- i0.ɵɵadvance(2);
164
- i0.ɵɵconditional(ctx_r1.sortField ? 12 : -1);
165
- i0.ɵɵadvance(7);
166
- i0.ɵɵtextInterpolate(ctx_r1.visibleColumns.length);
167
- i0.ɵɵadvance(2);
168
- i0.ɵɵrepeater(ctx_r1.visibleColumns);
169
- i0.ɵɵadvance(2);
170
- i0.ɵɵconditional(ctx_r1.visibleColumns.length === 0 ? 23 : -1);
171
- i0.ɵɵadvance(7);
172
- i0.ɵɵtextInterpolate(ctx_r1.hiddenColumns.length);
173
- i0.ɵɵadvance();
174
- i0.ɵɵconditional(ctx_r1.hiddenColumns.length > 5 ? 31 : -1);
175
- i0.ɵɵadvance(2);
176
- i0.ɵɵrepeater(ctx_r1.filteredHiddenColumns);
177
- i0.ɵɵadvance(2);
178
- i0.ɵɵconditional(ctx_r1.hiddenColumns.length === 0 ? 35 : -1);
179
- } }
180
- function ViewConfigPanelComponent_Conditional_24_Conditional_10_Template(rf, ctx) { if (rf & 1) {
181
- i0.ɵɵelement(0, "i", 63);
182
- } }
183
- function ViewConfigPanelComponent_Conditional_24_Conditional_19_Template(rf, ctx) { if (rf & 1) {
184
- i0.ɵɵelement(0, "i", 63);
185
- } }
186
- function ViewConfigPanelComponent_Conditional_24_Conditional_20_Conditional_5_Template(rf, ctx) { if (rf & 1) {
187
- i0.ɵɵelementStart(0, "div", 70);
188
- i0.ɵɵelement(1, "i", 81);
189
- i0.ɵɵelementStart(2, "span");
190
- i0.ɵɵtext(3);
191
- i0.ɵɵelementEnd()();
192
- } if (rf & 2) {
193
- const ctx_r1 = i0.ɵɵnextContext(3);
194
- i0.ɵɵadvance(3);
195
- i0.ɵɵtextInterpolate(ctx_r1.smartFilterExplanation);
196
- } }
197
- function ViewConfigPanelComponent_Conditional_24_Conditional_20_Template(rf, ctx) { if (rf & 1) {
198
- const _r13 = i0.ɵɵgetCurrentView();
199
- i0.ɵɵelementStart(0, "div", 65)(1, "div", 67)(2, "div", 68);
200
- i0.ɵɵelement(3, "i", 59);
201
- i0.ɵɵelementEnd();
202
- i0.ɵɵelementStart(4, "textarea", 69);
203
- i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_24_Conditional_20_Template_textarea_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.smartFilterPrompt, $event) || (ctx_r1.smartFilterPrompt = $event); return i0.ɵɵresetView($event); });
204
- i0.ɵɵelementEnd()();
205
- i0.ɵɵtemplate(5, ViewConfigPanelComponent_Conditional_24_Conditional_20_Conditional_5_Template, 4, 1, "div", 70);
206
- i0.ɵɵelementStart(6, "div", 71)(7, "div", 72);
207
- i0.ɵɵelement(8, "i", 73);
208
- i0.ɵɵelementStart(9, "span");
209
- i0.ɵɵtext(10, "Try these examples:");
210
- i0.ɵɵelementEnd()();
211
- i0.ɵɵelementStart(11, "div", 74)(12, "button", 75);
212
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_24_Conditional_20_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.applySmartFilterExample("Show records created in the last 30 days")); });
213
- i0.ɵɵelement(13, "i", 76);
214
- i0.ɵɵtext(14, " Last 30 days ");
215
- i0.ɵɵelementEnd();
216
- i0.ɵɵelementStart(15, "button", 75);
217
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_24_Conditional_20_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.applySmartFilterExample("Active records only")); });
218
- i0.ɵɵelement(16, "i", 77);
219
- i0.ɵɵtext(17, " Active only ");
220
- i0.ɵɵelementEnd();
221
- i0.ɵɵelementStart(18, "button", 75);
222
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_24_Conditional_20_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.applySmartFilterExample("Records with high priority")); });
223
- i0.ɵɵelement(19, "i", 78);
224
- i0.ɵɵtext(20, " High priority ");
225
- i0.ɵɵelementEnd();
226
- i0.ɵɵelementStart(21, "button", 75);
227
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_24_Conditional_20_Template_button_click_21_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.applySmartFilterExample("Records modified this week")); });
228
- i0.ɵɵelement(22, "i", 79);
229
- i0.ɵɵtext(23, " Modified this week ");
230
- i0.ɵɵelementEnd()()();
231
- i0.ɵɵelementStart(24, "div", 80);
232
- i0.ɵɵelement(25, "i", 50);
233
- i0.ɵɵelementStart(26, "span");
234
- i0.ɵɵtext(27, "The AI will interpret your description and create the appropriate filter when you save the view.");
235
- i0.ɵɵelementEnd()()();
236
- } if (rf & 2) {
237
- const ctx_r1 = i0.ɵɵnextContext(2);
238
- i0.ɵɵadvance(4);
239
- i0.ɵɵtwoWayProperty("ngModel", ctx_r1.smartFilterPrompt);
240
- i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
241
- i0.ɵɵadvance();
242
- i0.ɵɵconditional(ctx_r1.smartFilterExplanation ? 5 : -1);
243
- i0.ɵɵadvance(7);
244
- i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
245
- i0.ɵɵadvance(3);
246
- i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
247
- i0.ɵɵadvance(3);
248
- i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
249
- i0.ɵɵadvance(3);
250
- i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
251
- } }
252
- function ViewConfigPanelComponent_Conditional_24_Conditional_21_Conditional_4_Template(rf, ctx) { if (rf & 1) {
253
- i0.ɵɵelementStart(0, "span", 91);
254
- i0.ɵɵtext(1);
255
- i0.ɵɵelementEnd();
256
- i0.ɵɵelementStart(2, "span", 92);
257
- i0.ɵɵtext(3);
258
- i0.ɵɵelementEnd();
259
- } if (rf & 2) {
260
- const ctx_r1 = i0.ɵɵnextContext(3);
261
- i0.ɵɵadvance();
262
- i0.ɵɵtextInterpolate(ctx_r1.getFilterCount());
263
- i0.ɵɵadvance(2);
264
- i0.ɵɵtextInterpolate(ctx_r1.getFilterSummary());
265
- } }
266
- function ViewConfigPanelComponent_Conditional_24_Conditional_21_Conditional_5_Template(rf, ctx) { if (rf & 1) {
267
- i0.ɵɵelementStart(0, "span", 85);
268
- i0.ɵɵtext(1, "No filters configured");
269
- i0.ɵɵelementEnd();
270
- } }
271
- function ViewConfigPanelComponent_Conditional_24_Conditional_21_Conditional_7_Template(rf, ctx) { if (rf & 1) {
272
- const _r15 = i0.ɵɵgetCurrentView();
273
- i0.ɵɵelementStart(0, "button", 93);
274
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_24_Conditional_21_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.clearFilters()); });
275
- i0.ɵɵelement(1, "i", 6);
276
- i0.ɵɵtext(2, " Clear ");
277
- i0.ɵɵelementEnd();
278
- } }
279
- function ViewConfigPanelComponent_Conditional_24_Conditional_21_Template(rf, ctx) { if (rf & 1) {
280
- const _r14 = i0.ɵɵgetCurrentView();
281
- i0.ɵɵelementStart(0, "div", 66)(1, "div", 82)(2, "div", 83)(3, "div", 84);
282
- i0.ɵɵtemplate(4, ViewConfigPanelComponent_Conditional_24_Conditional_21_Conditional_4_Template, 4, 2)(5, ViewConfigPanelComponent_Conditional_24_Conditional_21_Conditional_5_Template, 2, 0, "span", 85);
283
- i0.ɵɵelementEnd();
284
- i0.ɵɵelementStart(6, "div", 86);
285
- i0.ɵɵtemplate(7, ViewConfigPanelComponent_Conditional_24_Conditional_21_Conditional_7_Template, 3, 0, "button", 87);
286
- i0.ɵɵelementStart(8, "button", 88);
287
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_24_Conditional_21_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.openFilterDialog()); });
288
- i0.ɵɵelement(9, "i", 89);
289
- i0.ɵɵtext(10);
290
- i0.ɵɵelementEnd()()()();
291
- i0.ɵɵelementStart(11, "div", 90);
292
- i0.ɵɵelement(12, "i", 50);
293
- i0.ɵɵelementStart(13, "span");
294
- i0.ɵɵtext(14, "Build precise filters by selecting fields, operators, and values. Use groups for complex AND/OR logic.");
295
- i0.ɵɵelementEnd()()();
296
- } if (rf & 2) {
297
- const ctx_r1 = i0.ɵɵnextContext(2);
298
- i0.ɵɵadvance(4);
299
- i0.ɵɵconditional(ctx_r1.getFilterCount() > 0 ? 4 : 5);
300
- i0.ɵɵadvance(3);
301
- i0.ɵɵconditional(ctx_r1.getFilterCount() > 0 && ctx_r1.canEdit ? 7 : -1);
302
- i0.ɵɵadvance();
303
- i0.ɵɵproperty("disabled", !ctx_r1.canEdit && ctx_r1.getFilterCount() === 0);
304
- i0.ɵɵadvance(2);
305
- i0.ɵɵtextInterpolate1(" ", ctx_r1.getFilterCount() > 0 ? "Edit Filters" : "Add Filters", " ");
306
- } }
307
- function ViewConfigPanelComponent_Conditional_24_Template(rf, ctx) { if (rf & 1) {
308
- const _r12 = i0.ɵɵgetCurrentView();
309
- i0.ɵɵelementStart(0, "div", 13)(1, "div", 56)(2, "button", 57);
310
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_24_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setFilterMode("smart")); });
311
- i0.ɵɵelementStart(3, "div", 58);
312
- i0.ɵɵelement(4, "i", 59);
313
- i0.ɵɵelementEnd();
314
- i0.ɵɵelementStart(5, "div", 60)(6, "span", 61);
315
- i0.ɵɵtext(7, "Smart Filter");
316
- i0.ɵɵelementEnd();
317
- i0.ɵɵelementStart(8, "span", 62);
318
- i0.ɵɵtext(9, "Use AI to filter with natural language");
319
- i0.ɵɵelementEnd()();
320
- i0.ɵɵtemplate(10, ViewConfigPanelComponent_Conditional_24_Conditional_10_Template, 1, 0, "i", 63);
321
- i0.ɵɵelementEnd();
322
- i0.ɵɵelementStart(11, "button", 57);
323
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_24_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setFilterMode("traditional")); });
324
- i0.ɵɵelementStart(12, "div", 58);
325
- i0.ɵɵelement(13, "i", 64);
326
- i0.ɵɵelementEnd();
327
- i0.ɵɵelementStart(14, "div", 60)(15, "span", 61);
328
- i0.ɵɵtext(16, "Traditional Filter");
329
- i0.ɵɵelementEnd();
330
- i0.ɵɵelementStart(17, "span", 62);
331
- i0.ɵɵtext(18, "Build filters with field/operator/value");
332
- i0.ɵɵelementEnd()();
333
- i0.ɵɵtemplate(19, ViewConfigPanelComponent_Conditional_24_Conditional_19_Template, 1, 0, "i", 63);
334
- i0.ɵɵelementEnd()();
335
- i0.ɵɵtemplate(20, ViewConfigPanelComponent_Conditional_24_Conditional_20_Template, 28, 7, "div", 65)(21, ViewConfigPanelComponent_Conditional_24_Conditional_21_Template, 15, 4, "div", 66);
336
- i0.ɵɵelementEnd();
337
- } if (rf & 2) {
338
- const ctx_r1 = i0.ɵɵnextContext();
339
- i0.ɵɵadvance(2);
340
- i0.ɵɵclassProp("active", ctx_r1.filterMode === "smart");
341
- i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
342
- i0.ɵɵadvance(8);
343
- i0.ɵɵconditional(ctx_r1.filterMode === "smart" ? 10 : -1);
344
- i0.ɵɵadvance();
345
- i0.ɵɵclassProp("active", ctx_r1.filterMode === "traditional");
346
- i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
347
- i0.ɵɵadvance(8);
348
- i0.ɵɵconditional(ctx_r1.filterMode === "traditional" ? 19 : -1);
349
- i0.ɵɵadvance();
350
- i0.ɵɵconditional(ctx_r1.filterMode === "smart" ? 20 : -1);
351
- i0.ɵɵadvance();
352
- i0.ɵɵconditional(ctx_r1.filterMode === "traditional" ? 21 : -1);
353
- } }
354
- function ViewConfigPanelComponent_Conditional_25_Conditional_26_Template(rf, ctx) { if (rf & 1) {
355
- const _r17 = i0.ɵɵgetCurrentView();
356
- i0.ɵɵelementStart(0, "div", 103)(1, "div", 21);
357
- i0.ɵɵelement(2, "i", 104);
358
- i0.ɵɵelementStart(3, "span");
359
- i0.ɵɵtext(4, "Danger Zone");
360
- i0.ɵɵelementEnd()();
361
- i0.ɵɵelementStart(5, "button", 105);
362
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_25_Conditional_26_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onDelete()); });
363
- i0.ɵɵelement(6, "i", 106);
364
- i0.ɵɵelementStart(7, "span");
365
- i0.ɵɵtext(8, "Delete View");
366
- i0.ɵɵelementEnd()()();
367
- } }
368
- function ViewConfigPanelComponent_Conditional_25_Template(rf, ctx) { if (rf & 1) {
369
- const _r16 = i0.ɵɵgetCurrentView();
370
- i0.ɵɵelementStart(0, "div", 13)(1, "div", 20)(2, "div", 21);
371
- i0.ɵɵelement(3, "i", 50);
372
- i0.ɵɵelementStart(4, "span");
373
- i0.ɵɵtext(5, "View Details");
374
- i0.ɵɵelementEnd()();
375
- i0.ɵɵelementStart(6, "div", 94)(7, "label", 95);
376
- i0.ɵɵtext(8, "Name");
377
- i0.ɵɵelementEnd();
378
- i0.ɵɵelementStart(9, "input", 96);
379
- i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_25_Template_input_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.viewName, $event) || (ctx_r1.viewName = $event); return i0.ɵɵresetView($event); });
380
- i0.ɵɵelementEnd()();
381
- i0.ɵɵelementStart(10, "div", 94)(11, "label", 97);
382
- i0.ɵɵtext(12, "Description");
383
- i0.ɵɵelementEnd();
384
- i0.ɵɵelementStart(13, "textarea", 98);
385
- i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_25_Template_textarea_ngModelChange_13_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.viewDescription, $event) || (ctx_r1.viewDescription = $event); return i0.ɵɵresetView($event); });
386
- i0.ɵɵelementEnd()()();
387
- i0.ɵɵelementStart(14, "div", 20)(15, "div", 21);
388
- i0.ɵɵelement(16, "i", 99);
389
- i0.ɵɵelementStart(17, "span");
390
- i0.ɵɵtext(18, "Sharing");
391
- i0.ɵɵelementEnd()();
392
- i0.ɵɵelementStart(19, "label", 100)(20, "input", 101);
393
- i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_25_Template_input_ngModelChange_20_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.isShared, $event) || (ctx_r1.isShared = $event); return i0.ɵɵresetView($event); });
394
- i0.ɵɵelementEnd();
395
- i0.ɵɵelementStart(21, "span", 102)(22, "strong");
396
- i0.ɵɵtext(23, "Share with others");
397
- i0.ɵɵelementEnd();
398
- i0.ɵɵelementStart(24, "small");
399
- i0.ɵɵtext(25, "Allow other users to use this view");
400
- i0.ɵɵelementEnd()()()();
401
- i0.ɵɵtemplate(26, ViewConfigPanelComponent_Conditional_25_Conditional_26_Template, 9, 0, "div", 103);
402
- i0.ɵɵelementEnd();
403
- } if (rf & 2) {
404
- const ctx_r1 = i0.ɵɵnextContext();
405
- i0.ɵɵadvance(9);
406
- i0.ɵɵtwoWayProperty("ngModel", ctx_r1.viewName);
407
- i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
408
- i0.ɵɵadvance(4);
409
- i0.ɵɵtwoWayProperty("ngModel", ctx_r1.viewDescription);
410
- i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
411
- i0.ɵɵadvance(7);
412
- i0.ɵɵtwoWayProperty("ngModel", ctx_r1.isShared);
413
- i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
414
- i0.ɵɵadvance(6);
415
- i0.ɵɵconditional(ctx_r1.viewEntity && ctx_r1.canDelete ? 26 : -1);
416
- } }
417
- function ViewConfigPanelComponent_Conditional_30_Conditional_1_Template(rf, ctx) { if (rf & 1) {
418
- i0.ɵɵelement(0, "i", 108);
419
- } }
420
- function ViewConfigPanelComponent_Conditional_30_Conditional_2_Template(rf, ctx) { if (rf & 1) {
421
- i0.ɵɵelement(0, "i", 54);
422
- } }
423
- function ViewConfigPanelComponent_Conditional_30_Template(rf, ctx) { if (rf & 1) {
424
- const _r18 = i0.ɵɵgetCurrentView();
425
- i0.ɵɵelementStart(0, "button", 107);
426
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_30_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSaveAsNew()); });
427
- i0.ɵɵtemplate(1, ViewConfigPanelComponent_Conditional_30_Conditional_1_Template, 1, 0, "i", 108)(2, ViewConfigPanelComponent_Conditional_30_Conditional_2_Template, 1, 0, "i", 54);
428
- i0.ɵɵtext(3);
429
- i0.ɵɵelementEnd();
430
- } if (rf & 2) {
431
- const ctx_r1 = i0.ɵɵnextContext();
432
- i0.ɵɵproperty("disabled", ctx_r1.isSaving);
433
- i0.ɵɵadvance();
434
- i0.ɵɵconditional(ctx_r1.isSaving ? 1 : 2);
435
- i0.ɵɵadvance(2);
436
- i0.ɵɵtextInterpolate1(" ", ctx_r1.isSaving ? "Saving..." : "Save As New", " ");
437
- } }
438
- function ViewConfigPanelComponent_Conditional_31_Conditional_1_Template(rf, ctx) { if (rf & 1) {
439
- i0.ɵɵelement(0, "i", 108);
440
- } }
441
- function ViewConfigPanelComponent_Conditional_31_Conditional_2_Template(rf, ctx) { if (rf & 1) {
442
- i0.ɵɵelement(0, "i", 110);
443
- } }
444
- function ViewConfigPanelComponent_Conditional_31_Template(rf, ctx) { if (rf & 1) {
445
- const _r19 = i0.ɵɵgetCurrentView();
446
- i0.ɵɵelementStart(0, "button", 109);
447
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_31_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSave()); });
448
- i0.ɵɵtemplate(1, ViewConfigPanelComponent_Conditional_31_Conditional_1_Template, 1, 0, "i", 108)(2, ViewConfigPanelComponent_Conditional_31_Conditional_2_Template, 1, 0, "i", 110);
449
- i0.ɵɵtext(3);
450
- i0.ɵɵelementEnd();
451
- } if (rf & 2) {
452
- const ctx_r1 = i0.ɵɵnextContext();
453
- i0.ɵɵproperty("disabled", ctx_r1.isSaving || !ctx_r1.viewName);
454
- i0.ɵɵadvance();
455
- i0.ɵɵconditional(ctx_r1.isSaving ? 1 : 2);
456
- i0.ɵɵadvance(2);
457
- i0.ɵɵtextInterpolate1(" ", ctx_r1.isSaving ? "Saving..." : "Save", " ");
458
- } }
459
- function ViewConfigPanelComponent_Conditional_32_Conditional_1_Template(rf, ctx) { if (rf & 1) {
460
- i0.ɵɵelement(0, "i", 108);
461
- } }
462
- function ViewConfigPanelComponent_Conditional_32_Conditional_2_Template(rf, ctx) { if (rf & 1) {
463
- i0.ɵɵelement(0, "i", 110);
464
- } }
465
- function ViewConfigPanelComponent_Conditional_32_Template(rf, ctx) { if (rf & 1) {
466
- const _r20 = i0.ɵɵgetCurrentView();
467
- i0.ɵɵelementStart(0, "button", 109);
468
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_32_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSaveAsNew()); });
469
- i0.ɵɵtemplate(1, ViewConfigPanelComponent_Conditional_32_Conditional_1_Template, 1, 0, "i", 108)(2, ViewConfigPanelComponent_Conditional_32_Conditional_2_Template, 1, 0, "i", 110);
470
- i0.ɵɵtext(3);
471
- i0.ɵɵelementEnd();
472
- } if (rf & 2) {
473
- const ctx_r1 = i0.ɵɵnextContext();
474
- i0.ɵɵproperty("disabled", ctx_r1.isSaving || !ctx_r1.viewName);
475
- i0.ɵɵadvance();
476
- i0.ɵɵconditional(ctx_r1.isSaving ? 1 : 2);
477
- i0.ɵɵadvance(2);
478
- i0.ɵɵtextInterpolate1(" ", ctx_r1.isSaving ? "Creating..." : "Create View", " ");
479
- } }
480
- /**
481
- * ViewConfigPanelComponent - Sliding panel for configuring view settings
482
- *
483
- * Features:
484
- * - Column visibility and ordering
485
- * - Sort configuration
486
- * - View name and description editing
487
- * - Share settings
488
- * - Save / Save As New / Cancel actions
489
- */
490
- export class ViewConfigPanelComponent {
491
- cdr;
492
- /**
493
- * The entity being viewed
494
- */
495
- entity = null;
496
- /**
497
- * The current view entity (null for default view)
498
- */
499
- viewEntity = null;
500
- /**
501
- * Whether the panel is open
502
- */
503
- isOpen = false;
504
- /**
505
- * Current grid state from the grid (includes live column widths/order from user interaction)
506
- * This takes precedence over viewEntity.Columns for showing current state
507
- */
508
- currentGridState = null;
509
- /**
510
- * Emitted when the panel should close
511
- */
512
- close = new EventEmitter();
513
- /**
514
- * Emitted when the view should be saved
515
- */
516
- save = new EventEmitter();
517
- /**
518
- * Emitted when the view should be deleted
519
- */
520
- delete = new EventEmitter();
521
- /**
522
- * Emitted when filter dialog should be opened (at dashboard level for full width)
523
- */
524
- openFilterDialogRequest = new EventEmitter();
525
- /**
526
- * Filter state from external dialog (set by parent after dialog closes)
527
- */
528
- externalFilterState = null;
529
- // Form state
530
- viewName = '';
531
- viewDescription = '';
532
- isShared = false;
533
- columns = [];
534
- sortField = null;
535
- sortDirection = 'asc';
536
- // Smart Filter state
537
- smartFilterEnabled = false;
538
- smartFilterPrompt = '';
539
- smartFilterExplanation = '';
540
- // Traditional Filter state
541
- filterState = createEmptyFilter();
542
- filterFields = [];
543
- // Filter mode: 'smart' or 'traditional' (mutually exclusive)
544
- filterMode = 'smart';
545
- // UI state
546
- activeTab = 'columns';
547
- isSaving = false;
548
- columnSearchText = '';
549
- // Drag state for column reordering
550
- draggedColumn = null;
551
- metadata = new Metadata();
552
- constructor(cdr) {
553
- this.cdr = cdr;
554
- }
555
- /**
556
- * Handle keyboard shortcuts
557
- * Escape: Close the panel
558
- */
559
- handleEscape() {
560
- if (this.isOpen) {
561
- this.onClose();
562
- }
563
- }
564
- ngOnInit() {
565
- this.initializeFromEntity();
566
- }
567
- ngOnChanges(changes) {
568
- // Reset to first tab and clear search when panel opens
569
- if (changes['isOpen'] && this.isOpen) {
570
- this.activeTab = 'columns';
571
- this.columnSearchText = '';
572
- }
573
- if (changes['entity'] || changes['viewEntity'] || changes['currentGridState']) {
574
- this.initializeFromEntity();
575
- }
576
- // Apply external filter state when it changes (from dashboard-level dialog)
577
- if (changes['externalFilterState'] && this.externalFilterState) {
578
- this.filterState = this.externalFilterState;
579
- this.cdr.detectChanges();
580
- }
581
- }
582
- /**
583
- * Initialize form state from entity and view
584
- * Priority for column state: currentGridState > viewEntity.Columns > entity defaults
585
- */
586
- initializeFromEntity() {
587
- if (!this.entity) {
588
- this.columns = [];
589
- return;
590
- }
591
- // Initialize columns from entity fields (including __mj_ fields for audit/timestamp info)
592
- this.columns = this.entity.Fields
593
- .map((field, index) => ({
594
- fieldId: field.ID,
595
- fieldName: field.Name,
596
- displayName: field.DisplayNameOrName,
597
- visible: field.DefaultInView,
598
- width: field.DefaultColumnWidth || null,
599
- orderIndex: index,
600
- field
601
- }));
602
- // Priority 1: Use currentGridState if available (reflects live grid state including resizes)
603
- if (this.currentGridState?.columnSettings && this.currentGridState.columnSettings.length > 0) {
604
- this.applyGridStateToColumns(this.currentGridState.columnSettings);
605
- // Also apply sort from currentGridState
606
- if (this.currentGridState.sortSettings && this.currentGridState.sortSettings.length > 0) {
607
- this.sortField = this.currentGridState.sortSettings[0].field;
608
- this.sortDirection = this.currentGridState.sortSettings[0].dir;
609
- }
610
- }
611
- // Priority 2: If we have a view, apply its column configuration
612
- else if (this.viewEntity) {
613
- const viewColumns = this.viewEntity.Columns;
614
- if (viewColumns && viewColumns.length > 0) {
615
- // Mark all columns as hidden initially
616
- this.columns.forEach(c => c.visible = false);
617
- // Apply view column settings
618
- viewColumns.forEach((vc, idx) => {
619
- const column = this.columns.find(c => c.fieldName.toLowerCase() === vc.Name?.toLowerCase());
620
- if (column) {
621
- column.visible = !vc.hidden;
622
- column.width = vc.width || null;
623
- column.orderIndex = vc.orderIndex ?? idx;
624
- }
625
- });
626
- // Sort by orderIndex
627
- this.columns.sort((a, b) => a.orderIndex - b.orderIndex);
628
- }
629
- // Apply view's sort configuration
630
- const sortInfo = this.viewEntity.ViewSortInfo;
631
- if (sortInfo && sortInfo.length > 0) {
632
- this.sortField = sortInfo[0].field;
633
- this.sortDirection = sortInfo[0].direction === 'Desc' ? 'desc' : 'asc';
634
- }
635
- }
636
- // Initialize filter fields from entity
637
- this.filterFields = this.buildFilterFields();
638
- // Apply view entity metadata (name, description, etc.) if available
639
- if (this.viewEntity) {
640
- this.viewName = this.viewEntity.Name;
641
- this.viewDescription = this.viewEntity.Description || '';
642
- this.isShared = this.viewEntity.IsShared;
643
- // Apply view's smart filter configuration
644
- this.smartFilterEnabled = this.viewEntity.SmartFilterEnabled || false;
645
- this.smartFilterPrompt = this.viewEntity.SmartFilterPrompt || '';
646
- this.smartFilterExplanation = this.viewEntity.SmartFilterExplanation || '';
647
- // Apply view's traditional filter state
648
- this.filterState = this.parseFilterState(this.viewEntity.FilterState);
649
- // Set filter mode based on which type of filter is active
650
- // Smart filter takes precedence if enabled
651
- if (this.smartFilterEnabled && this.smartFilterPrompt) {
652
- this.filterMode = 'smart';
653
- }
654
- else if (this.getFilterCount() > 0) {
655
- this.filterMode = 'traditional';
656
- }
657
- else {
658
- // Default to smart mode for new/empty filters (promote AI filtering)
659
- this.filterMode = 'smart';
660
- this.smartFilterEnabled = true; // Enable smart filter when defaulting to smart mode
661
- }
662
- }
663
- else {
664
- // Default view - use entity defaults
665
- this.viewName = '';
666
- this.viewDescription = '';
667
- this.isShared = false;
668
- if (!this.currentGridState?.sortSettings?.length) {
669
- this.sortField = null;
670
- this.sortDirection = 'asc';
671
- }
672
- this.smartFilterPrompt = '';
673
- this.smartFilterExplanation = '';
674
- this.filterState = createEmptyFilter();
675
- // Default to smart mode (promote AI filtering)
676
- this.filterMode = 'smart';
677
- this.smartFilterEnabled = true; // Enable smart filter when defaulting to smart mode
678
- }
679
- this.cdr.detectChanges();
680
- }
681
- /**
682
- * Build filter fields from entity fields (including __mj_ fields for filtering by timestamps)
683
- */
684
- buildFilterFields() {
685
- if (!this.entity)
686
- return [];
687
- return this.entity.Fields
688
- .filter(f => !f.IsBinaryFieldType)
689
- .map(field => ({
690
- name: field.Name,
691
- displayName: field.DisplayNameOrName,
692
- type: this.mapFieldType(field),
693
- lookupEntityName: field.RelatedEntity || undefined,
694
- valueList: field.ValueListType === 'List' && field.EntityFieldValues?.length > 0
695
- ? field.EntityFieldValues.map(v => ({ value: v.Value, label: v.Value }))
696
- : undefined
697
- }));
698
- }
699
- /**
700
- * Map entity field type to filter field type
701
- */
702
- mapFieldType(field) {
703
- // Check for lookup first - RelatedEntity is a string (entity name) if it's a lookup field
704
- if (field.RelatedEntity) {
705
- return 'lookup';
706
- }
707
- // Map based on SQL type
708
- const sqlType = field.Type.toLowerCase();
709
- if (sqlType.includes('bit') || sqlType === 'boolean') {
710
- return 'boolean';
711
- }
712
- if (sqlType.includes('date') || sqlType.includes('time')) {
713
- return 'date';
714
- }
715
- if (sqlType.includes('int') || sqlType.includes('decimal') ||
716
- sqlType.includes('numeric') || sqlType.includes('float') ||
717
- sqlType.includes('real') || sqlType.includes('money')) {
718
- return 'number';
719
- }
720
- return 'string';
721
- }
722
- /**
723
- * Parse the filter state from JSON string
724
- */
725
- parseFilterState(filterStateJson) {
726
- if (!filterStateJson) {
727
- return createEmptyFilter();
728
- }
729
- try {
730
- const parsed = JSON.parse(filterStateJson);
731
- // Validate it has the expected structure
732
- if (parsed && typeof parsed === 'object' && 'logic' in parsed && 'filters' in parsed) {
733
- return parsed;
734
- }
735
- return createEmptyFilter();
736
- }
737
- catch {
738
- return createEmptyFilter();
739
- }
740
- }
741
- /**
742
- * Handle filter state change from filter builder
743
- */
744
- onFilterChange(filter) {
745
- this.filterState = filter;
746
- this.cdr.detectChanges();
747
- }
748
- /**
749
- * Open the filter dialog - emits event to parent (dashboard) which renders the dialog at viewport level
750
- */
751
- openFilterDialog() {
752
- this.openFilterDialogRequest.emit({
753
- filterState: this.filterState,
754
- filterFields: this.filterFields
755
- });
756
- }
757
- /**
758
- * Get the count of active filter rules
759
- */
760
- getFilterCount() {
761
- return this.countFilters(this.filterState);
762
- }
763
- /**
764
- * Count filters recursively
765
- */
766
- countFilters(filter) {
767
- let count = 0;
768
- for (const item of filter.filters || []) {
769
- if ('logic' in item && 'filters' in item) {
770
- count += this.countFilters(item);
771
- }
772
- else if ('field' in item) {
773
- count++;
774
- }
775
- }
776
- return count;
777
- }
778
- /**
779
- * Get a human-readable summary of the filter state
780
- */
781
- getFilterSummary() {
782
- const count = this.getFilterCount();
783
- if (count === 0) {
784
- return 'No filters applied';
785
- }
786
- return `${count} filter${count !== 1 ? 's' : ''} active`;
787
- }
788
- /**
789
- * Clear all filters
790
- */
791
- clearFilters() {
792
- this.filterState = createEmptyFilter();
793
- this.cdr.detectChanges();
794
- }
795
- /**
796
- * Apply grid state column settings to the columns array
797
- */
798
- applyGridStateToColumns(gridColumns) {
799
- // Mark all columns as hidden initially
800
- this.columns.forEach(c => c.visible = false);
801
- // Apply grid state column settings
802
- gridColumns.forEach((gc, idx) => {
803
- const column = this.columns.find(c => c.fieldName.toLowerCase() === gc.Name.toLowerCase());
804
- if (column) {
805
- column.visible = !gc.hidden;
806
- column.width = gc.width || null;
807
- column.orderIndex = gc.orderIndex ?? idx;
808
- if (gc.DisplayName) {
809
- column.displayName = gc.DisplayName;
810
- }
811
- }
812
- });
813
- // Sort by orderIndex
814
- this.columns.sort((a, b) => a.orderIndex - b.orderIndex);
815
- }
816
- /**
817
- * Get visible columns
818
- */
819
- get visibleColumns() {
820
- return this.columns.filter(c => c.visible);
821
- }
822
- /**
823
- * Get hidden columns
824
- */
825
- get hiddenColumns() {
826
- return this.columns.filter(c => !c.visible);
827
- }
828
- /**
829
- * Get filtered columns for search
830
- */
831
- get filteredHiddenColumns() {
832
- if (!this.columnSearchText) {
833
- return this.hiddenColumns;
834
- }
835
- const search = this.columnSearchText.toLowerCase();
836
- return this.hiddenColumns.filter(c => c.displayName.toLowerCase().includes(search) ||
837
- c.fieldName.toLowerCase().includes(search));
838
- }
839
- /**
840
- * Get sortable fields for dropdown (including __mj_ fields for sorting by timestamps)
841
- */
842
- get sortableFields() {
843
- if (!this.entity)
844
- return [];
845
- return this.entity.Fields.filter(f => !f.IsBinaryFieldType // Exclude binary fields from sorting
846
- );
847
- }
848
- /**
849
- * Check if the current user can edit the view
850
- */
851
- get canEdit() {
852
- if (!this.viewEntity)
853
- return true; // Can always create new
854
- return this.viewEntity.UserCanEdit;
855
- }
856
- /**
857
- * Check if the current user can delete the view
858
- */
859
- get canDelete() {
860
- if (!this.viewEntity)
861
- return false; // Can't delete default
862
- return this.viewEntity.UserCanDelete;
863
- }
864
- /**
865
- * Toggle column visibility
866
- */
867
- toggleColumnVisibility(column) {
868
- column.visible = !column.visible;
869
- if (column.visible) {
870
- // Add to end of visible columns
871
- column.orderIndex = this.visibleColumns.length;
872
- }
873
- this.cdr.detectChanges();
874
- }
875
- /**
876
- * Move column up in order
877
- */
878
- moveColumnUp(column) {
879
- const visibleCols = this.visibleColumns;
880
- const currentIndex = visibleCols.indexOf(column);
881
- if (currentIndex > 0) {
882
- const prevColumn = visibleCols[currentIndex - 1];
883
- const tempOrder = column.orderIndex;
884
- column.orderIndex = prevColumn.orderIndex;
885
- prevColumn.orderIndex = tempOrder;
886
- this.columns.sort((a, b) => a.orderIndex - b.orderIndex);
887
- this.cdr.detectChanges();
888
- }
889
- }
890
- /**
891
- * Move column down in order
892
- */
893
- moveColumnDown(column) {
894
- const visibleCols = this.visibleColumns;
895
- const currentIndex = visibleCols.indexOf(column);
896
- if (currentIndex < visibleCols.length - 1) {
897
- const nextColumn = visibleCols[currentIndex + 1];
898
- const tempOrder = column.orderIndex;
899
- column.orderIndex = nextColumn.orderIndex;
900
- nextColumn.orderIndex = tempOrder;
901
- this.columns.sort((a, b) => a.orderIndex - b.orderIndex);
902
- this.cdr.detectChanges();
903
- }
904
- }
905
- /**
906
- * Handle drag start for column reordering
907
- */
908
- onDragStart(event, column) {
909
- this.draggedColumn = column;
910
- if (event.dataTransfer) {
911
- event.dataTransfer.effectAllowed = 'move';
912
- }
913
- }
914
- /**
915
- * Handle drag over for column reordering
916
- */
917
- onDragOver(event, column) {
918
- event.preventDefault();
919
- if (event.dataTransfer) {
920
- event.dataTransfer.dropEffect = 'move';
921
- }
922
- }
923
- /**
924
- * Handle drop for column reordering
925
- */
926
- onDrop(event, targetColumn) {
927
- event.preventDefault();
928
- if (this.draggedColumn && this.draggedColumn !== targetColumn) {
929
- const draggedIndex = this.draggedColumn.orderIndex;
930
- const targetIndex = targetColumn.orderIndex;
931
- // Reorder columns
932
- if (draggedIndex < targetIndex) {
933
- this.columns.forEach(c => {
934
- if (c.orderIndex > draggedIndex && c.orderIndex <= targetIndex) {
935
- c.orderIndex--;
936
- }
937
- });
938
- }
939
- else {
940
- this.columns.forEach(c => {
941
- if (c.orderIndex >= targetIndex && c.orderIndex < draggedIndex) {
942
- c.orderIndex++;
943
- }
944
- });
945
- }
946
- this.draggedColumn.orderIndex = targetIndex;
947
- this.columns.sort((a, b) => a.orderIndex - b.orderIndex);
948
- }
949
- this.draggedColumn = null;
950
- this.cdr.detectChanges();
951
- }
952
- /**
953
- * Handle drag end
954
- */
955
- onDragEnd() {
956
- this.draggedColumn = null;
957
- }
958
- /**
959
- * Close the panel
960
- */
961
- onClose() {
962
- this.close.emit();
963
- }
964
- /**
965
- * Check if filter state has any active filters
966
- */
967
- hasActiveFilters() {
968
- return this.filterState?.filters?.length > 0;
969
- }
970
- /**
971
- * Save the view
972
- */
973
- onSave() {
974
- this.save.emit({
975
- name: this.viewName,
976
- description: this.viewDescription,
977
- isShared: this.isShared,
978
- saveAsNew: false,
979
- columns: this.visibleColumns,
980
- sortField: this.sortField,
981
- sortDirection: this.sortDirection,
982
- smartFilterEnabled: this.smartFilterEnabled,
983
- smartFilterPrompt: this.smartFilterPrompt,
984
- filterState: this.hasActiveFilters() ? this.filterState : null
985
- });
986
- }
987
- /**
988
- * Save as a new view
989
- */
990
- onSaveAsNew() {
991
- this.save.emit({
992
- name: this.viewName || 'New View',
993
- description: this.viewDescription,
994
- isShared: this.isShared,
995
- saveAsNew: true,
996
- columns: this.visibleColumns,
997
- sortField: this.sortField,
998
- sortDirection: this.sortDirection,
999
- smartFilterEnabled: this.smartFilterEnabled,
1000
- smartFilterPrompt: this.smartFilterPrompt,
1001
- filterState: this.hasActiveFilters() ? this.filterState : null
1002
- });
1003
- }
1004
- /**
1005
- * Delete the view
1006
- */
1007
- onDelete() {
1008
- if (confirm('Are you sure you want to delete this view?')) {
1009
- this.delete.emit();
1010
- }
1011
- }
1012
- /**
1013
- * Set the active tab
1014
- */
1015
- setActiveTab(tab) {
1016
- this.activeTab = tab;
1017
- this.cdr.detectChanges();
1018
- }
1019
- /**
1020
- * Set the filter mode (smart or traditional)
1021
- * When switching modes, clear the other mode's settings
1022
- */
1023
- setFilterMode(mode) {
1024
- if (this.filterMode === mode)
1025
- return;
1026
- this.filterMode = mode;
1027
- // When switching to smart mode, clear traditional filters and enable smart filter
1028
- if (mode === 'smart') {
1029
- this.smartFilterEnabled = true;
1030
- this.filterState = createEmptyFilter();
1031
- }
1032
- // When switching to traditional mode, disable smart filter and clear its prompt
1033
- else {
1034
- this.smartFilterEnabled = false;
1035
- this.smartFilterPrompt = '';
1036
- this.smartFilterExplanation = '';
1037
- }
1038
- this.cdr.detectChanges();
1039
- }
1040
- /**
1041
- * Apply a smart filter example to the prompt field
1042
- */
1043
- applySmartFilterExample(example) {
1044
- this.smartFilterPrompt = example;
1045
- this.cdr.detectChanges();
1046
- }
1047
- static ɵfac = function ViewConfigPanelComponent_Factory(t) { return new (t || ViewConfigPanelComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
1048
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ViewConfigPanelComponent, selectors: [["mj-view-config-panel"]], hostBindings: function ViewConfigPanelComponent_HostBindings(rf, ctx) { if (rf & 1) {
1049
- i0.ɵɵlistener("keydown.escape", function ViewConfigPanelComponent_keydown_escape_HostBindingHandler() { return ctx.handleEscape(); }, false, i0.ɵɵresolveDocument);
1050
- } }, inputs: { entity: "entity", viewEntity: "viewEntity", isOpen: "isOpen", currentGridState: "currentGridState", externalFilterState: "externalFilterState", isSaving: "isSaving" }, outputs: { close: "close", save: "save", delete: "delete", openFilterDialogRequest: "openFilterDialogRequest" }, features: [i0.ɵɵNgOnChangesFeature], decls: 33, vars: 16, consts: [[1, "panel-backdrop"], [1, "config-panel"], [1, "panel-header"], [1, "header-title"], [1, "fa-solid", "fa-sliders-h"], ["title", "Close", 1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "tab-nav"], [1, "tab-btn", 3, "click"], [1, "fa-solid", "fa-columns"], [1, "fa-solid", "fa-filter"], [1, "fa-solid", "fa-cog"], [1, "panel-content"], [1, "tab-content"], [1, "panel-footer"], [1, "footer-btn", "cancel-btn", 3, "click"], [1, "footer-right"], [1, "footer-btn", "save-as-btn", 3, "disabled"], [1, "footer-btn", "save-btn", "primary", 3, "disabled"], [1, "panel-backdrop", 3, "click"], [1, "config-section"], [1, "section-header"], [1, "fa-solid", "fa-sort"], [1, "sort-config"], [1, "sort-field-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "sort-direction-toggle"], [1, "fa-solid", "fa-eye"], [1, "column-count"], [1, "column-list", "visible-columns"], ["draggable", "true", 1, "column-item"], [1, "empty-list"], [1, "fa-solid", "fa-eye-slash"], [1, "column-search"], [1, "column-list", "hidden-columns"], [1, "column-item", "hidden"], ["title", "Ascending", 1, "direction-btn", 3, "click"], [1, "fa-solid", "fa-arrow-up"], ["title", "Descending", 1, "direction-btn", 3, "click"], [1, "fa-solid", "fa-arrow-down"], ["draggable", "true", 1, "column-item", 3, "dragstart", "dragover", "drop", "dragend"], [1, "drag-handle"], [1, "fa-solid", "fa-grip-vertical"], [1, "column-name"], [1, "column-actions"], ["title", "Move up", 1, "action-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-up"], ["title", "Move down", 1, "action-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-down"], ["title", "Hide column", 1, "action-btn", "hide-btn", 3, "click"], [1, "fa-solid", "fa-info-circle"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search columns...", 3, "ngModelChange", "ngModel"], ["title", "Show column", 1, "action-btn", "show-btn", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "fa-solid", "fa-check-circle"], [1, "filter-mode-selector"], [1, "filter-mode-btn", 3, "click", "disabled"], [1, "mode-icon"], [1, "fa-solid", "fa-wand-magic-sparkles"], [1, "mode-content"], [1, "mode-title"], [1, "mode-subtitle"], [1, "fa-solid", "fa-check", "mode-check"], [1, "fa-solid", "fa-sliders"], [1, "config-section", "smart-filter-section"], [1, "config-section", "traditional-filter-section"], [1, "smart-filter-input-container"], [1, "smart-filter-icon"], ["id", "smartFilterPrompt", "placeholder", "Describe what you're looking for...", "rows", "3", 1, "smart-filter-textarea", 3, "ngModelChange", "ngModel", "disabled"], [1, "smart-filter-explanation"], [1, "smart-filter-examples"], [1, "examples-header"], [1, "fa-solid", "fa-lightbulb"], [1, "example-chips"], [1, "example-chip", 3, "click", "disabled"], [1, "fa-regular", "fa-calendar"], [1, "fa-solid", "fa-circle-check"], [1, "fa-solid", "fa-star"], [1, "fa-solid", "fa-clock-rotate-left"], [1, "smart-filter-tip"], [1, "fa-solid", "fa-robot"], [1, "filter-summary-container"], [1, "filter-summary"], [1, "summary-info"], [1, "summary-text", "no-filters"], [1, "summary-actions"], ["title", "Clear all filters", 1, "summary-btn", "clear-btn"], ["title", "Edit filters", 1, "summary-btn", "edit-btn", "primary", 3, "click", "disabled"], [1, "fa-solid", "fa-pen"], [1, "traditional-filter-tip"], [1, "filter-badge"], [1, "summary-text"], ["title", "Clear all filters", 1, "summary-btn", "clear-btn", 3, "click"], [1, "form-group"], ["for", "viewName"], ["id", "viewName", "type", "text", "placeholder", "Enter view name...", 1, "form-input", 3, "ngModelChange", "ngModel", "disabled"], ["for", "viewDescription"], ["id", "viewDescription", "placeholder", "Describe this view...", "rows", "3", 1, "form-input", "form-textarea", 3, "ngModelChange", "ngModel", "disabled"], [1, "fa-solid", "fa-share-alt"], [1, "checkbox-label"], ["type", "checkbox", 3, "ngModelChange", "ngModel", "disabled"], [1, "checkbox-text"], [1, "config-section", "danger-zone"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "delete-btn", 3, "click"], [1, "fa-solid", "fa-trash"], [1, "footer-btn", "save-as-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "footer-btn", "save-btn", "primary", 3, "click", "disabled"], [1, "fa-solid", "fa-save"]], template: function ViewConfigPanelComponent_Template(rf, ctx) { if (rf & 1) {
1051
- i0.ɵɵtemplate(0, ViewConfigPanelComponent_Conditional_0_Template, 1, 0, "div", 0);
1052
- i0.ɵɵelementStart(1, "div", 1)(2, "div", 2)(3, "div", 3);
1053
- i0.ɵɵelement(4, "i", 4);
1054
- i0.ɵɵelementStart(5, "span");
1055
- i0.ɵɵtext(6);
1056
- i0.ɵɵelementEnd()();
1057
- i0.ɵɵelementStart(7, "button", 5);
1058
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Template_button_click_7_listener() { return ctx.onClose(); });
1059
- i0.ɵɵelement(8, "i", 6);
1060
- i0.ɵɵelementEnd()();
1061
- i0.ɵɵelementStart(9, "div", 7)(10, "button", 8);
1062
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Template_button_click_10_listener() { return ctx.setActiveTab("columns"); });
1063
- i0.ɵɵelement(11, "i", 9);
1064
- i0.ɵɵelementStart(12, "span");
1065
- i0.ɵɵtext(13, "Columns");
1066
- i0.ɵɵelementEnd()();
1067
- i0.ɵɵelementStart(14, "button", 8);
1068
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Template_button_click_14_listener() { return ctx.setActiveTab("filters"); });
1069
- i0.ɵɵelement(15, "i", 10);
1070
- i0.ɵɵelementStart(16, "span");
1071
- i0.ɵɵtext(17, "Filters");
1072
- i0.ɵɵelementEnd()();
1073
- i0.ɵɵelementStart(18, "button", 8);
1074
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Template_button_click_18_listener() { return ctx.setActiveTab("settings"); });
1075
- i0.ɵɵelement(19, "i", 11);
1076
- i0.ɵɵelementStart(20, "span");
1077
- i0.ɵɵtext(21, "Settings");
1078
- i0.ɵɵelementEnd()()();
1079
- i0.ɵɵelementStart(22, "div", 12);
1080
- i0.ɵɵtemplate(23, ViewConfigPanelComponent_Conditional_23_Template, 36, 8, "div", 13)(24, ViewConfigPanelComponent_Conditional_24_Template, 22, 10, "div", 13)(25, ViewConfigPanelComponent_Conditional_25_Template, 27, 7, "div", 13);
1081
- i0.ɵɵelementEnd();
1082
- i0.ɵɵelementStart(26, "div", 14)(27, "button", 15);
1083
- i0.ɵɵlistener("click", function ViewConfigPanelComponent_Template_button_click_27_listener() { return ctx.onClose(); });
1084
- i0.ɵɵtext(28, " Cancel ");
1085
- i0.ɵɵelementEnd();
1086
- i0.ɵɵelementStart(29, "div", 16);
1087
- i0.ɵɵtemplate(30, ViewConfigPanelComponent_Conditional_30_Template, 4, 3, "button", 17)(31, ViewConfigPanelComponent_Conditional_31_Template, 4, 3, "button", 18)(32, ViewConfigPanelComponent_Conditional_32_Template, 4, 3, "button", 18);
1088
- i0.ɵɵelementEnd()()();
1089
- } if (rf & 2) {
1090
- i0.ɵɵconditional(ctx.isOpen ? 0 : -1);
1091
- i0.ɵɵadvance();
1092
- i0.ɵɵclassProp("open", ctx.isOpen);
1093
- i0.ɵɵadvance(5);
1094
- i0.ɵɵtextInterpolate(ctx.viewEntity ? "Edit View" : "Configure View");
1095
- i0.ɵɵadvance(4);
1096
- i0.ɵɵclassProp("active", ctx.activeTab === "columns");
1097
- i0.ɵɵadvance(4);
1098
- i0.ɵɵclassProp("active", ctx.activeTab === "filters");
1099
- i0.ɵɵadvance(4);
1100
- i0.ɵɵclassProp("active", ctx.activeTab === "settings");
1101
- i0.ɵɵadvance(5);
1102
- i0.ɵɵconditional(ctx.activeTab === "columns" ? 23 : -1);
1103
- i0.ɵɵadvance();
1104
- i0.ɵɵconditional(ctx.activeTab === "filters" ? 24 : -1);
1105
- i0.ɵɵadvance();
1106
- i0.ɵɵconditional(ctx.activeTab === "settings" ? 25 : -1);
1107
- i0.ɵɵadvance(5);
1108
- i0.ɵɵconditional(ctx.canEdit || !ctx.viewEntity ? 30 : -1);
1109
- i0.ɵɵadvance();
1110
- i0.ɵɵconditional(ctx.viewEntity && ctx.canEdit ? 31 : -1);
1111
- i0.ɵɵadvance();
1112
- i0.ɵɵconditional(!ctx.viewEntity ? 32 : -1);
1113
- } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel], styles: ["\n\n.panel-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.3);\n z-index: 1000;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n\n.config-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n width: 400px;\n max-width: 100vw;\n height: 100%;\n background: white;\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.15);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n transform: translateX(100%);\n transition: transform 0.25s ease;\n}\n\n.config-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid #e0e0e0;\n background: #fafafa;\n flex-shrink: 0;\n}\n\n.header-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n}\n\n.header-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #1976d2;\n}\n\n.close-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n color: #666;\n transition: all 0.15s ease;\n}\n\n.close-btn[_ngcontent-%COMP%]:hover {\n background: #e0e0e0;\n color: #333;\n}\n\n\n\n.tab-nav[_ngcontent-%COMP%] {\n display: flex;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n}\n\n.tab-btn[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px 16px;\n border: none;\n background: transparent;\n color: #666;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n border-bottom: 2px solid transparent;\n}\n\n.tab-btn[_ngcontent-%COMP%]:hover {\n background: #f5f5f5;\n color: #333;\n}\n\n.tab-btn.active[_ngcontent-%COMP%] {\n color: #1976d2;\n border-bottom-color: #1976d2;\n background: transparent;\n}\n\n.tab-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n.panel-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n padding: 16px 0;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.tab-content[_ngcontent-%COMP%] {\n padding: 0 20px;\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow-y: auto;\n}\n\n\n\n.config-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-size: 13px;\n font-weight: 600;\n color: #333;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #1976d2;\n font-size: 12px;\n}\n\n.column-count[_ngcontent-%COMP%] {\n margin-left: auto;\n background: #e3f2fd;\n color: #1976d2;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n}\n\n\n\n.sort-config[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.sort-field-select[_ngcontent-%COMP%] {\n flex: 1;\n padding: 10px 12px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 14px;\n background: white;\n cursor: pointer;\n}\n\n.sort-field-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #1976d2;\n}\n\n.sort-direction-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: #f0f0f0;\n border-radius: 6px;\n padding: 2px;\n}\n\n.direction-btn[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: #666;\n transition: all 0.15s ease;\n}\n\n.direction-btn[_ngcontent-%COMP%]:hover {\n color: #333;\n}\n\n.direction-btn.active[_ngcontent-%COMP%] {\n background: white;\n color: #1976d2;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n\n\n.column-list[_ngcontent-%COMP%] {\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n overflow: hidden;\n background: #fafafa;\n}\n\n.column-list.visible-columns[_ngcontent-%COMP%] {\n max-height: 300px;\n overflow-y: auto;\n}\n\n.column-list.hidden-columns[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 100px;\n overflow-y: auto;\n}\n\n\n\n.config-section[_ngcontent-%COMP%]:last-child {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n margin-bottom: 0;\n}\n\n.column-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: white;\n border-bottom: 1px solid #f0f0f0;\n transition: background 0.1s ease;\n}\n\n.column-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.column-item[_ngcontent-%COMP%]:hover {\n background: #f5f7fa;\n}\n\n.column-item.hidden[_ngcontent-%COMP%] {\n background: #fafafa;\n}\n\n.column-item.hidden[_ngcontent-%COMP%]:hover {\n background: #f0f0f0;\n}\n\n.drag-handle[_ngcontent-%COMP%] {\n cursor: grab;\n color: #999;\n padding: 4px;\n}\n\n.drag-handle[_ngcontent-%COMP%]:active {\n cursor: grabbing;\n}\n\n.column-name[_ngcontent-%COMP%] {\n flex: 1;\n font-size: 14px;\n color: #333;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.column-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n}\n\n.action-btn[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: #999;\n transition: all 0.15s ease;\n}\n\n.action-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #e0e0e0;\n color: #333;\n}\n\n.action-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n.action-btn.hide-btn[_ngcontent-%COMP%]:hover {\n background: #ffebee;\n color: #c62828;\n}\n\n.action-btn.show-btn[_ngcontent-%COMP%]:hover {\n background: #e8f5e9;\n color: #2e7d32;\n}\n\n.empty-list[_ngcontent-%COMP%] {\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}\n\n\n\n.column-search[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n margin-bottom: 8px;\n}\n\n.column-search[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #999;\n font-size: 12px;\n}\n\n.column-search[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n outline: none;\n font-size: 14px;\n}\n\n\n\n.filter-summary-container[_ngcontent-%COMP%] {\n padding: 4px 0;\n}\n\n.filter-summary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: #f5f7fa;\n border-radius: 8px;\n border: 1px solid #e8e8e8;\n}\n\n.summary-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.filter-badge[_ngcontent-%COMP%] {\n background: #1976d2;\n color: white;\n font-size: 12px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 10px;\n min-width: 20px;\n text-align: center;\n}\n\n.summary-text[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #333;\n}\n\n.summary-text.no-filters[_ngcontent-%COMP%] {\n color: #999;\n}\n\n.summary-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.summary-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px 12px;\n border: none;\n border-radius: 6px;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.summary-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.summary-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.summary-btn.clear-btn[_ngcontent-%COMP%] {\n background: transparent;\n color: #c62828;\n border: 1px solid #e0e0e0;\n}\n\n.summary-btn.clear-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #ffebee;\n border-color: #c62828;\n}\n\n.summary-btn.edit-btn[_ngcontent-%COMP%] {\n background: #1976d2;\n color: white;\n}\n\n.summary-btn.edit-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #1565c0;\n}\n\n\n\n.filters-placeholder[_ngcontent-%COMP%] {\n text-align: center;\n padding: 32px 20px;\n background: #f5f7fa;\n border-radius: 8px;\n}\n\n.filters-placeholder[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n color: #1976d2;\n margin-bottom: 16px;\n}\n\n.filters-placeholder[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 16px;\n color: #333;\n}\n\n.filters-placeholder[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 16px 0;\n font-size: 14px;\n color: #666;\n line-height: 1.5;\n}\n\n.tip[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 12px;\n background: #fff8e1;\n border-radius: 6px;\n font-size: 12px;\n color: #795548;\n text-align: left;\n}\n\n.tip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #ffc107;\n font-size: 14px;\n margin-top: 1px;\n}\n\n\n\n.smart-filter-toggle[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n cursor: pointer;\n}\n\n.smart-filter-toggle[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n cursor: pointer;\n}\n\n.smart-filter-toggle[_ngcontent-%COMP%] .toggle-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 500;\n color: #666;\n text-transform: none;\n letter-spacing: normal;\n}\n\n.smart-filter-textarea[_ngcontent-%COMP%] {\n min-height: 100px;\n font-family: inherit;\n line-height: 1.5;\n}\n\n.smart-filter-explanation[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 12px;\n background: #e3f2fd;\n border-radius: 6px;\n margin-bottom: 12px;\n font-size: 13px;\n color: #1565c0;\n}\n\n.smart-filter-explanation[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #1976d2;\n font-size: 14px;\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n.smart-filter-disabled-message[_ngcontent-%COMP%] {\n padding: 16px;\n background: #f5f7fa;\n border-radius: 6px;\n text-align: center;\n}\n\n.smart-filter-disabled-message[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: #666;\n line-height: 1.5;\n}\n\n\n\n\n\n\n.filter-mode-selector[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 16px;\n}\n\n.filter-mode-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 14px 16px;\n border: 2px solid #e5e7eb;\n border-radius: 12px;\n background: white;\n cursor: pointer;\n transition: all 0.2s ease;\n text-align: left;\n}\n\n.filter-mode-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: #d1d5db;\n background: #f9fafb;\n}\n\n.filter-mode-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.filter-mode-btn.active[_ngcontent-%COMP%] {\n border-color: #3b82f6;\n background: linear-gradient(135deg, #eff6ff 0%, #dbeafe 100%);\n}\n\n.filter-mode-btn[_ngcontent-%COMP%] .mode-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 10px;\n background: #f3f4f6;\n color: #6b7280;\n font-size: 16px;\n flex-shrink: 0;\n transition: all 0.2s ease;\n}\n\n.filter-mode-btn.active[_ngcontent-%COMP%] .mode-icon[_ngcontent-%COMP%] {\n background: #3b82f6;\n color: white;\n}\n\n.filter-mode-btn[_ngcontent-%COMP%] .mode-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.filter-mode-btn[_ngcontent-%COMP%] .mode-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: #1f2937;\n}\n\n.filter-mode-btn[_ngcontent-%COMP%] .mode-subtitle[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6b7280;\n}\n\n.filter-mode-btn.active[_ngcontent-%COMP%] .mode-title[_ngcontent-%COMP%] {\n color: #1d4ed8;\n}\n\n.filter-mode-btn[_ngcontent-%COMP%] .mode-check[_ngcontent-%COMP%] {\n color: #3b82f6;\n font-size: 16px;\n flex-shrink: 0;\n}\n\n\n\n\n\n\n.smart-filter-section[_ngcontent-%COMP%] {\n padding: 0;\n border: none;\n background: transparent;\n}\n\n.smart-filter-input-container[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 16px;\n background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%);\n border: 1px solid #bae6fd;\n border-radius: 12px;\n margin-bottom: 16px;\n}\n\n.smart-filter-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #3b82f6 0%, #6366f1 100%);\n border-radius: 10px;\n color: white;\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.smart-filter-input-container[_ngcontent-%COMP%] .smart-filter-textarea[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n background: white;\n border-radius: 8px;\n padding: 12px;\n font-size: 14px;\n line-height: 1.5;\n resize: none;\n min-height: 60px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n\n.smart-filter-input-container[_ngcontent-%COMP%] .smart-filter-textarea[_ngcontent-%COMP%]:focus {\n outline: none;\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.3), 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n\n.smart-filter-input-container[_ngcontent-%COMP%] .smart-filter-textarea[_ngcontent-%COMP%]::placeholder {\n color: #9ca3af;\n}\n\n\n\n.smart-filter-examples[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.examples-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 10px;\n font-size: 13px;\n font-weight: 500;\n color: #6b7280;\n}\n\n.examples-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #f59e0b;\n}\n\n.example-chips[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.example-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n border: 1px solid #e5e7eb;\n border-radius: 20px;\n background: white;\n font-size: 12px;\n font-weight: 500;\n color: #4b5563;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.example-chip[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: #3b82f6;\n background: #eff6ff;\n color: #1d4ed8;\n}\n\n.example-chip[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.example-chip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #9ca3af;\n}\n\n.example-chip[_ngcontent-%COMP%]:hover:not(:disabled) i[_ngcontent-%COMP%] {\n color: #3b82f6;\n}\n\n\n\n.smart-filter-tip[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 12px 14px;\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n font-size: 12px;\n color: #64748b;\n line-height: 1.5;\n}\n\n.smart-filter-tip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #94a3b8;\n margin-top: 1px;\n flex-shrink: 0;\n}\n\n\n\n\n\n\n.traditional-filter-section[_ngcontent-%COMP%] {\n padding: 0;\n border: none;\n background: transparent;\n}\n\n.traditional-filter-tip[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 12px 14px;\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n font-size: 12px;\n color: #64748b;\n line-height: 1.5;\n margin-top: 12px;\n}\n\n.traditional-filter-tip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #94a3b8;\n margin-top: 1px;\n flex-shrink: 0;\n}\n\n.summary-btn.edit-btn.primary[_ngcontent-%COMP%] {\n background: #3b82f6;\n color: white;\n border-color: #3b82f6;\n}\n\n.summary-btn.edit-btn.primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #2563eb;\n border-color: #2563eb;\n}\n\n\n\n.form-group[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.form-group[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #333;\n}\n\n.form-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.15s ease;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #1976d2;\n}\n\n.form-input[_ngcontent-%COMP%]:disabled {\n background: #f5f5f5;\n color: #999;\n}\n\n.form-textarea[_ngcontent-%COMP%] {\n resize: vertical;\n min-height: 80px;\n}\n\n\n\n.checkbox-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n cursor: pointer;\n}\n\n.checkbox-label[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n width: 18px;\n height: 18px;\n margin-top: 2px;\n cursor: pointer;\n}\n\n.checkbox-text[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.checkbox-text[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #333;\n}\n\n.checkbox-text[_ngcontent-%COMP%] small[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #666;\n}\n\n\n\n.danger-zone[_ngcontent-%COMP%] {\n padding-top: 16px;\n border-top: 1px solid #ffcdd2;\n}\n\n.danger-zone[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] {\n color: #c62828;\n}\n\n.danger-zone[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #c62828;\n}\n\n.delete-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n width: 100%;\n padding: 10px 16px;\n border: 1px solid #c62828;\n background: transparent;\n border-radius: 6px;\n color: #c62828;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.delete-btn[_ngcontent-%COMP%]:hover {\n background: #c62828;\n color: white;\n}\n\n\n\n.panel-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-top: 1px solid #e0e0e0;\n background: #fafafa;\n flex-shrink: 0;\n}\n\n.footer-right[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.footer-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 16px;\n border: 1px solid #e0e0e0;\n background: white;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.footer-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #f0f0f0;\n border-color: #ccc;\n}\n\n.footer-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.footer-btn.primary[_ngcontent-%COMP%] {\n background: #1976d2;\n border-color: #1976d2;\n color: white;\n}\n\n.footer-btn.primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #1565c0;\n border-color: #1565c0;\n}\n\n.footer-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n@media (max-width: 768px) {\n .config-panel[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .tab-btn[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: none;\n }\n\n .tab-btn[_ngcontent-%COMP%] {\n padding: 14px;\n }\n\n .tab-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n}"] });
1114
- }
1115
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ViewConfigPanelComponent, [{
1116
- type: Component,
1117
- args: [{ selector: 'mj-view-config-panel', template: "<!-- Backdrop -->\n@if (isOpen) {\n <div class=\"panel-backdrop\" (click)=\"onClose()\"></div>\n}\n\n<!-- Sliding Panel -->\n<div class=\"config-panel\" [class.open]=\"isOpen\">\n <!-- Panel Header -->\n <div class=\"panel-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-sliders-h\"></i>\n <span>{{ viewEntity ? 'Edit View' : 'Configure View' }}</span>\n </div>\n <button class=\"close-btn\" (click)=\"onClose()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Tab Navigation -->\n <div class=\"tab-nav\">\n <button\n class=\"tab-btn\"\n [class.active]=\"activeTab === 'columns'\"\n (click)=\"setActiveTab('columns')\">\n <i class=\"fa-solid fa-columns\"></i>\n <span>Columns</span>\n </button>\n <button\n class=\"tab-btn\"\n [class.active]=\"activeTab === 'filters'\"\n (click)=\"setActiveTab('filters')\">\n <i class=\"fa-solid fa-filter\"></i>\n <span>Filters</span>\n </button>\n <button\n class=\"tab-btn\"\n [class.active]=\"activeTab === 'settings'\"\n (click)=\"setActiveTab('settings')\">\n <i class=\"fa-solid fa-cog\"></i>\n <span>Settings</span>\n </button>\n </div>\n\n <!-- Panel Content -->\n <div class=\"panel-content\">\n <!-- Columns Tab -->\n @if (activeTab === 'columns') {\n <div class=\"tab-content\">\n <!-- Sort Configuration -->\n <div class=\"config-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-sort\"></i>\n <span>Default Sort</span>\n </div>\n <div class=\"sort-config\">\n <select\n class=\"sort-field-select\"\n [(ngModel)]=\"sortField\">\n <option [value]=\"null\">No default sort</option>\n @for (field of sortableFields; track field.ID) {\n <option [value]=\"field.Name\">{{ field.DisplayNameOrName }}</option>\n }\n </select>\n @if (sortField) {\n <div class=\"sort-direction-toggle\">\n <button\n class=\"direction-btn\"\n [class.active]=\"sortDirection === 'asc'\"\n (click)=\"sortDirection = 'asc'\"\n title=\"Ascending\">\n <i class=\"fa-solid fa-arrow-up\"></i>\n </button>\n <button\n class=\"direction-btn\"\n [class.active]=\"sortDirection === 'desc'\"\n (click)=\"sortDirection = 'desc'\"\n title=\"Descending\">\n <i class=\"fa-solid fa-arrow-down\"></i>\n </button>\n </div>\n }\n </div>\n </div>\n\n <!-- Visible Columns -->\n <div class=\"config-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-eye\"></i>\n <span>Visible Columns</span>\n <span class=\"column-count\">{{ visibleColumns.length }}</span>\n </div>\n <div class=\"column-list visible-columns\">\n @for (column of visibleColumns; track column.fieldId; let i = $index) {\n <div\n class=\"column-item\"\n draggable=\"true\"\n (dragstart)=\"onDragStart($event, column)\"\n (dragover)=\"onDragOver($event, column)\"\n (drop)=\"onDrop($event, column)\"\n (dragend)=\"onDragEnd()\">\n <div class=\"drag-handle\">\n <i class=\"fa-solid fa-grip-vertical\"></i>\n </div>\n <span class=\"column-name\">{{ column.displayName }}</span>\n <div class=\"column-actions\">\n <button\n class=\"action-btn\"\n [disabled]=\"i === 0\"\n (click)=\"moveColumnUp(column)\"\n title=\"Move up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button\n class=\"action-btn\"\n [disabled]=\"i === visibleColumns.length - 1\"\n (click)=\"moveColumnDown(column)\"\n title=\"Move down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n <button\n class=\"action-btn hide-btn\"\n (click)=\"toggleColumnVisibility(column)\"\n title=\"Hide column\">\n <i class=\"fa-solid fa-eye-slash\"></i>\n </button>\n </div>\n </div>\n }\n @if (visibleColumns.length === 0) {\n <div class=\"empty-list\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>No columns visible. Add columns from below.</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Hidden Columns -->\n <div class=\"config-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-eye-slash\"></i>\n <span>Hidden Columns</span>\n <span class=\"column-count\">{{ hiddenColumns.length }}</span>\n </div>\n @if (hiddenColumns.length > 5) {\n <div class=\"column-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n placeholder=\"Search columns...\"\n [(ngModel)]=\"columnSearchText\"\n />\n </div>\n }\n <div class=\"column-list hidden-columns\">\n @for (column of filteredHiddenColumns; track column.fieldId) {\n <div class=\"column-item hidden\">\n <span class=\"column-name\">{{ column.displayName }}</span>\n <button\n class=\"action-btn show-btn\"\n (click)=\"toggleColumnVisibility(column)\"\n title=\"Show column\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n </div>\n }\n @if (hiddenColumns.length === 0) {\n <div class=\"empty-list\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>All columns are visible</span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Filters Tab -->\n @if (activeTab === 'filters') {\n <div class=\"tab-content\">\n <!-- Filter Mode Selection -->\n <div class=\"filter-mode-selector\">\n <button\n class=\"filter-mode-btn\"\n [class.active]=\"filterMode === 'smart'\"\n (click)=\"setFilterMode('smart')\"\n [disabled]=\"!canEdit\">\n <div class=\"mode-icon\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n </div>\n <div class=\"mode-content\">\n <span class=\"mode-title\">Smart Filter</span>\n <span class=\"mode-subtitle\">Use AI to filter with natural language</span>\n </div>\n @if (filterMode === 'smart') {\n <i class=\"fa-solid fa-check mode-check\"></i>\n }\n </button>\n <button\n class=\"filter-mode-btn\"\n [class.active]=\"filterMode === 'traditional'\"\n (click)=\"setFilterMode('traditional')\"\n [disabled]=\"!canEdit\">\n <div class=\"mode-icon\">\n <i class=\"fa-solid fa-sliders\"></i>\n </div>\n <div class=\"mode-content\">\n <span class=\"mode-title\">Traditional Filter</span>\n <span class=\"mode-subtitle\">Build filters with field/operator/value</span>\n </div>\n @if (filterMode === 'traditional') {\n <i class=\"fa-solid fa-check mode-check\"></i>\n }\n </button>\n </div>\n\n <!-- Smart Filter Section -->\n @if (filterMode === 'smart') {\n <div class=\"config-section smart-filter-section\">\n <div class=\"smart-filter-input-container\">\n <div class=\"smart-filter-icon\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n </div>\n <textarea\n id=\"smartFilterPrompt\"\n class=\"smart-filter-textarea\"\n placeholder=\"Describe what you're looking for...\"\n [(ngModel)]=\"smartFilterPrompt\"\n [disabled]=\"!canEdit\"\n rows=\"3\"\n ></textarea>\n </div>\n\n @if (smartFilterExplanation) {\n <div class=\"smart-filter-explanation\">\n <i class=\"fa-solid fa-robot\"></i>\n <span>{{ smartFilterExplanation }}</span>\n </div>\n }\n\n <!-- Example Prompts -->\n <div class=\"smart-filter-examples\">\n <div class=\"examples-header\">\n <i class=\"fa-solid fa-lightbulb\"></i>\n <span>Try these examples:</span>\n </div>\n <div class=\"example-chips\">\n <button\n class=\"example-chip\"\n (click)=\"applySmartFilterExample('Show records created in the last 30 days')\"\n [disabled]=\"!canEdit\">\n <i class=\"fa-regular fa-calendar\"></i>\n Last 30 days\n </button>\n <button\n class=\"example-chip\"\n (click)=\"applySmartFilterExample('Active records only')\"\n [disabled]=\"!canEdit\">\n <i class=\"fa-solid fa-circle-check\"></i>\n Active only\n </button>\n <button\n class=\"example-chip\"\n (click)=\"applySmartFilterExample('Records with high priority')\"\n [disabled]=\"!canEdit\">\n <i class=\"fa-solid fa-star\"></i>\n High priority\n </button>\n <button\n class=\"example-chip\"\n (click)=\"applySmartFilterExample('Records modified this week')\"\n [disabled]=\"!canEdit\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n Modified this week\n </button>\n </div>\n </div>\n\n <div class=\"smart-filter-tip\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>The AI will interpret your description and create the appropriate filter when you save the view.</span>\n </div>\n </div>\n }\n\n <!-- Traditional Filter Section -->\n @if (filterMode === 'traditional') {\n <div class=\"config-section traditional-filter-section\">\n <div class=\"filter-summary-container\">\n <div class=\"filter-summary\">\n <div class=\"summary-info\">\n @if (getFilterCount() > 0) {\n <span class=\"filter-badge\">{{ getFilterCount() }}</span>\n <span class=\"summary-text\">{{ getFilterSummary() }}</span>\n } @else {\n <span class=\"summary-text no-filters\">No filters configured</span>\n }\n </div>\n <div class=\"summary-actions\">\n @if (getFilterCount() > 0 && canEdit) {\n <button\n class=\"summary-btn clear-btn\"\n (click)=\"clearFilters()\"\n title=\"Clear all filters\">\n <i class=\"fa-solid fa-times\"></i>\n Clear\n </button>\n }\n <button\n class=\"summary-btn edit-btn primary\"\n (click)=\"openFilterDialog()\"\n [disabled]=\"!canEdit && getFilterCount() === 0\"\n title=\"Edit filters\">\n <i class=\"fa-solid fa-pen\"></i>\n {{ getFilterCount() > 0 ? 'Edit Filters' : 'Add Filters' }}\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"traditional-filter-tip\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>Build precise filters by selecting fields, operators, and values. Use groups for complex AND/OR logic.</span>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Settings Tab -->\n @if (activeTab === 'settings') {\n <div class=\"tab-content\">\n <!-- View Name & Description -->\n <div class=\"config-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>View Details</span>\n </div>\n <div class=\"form-group\">\n <label for=\"viewName\">Name</label>\n <input\n id=\"viewName\"\n type=\"text\"\n class=\"form-input\"\n placeholder=\"Enter view name...\"\n [(ngModel)]=\"viewName\"\n [disabled]=\"!canEdit\"\n />\n </div>\n <div class=\"form-group\">\n <label for=\"viewDescription\">Description</label>\n <textarea\n id=\"viewDescription\"\n class=\"form-input form-textarea\"\n placeholder=\"Describe this view...\"\n [(ngModel)]=\"viewDescription\"\n [disabled]=\"!canEdit\"\n rows=\"3\"\n ></textarea>\n </div>\n </div>\n\n <!-- Sharing -->\n <div class=\"config-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-share-alt\"></i>\n <span>Sharing</span>\n </div>\n <label class=\"checkbox-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"isShared\"\n [disabled]=\"!canEdit\"\n />\n <span class=\"checkbox-text\">\n <strong>Share with others</strong>\n <small>Allow other users to use this view</small>\n </span>\n </label>\n </div>\n\n <!-- Danger Zone -->\n @if (viewEntity && canDelete) {\n <div class=\"config-section danger-zone\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>Danger Zone</span>\n </div>\n <button class=\"delete-btn\" (click)=\"onDelete()\">\n <i class=\"fa-solid fa-trash\"></i>\n <span>Delete View</span>\n </button>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Panel Footer -->\n <div class=\"panel-footer\">\n <button class=\"footer-btn cancel-btn\" (click)=\"onClose()\">\n Cancel\n </button>\n <div class=\"footer-right\">\n @if (canEdit || !viewEntity) {\n <button\n class=\"footer-btn save-as-btn\"\n (click)=\"onSaveAsNew()\"\n [disabled]=\"isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-plus\"></i>\n }\n {{ isSaving ? 'Saving...' : 'Save As New' }}\n </button>\n }\n @if (viewEntity && canEdit) {\n <button\n class=\"footer-btn save-btn primary\"\n (click)=\"onSave()\"\n [disabled]=\"isSaving || !viewName\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-save\"></i>\n }\n {{ isSaving ? 'Saving...' : 'Save' }}\n </button>\n }\n @if (!viewEntity) {\n <button\n class=\"footer-btn save-btn primary\"\n (click)=\"onSaveAsNew()\"\n [disabled]=\"isSaving || !viewName\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-save\"></i>\n }\n {{ isSaving ? 'Creating...' : 'Create View' }}\n </button>\n }\n </div>\n </div>\n</div>\n", styles: ["/* Backdrop */\n.panel-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.3);\n z-index: 1000;\n animation: fadeIn 0.2s ease;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Sliding Panel */\n.config-panel {\n position: fixed;\n top: 0;\n right: 0;\n width: 400px;\n max-width: 100vw;\n height: 100%;\n background: white;\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.15);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n transform: translateX(100%);\n transition: transform 0.25s ease;\n}\n\n.config-panel.open {\n transform: translateX(0);\n}\n\n/* Panel Header */\n.panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid #e0e0e0;\n background: #fafafa;\n flex-shrink: 0;\n}\n\n.header-title {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n}\n\n.header-title i {\n color: #1976d2;\n}\n\n.close-btn {\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n color: #666;\n transition: all 0.15s ease;\n}\n\n.close-btn:hover {\n background: #e0e0e0;\n color: #333;\n}\n\n/* Tab Navigation */\n.tab-nav {\n display: flex;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n}\n\n.tab-btn {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px 16px;\n border: none;\n background: transparent;\n color: #666;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n border-bottom: 2px solid transparent;\n}\n\n.tab-btn:hover {\n background: #f5f5f5;\n color: #333;\n}\n\n.tab-btn.active {\n color: #1976d2;\n border-bottom-color: #1976d2;\n background: transparent;\n}\n\n.tab-btn i {\n font-size: 12px;\n}\n\n/* Panel Content */\n.panel-content {\n flex: 1;\n overflow: hidden;\n padding: 16px 0;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.tab-content {\n padding: 0 20px;\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow-y: auto;\n}\n\n/* Config Sections */\n.config-section {\n margin-bottom: 24px;\n}\n\n.section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-size: 13px;\n font-weight: 600;\n color: #333;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-header i {\n color: #1976d2;\n font-size: 12px;\n}\n\n.column-count {\n margin-left: auto;\n background: #e3f2fd;\n color: #1976d2;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n}\n\n/* Sort Configuration */\n.sort-config {\n display: flex;\n gap: 8px;\n}\n\n.sort-field-select {\n flex: 1;\n padding: 10px 12px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 14px;\n background: white;\n cursor: pointer;\n}\n\n.sort-field-select:focus {\n outline: none;\n border-color: #1976d2;\n}\n\n.sort-direction-toggle {\n display: flex;\n background: #f0f0f0;\n border-radius: 6px;\n padding: 2px;\n}\n\n.direction-btn {\n width: 36px;\n height: 36px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: #666;\n transition: all 0.15s ease;\n}\n\n.direction-btn:hover {\n color: #333;\n}\n\n.direction-btn.active {\n background: white;\n color: #1976d2;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* Column Lists */\n.column-list {\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n overflow: hidden;\n background: #fafafa;\n}\n\n.column-list.visible-columns {\n max-height: 300px;\n overflow-y: auto;\n}\n\n.column-list.hidden-columns {\n flex: 1;\n min-height: 100px;\n overflow-y: auto;\n}\n\n/* Hidden columns section should expand to fill available space */\n.config-section:last-child {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n margin-bottom: 0;\n}\n\n.column-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: white;\n border-bottom: 1px solid #f0f0f0;\n transition: background 0.1s ease;\n}\n\n.column-item:last-child {\n border-bottom: none;\n}\n\n.column-item:hover {\n background: #f5f7fa;\n}\n\n.column-item.hidden {\n background: #fafafa;\n}\n\n.column-item.hidden:hover {\n background: #f0f0f0;\n}\n\n.drag-handle {\n cursor: grab;\n color: #999;\n padding: 4px;\n}\n\n.drag-handle:active {\n cursor: grabbing;\n}\n\n.column-name {\n flex: 1;\n font-size: 14px;\n color: #333;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.column-actions {\n display: flex;\n gap: 4px;\n}\n\n.action-btn {\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: #999;\n transition: all 0.15s ease;\n}\n\n.action-btn:hover:not(:disabled) {\n background: #e0e0e0;\n color: #333;\n}\n\n.action-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n.action-btn.hide-btn:hover {\n background: #ffebee;\n color: #c62828;\n}\n\n.action-btn.show-btn:hover {\n background: #e8f5e9;\n color: #2e7d32;\n}\n\n.empty-list {\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}\n\n/* Column Search */\n.column-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n margin-bottom: 8px;\n}\n\n.column-search i {\n color: #999;\n font-size: 12px;\n}\n\n.column-search input {\n flex: 1;\n border: none;\n outline: none;\n font-size: 14px;\n}\n\n/* Filter Summary Container */\n.filter-summary-container {\n padding: 4px 0;\n}\n\n.filter-summary {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: #f5f7fa;\n border-radius: 8px;\n border: 1px solid #e8e8e8;\n}\n\n.summary-info {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.filter-badge {\n background: #1976d2;\n color: white;\n font-size: 12px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 10px;\n min-width: 20px;\n text-align: center;\n}\n\n.summary-text {\n font-size: 14px;\n color: #333;\n}\n\n.summary-text.no-filters {\n color: #999;\n}\n\n.summary-actions {\n display: flex;\n gap: 8px;\n}\n\n.summary-btn {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px 12px;\n border: none;\n border-radius: 6px;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.summary-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.summary-btn i {\n font-size: 11px;\n}\n\n.summary-btn.clear-btn {\n background: transparent;\n color: #c62828;\n border: 1px solid #e0e0e0;\n}\n\n.summary-btn.clear-btn:hover:not(:disabled) {\n background: #ffebee;\n border-color: #c62828;\n}\n\n.summary-btn.edit-btn {\n background: #1976d2;\n color: white;\n}\n\n.summary-btn.edit-btn:hover:not(:disabled) {\n background: #1565c0;\n}\n\n/* Filters Placeholder (kept for reference) */\n.filters-placeholder {\n text-align: center;\n padding: 32px 20px;\n background: #f5f7fa;\n border-radius: 8px;\n}\n\n.filters-placeholder i {\n font-size: 32px;\n color: #1976d2;\n margin-bottom: 16px;\n}\n\n.filters-placeholder h4 {\n margin: 0 0 8px 0;\n font-size: 16px;\n color: #333;\n}\n\n.filters-placeholder p {\n margin: 0 0 16px 0;\n font-size: 14px;\n color: #666;\n line-height: 1.5;\n}\n\n.tip {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 12px;\n background: #fff8e1;\n border-radius: 6px;\n font-size: 12px;\n color: #795548;\n text-align: left;\n}\n\n.tip i {\n color: #ffc107;\n font-size: 14px;\n margin-top: 1px;\n}\n\n/* Smart Filter Styles */\n.smart-filter-toggle {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n cursor: pointer;\n}\n\n.smart-filter-toggle input[type=\"checkbox\"] {\n width: 16px;\n height: 16px;\n cursor: pointer;\n}\n\n.smart-filter-toggle .toggle-label {\n font-size: 12px;\n font-weight: 500;\n color: #666;\n text-transform: none;\n letter-spacing: normal;\n}\n\n.smart-filter-textarea {\n min-height: 100px;\n font-family: inherit;\n line-height: 1.5;\n}\n\n.smart-filter-explanation {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 12px;\n background: #e3f2fd;\n border-radius: 6px;\n margin-bottom: 12px;\n font-size: 13px;\n color: #1565c0;\n}\n\n.smart-filter-explanation i {\n color: #1976d2;\n font-size: 14px;\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n.smart-filter-disabled-message {\n padding: 16px;\n background: #f5f7fa;\n border-radius: 6px;\n text-align: center;\n}\n\n.smart-filter-disabled-message p {\n margin: 0;\n font-size: 13px;\n color: #666;\n line-height: 1.5;\n}\n\n/* ========================================\n FILTER MODE SELECTOR\n ======================================== */\n\n.filter-mode-selector {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 16px;\n}\n\n.filter-mode-btn {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 14px 16px;\n border: 2px solid #e5e7eb;\n border-radius: 12px;\n background: white;\n cursor: pointer;\n transition: all 0.2s ease;\n text-align: left;\n}\n\n.filter-mode-btn:hover:not(:disabled) {\n border-color: #d1d5db;\n background: #f9fafb;\n}\n\n.filter-mode-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.filter-mode-btn.active {\n border-color: #3b82f6;\n background: linear-gradient(135deg, #eff6ff 0%, #dbeafe 100%);\n}\n\n.filter-mode-btn .mode-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 10px;\n background: #f3f4f6;\n color: #6b7280;\n font-size: 16px;\n flex-shrink: 0;\n transition: all 0.2s ease;\n}\n\n.filter-mode-btn.active .mode-icon {\n background: #3b82f6;\n color: white;\n}\n\n.filter-mode-btn .mode-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.filter-mode-btn .mode-title {\n font-size: 14px;\n font-weight: 600;\n color: #1f2937;\n}\n\n.filter-mode-btn .mode-subtitle {\n font-size: 12px;\n color: #6b7280;\n}\n\n.filter-mode-btn.active .mode-title {\n color: #1d4ed8;\n}\n\n.filter-mode-btn .mode-check {\n color: #3b82f6;\n font-size: 16px;\n flex-shrink: 0;\n}\n\n/* ========================================\n SMART FILTER SECTION (ENHANCED)\n ======================================== */\n\n.smart-filter-section {\n padding: 0;\n border: none;\n background: transparent;\n}\n\n.smart-filter-input-container {\n display: flex;\n gap: 12px;\n padding: 16px;\n background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%);\n border: 1px solid #bae6fd;\n border-radius: 12px;\n margin-bottom: 16px;\n}\n\n.smart-filter-icon {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #3b82f6 0%, #6366f1 100%);\n border-radius: 10px;\n color: white;\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.smart-filter-input-container .smart-filter-textarea {\n flex: 1;\n border: none;\n background: white;\n border-radius: 8px;\n padding: 12px;\n font-size: 14px;\n line-height: 1.5;\n resize: none;\n min-height: 60px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n\n.smart-filter-input-container .smart-filter-textarea:focus {\n outline: none;\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.3), 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n\n.smart-filter-input-container .smart-filter-textarea::placeholder {\n color: #9ca3af;\n}\n\n/* Smart Filter Examples */\n.smart-filter-examples {\n margin-bottom: 16px;\n}\n\n.examples-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 10px;\n font-size: 13px;\n font-weight: 500;\n color: #6b7280;\n}\n\n.examples-header i {\n color: #f59e0b;\n}\n\n.example-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.example-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n border: 1px solid #e5e7eb;\n border-radius: 20px;\n background: white;\n font-size: 12px;\n font-weight: 500;\n color: #4b5563;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.example-chip:hover:not(:disabled) {\n border-color: #3b82f6;\n background: #eff6ff;\n color: #1d4ed8;\n}\n\n.example-chip:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.example-chip i {\n font-size: 11px;\n color: #9ca3af;\n}\n\n.example-chip:hover:not(:disabled) i {\n color: #3b82f6;\n}\n\n/* Smart Filter Tip */\n.smart-filter-tip {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 12px 14px;\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n font-size: 12px;\n color: #64748b;\n line-height: 1.5;\n}\n\n.smart-filter-tip i {\n color: #94a3b8;\n margin-top: 1px;\n flex-shrink: 0;\n}\n\n/* ========================================\n TRADITIONAL FILTER SECTION\n ======================================== */\n\n.traditional-filter-section {\n padding: 0;\n border: none;\n background: transparent;\n}\n\n.traditional-filter-tip {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 12px 14px;\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n font-size: 12px;\n color: #64748b;\n line-height: 1.5;\n margin-top: 12px;\n}\n\n.traditional-filter-tip i {\n color: #94a3b8;\n margin-top: 1px;\n flex-shrink: 0;\n}\n\n.summary-btn.edit-btn.primary {\n background: #3b82f6;\n color: white;\n border-color: #3b82f6;\n}\n\n.summary-btn.edit-btn.primary:hover:not(:disabled) {\n background: #2563eb;\n border-color: #2563eb;\n}\n\n/* Form Elements */\n.form-group {\n margin-bottom: 16px;\n}\n\n.form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #333;\n}\n\n.form-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.15s ease;\n}\n\n.form-input:focus {\n outline: none;\n border-color: #1976d2;\n}\n\n.form-input:disabled {\n background: #f5f5f5;\n color: #999;\n}\n\n.form-textarea {\n resize: vertical;\n min-height: 80px;\n}\n\n/* Checkbox */\n.checkbox-label {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n cursor: pointer;\n}\n\n.checkbox-label input[type=\"checkbox\"] {\n width: 18px;\n height: 18px;\n margin-top: 2px;\n cursor: pointer;\n}\n\n.checkbox-text {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.checkbox-text strong {\n font-size: 14px;\n color: #333;\n}\n\n.checkbox-text small {\n font-size: 12px;\n color: #666;\n}\n\n/* Danger Zone */\n.danger-zone {\n padding-top: 16px;\n border-top: 1px solid #ffcdd2;\n}\n\n.danger-zone .section-header {\n color: #c62828;\n}\n\n.danger-zone .section-header i {\n color: #c62828;\n}\n\n.delete-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n width: 100%;\n padding: 10px 16px;\n border: 1px solid #c62828;\n background: transparent;\n border-radius: 6px;\n color: #c62828;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.delete-btn:hover {\n background: #c62828;\n color: white;\n}\n\n/* Panel Footer */\n.panel-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-top: 1px solid #e0e0e0;\n background: #fafafa;\n flex-shrink: 0;\n}\n\n.footer-right {\n display: flex;\n gap: 8px;\n}\n\n.footer-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 16px;\n border: 1px solid #e0e0e0;\n background: white;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.footer-btn:hover:not(:disabled) {\n background: #f0f0f0;\n border-color: #ccc;\n}\n\n.footer-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.footer-btn.primary {\n background: #1976d2;\n border-color: #1976d2;\n color: white;\n}\n\n.footer-btn.primary:hover:not(:disabled) {\n background: #1565c0;\n border-color: #1565c0;\n}\n\n.footer-btn i {\n font-size: 12px;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .config-panel {\n width: 100%;\n }\n\n .tab-btn span {\n display: none;\n }\n\n .tab-btn {\n padding: 14px;\n }\n\n .tab-btn i {\n font-size: 16px;\n }\n}\n"] }]
1118
- }], () => [{ type: i0.ChangeDetectorRef }], { entity: [{
1119
- type: Input
1120
- }], viewEntity: [{
1121
- type: Input
1122
- }], isOpen: [{
1123
- type: Input
1124
- }], currentGridState: [{
1125
- type: Input
1126
- }], close: [{
1127
- type: Output
1128
- }], save: [{
1129
- type: Output
1130
- }], delete: [{
1131
- type: Output
1132
- }], openFilterDialogRequest: [{
1133
- type: Output
1134
- }], externalFilterState: [{
1135
- type: Input
1136
- }], isSaving: [{
1137
- type: Input
1138
- }], handleEscape: [{
1139
- type: HostListener,
1140
- args: ['document:keydown.escape']
1141
- }] }); })();
1142
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ViewConfigPanelComponent, { className: "ViewConfigPanelComponent" }); })();
1143
- //# sourceMappingURL=view-config-panel.component.js.map