@memberjunction/ng-dashboards 5.22.0 → 5.24.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 (245) hide show
  1. package/README.md +51 -0
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +364 -362
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.js +2 -2
  6. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +947 -64
  7. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  8. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +7645 -430
  9. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  10. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +285 -6
  11. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  12. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +2454 -277
  13. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  14. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  15. package/dist/AI/components/execution-monitoring.component.js +191 -197
  16. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  17. package/dist/AI/components/models/model-management.component.js +9 -8
  18. package/dist/AI/components/models/model-management.component.js.map +1 -1
  19. package/dist/AI/components/prompts/prompt-management.component.js +305 -299
  20. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  21. package/dist/AI/components/system/system-configuration.component.js +319 -313
  22. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  23. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +20 -2
  24. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  25. package/dist/AI/components/vectors/vector-management-resource.component.js +419 -232
  26. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  27. package/dist/APIKeys/api-applications-panel.component.js +10 -12
  28. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  29. package/dist/APIKeys/api-key-create-dialog.component.js +13 -19
  30. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  31. package/dist/APIKeys/api-key-edit-panel.component.js +12 -14
  32. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  33. package/dist/APIKeys/api-scopes-panel.component.js +61 -68
  34. package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
  35. package/dist/APIKeys/api-usage-panel.component.js +10 -11
  36. package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
  37. package/dist/Actions/components/actions-list-view.component.js +82 -96
  38. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  39. package/dist/Actions/components/actions-overview.component.js +130 -134
  40. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  41. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  42. package/dist/Actions/components/categories-list-view.component.js +40 -46
  43. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  44. package/dist/Actions/components/code-management.component.js +2 -2
  45. package/dist/Actions/components/code-management.component.js.map +1 -1
  46. package/dist/Actions/components/entity-integration.component.js +2 -2
  47. package/dist/Actions/components/entity-integration.component.js.map +1 -1
  48. package/dist/Actions/components/execution-monitoring.component.js +127 -132
  49. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  50. package/dist/Actions/components/executions-list-view.component.js +2 -2
  51. package/dist/Actions/components/executions-list-view.component.js.map +1 -1
  52. package/dist/Actions/components/explorer/action-card.component.js +11 -17
  53. package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
  54. package/dist/Actions/components/explorer/action-explorer.component.js +5 -11
  55. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  56. package/dist/Actions/components/explorer/action-list-item.component.js +8 -10
  57. package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -1
  58. package/dist/Actions/components/explorer/action-toolbar.component.js +112 -133
  59. package/dist/Actions/components/explorer/action-toolbar.component.js.map +1 -1
  60. package/dist/Actions/components/explorer/action-tree-panel.component.js +63 -83
  61. package/dist/Actions/components/explorer/action-tree-panel.component.js.map +1 -1
  62. package/dist/Actions/components/explorer/new-action-panel.component.js +17 -21
  63. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  64. package/dist/Actions/components/explorer/new-category-panel.component.js +17 -21
  65. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  66. package/dist/Actions/components/scheduled-actions.component.js +2 -2
  67. package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
  68. package/dist/Actions/components/security-permissions.component.js +2 -2
  69. package/dist/Actions/components/security-permissions.component.js.map +1 -1
  70. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +13 -5
  71. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  72. package/dist/ComponentStudio/component-studio-dashboard.component.js +168 -145
  73. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  74. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +4 -5
  75. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  76. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +197 -200
  77. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  78. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +5 -7
  79. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  80. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +142 -148
  81. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  82. package/dist/ComponentStudio/components/browser/component-browser.component.js +153 -166
  83. package/dist/ComponentStudio/components/browser/component-browser.component.js.map +1 -1
  84. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +15 -20
  85. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
  86. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +16 -21
  87. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
  88. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +18 -23
  89. package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
  90. package/dist/ComponentStudio/components/editors/spec-editor.component.js +25 -30
  91. package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
  92. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +10 -11
  93. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js.map +1 -1
  94. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts.map +1 -1
  95. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +24 -35
  96. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
  97. package/dist/ComponentStudio/components/text-import-dialog.component.js +15 -17
  98. package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
  99. package/dist/Credentials/components/credentials-categories-resource.component.js +7 -6
  100. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  101. package/dist/Credentials/components/credentials-list-resource.component.js +6 -5
  102. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  103. package/dist/Credentials/components/credentials-types-resource.component.js +7 -6
  104. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  105. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +9 -9
  106. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  107. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  108. package/dist/DataExplorer/data-explorer-dashboard.component.js +17 -17
  109. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  110. package/dist/Home/home-dashboard.component.js +4 -4
  111. package/dist/Home/home-dashboard.component.js.map +1 -1
  112. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  113. package/dist/Integration/components/activity/activity.component.js +1 -0
  114. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  115. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  116. package/dist/Integration/components/connections/connections.component.js +5 -4
  117. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  118. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
  119. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +247 -259
  120. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  121. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
  122. package/dist/Integration/components/overview/overview.component.js +1 -0
  123. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  124. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
  125. package/dist/Integration/components/pipelines/pipelines.component.js +1 -0
  126. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  127. package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
  128. package/dist/Integration/components/schedules/schedules.component.js +1 -0
  129. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  130. package/dist/Integration/components/widgets/integration-card.component.js +7 -9
  131. package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
  132. package/dist/Integration/integration.module.d.ts +6 -10
  133. package/dist/Integration/integration.module.d.ts.map +1 -1
  134. package/dist/Integration/integration.module.js +12 -20
  135. package/dist/Integration/integration.module.js.map +1 -1
  136. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +411 -0
  137. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -0
  138. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +4266 -0
  139. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -0
  140. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +140 -0
  141. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -0
  142. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +780 -0
  143. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -0
  144. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +8 -2
  145. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
  146. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +246 -195
  147. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  148. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +75 -0
  149. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -0
  150. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +601 -0
  151. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -0
  152. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +93 -12
  153. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +1 -1
  154. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +637 -107
  155. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +1 -1
  156. package/dist/KnowledgeHub/index.d.ts +3 -0
  157. package/dist/KnowledgeHub/index.d.ts.map +1 -1
  158. package/dist/KnowledgeHub/index.js +3 -0
  159. package/dist/KnowledgeHub/index.js.map +1 -1
  160. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  161. package/dist/Lists/components/lists-browse-resource.component.js +9 -7
  162. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  163. package/dist/Lists/components/lists-my-lists-resource.component.js +5 -4
  164. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  165. package/dist/Lists/components/lists-operations-resource.component.js +10 -9
  166. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  167. package/dist/MCP/components/mcp-connection-dialog.component.js +141 -132
  168. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  169. package/dist/MCP/components/mcp-log-detail-panel.component.js +4 -4
  170. package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
  171. package/dist/MCP/components/mcp-server-dialog.component.js +141 -128
  172. package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
  173. package/dist/MCP/components/mcp-test-tool-dialog.component.js +210 -218
  174. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
  175. package/dist/MCP/mcp-dashboard.component.js +2 -2
  176. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  177. package/dist/MCP/mcp.module.d.ts +6 -9
  178. package/dist/MCP/mcp.module.d.ts.map +1 -1
  179. package/dist/MCP/mcp.module.js +20 -22
  180. package/dist/MCP/mcp.module.js.map +1 -1
  181. package/dist/Scheduling/components/scheduling-activity.component.js +5 -4
  182. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  183. package/dist/Scheduling/components/scheduling-jobs.component.js +6 -5
  184. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  185. package/dist/Scheduling/components/scheduling-overview.component.js +93 -92
  186. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  187. package/dist/Testing/testing-dashboard.component.js +9 -10
  188. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  189. package/dist/__tests__/analytics-resource.test.d.ts +2 -0
  190. package/dist/__tests__/analytics-resource.test.d.ts.map +1 -0
  191. package/dist/__tests__/analytics-resource.test.js +181 -0
  192. package/dist/__tests__/analytics-resource.test.js.map +1 -0
  193. package/dist/__tests__/scheduling.test.d.ts +2 -0
  194. package/dist/__tests__/scheduling.test.d.ts.map +1 -0
  195. package/dist/__tests__/scheduling.test.js +205 -0
  196. package/dist/__tests__/scheduling.test.js.map +1 -0
  197. package/dist/actions-dashboards.module.d.ts +8 -13
  198. package/dist/actions-dashboards.module.d.ts.map +1 -1
  199. package/dist/actions-dashboards.module.js +6 -27
  200. package/dist/actions-dashboards.module.js.map +1 -1
  201. package/dist/ai-dashboards.module.d.ts +20 -20
  202. package/dist/ai-dashboards.module.d.ts.map +1 -1
  203. package/dist/ai-dashboards.module.js +43 -44
  204. package/dist/ai-dashboards.module.js.map +1 -1
  205. package/dist/communication-dashboards.module.d.ts +4 -8
  206. package/dist/communication-dashboards.module.d.ts.map +1 -1
  207. package/dist/communication-dashboards.module.js +0 -19
  208. package/dist/communication-dashboards.module.js.map +1 -1
  209. package/dist/component-studio-dashboards.module.d.ts +7 -11
  210. package/dist/component-studio-dashboards.module.d.ts.map +1 -1
  211. package/dist/component-studio-dashboards.module.js +22 -34
  212. package/dist/component-studio-dashboards.module.js.map +1 -1
  213. package/dist/core-dashboards.module.d.ts +12 -18
  214. package/dist/core-dashboards.module.d.ts.map +1 -1
  215. package/dist/core-dashboards.module.js +15 -31
  216. package/dist/core-dashboards.module.js.map +1 -1
  217. package/dist/credentials-dashboards.module.d.ts +5 -8
  218. package/dist/credentials-dashboards.module.d.ts.map +1 -1
  219. package/dist/credentials-dashboards.module.js +3 -19
  220. package/dist/credentials-dashboards.module.js.map +1 -1
  221. package/dist/data-explorer-dashboards.module.d.ts +7 -13
  222. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  223. package/dist/data-explorer-dashboards.module.js +0 -27
  224. package/dist/data-explorer-dashboards.module.js.map +1 -1
  225. package/dist/lists-dashboards.module.d.ts +5 -8
  226. package/dist/lists-dashboards.module.d.ts.map +1 -1
  227. package/dist/lists-dashboards.module.js +3 -19
  228. package/dist/lists-dashboards.module.js.map +1 -1
  229. package/dist/public-api.d.ts +2 -0
  230. package/dist/public-api.d.ts.map +1 -1
  231. package/dist/public-api.js +2 -0
  232. package/dist/public-api.js.map +1 -1
  233. package/dist/scheduling-dashboards.module.d.ts +6 -10
  234. package/dist/scheduling-dashboards.module.d.ts.map +1 -1
  235. package/dist/scheduling-dashboards.module.js +3 -23
  236. package/dist/scheduling-dashboards.module.js.map +1 -1
  237. package/dist/shared/entity-field-display.d.ts +44 -0
  238. package/dist/shared/entity-field-display.d.ts.map +1 -0
  239. package/dist/shared/entity-field-display.js +118 -0
  240. package/dist/shared/entity-field-display.js.map +1 -0
  241. package/dist/testing-dashboards.module.d.ts +7 -13
  242. package/dist/testing-dashboards.module.d.ts.map +1 -1
  243. package/dist/testing-dashboards.module.js +0 -27
  244. package/dist/testing-dashboards.module.js.map +1 -1
  245. package/package.json +48 -55
@@ -4,7 +4,7 @@ import { DashboardEngine } from '@memberjunction/core-entities';
4
4
  import { UUIDsEqual } from '@memberjunction/global';
5
5
  import * as i0 from "@angular/core";
6
6
  import * as i1 from "@angular/forms";
7
- import * as i2 from "@progress/kendo-angular-dialog";
7
+ import * as i2 from "@memberjunction/ng-ui-components";
8
8
  const _forTrack0 = ($index, $item) => $item.User.ID;
9
9
  const _forTrack1 = ($index, $item) => $item.ID;
10
10
  function DashboardShareDialogComponent_Conditional_0_Conditional_7_Template(rf, ctx) { if (rf & 1) {
@@ -189,9 +189,9 @@ function DashboardShareDialogComponent_Conditional_0_Conditional_36_Template(rf,
189
189
  } }
190
190
  function DashboardShareDialogComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
191
191
  const _r1 = i0.ɵɵgetCurrentView();
192
- i0.ɵɵelementStart(0, "kendo-window", 1);
193
- i0.ɵɵlistener("close", function DashboardShareDialogComponent_Conditional_0_Template_kendo_window_close_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancel()); });
194
- i0.ɵɵelementStart(1, "kendo-window-titlebar")(2, "div", 2);
192
+ i0.ɵɵelementStart(0, "mj-window", 1);
193
+ i0.ɵɵlistener("Close", function DashboardShareDialogComponent_Conditional_0_Template_mj_window_Close_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancel()); });
194
+ i0.ɵɵelementStart(1, "mj-window-titlebar")(2, "div", 2);
195
195
  i0.ɵɵelement(3, "i", 3);
196
196
  i0.ɵɵelementStart(4, "span");
197
197
  i0.ɵɵtext(5);
@@ -234,7 +234,7 @@ function DashboardShareDialogComponent_Conditional_0_Template(rf, ctx) { if (rf
234
234
  i0.ɵɵelementEnd()()()()();
235
235
  } if (rf & 2) {
236
236
  const ctx_r1 = i0.ɵɵnextContext();
237
- i0.ɵɵproperty("width", 560)("minHeight", 200)("resizable", false)("draggable", true)("keepContent", true);
237
+ i0.ɵɵproperty("Visible", true)("Width", 560)("MinHeight", 200)("Resizable", false)("Draggable", true);
238
238
  i0.ɵɵadvance(5);
239
239
  i0.ɵɵtextInterpolate1("Share \"", ctx_r1.Dashboard == null ? null : ctx_r1.Dashboard.Name, "\"");
240
240
  i0.ɵɵadvance(2);
@@ -531,15 +531,15 @@ export class DashboardShareDialogComponent {
531
531
  return name.substring(0, 2).toUpperCase();
532
532
  }
533
533
  static ɵfac = function DashboardShareDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || DashboardShareDialogComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
534
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DashboardShareDialogComponent, selectors: [["mj-dashboard-share-dialog"]], inputs: { Visible: "Visible", Dashboard: "Dashboard" }, outputs: { Result: "Result" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["kendoWindowContainer", "", 1, "mj-share-dialog-window", 3, "width", "minHeight", "resizable", "draggable", "keepContent"], ["kendoWindowContainer", "", 1, "mj-share-dialog-window", 3, "close", "width", "minHeight", "resizable", "draggable", "keepContent"], [1, "share-dialog-header"], [1, "fa-solid", "fa-share-nodes"], [1, "share-dialog-body"], [1, "share-alert", "share-alert-error"], [1, "share-section"], [1, "share-search-box"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Add people by name or email...", 3, "ngModelChange", "ngModel", "disabled"], [1, "share-user-dropdown"], [1, "share-no-results"], [1, "share-section-label"], [1, "share-person", "share-owner"], [1, "share-avatar", "share-avatar-owner"], [1, "fa-solid", "fa-crown"], [1, "share-person-info"], [1, "share-person-name"], [1, "share-person-role"], [1, "share-person", 3, "share-person-new", "share-person-modified"], [1, "share-empty"], [1, "share-removed-section"], [1, "share-footer"], [1, "share-changes-hint"], [1, "share-footer-actions"], ["type", "button", 1, "share-btn", "share-btn-secondary", 3, "click"], ["type", "button", 1, "share-btn", "share-btn-primary", 3, "click", "disabled"], [1, "fa-solid", "fa-exclamation-triangle"], ["type", "button", 1, "share-user-option", 3, "disabled"], ["type", "button", 1, "share-user-option", 3, "click", "disabled"], [1, "share-avatar"], [1, "share-user-name"], [1, "share-user-email"], [1, "fa-solid", "fa-plus"], [1, "share-person"], [1, "share-badge-new"], [1, "share-person-email"], [1, "share-permissions"], ["title", "Can view", 1, "share-perm"], ["type", "checkbox", "disabled", "", 3, "checked"], [1, "fa-solid", "fa-eye"], ["title", "Can edit", 1, "share-perm"], ["type", "checkbox", 3, "change", "checked"], [1, "fa-solid", "fa-edit"], ["title", "Can delete", 1, "share-perm"], [1, "fa-solid", "fa-trash"], ["title", "Can share", 1, "share-perm"], [1, "fa-solid", "fa-share"], ["type", "button", "title", "Remove", 1, "share-remove-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "fa-solid", "fa-user-lock"], [1, "share-removed-item"], [1, "share-avatar", "share-avatar-removed"], [1, "share-removed-name"], ["type", "button", 1, "share-undo-btn", 3, "click"], [1, "fa-solid", "fa-undo"], [1, "fa-solid", "fa-circle"], [1, "fa-solid", "fa-spinner", "fa-spin"]], template: function DashboardShareDialogComponent_Template(rf, ctx) { if (rf & 1) {
535
- i0.ɵɵconditionalCreate(0, DashboardShareDialogComponent_Conditional_0_Template, 37, 17, "kendo-window", 0);
534
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DashboardShareDialogComponent, selectors: [["mj-dashboard-share-dialog"]], inputs: { Visible: "Visible", Dashboard: "Dashboard" }, outputs: { Result: "Result" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [[1, "mj-share-dialog-window", 3, "Visible", "Width", "MinHeight", "Resizable", "Draggable"], [1, "mj-share-dialog-window", 3, "Close", "Visible", "Width", "MinHeight", "Resizable", "Draggable"], [1, "share-dialog-header"], [1, "fa-solid", "fa-share-nodes"], [1, "share-dialog-body"], [1, "share-alert", "share-alert-error"], [1, "share-section"], [1, "share-search-box"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Add people by name or email...", 3, "ngModelChange", "ngModel", "disabled"], [1, "share-user-dropdown"], [1, "share-no-results"], [1, "share-section-label"], [1, "share-person", "share-owner"], [1, "share-avatar", "share-avatar-owner"], [1, "fa-solid", "fa-crown"], [1, "share-person-info"], [1, "share-person-name"], [1, "share-person-role"], [1, "share-person", 3, "share-person-new", "share-person-modified"], [1, "share-empty"], [1, "share-removed-section"], [1, "share-footer"], [1, "share-changes-hint"], [1, "share-footer-actions"], ["type", "button", 1, "share-btn", "share-btn-secondary", 3, "click"], ["type", "button", 1, "share-btn", "share-btn-primary", 3, "click", "disabled"], [1, "fa-solid", "fa-exclamation-triangle"], ["type", "button", 1, "share-user-option", 3, "disabled"], ["type", "button", 1, "share-user-option", 3, "click", "disabled"], [1, "share-avatar"], [1, "share-user-name"], [1, "share-user-email"], [1, "fa-solid", "fa-plus"], [1, "share-person"], [1, "share-badge-new"], [1, "share-person-email"], [1, "share-permissions"], ["title", "Can view", 1, "share-perm"], ["type", "checkbox", "disabled", "", 3, "checked"], [1, "fa-solid", "fa-eye"], ["title", "Can edit", 1, "share-perm"], ["type", "checkbox", 3, "change", "checked"], [1, "fa-solid", "fa-edit"], ["title", "Can delete", 1, "share-perm"], [1, "fa-solid", "fa-trash"], ["title", "Can share", 1, "share-perm"], [1, "fa-solid", "fa-share"], ["type", "button", "title", "Remove", 1, "share-remove-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "fa-solid", "fa-user-lock"], [1, "share-removed-item"], [1, "share-avatar", "share-avatar-removed"], [1, "share-removed-name"], ["type", "button", 1, "share-undo-btn", 3, "click"], [1, "fa-solid", "fa-undo"], [1, "fa-solid", "fa-circle"], [1, "fa-solid", "fa-spinner", "fa-spin"]], template: function DashboardShareDialogComponent_Template(rf, ctx) { if (rf & 1) {
535
+ i0.ɵɵconditionalCreate(0, DashboardShareDialogComponent_Conditional_0_Template, 37, 17, "mj-window", 0);
536
536
  } if (rf & 2) {
537
537
  i0.ɵɵconditional(ctx.Visible ? 0 : -1);
538
- } }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel, i2.WindowComponent, i2.WindowTitleBarComponent, i2.WindowContainerDirective], styles: ["/* Dashboard Share Dialog - Compact Design */\n\n/* Window Styling - use specific class to override Kendo defaults */\n.mj-share-dialog-window.k-window {\n border-radius: 12px !important;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2) !important;\n overflow: hidden !important;\n}\n\n.mj-share-dialog-window .k-window-titlebar {\n background: var(--mj-brand-primary) !important;\n border: none !important;\n padding: 16px 20px !important;\n}\n\n.mj-share-dialog-window .k-window-titlebar .k-window-title {\n display: none !important;\n}\n\n.mj-share-dialog-window .k-window-titlebar .k-window-actions .k-button {\n background: color-mix(in srgb, var(--mj-bg-surface) 15%, transparent) !important;\n border: none !important;\n color: var(--mj-text-inverse) !important;\n border-radius: 4px !important;\n}\n\n.mj-share-dialog-window .k-window-titlebar .k-window-actions .k-button:hover {\n background: color-mix(in srgb, var(--mj-bg-surface) 25%, transparent) !important;\n}\n\n.mj-share-dialog-window .k-window-content {\n padding: 0 !important;\n background: var(--mj-bg-surface) !important;\n}\n\n/* Header */\n.share-dialog-header {\n display: flex;\n align-items: center;\n gap: 10px;\n color: var(--mj-text-inverse);\n font-size: 16px;\n font-weight: 500;\n}\n\n.share-dialog-header i {\n font-size: 18px;\n opacity: 0.9;\n}\n\n/* Body */\n.share-dialog-body {\n padding: 0;\n}\n\n/* Alert */\n.share-alert {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 20px;\n font-size: 13px;\n}\n\n.share-alert-error {\n background: var(--mj-bg-error);\n color: var(--mj-status-error);\n border-bottom: 1px solid var(--mj-border-error);\n}\n\n/* Sections */\n.share-section {\n padding: 16px 20px;\n}\n\n.share-section:not(:last-child) {\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.share-section-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 12px;\n}\n\n/* Search Box */\n.share-search-box {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n border: 1px solid transparent;\n transition: all 0.15s;\n}\n\n.share-search-box:focus-within {\n background: var(--mj-bg-surface);\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.share-search-box i {\n color: var(--mj-text-disabled);\n font-size: 14px;\n}\n\n.share-search-box input {\n flex: 1;\n border: none;\n background: transparent;\n font-size: 14px;\n outline: none;\n}\n\n.share-search-box input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n/* User Dropdown */\n.share-user-dropdown {\n margin-top: 8px;\n max-height: 180px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n}\n\n/* User Option */\n.share-user-option {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 12px;\n border: none;\n background: transparent;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.share-user-option:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.share-user-option:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.share-user-option .share-user-name {\n flex: 1;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.share-user-option .share-user-email {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-right: auto;\n}\n\n.share-user-option i.fa-plus {\n color: var(--mj-brand-primary);\n font-size: 12px;\n opacity: 0;\n transition: opacity 0.1s;\n}\n\n.share-user-option:hover i.fa-plus {\n opacity: 1;\n}\n\n.share-no-results {\n padding: 16px;\n text-align: center;\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n/* Avatar */\n.share-avatar {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 12px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.share-avatar-owner {\n background: var(--mj-status-warning);\n font-size: 14px;\n}\n\n.share-avatar-removed {\n background: var(--mj-border-strong);\n}\n\n/* Person Row */\n.share-person {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 0;\n}\n\n.share-person:not(:last-child) {\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.share-person-new {\n background: color-mix(in srgb, var(--mj-status-success) 5%, transparent);\n margin: 0 -20px;\n padding: 10px 20px;\n}\n\n.share-person-modified {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, transparent);\n margin: 0 -20px;\n padding: 10px 20px;\n}\n\n.share-person-info {\n flex: 1;\n min-width: 0;\n}\n\n.share-person-name {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.share-person-email {\n font-size: 12px;\n color: var(--mj-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.share-person-role {\n font-size: 12px;\n color: var(--mj-status-warning);\n font-weight: 500;\n}\n\n.share-badge-new {\n padding: 2px 6px;\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n border-radius: 4px;\n}\n\n/* Permissions */\n.share-permissions {\n display: flex;\n gap: 4px;\n}\n\n.share-perm {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.1s;\n position: relative;\n}\n\n.share-perm input {\n position: absolute;\n opacity: 0;\n cursor: pointer;\n}\n\n.share-perm i {\n font-size: 12px;\n color: var(--mj-border-strong);\n transition: color 0.1s;\n}\n\n.share-perm:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.share-perm input:checked + i {\n color: var(--mj-brand-primary);\n}\n\n.share-perm input:disabled + i {\n color: var(--mj-brand-primary);\n opacity: 0.7;\n}\n\n/* Remove Button */\n.share-remove-btn {\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n color: var(--mj-border-strong);\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.1s;\n}\n\n.share-remove-btn:hover {\n background: var(--mj-bg-error);\n color: var(--mj-status-error);\n}\n\n/* Empty State */\n.share-empty {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 20px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n justify-content: center;\n}\n\n.share-empty i {\n font-size: 16px;\n}\n\n/* Removed Section */\n.share-removed-section {\n margin-top: 12px;\n padding: 12px;\n background: var(--mj-bg-warning);\n border-radius: 8px;\n border: 1px solid var(--mj-border-warning);\n}\n\n.share-removed-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 0;\n}\n\n.share-removed-name {\n flex: 1;\n font-size: 13px;\n color: var(--mj-text-secondary);\n text-decoration: line-through;\n}\n\n.share-undo-btn {\n padding: 4px 10px;\n border: none;\n background: transparent;\n color: var(--mj-status-warning);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.share-undo-btn:hover {\n text-decoration: underline;\n}\n\n/* Footer */\n.share-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-default);\n}\n\n.share-changes-hint {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-brand-primary);\n}\n\n.share-changes-hint i {\n font-size: 6px;\n}\n\n.share-footer-actions {\n display: flex;\n gap: 10px;\n margin-left: auto;\n}\n\n.share-btn {\n padding: 8px 18px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.share-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.share-btn-secondary {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n color: var(--mj-text-secondary);\n}\n\n.share-btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-strong);\n}\n\n.share-btn-primary {\n background: var(--mj-brand-primary);\n border: none;\n color: var(--mj-text-inverse);\n}\n\n.share-btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n/* Owner row specific styling */\n.share-owner {\n background: var(--mj-bg-warning);\n margin: 0 -20px;\n padding: 10px 20px;\n border-radius: 0;\n}\n"], encapsulation: 2 });
538
+ } }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel, i2.MJWindowComponent, i2.MJWindowTitlebarComponent], styles: ["/* Dashboard Share Dialog - Compact Design */\n\n/* Window Styling - use specific class to override Kendo defaults */\n.mj-share-dialog-window.k-window {\n border-radius: 12px !important;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2) !important;\n overflow: hidden !important;\n}\n\n.mj-share-dialog-window .k-window-titlebar {\n background: var(--mj-brand-primary) !important;\n border: none !important;\n padding: 16px 20px !important;\n}\n\n.mj-share-dialog-window .k-window-titlebar .k-window-title {\n display: none !important;\n}\n\n.mj-share-dialog-window .k-window-titlebar .k-window-actions .k-button {\n background: color-mix(in srgb, var(--mj-bg-surface) 15%, transparent) !important;\n border: none !important;\n color: var(--mj-text-inverse) !important;\n border-radius: 4px !important;\n}\n\n.mj-share-dialog-window .k-window-titlebar .k-window-actions .k-button:hover {\n background: color-mix(in srgb, var(--mj-bg-surface) 25%, transparent) !important;\n}\n\n.mj-share-dialog-window .k-window-content {\n padding: 0 !important;\n background: var(--mj-bg-surface) !important;\n}\n\n/* Header */\n.share-dialog-header {\n display: flex;\n align-items: center;\n gap: 10px;\n color: var(--mj-text-inverse);\n font-size: 16px;\n font-weight: 500;\n}\n\n.share-dialog-header i {\n font-size: 18px;\n opacity: 0.9;\n}\n\n/* Body */\n.share-dialog-body {\n padding: 0;\n}\n\n/* Alert */\n.share-alert {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 20px;\n font-size: 13px;\n}\n\n.share-alert-error {\n background: var(--mj-bg-error);\n color: var(--mj-status-error);\n border-bottom: 1px solid var(--mj-border-error);\n}\n\n/* Sections */\n.share-section {\n padding: 16px 20px;\n}\n\n.share-section:not(:last-child) {\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.share-section-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 12px;\n}\n\n/* Search Box */\n.share-search-box {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n border: 1px solid transparent;\n transition: all 0.15s;\n}\n\n.share-search-box:focus-within {\n background: var(--mj-bg-surface);\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.share-search-box i {\n color: var(--mj-text-disabled);\n font-size: 14px;\n}\n\n.share-search-box input {\n flex: 1;\n border: none;\n background: transparent;\n font-size: 14px;\n outline: none;\n}\n\n.share-search-box input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n/* User Dropdown */\n.share-user-dropdown {\n margin-top: 8px;\n max-height: 180px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n}\n\n/* User Option */\n.share-user-option {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 12px;\n border: none;\n background: transparent;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.share-user-option:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.share-user-option:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.share-user-option .share-user-name {\n flex: 1;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.share-user-option .share-user-email {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-right: auto;\n}\n\n.share-user-option i.fa-plus {\n color: var(--mj-brand-primary);\n font-size: 12px;\n opacity: 0;\n transition: opacity 0.1s;\n}\n\n.share-user-option:hover i.fa-plus {\n opacity: 1;\n}\n\n.share-no-results {\n padding: 16px;\n text-align: center;\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n/* Avatar */\n.share-avatar {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 12px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.share-avatar-owner {\n background: var(--mj-status-warning);\n font-size: 14px;\n}\n\n.share-avatar-removed {\n background: var(--mj-border-strong);\n}\n\n/* Person Row */\n.share-person {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 0;\n}\n\n.share-person:not(:last-child) {\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.share-person-new {\n background: color-mix(in srgb, var(--mj-status-success) 5%, transparent);\n margin: 0 -20px;\n padding: 10px 20px;\n}\n\n.share-person-modified {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, transparent);\n margin: 0 -20px;\n padding: 10px 20px;\n}\n\n.share-person-info {\n flex: 1;\n min-width: 0;\n}\n\n.share-person-name {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.share-person-email {\n font-size: 12px;\n color: var(--mj-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.share-person-role {\n font-size: 12px;\n color: var(--mj-status-warning);\n font-weight: 500;\n}\n\n.share-badge-new {\n padding: 2px 6px;\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n border-radius: 4px;\n}\n\n/* Permissions */\n.share-permissions {\n display: flex;\n gap: 4px;\n}\n\n.share-perm {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.1s;\n position: relative;\n}\n\n.share-perm input {\n position: absolute;\n opacity: 0;\n cursor: pointer;\n}\n\n.share-perm i {\n font-size: 12px;\n color: var(--mj-border-strong);\n transition: color 0.1s;\n}\n\n.share-perm:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.share-perm input:checked + i {\n color: var(--mj-brand-primary);\n}\n\n.share-perm input:disabled + i {\n color: var(--mj-brand-primary);\n opacity: 0.7;\n}\n\n/* Remove Button */\n.share-remove-btn {\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n color: var(--mj-border-strong);\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.1s;\n}\n\n.share-remove-btn:hover {\n background: var(--mj-bg-error);\n color: var(--mj-status-error);\n}\n\n/* Empty State */\n.share-empty {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 20px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n justify-content: center;\n}\n\n.share-empty i {\n font-size: 16px;\n}\n\n/* Removed Section */\n.share-removed-section {\n margin-top: 12px;\n padding: 12px;\n background: var(--mj-bg-warning);\n border-radius: 8px;\n border: 1px solid var(--mj-border-warning);\n}\n\n.share-removed-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 0;\n}\n\n.share-removed-name {\n flex: 1;\n font-size: 13px;\n color: var(--mj-text-secondary);\n text-decoration: line-through;\n}\n\n.share-undo-btn {\n padding: 4px 10px;\n border: none;\n background: transparent;\n color: var(--mj-status-warning);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.share-undo-btn:hover {\n text-decoration: underline;\n}\n\n/* Footer */\n.share-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-default);\n}\n\n.share-changes-hint {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-brand-primary);\n}\n\n.share-changes-hint i {\n font-size: 6px;\n}\n\n.share-footer-actions {\n display: flex;\n gap: 10px;\n margin-left: auto;\n}\n\n.share-btn {\n padding: 8px 18px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.share-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.share-btn-secondary {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n color: var(--mj-text-secondary);\n}\n\n.share-btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-strong);\n}\n\n.share-btn-primary {\n background: var(--mj-brand-primary);\n border: none;\n color: var(--mj-text-inverse);\n}\n\n.share-btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n/* Owner row specific styling */\n.share-owner {\n background: var(--mj-bg-warning);\n margin: 0 -20px;\n padding: 10px 20px;\n border-radius: 0;\n}\n"], encapsulation: 2 });
539
539
  }
540
540
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DashboardShareDialogComponent, [{
541
541
  type: Component,
542
- args: [{ standalone: false, selector: 'mj-dashboard-share-dialog', encapsulation: ViewEncapsulation.None, template: "@if (Visible) {\n <kendo-window\n [width]=\"560\"\n [minHeight]=\"200\"\n [resizable]=\"false\"\n [draggable]=\"true\"\n [keepContent]=\"true\"\n (close)=\"onCancel()\"\n class=\"mj-share-dialog-window\"\n kendoWindowContainer>\n <kendo-window-titlebar>\n <div class=\"share-dialog-header\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n <span>Share \"{{ Dashboard?.Name }}\"</span>\n </div>\n </kendo-window-titlebar>\n <div class=\"share-dialog-body\">\n <!-- Error Alert -->\n @if (Error) {\n <div class=\"share-alert share-alert-error\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>{{ Error }}</span>\n </div>\n }\n <!-- Add Users Section -->\n <div class=\"share-section\">\n <div class=\"share-search-box\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n placeholder=\"Add people by name or email...\"\n [(ngModel)]=\"UserSearchFilter\"\n [disabled]=\"IsLoading\">\n </div>\n <!-- Available Users Dropdown -->\n @if (FilteredAvailableUsers.length > 0) {\n <div class=\"share-user-dropdown\">\n @for (user of FilteredAvailableUsers; track user.ID) {\n <button type=\"button\" class=\"share-user-option\" (click)=\"addUserShare(user)\" [disabled]=\"IsLoading\">\n <span class=\"share-avatar\">{{ getUserInitials(user) }}</span>\n <span class=\"share-user-name\">{{ user.Name }}</span>\n @if (user.Email) {\n <span class=\"share-user-email\">{{ user.Email }}</span>\n }\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n </div>\n }\n @if (UserSearchFilter && FilteredAvailableUsers.length === 0) {\n <div class=\"share-no-results\">\n No users found matching \"{{ UserSearchFilter }}\"\n </div>\n }\n </div>\n <!-- People with Access -->\n <div class=\"share-section\">\n <div class=\"share-section-label\">People with access</div>\n <!-- Owner -->\n <div class=\"share-person share-owner\">\n <span class=\"share-avatar share-avatar-owner\">\n <i class=\"fa-solid fa-crown\"></i>\n </span>\n <div class=\"share-person-info\">\n <span class=\"share-person-name\">{{ Dashboard?.User || 'You' }}</span>\n <span class=\"share-person-role\">Owner</span>\n </div>\n </div>\n <!-- Shared Users -->\n @for (share of ActiveShares; track share.User.ID) {\n <div class=\"share-person\" [class.share-person-new]=\"share.IsNew\" [class.share-person-modified]=\"share.Permission.Dirty\">\n <span class=\"share-avatar\">{{ getUserInitials(share.User) }}</span>\n <div class=\"share-person-info\">\n <span class=\"share-person-name\">\n {{ share.User.Name }}\n @if (share.IsNew) {\n <span class=\"share-badge-new\">New</span>\n }\n </span>\n @if (share.User.Email) {\n <span class=\"share-person-email\">{{ share.User.Email }}</span>\n }\n </div>\n <div class=\"share-permissions\">\n <label class=\"share-perm\" title=\"Can view\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanRead\" disabled>\n <i class=\"fa-solid fa-eye\"></i>\n </label>\n <label class=\"share-perm\" title=\"Can edit\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanEdit\" (change)=\"toggleCanEdit(share)\">\n <i class=\"fa-solid fa-edit\"></i>\n </label>\n <label class=\"share-perm\" title=\"Can delete\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanDelete\" (change)=\"toggleCanDelete(share)\">\n <i class=\"fa-solid fa-trash\"></i>\n </label>\n <label class=\"share-perm\" title=\"Can share\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanShare\" (change)=\"toggleCanShare(share)\">\n <i class=\"fa-solid fa-share\"></i>\n </label>\n </div>\n <button type=\"button\" class=\"share-remove-btn\" (click)=\"removeUserShare(share)\" title=\"Remove\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n @if (ActiveShares.length === 0) {\n <div class=\"share-empty\">\n <i class=\"fa-solid fa-user-lock\"></i>\n <span>Not shared with anyone yet</span>\n </div>\n }\n <!-- Pending Removals -->\n @if (RemovedShares.length > 0) {\n <div class=\"share-removed-section\">\n @for (share of RemovedShares; track share.User.ID) {\n <div class=\"share-removed-item\">\n <span class=\"share-avatar share-avatar-removed\">{{ getUserInitials(share.User) }}</span>\n <span class=\"share-removed-name\">{{ share.User.Name }}</span>\n <button type=\"button\" class=\"share-undo-btn\" (click)=\"undoRemove(share)\">\n <i class=\"fa-solid fa-undo\"></i> Undo\n </button>\n </div>\n }\n </div>\n }\n </div>\n <!-- Footer -->\n <div class=\"share-footer\">\n @if (HasChanges) {\n <span class=\"share-changes-hint\">\n <i class=\"fa-solid fa-circle\"></i> Unsaved changes\n </span>\n }\n <div class=\"share-footer-actions\">\n <button type=\"button\" class=\"share-btn share-btn-secondary\" (click)=\"onCancel()\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"share-btn share-btn-primary\"\n (click)=\"onSave()\"\n [disabled]=\"!HasChanges || IsLoading\">\n @if (IsLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n Save\n }\n </button>\n </div>\n </div>\n </div>\n </kendo-window>\n}\n", styles: ["/* Dashboard Share Dialog - Compact Design */\n\n/* Window Styling - use specific class to override Kendo defaults */\n.mj-share-dialog-window.k-window {\n border-radius: 12px !important;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2) !important;\n overflow: hidden !important;\n}\n\n.mj-share-dialog-window .k-window-titlebar {\n background: var(--mj-brand-primary) !important;\n border: none !important;\n padding: 16px 20px !important;\n}\n\n.mj-share-dialog-window .k-window-titlebar .k-window-title {\n display: none !important;\n}\n\n.mj-share-dialog-window .k-window-titlebar .k-window-actions .k-button {\n background: color-mix(in srgb, var(--mj-bg-surface) 15%, transparent) !important;\n border: none !important;\n color: var(--mj-text-inverse) !important;\n border-radius: 4px !important;\n}\n\n.mj-share-dialog-window .k-window-titlebar .k-window-actions .k-button:hover {\n background: color-mix(in srgb, var(--mj-bg-surface) 25%, transparent) !important;\n}\n\n.mj-share-dialog-window .k-window-content {\n padding: 0 !important;\n background: var(--mj-bg-surface) !important;\n}\n\n/* Header */\n.share-dialog-header {\n display: flex;\n align-items: center;\n gap: 10px;\n color: var(--mj-text-inverse);\n font-size: 16px;\n font-weight: 500;\n}\n\n.share-dialog-header i {\n font-size: 18px;\n opacity: 0.9;\n}\n\n/* Body */\n.share-dialog-body {\n padding: 0;\n}\n\n/* Alert */\n.share-alert {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 20px;\n font-size: 13px;\n}\n\n.share-alert-error {\n background: var(--mj-bg-error);\n color: var(--mj-status-error);\n border-bottom: 1px solid var(--mj-border-error);\n}\n\n/* Sections */\n.share-section {\n padding: 16px 20px;\n}\n\n.share-section:not(:last-child) {\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.share-section-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 12px;\n}\n\n/* Search Box */\n.share-search-box {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n border: 1px solid transparent;\n transition: all 0.15s;\n}\n\n.share-search-box:focus-within {\n background: var(--mj-bg-surface);\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.share-search-box i {\n color: var(--mj-text-disabled);\n font-size: 14px;\n}\n\n.share-search-box input {\n flex: 1;\n border: none;\n background: transparent;\n font-size: 14px;\n outline: none;\n}\n\n.share-search-box input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n/* User Dropdown */\n.share-user-dropdown {\n margin-top: 8px;\n max-height: 180px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n}\n\n/* User Option */\n.share-user-option {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 12px;\n border: none;\n background: transparent;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.share-user-option:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.share-user-option:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.share-user-option .share-user-name {\n flex: 1;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.share-user-option .share-user-email {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-right: auto;\n}\n\n.share-user-option i.fa-plus {\n color: var(--mj-brand-primary);\n font-size: 12px;\n opacity: 0;\n transition: opacity 0.1s;\n}\n\n.share-user-option:hover i.fa-plus {\n opacity: 1;\n}\n\n.share-no-results {\n padding: 16px;\n text-align: center;\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n/* Avatar */\n.share-avatar {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 12px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.share-avatar-owner {\n background: var(--mj-status-warning);\n font-size: 14px;\n}\n\n.share-avatar-removed {\n background: var(--mj-border-strong);\n}\n\n/* Person Row */\n.share-person {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 0;\n}\n\n.share-person:not(:last-child) {\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.share-person-new {\n background: color-mix(in srgb, var(--mj-status-success) 5%, transparent);\n margin: 0 -20px;\n padding: 10px 20px;\n}\n\n.share-person-modified {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, transparent);\n margin: 0 -20px;\n padding: 10px 20px;\n}\n\n.share-person-info {\n flex: 1;\n min-width: 0;\n}\n\n.share-person-name {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.share-person-email {\n font-size: 12px;\n color: var(--mj-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.share-person-role {\n font-size: 12px;\n color: var(--mj-status-warning);\n font-weight: 500;\n}\n\n.share-badge-new {\n padding: 2px 6px;\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n border-radius: 4px;\n}\n\n/* Permissions */\n.share-permissions {\n display: flex;\n gap: 4px;\n}\n\n.share-perm {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.1s;\n position: relative;\n}\n\n.share-perm input {\n position: absolute;\n opacity: 0;\n cursor: pointer;\n}\n\n.share-perm i {\n font-size: 12px;\n color: var(--mj-border-strong);\n transition: color 0.1s;\n}\n\n.share-perm:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.share-perm input:checked + i {\n color: var(--mj-brand-primary);\n}\n\n.share-perm input:disabled + i {\n color: var(--mj-brand-primary);\n opacity: 0.7;\n}\n\n/* Remove Button */\n.share-remove-btn {\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n color: var(--mj-border-strong);\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.1s;\n}\n\n.share-remove-btn:hover {\n background: var(--mj-bg-error);\n color: var(--mj-status-error);\n}\n\n/* Empty State */\n.share-empty {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 20px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n justify-content: center;\n}\n\n.share-empty i {\n font-size: 16px;\n}\n\n/* Removed Section */\n.share-removed-section {\n margin-top: 12px;\n padding: 12px;\n background: var(--mj-bg-warning);\n border-radius: 8px;\n border: 1px solid var(--mj-border-warning);\n}\n\n.share-removed-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 0;\n}\n\n.share-removed-name {\n flex: 1;\n font-size: 13px;\n color: var(--mj-text-secondary);\n text-decoration: line-through;\n}\n\n.share-undo-btn {\n padding: 4px 10px;\n border: none;\n background: transparent;\n color: var(--mj-status-warning);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.share-undo-btn:hover {\n text-decoration: underline;\n}\n\n/* Footer */\n.share-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-default);\n}\n\n.share-changes-hint {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-brand-primary);\n}\n\n.share-changes-hint i {\n font-size: 6px;\n}\n\n.share-footer-actions {\n display: flex;\n gap: 10px;\n margin-left: auto;\n}\n\n.share-btn {\n padding: 8px 18px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.share-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.share-btn-secondary {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n color: var(--mj-text-secondary);\n}\n\n.share-btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-strong);\n}\n\n.share-btn-primary {\n background: var(--mj-brand-primary);\n border: none;\n color: var(--mj-text-inverse);\n}\n\n.share-btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n/* Owner row specific styling */\n.share-owner {\n background: var(--mj-bg-warning);\n margin: 0 -20px;\n padding: 10px 20px;\n border-radius: 0;\n}\n"] }]
542
+ args: [{ standalone: false, selector: 'mj-dashboard-share-dialog', encapsulation: ViewEncapsulation.None, template: "@if (Visible) {\n <mj-window\n [Visible]=\"true\"\n [Width]=\"560\"\n [MinHeight]=\"200\"\n [Resizable]=\"false\"\n [Draggable]=\"true\"\n (Close)=\"onCancel()\"\n class=\"mj-share-dialog-window\">\n <mj-window-titlebar>\n <div class=\"share-dialog-header\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n <span>Share \"{{ Dashboard?.Name }}\"</span>\n </div>\n </mj-window-titlebar>\n <div class=\"share-dialog-body\">\n <!-- Error Alert -->\n @if (Error) {\n <div class=\"share-alert share-alert-error\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>{{ Error }}</span>\n </div>\n }\n <!-- Add Users Section -->\n <div class=\"share-section\">\n <div class=\"share-search-box\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n placeholder=\"Add people by name or email...\"\n [(ngModel)]=\"UserSearchFilter\"\n [disabled]=\"IsLoading\">\n </div>\n <!-- Available Users Dropdown -->\n @if (FilteredAvailableUsers.length > 0) {\n <div class=\"share-user-dropdown\">\n @for (user of FilteredAvailableUsers; track user.ID) {\n <button type=\"button\" class=\"share-user-option\" (click)=\"addUserShare(user)\" [disabled]=\"IsLoading\">\n <span class=\"share-avatar\">{{ getUserInitials(user) }}</span>\n <span class=\"share-user-name\">{{ user.Name }}</span>\n @if (user.Email) {\n <span class=\"share-user-email\">{{ user.Email }}</span>\n }\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n </div>\n }\n @if (UserSearchFilter && FilteredAvailableUsers.length === 0) {\n <div class=\"share-no-results\">\n No users found matching \"{{ UserSearchFilter }}\"\n </div>\n }\n </div>\n <!-- People with Access -->\n <div class=\"share-section\">\n <div class=\"share-section-label\">People with access</div>\n <!-- Owner -->\n <div class=\"share-person share-owner\">\n <span class=\"share-avatar share-avatar-owner\">\n <i class=\"fa-solid fa-crown\"></i>\n </span>\n <div class=\"share-person-info\">\n <span class=\"share-person-name\">{{ Dashboard?.User || 'You' }}</span>\n <span class=\"share-person-role\">Owner</span>\n </div>\n </div>\n <!-- Shared Users -->\n @for (share of ActiveShares; track share.User.ID) {\n <div class=\"share-person\" [class.share-person-new]=\"share.IsNew\" [class.share-person-modified]=\"share.Permission.Dirty\">\n <span class=\"share-avatar\">{{ getUserInitials(share.User) }}</span>\n <div class=\"share-person-info\">\n <span class=\"share-person-name\">\n {{ share.User.Name }}\n @if (share.IsNew) {\n <span class=\"share-badge-new\">New</span>\n }\n </span>\n @if (share.User.Email) {\n <span class=\"share-person-email\">{{ share.User.Email }}</span>\n }\n </div>\n <div class=\"share-permissions\">\n <label class=\"share-perm\" title=\"Can view\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanRead\" disabled>\n <i class=\"fa-solid fa-eye\"></i>\n </label>\n <label class=\"share-perm\" title=\"Can edit\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanEdit\" (change)=\"toggleCanEdit(share)\">\n <i class=\"fa-solid fa-edit\"></i>\n </label>\n <label class=\"share-perm\" title=\"Can delete\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanDelete\" (change)=\"toggleCanDelete(share)\">\n <i class=\"fa-solid fa-trash\"></i>\n </label>\n <label class=\"share-perm\" title=\"Can share\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanShare\" (change)=\"toggleCanShare(share)\">\n <i class=\"fa-solid fa-share\"></i>\n </label>\n </div>\n <button type=\"button\" class=\"share-remove-btn\" (click)=\"removeUserShare(share)\" title=\"Remove\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n @if (ActiveShares.length === 0) {\n <div class=\"share-empty\">\n <i class=\"fa-solid fa-user-lock\"></i>\n <span>Not shared with anyone yet</span>\n </div>\n }\n <!-- Pending Removals -->\n @if (RemovedShares.length > 0) {\n <div class=\"share-removed-section\">\n @for (share of RemovedShares; track share.User.ID) {\n <div class=\"share-removed-item\">\n <span class=\"share-avatar share-avatar-removed\">{{ getUserInitials(share.User) }}</span>\n <span class=\"share-removed-name\">{{ share.User.Name }}</span>\n <button type=\"button\" class=\"share-undo-btn\" (click)=\"undoRemove(share)\">\n <i class=\"fa-solid fa-undo\"></i> Undo\n </button>\n </div>\n }\n </div>\n }\n </div>\n <!-- Footer -->\n <div class=\"share-footer\">\n @if (HasChanges) {\n <span class=\"share-changes-hint\">\n <i class=\"fa-solid fa-circle\"></i> Unsaved changes\n </span>\n }\n <div class=\"share-footer-actions\">\n <button type=\"button\" class=\"share-btn share-btn-secondary\" (click)=\"onCancel()\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"share-btn share-btn-primary\"\n (click)=\"onSave()\"\n [disabled]=\"!HasChanges || IsLoading\">\n @if (IsLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n Save\n }\n </button>\n </div>\n </div>\n </div>\n </mj-window>\n}\n", styles: ["/* Dashboard Share Dialog - Compact Design */\n\n/* Window Styling - use specific class to override Kendo defaults */\n.mj-share-dialog-window.k-window {\n border-radius: 12px !important;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2) !important;\n overflow: hidden !important;\n}\n\n.mj-share-dialog-window .k-window-titlebar {\n background: var(--mj-brand-primary) !important;\n border: none !important;\n padding: 16px 20px !important;\n}\n\n.mj-share-dialog-window .k-window-titlebar .k-window-title {\n display: none !important;\n}\n\n.mj-share-dialog-window .k-window-titlebar .k-window-actions .k-button {\n background: color-mix(in srgb, var(--mj-bg-surface) 15%, transparent) !important;\n border: none !important;\n color: var(--mj-text-inverse) !important;\n border-radius: 4px !important;\n}\n\n.mj-share-dialog-window .k-window-titlebar .k-window-actions .k-button:hover {\n background: color-mix(in srgb, var(--mj-bg-surface) 25%, transparent) !important;\n}\n\n.mj-share-dialog-window .k-window-content {\n padding: 0 !important;\n background: var(--mj-bg-surface) !important;\n}\n\n/* Header */\n.share-dialog-header {\n display: flex;\n align-items: center;\n gap: 10px;\n color: var(--mj-text-inverse);\n font-size: 16px;\n font-weight: 500;\n}\n\n.share-dialog-header i {\n font-size: 18px;\n opacity: 0.9;\n}\n\n/* Body */\n.share-dialog-body {\n padding: 0;\n}\n\n/* Alert */\n.share-alert {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 20px;\n font-size: 13px;\n}\n\n.share-alert-error {\n background: var(--mj-bg-error);\n color: var(--mj-status-error);\n border-bottom: 1px solid var(--mj-border-error);\n}\n\n/* Sections */\n.share-section {\n padding: 16px 20px;\n}\n\n.share-section:not(:last-child) {\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.share-section-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 12px;\n}\n\n/* Search Box */\n.share-search-box {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n border: 1px solid transparent;\n transition: all 0.15s;\n}\n\n.share-search-box:focus-within {\n background: var(--mj-bg-surface);\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.share-search-box i {\n color: var(--mj-text-disabled);\n font-size: 14px;\n}\n\n.share-search-box input {\n flex: 1;\n border: none;\n background: transparent;\n font-size: 14px;\n outline: none;\n}\n\n.share-search-box input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n/* User Dropdown */\n.share-user-dropdown {\n margin-top: 8px;\n max-height: 180px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n}\n\n/* User Option */\n.share-user-option {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 12px;\n border: none;\n background: transparent;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.share-user-option:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.share-user-option:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.share-user-option .share-user-name {\n flex: 1;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.share-user-option .share-user-email {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-right: auto;\n}\n\n.share-user-option i.fa-plus {\n color: var(--mj-brand-primary);\n font-size: 12px;\n opacity: 0;\n transition: opacity 0.1s;\n}\n\n.share-user-option:hover i.fa-plus {\n opacity: 1;\n}\n\n.share-no-results {\n padding: 16px;\n text-align: center;\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n/* Avatar */\n.share-avatar {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 12px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.share-avatar-owner {\n background: var(--mj-status-warning);\n font-size: 14px;\n}\n\n.share-avatar-removed {\n background: var(--mj-border-strong);\n}\n\n/* Person Row */\n.share-person {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 0;\n}\n\n.share-person:not(:last-child) {\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.share-person-new {\n background: color-mix(in srgb, var(--mj-status-success) 5%, transparent);\n margin: 0 -20px;\n padding: 10px 20px;\n}\n\n.share-person-modified {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, transparent);\n margin: 0 -20px;\n padding: 10px 20px;\n}\n\n.share-person-info {\n flex: 1;\n min-width: 0;\n}\n\n.share-person-name {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.share-person-email {\n font-size: 12px;\n color: var(--mj-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.share-person-role {\n font-size: 12px;\n color: var(--mj-status-warning);\n font-weight: 500;\n}\n\n.share-badge-new {\n padding: 2px 6px;\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n border-radius: 4px;\n}\n\n/* Permissions */\n.share-permissions {\n display: flex;\n gap: 4px;\n}\n\n.share-perm {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.1s;\n position: relative;\n}\n\n.share-perm input {\n position: absolute;\n opacity: 0;\n cursor: pointer;\n}\n\n.share-perm i {\n font-size: 12px;\n color: var(--mj-border-strong);\n transition: color 0.1s;\n}\n\n.share-perm:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.share-perm input:checked + i {\n color: var(--mj-brand-primary);\n}\n\n.share-perm input:disabled + i {\n color: var(--mj-brand-primary);\n opacity: 0.7;\n}\n\n/* Remove Button */\n.share-remove-btn {\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n color: var(--mj-border-strong);\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.1s;\n}\n\n.share-remove-btn:hover {\n background: var(--mj-bg-error);\n color: var(--mj-status-error);\n}\n\n/* Empty State */\n.share-empty {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 20px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n justify-content: center;\n}\n\n.share-empty i {\n font-size: 16px;\n}\n\n/* Removed Section */\n.share-removed-section {\n margin-top: 12px;\n padding: 12px;\n background: var(--mj-bg-warning);\n border-radius: 8px;\n border: 1px solid var(--mj-border-warning);\n}\n\n.share-removed-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 0;\n}\n\n.share-removed-name {\n flex: 1;\n font-size: 13px;\n color: var(--mj-text-secondary);\n text-decoration: line-through;\n}\n\n.share-undo-btn {\n padding: 4px 10px;\n border: none;\n background: transparent;\n color: var(--mj-status-warning);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.share-undo-btn:hover {\n text-decoration: underline;\n}\n\n/* Footer */\n.share-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-default);\n}\n\n.share-changes-hint {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-brand-primary);\n}\n\n.share-changes-hint i {\n font-size: 6px;\n}\n\n.share-footer-actions {\n display: flex;\n gap: 10px;\n margin-left: auto;\n}\n\n.share-btn {\n padding: 8px 18px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.share-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.share-btn-secondary {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n color: var(--mj-text-secondary);\n}\n\n.share-btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-strong);\n}\n\n.share-btn-primary {\n background: var(--mj-brand-primary);\n border: none;\n color: var(--mj-text-inverse);\n}\n\n.share-btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n/* Owner row specific styling */\n.share-owner {\n background: var(--mj-bg-warning);\n margin: 0 -20px;\n padding: 10px 20px;\n border-radius: 0;\n}\n"] }]
543
543
  }], () => [{ type: i0.ChangeDetectorRef }], { Visible: [{
544
544
  type: Input
545
545
  }], Dashboard: [{
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-share-dialog.component.js","sourceRoot":"","sources":["../../src/DashboardBrowser/dashboard-share-dialog.component.ts","../../src/DashboardBrowser/dashboard-share-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef, ViewEncapsulation } from '@angular/core';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJDashboardEntity, MJDashboardPermissionEntity, DashboardEngine, MJUserEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Represents a user share with their permissions\n */\nexport interface UserSharePermission {\n /** The permission entity (may be new or existing) */\n Permission: MJDashboardPermissionEntity;\n /** The user being shared with */\n User: MJUserEntity;\n /** Whether this is a newly added share */\n IsNew: boolean;\n /** Whether this share has been marked for removal */\n MarkedForRemoval: boolean;\n}\n\n/**\n * Result emitted when the dialog is closed\n */\nexport interface ShareDialogResult {\n /** The action taken: 'save' or 'cancel' */\n Action: 'save' | 'cancel';\n /** The dashboard that was shared (only on save) */\n Dashboard?: MJDashboardEntity;\n}\n\n/**\n * Dialog component for sharing dashboards with other users.\n * Allows setting granular permissions (CanRead, CanEdit, CanDelete, CanShare).\n */\n@Component({\n standalone: false,\n selector: 'mj-dashboard-share-dialog',\n templateUrl: './dashboard-share-dialog.component.html',\n styleUrls: ['./dashboard-share-dialog.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class DashboardShareDialogComponent implements OnChanges {\n @Input() Visible = false;\n @Input() Dashboard: MJDashboardEntity | null = null;\n @Output() Result = new EventEmitter<ShareDialogResult>();\n\n /** Current shares for this dashboard */\n public UserShares: UserSharePermission[] = [];\n\n /** All available users for sharing (excludes owner and already shared) */\n public AvailableUsers: MJUserEntity[] = [];\n\n /** All users in the system */\n private allUsers: MJUserEntity[] = [];\n\n /** Loading state */\n public IsLoading = false;\n\n /** Error message to display */\n public Error: string | null = null;\n\n /** Search filter for available users */\n public UserSearchFilter = '';\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['Visible'] && this.Visible && this.Dashboard) {\n this.resetDialog();\n this.loadData();\n }\n }\n\n /**\n * Reset dialog state\n */\n private resetDialog(): void {\n this.Error = null;\n this.IsLoading = false;\n this.UserShares = [];\n this.AvailableUsers = [];\n this.UserSearchFilter = '';\n }\n\n /**\n * Load existing shares and available users\n */\n private async loadData(): Promise<void> {\n if (!this.Dashboard) return;\n\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n const rv = new RunView();\n\n // Load all users\n const usersResult = await rv.RunView<MJUserEntity>({\n EntityName: 'MJ: Users',\n ExtraFilter: \"IsActive = 1\",\n OrderBy: 'Name',\n ResultType: 'entity_object'\n });\n\n if (usersResult.Success) {\n this.allUsers = usersResult.Results;\n }\n\n // Get existing shares from DashboardEngine\n const existingShares = DashboardEngine.Instance.GetDashboardShares(this.Dashboard.ID);\n\n // Build user shares list\n this.UserShares = [];\n for (const permission of existingShares) {\n const user = this.allUsers.find(u => UUIDsEqual(u.ID, permission.UserID));\n if (user) {\n this.UserShares.push({\n Permission: permission,\n User: user,\n IsNew: false,\n MarkedForRemoval: false\n });\n }\n }\n\n // Update available users\n this.updateAvailableUsers();\n\n } catch (error) {\n console.error('Error loading share data:', error);\n this.Error = 'Failed to load sharing data. Please try again.';\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Update the list of available users (excludes owner and already shared)\n */\n private updateAvailableUsers(): void {\n if (!this.Dashboard) return;\n\n const sharedUserIds = new Set(\n this.UserShares\n .filter(s => !s.MarkedForRemoval)\n .map(s => s.User.ID)\n );\n\n // Exclude dashboard owner and already shared users\n this.AvailableUsers = this.allUsers.filter(user =>\n !UUIDsEqual(user.ID, this.Dashboard!.UserID) && !sharedUserIds.has(user.ID)\n );\n }\n\n /**\n * Get filtered available users based on search\n */\n public get FilteredAvailableUsers(): MJUserEntity[] {\n if (!this.UserSearchFilter.trim()) {\n return this.AvailableUsers.slice(0, 10); // Show first 10 by default\n }\n\n const filter = this.UserSearchFilter.toLowerCase();\n return this.AvailableUsers\n .filter(user =>\n user.Name.toLowerCase().includes(filter) ||\n (user.Email && user.Email.toLowerCase().includes(filter))\n )\n .slice(0, 10);\n }\n\n /**\n * Check if there are unsaved changes\n */\n public get HasChanges(): boolean {\n return this.UserShares.some(s => s.IsNew || s.MarkedForRemoval || s.Permission.Dirty);\n }\n\n /**\n * Add a user to the share list\n */\n public async addUserShare(user: MJUserEntity): Promise<void> {\n if (!this.Dashboard) return;\n\n const md = new Metadata();\n const permission = await md.GetEntityObject<MJDashboardPermissionEntity>('MJ: Dashboard Permissions');\n permission.NewRecord();\n permission.DashboardID = this.Dashboard.ID;\n permission.UserID = user.ID;\n permission.CanRead = true; // Default to read access\n permission.CanEdit = false;\n permission.CanDelete = false;\n permission.CanShare = false;\n\n this.UserShares.push({\n Permission: permission,\n User: user,\n IsNew: true,\n MarkedForRemoval: false\n });\n\n this.updateAvailableUsers();\n this.UserSearchFilter = '';\n this.cdr.detectChanges();\n }\n\n /**\n * Mark a share for removal\n */\n public removeUserShare(share: UserSharePermission): void {\n if (share.IsNew) {\n // If it's new, just remove from the array\n this.UserShares = this.UserShares.filter(s => s !== share);\n } else {\n // Otherwise mark for removal\n share.MarkedForRemoval = true;\n }\n\n this.updateAvailableUsers();\n this.cdr.detectChanges();\n }\n\n /**\n * Undo removal of a share\n */\n public undoRemove(share: UserSharePermission): void {\n share.MarkedForRemoval = false;\n this.updateAvailableUsers();\n this.cdr.detectChanges();\n }\n\n /**\n * Get shares that are not marked for removal\n */\n public get ActiveShares(): UserSharePermission[] {\n return this.UserShares.filter(s => !s.MarkedForRemoval);\n }\n\n /**\n * Get shares marked for removal\n */\n public get RemovedShares(): UserSharePermission[] {\n return this.UserShares.filter(s => s.MarkedForRemoval);\n }\n\n /**\n * Toggle CanEdit permission (also enables CanRead)\n */\n public toggleCanEdit(share: UserSharePermission): void {\n share.Permission.CanEdit = !share.Permission.CanEdit;\n if (share.Permission.CanEdit) {\n share.Permission.CanRead = true;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle CanDelete permission (also enables CanRead and CanEdit)\n */\n public toggleCanDelete(share: UserSharePermission): void {\n share.Permission.CanDelete = !share.Permission.CanDelete;\n if (share.Permission.CanDelete) {\n share.Permission.CanRead = true;\n share.Permission.CanEdit = true;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle CanShare permission (also enables CanRead)\n */\n public toggleCanShare(share: UserSharePermission): void {\n share.Permission.CanShare = !share.Permission.CanShare;\n if (share.Permission.CanShare) {\n share.Permission.CanRead = true;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Save all permission changes\n */\n public async onSave(): Promise<void> {\n if (!this.HasChanges) {\n this.onCancel();\n return;\n }\n\n this.IsLoading = true;\n this.Error = null;\n this.cdr.detectChanges();\n\n try {\n // Process removals first\n for (const share of this.UserShares.filter(s => s.MarkedForRemoval && !s.IsNew)) {\n const deleted = await share.Permission.Delete();\n if (!deleted) {\n throw new Error(`Failed to remove share for ${share.User.Name}`);\n }\n }\n\n // Process new and modified shares\n for (const share of this.UserShares.filter(s => !s.MarkedForRemoval && (s.IsNew || s.Permission.Dirty))) {\n const saved = await share.Permission.Save();\n if (!saved) {\n throw new Error(`Failed to save share for ${share.User.Name}: ${share.Permission.LatestResult?.Message}`);\n }\n }\n\n // Refresh the engine cache\n await DashboardEngine.Instance.Config(true);\n\n this.Result.emit({\n Action: 'save',\n Dashboard: this.Dashboard!\n });\n\n } catch (error) {\n console.error('Error saving shares:', error);\n this.Error = error instanceof Error ? error.message : 'Failed to save sharing settings.';\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Cancel and close the dialog\n */\n public onCancel(): void {\n this.Result.emit({ Action: 'cancel' });\n }\n\n /**\n * Get initials for a user (for avatar display)\n */\n public getUserInitials(user: MJUserEntity): string {\n const name = user.Name || user.Email || '?';\n const parts = name.split(' ');\n if (parts.length >= 2) {\n return (parts[0][0] + parts[1][0]).toUpperCase();\n }\n return name.substring(0, 2).toUpperCase();\n }\n}\n","@if (Visible) {\n <kendo-window\n [width]=\"560\"\n [minHeight]=\"200\"\n [resizable]=\"false\"\n [draggable]=\"true\"\n [keepContent]=\"true\"\n (close)=\"onCancel()\"\n class=\"mj-share-dialog-window\"\n kendoWindowContainer>\n <kendo-window-titlebar>\n <div class=\"share-dialog-header\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n <span>Share \"{{ Dashboard?.Name }}\"</span>\n </div>\n </kendo-window-titlebar>\n <div class=\"share-dialog-body\">\n <!-- Error Alert -->\n @if (Error) {\n <div class=\"share-alert share-alert-error\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>{{ Error }}</span>\n </div>\n }\n <!-- Add Users Section -->\n <div class=\"share-section\">\n <div class=\"share-search-box\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n placeholder=\"Add people by name or email...\"\n [(ngModel)]=\"UserSearchFilter\"\n [disabled]=\"IsLoading\">\n </div>\n <!-- Available Users Dropdown -->\n @if (FilteredAvailableUsers.length > 0) {\n <div class=\"share-user-dropdown\">\n @for (user of FilteredAvailableUsers; track user.ID) {\n <button type=\"button\" class=\"share-user-option\" (click)=\"addUserShare(user)\" [disabled]=\"IsLoading\">\n <span class=\"share-avatar\">{{ getUserInitials(user) }}</span>\n <span class=\"share-user-name\">{{ user.Name }}</span>\n @if (user.Email) {\n <span class=\"share-user-email\">{{ user.Email }}</span>\n }\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n </div>\n }\n @if (UserSearchFilter && FilteredAvailableUsers.length === 0) {\n <div class=\"share-no-results\">\n No users found matching \"{{ UserSearchFilter }}\"\n </div>\n }\n </div>\n <!-- People with Access -->\n <div class=\"share-section\">\n <div class=\"share-section-label\">People with access</div>\n <!-- Owner -->\n <div class=\"share-person share-owner\">\n <span class=\"share-avatar share-avatar-owner\">\n <i class=\"fa-solid fa-crown\"></i>\n </span>\n <div class=\"share-person-info\">\n <span class=\"share-person-name\">{{ Dashboard?.User || 'You' }}</span>\n <span class=\"share-person-role\">Owner</span>\n </div>\n </div>\n <!-- Shared Users -->\n @for (share of ActiveShares; track share.User.ID) {\n <div class=\"share-person\" [class.share-person-new]=\"share.IsNew\" [class.share-person-modified]=\"share.Permission.Dirty\">\n <span class=\"share-avatar\">{{ getUserInitials(share.User) }}</span>\n <div class=\"share-person-info\">\n <span class=\"share-person-name\">\n {{ share.User.Name }}\n @if (share.IsNew) {\n <span class=\"share-badge-new\">New</span>\n }\n </span>\n @if (share.User.Email) {\n <span class=\"share-person-email\">{{ share.User.Email }}</span>\n }\n </div>\n <div class=\"share-permissions\">\n <label class=\"share-perm\" title=\"Can view\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanRead\" disabled>\n <i class=\"fa-solid fa-eye\"></i>\n </label>\n <label class=\"share-perm\" title=\"Can edit\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanEdit\" (change)=\"toggleCanEdit(share)\">\n <i class=\"fa-solid fa-edit\"></i>\n </label>\n <label class=\"share-perm\" title=\"Can delete\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanDelete\" (change)=\"toggleCanDelete(share)\">\n <i class=\"fa-solid fa-trash\"></i>\n </label>\n <label class=\"share-perm\" title=\"Can share\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanShare\" (change)=\"toggleCanShare(share)\">\n <i class=\"fa-solid fa-share\"></i>\n </label>\n </div>\n <button type=\"button\" class=\"share-remove-btn\" (click)=\"removeUserShare(share)\" title=\"Remove\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n @if (ActiveShares.length === 0) {\n <div class=\"share-empty\">\n <i class=\"fa-solid fa-user-lock\"></i>\n <span>Not shared with anyone yet</span>\n </div>\n }\n <!-- Pending Removals -->\n @if (RemovedShares.length > 0) {\n <div class=\"share-removed-section\">\n @for (share of RemovedShares; track share.User.ID) {\n <div class=\"share-removed-item\">\n <span class=\"share-avatar share-avatar-removed\">{{ getUserInitials(share.User) }}</span>\n <span class=\"share-removed-name\">{{ share.User.Name }}</span>\n <button type=\"button\" class=\"share-undo-btn\" (click)=\"undoRemove(share)\">\n <i class=\"fa-solid fa-undo\"></i> Undo\n </button>\n </div>\n }\n </div>\n }\n </div>\n <!-- Footer -->\n <div class=\"share-footer\">\n @if (HasChanges) {\n <span class=\"share-changes-hint\">\n <i class=\"fa-solid fa-circle\"></i> Unsaved changes\n </span>\n }\n <div class=\"share-footer-actions\">\n <button type=\"button\" class=\"share-btn share-btn-secondary\" (click)=\"onCancel()\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"share-btn share-btn-primary\"\n (click)=\"onSave()\"\n [disabled]=\"!HasChanges || IsLoading\">\n @if (IsLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n Save\n }\n </button>\n </div>\n </div>\n </div>\n </kendo-window>\n}\n"]}
1
+ {"version":3,"file":"dashboard-share-dialog.component.js","sourceRoot":"","sources":["../../src/DashboardBrowser/dashboard-share-dialog.component.ts","../../src/DashboardBrowser/dashboard-share-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef, ViewEncapsulation } from '@angular/core';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJDashboardEntity, MJDashboardPermissionEntity, DashboardEngine, MJUserEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Represents a user share with their permissions\n */\nexport interface UserSharePermission {\n /** The permission entity (may be new or existing) */\n Permission: MJDashboardPermissionEntity;\n /** The user being shared with */\n User: MJUserEntity;\n /** Whether this is a newly added share */\n IsNew: boolean;\n /** Whether this share has been marked for removal */\n MarkedForRemoval: boolean;\n}\n\n/**\n * Result emitted when the dialog is closed\n */\nexport interface ShareDialogResult {\n /** The action taken: 'save' or 'cancel' */\n Action: 'save' | 'cancel';\n /** The dashboard that was shared (only on save) */\n Dashboard?: MJDashboardEntity;\n}\n\n/**\n * Dialog component for sharing dashboards with other users.\n * Allows setting granular permissions (CanRead, CanEdit, CanDelete, CanShare).\n */\n@Component({\n standalone: false,\n selector: 'mj-dashboard-share-dialog',\n templateUrl: './dashboard-share-dialog.component.html',\n styleUrls: ['./dashboard-share-dialog.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class DashboardShareDialogComponent implements OnChanges {\n @Input() Visible = false;\n @Input() Dashboard: MJDashboardEntity | null = null;\n @Output() Result = new EventEmitter<ShareDialogResult>();\n\n /** Current shares for this dashboard */\n public UserShares: UserSharePermission[] = [];\n\n /** All available users for sharing (excludes owner and already shared) */\n public AvailableUsers: MJUserEntity[] = [];\n\n /** All users in the system */\n private allUsers: MJUserEntity[] = [];\n\n /** Loading state */\n public IsLoading = false;\n\n /** Error message to display */\n public Error: string | null = null;\n\n /** Search filter for available users */\n public UserSearchFilter = '';\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['Visible'] && this.Visible && this.Dashboard) {\n this.resetDialog();\n this.loadData();\n }\n }\n\n /**\n * Reset dialog state\n */\n private resetDialog(): void {\n this.Error = null;\n this.IsLoading = false;\n this.UserShares = [];\n this.AvailableUsers = [];\n this.UserSearchFilter = '';\n }\n\n /**\n * Load existing shares and available users\n */\n private async loadData(): Promise<void> {\n if (!this.Dashboard) return;\n\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n const rv = new RunView();\n\n // Load all users\n const usersResult = await rv.RunView<MJUserEntity>({\n EntityName: 'MJ: Users',\n ExtraFilter: \"IsActive = 1\",\n OrderBy: 'Name',\n ResultType: 'entity_object'\n });\n\n if (usersResult.Success) {\n this.allUsers = usersResult.Results;\n }\n\n // Get existing shares from DashboardEngine\n const existingShares = DashboardEngine.Instance.GetDashboardShares(this.Dashboard.ID);\n\n // Build user shares list\n this.UserShares = [];\n for (const permission of existingShares) {\n const user = this.allUsers.find(u => UUIDsEqual(u.ID, permission.UserID));\n if (user) {\n this.UserShares.push({\n Permission: permission,\n User: user,\n IsNew: false,\n MarkedForRemoval: false\n });\n }\n }\n\n // Update available users\n this.updateAvailableUsers();\n\n } catch (error) {\n console.error('Error loading share data:', error);\n this.Error = 'Failed to load sharing data. Please try again.';\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Update the list of available users (excludes owner and already shared)\n */\n private updateAvailableUsers(): void {\n if (!this.Dashboard) return;\n\n const sharedUserIds = new Set(\n this.UserShares\n .filter(s => !s.MarkedForRemoval)\n .map(s => s.User.ID)\n );\n\n // Exclude dashboard owner and already shared users\n this.AvailableUsers = this.allUsers.filter(user =>\n !UUIDsEqual(user.ID, this.Dashboard!.UserID) && !sharedUserIds.has(user.ID)\n );\n }\n\n /**\n * Get filtered available users based on search\n */\n public get FilteredAvailableUsers(): MJUserEntity[] {\n if (!this.UserSearchFilter.trim()) {\n return this.AvailableUsers.slice(0, 10); // Show first 10 by default\n }\n\n const filter = this.UserSearchFilter.toLowerCase();\n return this.AvailableUsers\n .filter(user =>\n user.Name.toLowerCase().includes(filter) ||\n (user.Email && user.Email.toLowerCase().includes(filter))\n )\n .slice(0, 10);\n }\n\n /**\n * Check if there are unsaved changes\n */\n public get HasChanges(): boolean {\n return this.UserShares.some(s => s.IsNew || s.MarkedForRemoval || s.Permission.Dirty);\n }\n\n /**\n * Add a user to the share list\n */\n public async addUserShare(user: MJUserEntity): Promise<void> {\n if (!this.Dashboard) return;\n\n const md = new Metadata();\n const permission = await md.GetEntityObject<MJDashboardPermissionEntity>('MJ: Dashboard Permissions');\n permission.NewRecord();\n permission.DashboardID = this.Dashboard.ID;\n permission.UserID = user.ID;\n permission.CanRead = true; // Default to read access\n permission.CanEdit = false;\n permission.CanDelete = false;\n permission.CanShare = false;\n\n this.UserShares.push({\n Permission: permission,\n User: user,\n IsNew: true,\n MarkedForRemoval: false\n });\n\n this.updateAvailableUsers();\n this.UserSearchFilter = '';\n this.cdr.detectChanges();\n }\n\n /**\n * Mark a share for removal\n */\n public removeUserShare(share: UserSharePermission): void {\n if (share.IsNew) {\n // If it's new, just remove from the array\n this.UserShares = this.UserShares.filter(s => s !== share);\n } else {\n // Otherwise mark for removal\n share.MarkedForRemoval = true;\n }\n\n this.updateAvailableUsers();\n this.cdr.detectChanges();\n }\n\n /**\n * Undo removal of a share\n */\n public undoRemove(share: UserSharePermission): void {\n share.MarkedForRemoval = false;\n this.updateAvailableUsers();\n this.cdr.detectChanges();\n }\n\n /**\n * Get shares that are not marked for removal\n */\n public get ActiveShares(): UserSharePermission[] {\n return this.UserShares.filter(s => !s.MarkedForRemoval);\n }\n\n /**\n * Get shares marked for removal\n */\n public get RemovedShares(): UserSharePermission[] {\n return this.UserShares.filter(s => s.MarkedForRemoval);\n }\n\n /**\n * Toggle CanEdit permission (also enables CanRead)\n */\n public toggleCanEdit(share: UserSharePermission): void {\n share.Permission.CanEdit = !share.Permission.CanEdit;\n if (share.Permission.CanEdit) {\n share.Permission.CanRead = true;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle CanDelete permission (also enables CanRead and CanEdit)\n */\n public toggleCanDelete(share: UserSharePermission): void {\n share.Permission.CanDelete = !share.Permission.CanDelete;\n if (share.Permission.CanDelete) {\n share.Permission.CanRead = true;\n share.Permission.CanEdit = true;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle CanShare permission (also enables CanRead)\n */\n public toggleCanShare(share: UserSharePermission): void {\n share.Permission.CanShare = !share.Permission.CanShare;\n if (share.Permission.CanShare) {\n share.Permission.CanRead = true;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Save all permission changes\n */\n public async onSave(): Promise<void> {\n if (!this.HasChanges) {\n this.onCancel();\n return;\n }\n\n this.IsLoading = true;\n this.Error = null;\n this.cdr.detectChanges();\n\n try {\n // Process removals first\n for (const share of this.UserShares.filter(s => s.MarkedForRemoval && !s.IsNew)) {\n const deleted = await share.Permission.Delete();\n if (!deleted) {\n throw new Error(`Failed to remove share for ${share.User.Name}`);\n }\n }\n\n // Process new and modified shares\n for (const share of this.UserShares.filter(s => !s.MarkedForRemoval && (s.IsNew || s.Permission.Dirty))) {\n const saved = await share.Permission.Save();\n if (!saved) {\n throw new Error(`Failed to save share for ${share.User.Name}: ${share.Permission.LatestResult?.Message}`);\n }\n }\n\n // Refresh the engine cache\n await DashboardEngine.Instance.Config(true);\n\n this.Result.emit({\n Action: 'save',\n Dashboard: this.Dashboard!\n });\n\n } catch (error) {\n console.error('Error saving shares:', error);\n this.Error = error instanceof Error ? error.message : 'Failed to save sharing settings.';\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Cancel and close the dialog\n */\n public onCancel(): void {\n this.Result.emit({ Action: 'cancel' });\n }\n\n /**\n * Get initials for a user (for avatar display)\n */\n public getUserInitials(user: MJUserEntity): string {\n const name = user.Name || user.Email || '?';\n const parts = name.split(' ');\n if (parts.length >= 2) {\n return (parts[0][0] + parts[1][0]).toUpperCase();\n }\n return name.substring(0, 2).toUpperCase();\n }\n}\n","@if (Visible) {\n <mj-window\n [Visible]=\"true\"\n [Width]=\"560\"\n [MinHeight]=\"200\"\n [Resizable]=\"false\"\n [Draggable]=\"true\"\n (Close)=\"onCancel()\"\n class=\"mj-share-dialog-window\">\n <mj-window-titlebar>\n <div class=\"share-dialog-header\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n <span>Share \"{{ Dashboard?.Name }}\"</span>\n </div>\n </mj-window-titlebar>\n <div class=\"share-dialog-body\">\n <!-- Error Alert -->\n @if (Error) {\n <div class=\"share-alert share-alert-error\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>{{ Error }}</span>\n </div>\n }\n <!-- Add Users Section -->\n <div class=\"share-section\">\n <div class=\"share-search-box\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n placeholder=\"Add people by name or email...\"\n [(ngModel)]=\"UserSearchFilter\"\n [disabled]=\"IsLoading\">\n </div>\n <!-- Available Users Dropdown -->\n @if (FilteredAvailableUsers.length > 0) {\n <div class=\"share-user-dropdown\">\n @for (user of FilteredAvailableUsers; track user.ID) {\n <button type=\"button\" class=\"share-user-option\" (click)=\"addUserShare(user)\" [disabled]=\"IsLoading\">\n <span class=\"share-avatar\">{{ getUserInitials(user) }}</span>\n <span class=\"share-user-name\">{{ user.Name }}</span>\n @if (user.Email) {\n <span class=\"share-user-email\">{{ user.Email }}</span>\n }\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n </div>\n }\n @if (UserSearchFilter && FilteredAvailableUsers.length === 0) {\n <div class=\"share-no-results\">\n No users found matching \"{{ UserSearchFilter }}\"\n </div>\n }\n </div>\n <!-- People with Access -->\n <div class=\"share-section\">\n <div class=\"share-section-label\">People with access</div>\n <!-- Owner -->\n <div class=\"share-person share-owner\">\n <span class=\"share-avatar share-avatar-owner\">\n <i class=\"fa-solid fa-crown\"></i>\n </span>\n <div class=\"share-person-info\">\n <span class=\"share-person-name\">{{ Dashboard?.User || 'You' }}</span>\n <span class=\"share-person-role\">Owner</span>\n </div>\n </div>\n <!-- Shared Users -->\n @for (share of ActiveShares; track share.User.ID) {\n <div class=\"share-person\" [class.share-person-new]=\"share.IsNew\" [class.share-person-modified]=\"share.Permission.Dirty\">\n <span class=\"share-avatar\">{{ getUserInitials(share.User) }}</span>\n <div class=\"share-person-info\">\n <span class=\"share-person-name\">\n {{ share.User.Name }}\n @if (share.IsNew) {\n <span class=\"share-badge-new\">New</span>\n }\n </span>\n @if (share.User.Email) {\n <span class=\"share-person-email\">{{ share.User.Email }}</span>\n }\n </div>\n <div class=\"share-permissions\">\n <label class=\"share-perm\" title=\"Can view\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanRead\" disabled>\n <i class=\"fa-solid fa-eye\"></i>\n </label>\n <label class=\"share-perm\" title=\"Can edit\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanEdit\" (change)=\"toggleCanEdit(share)\">\n <i class=\"fa-solid fa-edit\"></i>\n </label>\n <label class=\"share-perm\" title=\"Can delete\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanDelete\" (change)=\"toggleCanDelete(share)\">\n <i class=\"fa-solid fa-trash\"></i>\n </label>\n <label class=\"share-perm\" title=\"Can share\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanShare\" (change)=\"toggleCanShare(share)\">\n <i class=\"fa-solid fa-share\"></i>\n </label>\n </div>\n <button type=\"button\" class=\"share-remove-btn\" (click)=\"removeUserShare(share)\" title=\"Remove\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n @if (ActiveShares.length === 0) {\n <div class=\"share-empty\">\n <i class=\"fa-solid fa-user-lock\"></i>\n <span>Not shared with anyone yet</span>\n </div>\n }\n <!-- Pending Removals -->\n @if (RemovedShares.length > 0) {\n <div class=\"share-removed-section\">\n @for (share of RemovedShares; track share.User.ID) {\n <div class=\"share-removed-item\">\n <span class=\"share-avatar share-avatar-removed\">{{ getUserInitials(share.User) }}</span>\n <span class=\"share-removed-name\">{{ share.User.Name }}</span>\n <button type=\"button\" class=\"share-undo-btn\" (click)=\"undoRemove(share)\">\n <i class=\"fa-solid fa-undo\"></i> Undo\n </button>\n </div>\n }\n </div>\n }\n </div>\n <!-- Footer -->\n <div class=\"share-footer\">\n @if (HasChanges) {\n <span class=\"share-changes-hint\">\n <i class=\"fa-solid fa-circle\"></i> Unsaved changes\n </span>\n }\n <div class=\"share-footer-actions\">\n <button type=\"button\" class=\"share-btn share-btn-secondary\" (click)=\"onCancel()\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"share-btn share-btn-primary\"\n (click)=\"onSave()\"\n [disabled]=\"!HasChanges || IsLoading\">\n @if (IsLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n Save\n }\n </button>\n </div>\n </div>\n </div>\n </mj-window>\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"data-explorer-dashboard.component.d.ts","sourceRoot":"","sources":["../../src/DataExplorer/data-explorer-dashboard.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-explorer-dashboard.component.d.ts","sourceRoot":"","sources":["../../src/DataExplorer/data-explorer-dashboard.component.ts"],"names":[],"mappings":"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"}
@@ -1622,7 +1622,7 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
1622
1622
  return null;
1623
1623
  }
1624
1624
  try {
1625
- const parsed = JSON.parse(view.GridState);
1625
+ const parsed = view.GridStateObject;
1626
1626
  // Validate structure - expect columnSettings array
1627
1627
  if (parsed && Array.isArray(parsed.columnSettings)) {
1628
1628
  // Validate columns and sorts against current entity to prevent stale
@@ -1767,17 +1767,17 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
1767
1767
  newView.UserID = md.CurrentUser.ID;
1768
1768
  newView.IsShared = event.isShared;
1769
1769
  newView.IsDefault = false;
1770
- // Set GridState and SortState
1770
+ // Set state via typed object setters
1771
1771
  if (gridState) {
1772
- newView.GridState = JSON.stringify(gridState);
1772
+ newView.GridStateObject = gridState;
1773
1773
  }
1774
1774
  if (sortState) {
1775
- newView.SortState = JSON.stringify(sortState);
1775
+ newView.SortStateObject = sortState;
1776
1776
  }
1777
1777
  // Set Smart Filter settings
1778
1778
  newView.SmartFilterEnabled = event.smartFilterEnabled;
1779
1779
  newView.SmartFilterPrompt = event.smartFilterPrompt;
1780
- // BUG-008: Always set FilterState consistently
1780
+ // BUG-008: Always set FilterState consistently (raw string — Kendo CompositeFilterDescriptor shape)
1781
1781
  newView.FilterState = filterStateJson;
1782
1782
  const saved = await newView.Save();
1783
1783
  if (saved) {
@@ -1806,17 +1806,17 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
1806
1806
  this.selectedViewEntity.Name = event.name;
1807
1807
  this.selectedViewEntity.Description = event.description;
1808
1808
  this.selectedViewEntity.IsShared = event.isShared;
1809
- // Update GridState and SortState
1809
+ // Update state via typed object setters
1810
1810
  if (gridState) {
1811
- this.selectedViewEntity.GridState = JSON.stringify(gridState);
1811
+ this.selectedViewEntity.GridStateObject = gridState;
1812
1812
  }
1813
1813
  if (sortState) {
1814
- this.selectedViewEntity.SortState = JSON.stringify(sortState);
1814
+ this.selectedViewEntity.SortStateObject = sortState;
1815
1815
  }
1816
1816
  // Update Smart Filter settings
1817
1817
  this.selectedViewEntity.SmartFilterEnabled = event.smartFilterEnabled;
1818
1818
  this.selectedViewEntity.SmartFilterPrompt = event.smartFilterPrompt;
1819
- // BUG-008: Always set FilterState consistently
1819
+ // BUG-008: Always set FilterState consistently (raw string — Kendo CompositeFilterDescriptor shape)
1820
1820
  this.selectedViewEntity.FilterState = filterStateJson;
1821
1821
  const saved = await this.selectedViewEntity.Save();
1822
1822
  if (saved) {
@@ -1929,7 +1929,7 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
1929
1929
  DisplayName: col.displayName,
1930
1930
  userDisplayName: col.userDisplayName, // Include user-defined column alias
1931
1931
  hidden: false, // Visible columns only
1932
- width: col.width || null,
1932
+ width: col.width || undefined,
1933
1933
  orderIndex: idx,
1934
1934
  format: col.format // Include column format settings
1935
1935
  }));
@@ -1947,7 +1947,7 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
1947
1947
  Name: f.Name,
1948
1948
  DisplayName: f.DisplayNameOrName,
1949
1949
  hidden: false,
1950
- width: f.DefaultColumnWidth || null,
1950
+ width: f.DefaultColumnWidth || undefined,
1951
1951
  orderIndex: idx
1952
1952
  }));
1953
1953
  if (columnSettings.length === 0) {
@@ -1996,7 +1996,7 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
1996
1996
  if (event.sortItems && event.sortItems.length > 0) {
1997
1997
  return event.sortItems.map(item => ({
1998
1998
  field: item.field,
1999
- direction: item.direction // 'asc' or 'desc'
1999
+ direction: item.direction
2000
2000
  }));
2001
2001
  }
2002
2002
  // Fallback to deprecated sortField for backward compatibility
@@ -2165,20 +2165,20 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
2165
2165
  let sortCount = 0;
2166
2166
  let aggregateCount = 0;
2167
2167
  try {
2168
- const gridState = view.GridState ? JSON.parse(view.GridState) : null;
2169
- if (Array.isArray(gridState)) {
2170
- columnCount = gridState.filter((c) => !c['hidden']).length;
2168
+ const gridState = view.GridStateObject;
2169
+ if (gridState?.columnSettings && Array.isArray(gridState.columnSettings)) {
2170
+ columnCount = gridState.columnSettings.filter((c) => !c.hidden).length;
2171
2171
  }
2172
2172
  }
2173
2173
  catch { /* ignore */ }
2174
2174
  try {
2175
- const filterState = view.FilterState ? JSON.parse(view.FilterState) : null;
2175
+ const filterState = view.FilterStateObject;
2176
2176
  if (filterState?.filters?.length)
2177
2177
  filterCount = filterState.filters.length;
2178
2178
  }
2179
2179
  catch { /* ignore */ }
2180
2180
  try {
2181
- const sortState = view.SortState ? JSON.parse(view.SortState) : null;
2181
+ const sortState = view.SortStateObject;
2182
2182
  if (Array.isArray(sortState))
2183
2183
  sortCount = sortState.length;
2184
2184
  }