@memberjunction/ng-explorer-core 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 (91) hide show
  1. package/dist/app-routing.module.d.ts.map +1 -1
  2. package/dist/app-routing.module.js +1 -3
  3. package/dist/app-routing.module.js.map +1 -1
  4. package/dist/generated/lazy-feature-config.d.ts +1 -1
  5. package/dist/generated/lazy-feature-config.d.ts.map +1 -1
  6. package/dist/generated/lazy-feature-config.js +5 -2
  7. package/dist/generated/lazy-feature-config.js.map +1 -1
  8. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js +49 -49
  9. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js.map +1 -1
  10. package/dist/lib/oauth/oauth-callback.component.js +6 -6
  11. package/dist/lib/oauth/oauth-callback.component.js.map +1 -1
  12. package/dist/lib/oauth/oauth.module.d.ts +2 -3
  13. package/dist/lib/oauth/oauth.module.d.ts.map +1 -1
  14. package/dist/lib/oauth/oauth.module.js +0 -4
  15. package/dist/lib/oauth/oauth.module.js.map +1 -1
  16. package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts +6 -25
  17. package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts.map +1 -1
  18. package/dist/lib/resource-wrappers/chat-collections-resource.component.js +30 -124
  19. package/dist/lib/resource-wrappers/chat-collections-resource.component.js.map +1 -1
  20. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts +7 -23
  21. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts.map +1 -1
  22. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +50 -142
  23. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
  24. package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts +3 -19
  25. package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts.map +1 -1
  26. package/dist/lib/resource-wrappers/chat-tasks-resource.component.js +16 -98
  27. package/dist/lib/resource-wrappers/chat-tasks-resource.component.js.map +1 -1
  28. package/dist/lib/resource-wrappers/list-detail-resource.component.d.ts +3 -1
  29. package/dist/lib/resource-wrappers/list-detail-resource.component.d.ts.map +1 -1
  30. package/dist/lib/resource-wrappers/list-detail-resource.component.js +3 -0
  31. package/dist/lib/resource-wrappers/list-detail-resource.component.js.map +1 -1
  32. package/dist/lib/resource-wrappers/notifications-resource.component.js +1 -0
  33. package/dist/lib/resource-wrappers/notifications-resource.component.js.map +1 -1
  34. package/dist/lib/resource-wrappers/view-resource.component.d.ts +13 -11
  35. package/dist/lib/resource-wrappers/view-resource.component.d.ts.map +1 -1
  36. package/dist/lib/resource-wrappers/view-resource.component.js +80 -89
  37. package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
  38. package/dist/lib/services/startup-validation.service.d.ts.map +1 -1
  39. package/dist/lib/services/startup-validation.service.js +0 -3
  40. package/dist/lib/services/startup-validation.service.js.map +1 -1
  41. package/dist/lib/shell/components/header/app-nav.component.d.ts.map +1 -1
  42. package/dist/lib/shell/components/header/app-nav.component.js +18 -3
  43. package/dist/lib/shell/components/header/app-nav.component.js.map +1 -1
  44. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts +45 -16
  45. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts.map +1 -1
  46. package/dist/lib/shell/components/tabs/component-cache-manager.js +57 -35
  47. package/dist/lib/shell/components/tabs/component-cache-manager.js.map +1 -1
  48. package/dist/lib/shell/components/tabs/tab-container.component.d.ts +33 -0
  49. package/dist/lib/shell/components/tabs/tab-container.component.d.ts.map +1 -1
  50. package/dist/lib/shell/components/tabs/tab-container.component.js +99 -17
  51. package/dist/lib/shell/components/tabs/tab-container.component.js.map +1 -1
  52. package/dist/lib/shell/services/settings-dialog.service.d.ts +8 -8
  53. package/dist/lib/shell/services/settings-dialog.service.d.ts.map +1 -1
  54. package/dist/lib/shell/services/settings-dialog.service.js +20 -26
  55. package/dist/lib/shell/services/settings-dialog.service.js.map +1 -1
  56. package/dist/lib/shell/shell.component.d.ts.map +1 -1
  57. package/dist/lib/shell/shell.component.js +17 -17
  58. package/dist/lib/shell/shell.component.js.map +1 -1
  59. package/dist/lib/shell/shell.module.d.ts +4 -5
  60. package/dist/lib/shell/shell.module.d.ts.map +1 -1
  61. package/dist/lib/shell/shell.module.js +4 -8
  62. package/dist/lib/shell/shell.module.js.map +1 -1
  63. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js +72 -71
  64. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js.map +1 -1
  65. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js +11 -11
  66. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js.map +1 -1
  67. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.d.ts +36 -12
  68. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.d.ts.map +1 -1
  69. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js +78 -50
  70. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js.map +1 -1
  71. package/dist/lib/single-dashboard/single-dashboard.component.d.ts +12 -5
  72. package/dist/lib/single-dashboard/single-dashboard.component.d.ts.map +1 -1
  73. package/dist/lib/single-dashboard/single-dashboard.component.js +44 -55
  74. package/dist/lib/single-dashboard/single-dashboard.component.js.map +1 -1
  75. package/dist/lib/single-list-detail/single-list-detail.component.d.ts +10 -2
  76. package/dist/lib/single-list-detail/single-list-detail.component.d.ts.map +1 -1
  77. package/dist/lib/single-list-detail/single-list-detail.component.js +313 -243
  78. package/dist/lib/single-list-detail/single-list-detail.component.js.map +1 -1
  79. package/dist/module.d.ts +51 -63
  80. package/dist/module.d.ts.map +1 -1
  81. package/dist/module.js +35 -80
  82. package/dist/module.js.map +1 -1
  83. package/dist/public-api.d.ts +0 -1
  84. package/dist/public-api.d.ts.map +1 -1
  85. package/dist/public-api.js +0 -1
  86. package/dist/public-api.js.map +1 -1
  87. package/package.json +38 -47
  88. package/dist/lib/generic/form-toolbar.d.ts +0 -8
  89. package/dist/lib/generic/form-toolbar.d.ts.map +0 -1
  90. package/dist/lib/generic/form-toolbar.js +0 -114
  91. package/dist/lib/generic/form-toolbar.js.map +0 -1
@@ -9,7 +9,6 @@ import * as i1 from "@angular/router";
9
9
  import * as i2 from "@memberjunction/ng-shared";
10
10
  const _c0 = ["dashboardNameInput"];
11
11
  const _c1 = a0 => [a0];
12
- const _c2 = a0 => ["dashboard-item-header", a0];
13
12
  const _forTrack0 = ($index, $item) => $item.uniqueId;
14
13
  function SingleDashboardComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
15
14
  const _r1 = i0.ɵɵgetCurrentView();
@@ -57,7 +56,7 @@ function SingleDashboardComponent_Conditional_6_Template(rf, ctx) { if (rf & 1)
57
56
  } }
58
57
  function SingleDashboardComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
59
58
  const _r6 = i0.ɵɵgetCurrentView();
60
- i0.ɵɵelement(0, "span", 17);
59
+ i0.ɵɵelement(0, "i", 17);
61
60
  i0.ɵɵelementStart(1, "h3", 18);
62
61
  i0.ɵɵlistener("click", function SingleDashboardComponent_Conditional_7_Template_h3_click_1_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleInlineNameEdit(true)); });
63
62
  i0.ɵɵtext(2);
@@ -71,12 +70,12 @@ function SingleDashboardComponent_Conditional_9_Template(rf, ctx) { if (rf & 1)
71
70
  const _r7 = i0.ɵɵgetCurrentView();
72
71
  i0.ɵɵelementStart(0, "div")(1, "button", 14);
73
72
  i0.ɵɵlistener("click", function SingleDashboardComponent_Conditional_9_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onClickSaveDashboard()); });
74
- i0.ɵɵelement(2, "span", 19);
73
+ i0.ɵɵelement(2, "span", 15);
75
74
  i0.ɵɵtext(3, " Save ");
76
75
  i0.ɵɵelementEnd();
77
76
  i0.ɵɵelementStart(4, "button", 14);
78
77
  i0.ɵɵlistener("click", function SingleDashboardComponent_Conditional_9_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onclickCancelChanges()); });
79
- i0.ɵɵelement(5, "span", 20);
78
+ i0.ɵɵelement(5, "span", 16);
80
79
  i0.ɵɵtext(6, " Cancel ");
81
80
  i0.ɵɵelementEnd()();
82
81
  } }
@@ -84,81 +83,80 @@ function SingleDashboardComponent_Conditional_10_Template(rf, ctx) { if (rf & 1)
84
83
  const _r8 = i0.ɵɵgetCurrentView();
85
84
  i0.ɵɵelementStart(0, "button", 14);
86
85
  i0.ɵɵlistener("click", function SingleDashboardComponent_Conditional_10_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.addItem()); });
87
- i0.ɵɵelement(1, "span", 21);
86
+ i0.ɵɵelement(1, "span", 19);
88
87
  i0.ɵɵtext(2, " Add Item ");
89
88
  i0.ɵɵelementEnd();
90
89
  i0.ɵɵelementStart(3, "button", 14);
91
90
  i0.ɵɵlistener("click", function SingleDashboardComponent_Conditional_10_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleEditDashboard(true)); });
92
- i0.ɵɵelement(4, "span", 22);
91
+ i0.ɵɵelement(4, "span", 20);
93
92
  i0.ɵɵtext(5, " Edit Dashboard ");
94
93
  i0.ɵɵelementEnd();
95
94
  } }
96
95
  function SingleDashboardComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
97
96
  const _r9 = i0.ɵɵgetCurrentView();
98
97
  i0.ɵɵelementStart(0, "div", 8);
99
- i0.ɵɵelement(1, "i", 23);
98
+ i0.ɵɵelement(1, "i", 21);
100
99
  i0.ɵɵelementStart(2, "h3");
101
100
  i0.ɵɵtext(3, "This dashboard is empty");
102
101
  i0.ɵɵelementEnd();
103
102
  i0.ɵɵelementStart(4, "p");
104
103
  i0.ɵɵtext(5, "Start by adding reports or user views to your dashboard");
105
104
  i0.ɵɵelementEnd();
106
- i0.ɵɵelementStart(6, "button", 24);
105
+ i0.ɵɵelementStart(6, "button", 22);
107
106
  i0.ɵɵlistener("click", function SingleDashboardComponent_Conditional_12_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.addItem()); });
108
- i0.ɵɵelement(7, "span", 21);
107
+ i0.ɵɵelement(7, "span", 19);
109
108
  i0.ɵɵtext(8, " Add Item ");
110
109
  i0.ɵɵelementEnd()();
111
110
  } }
112
111
  function SingleDashboardComponent_Conditional_13_For_2_Conditional_5_Template(rf, ctx) { if (rf & 1) {
113
- const _r12 = i0.ɵɵgetCurrentView();
114
- i0.ɵɵelementStart(0, "div")(1, "div", 32)(2, "button", 33);
115
- i0.ɵɵlistener("click", function SingleDashboardComponent_Conditional_13_For_2_Conditional_5_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleEditDashboard(true)); });
116
- i0.ɵɵelement(3, "span", 34);
112
+ const _r11 = i0.ɵɵgetCurrentView();
113
+ i0.ɵɵelementStart(0, "div")(1, "div", 31)(2, "button", 32);
114
+ i0.ɵɵlistener("click", function SingleDashboardComponent_Conditional_13_For_2_Conditional_5_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleEditDashboard(true)); });
115
+ i0.ɵɵelement(3, "span", 33);
117
116
  i0.ɵɵelementEnd();
118
- i0.ɵɵelementStart(4, "button", 35);
119
- i0.ɵɵlistener("click", function SingleDashboardComponent_Conditional_13_For_2_Conditional_5_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r12); const item_r13 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.showConfirmDeleteDashboardItem(item_r13)); });
120
- i0.ɵɵelement(5, "span", 36);
117
+ i0.ɵɵelementStart(4, "button", 34);
118
+ i0.ɵɵlistener("click", function SingleDashboardComponent_Conditional_13_For_2_Conditional_5_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r11); const item_r12 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.showConfirmDeleteDashboardItem(item_r12)); });
119
+ i0.ɵɵelement(5, "span", 35);
121
120
  i0.ɵɵelementEnd()()();
122
121
  } }
123
122
  function SingleDashboardComponent_Conditional_13_For_2_Template(rf, ctx) { if (rf & 1) {
124
- const _r11 = i0.ɵɵgetCurrentView();
125
- i0.ɵɵelementStart(0, "kendo-tilelayout-item", 27);
126
- i0.ɵɵlistener("mouseenter", function SingleDashboardComponent_Conditional_13_For_2_Template_kendo_tilelayout_item_mouseenter_0_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onMouseEnter($event)); })("mouseleave", function SingleDashboardComponent_Conditional_13_For_2_Template_kendo_tilelayout_item_mouseleave_0_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onMouseOut($event)); });
127
- i0.ɵɵelementStart(1, "kendo-tilelayout-item-header", 28)(2, "div", 29);
128
- i0.ɵɵelement(3, "i", 30);
123
+ const _r10 = i0.ɵɵgetCurrentView();
124
+ i0.ɵɵelementStart(0, "div", 25);
125
+ i0.ɵɵlistener("mouseenter", function SingleDashboardComponent_Conditional_13_For_2_Template_div_mouseenter_0_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onMouseEnter($event)); })("mouseleave", function SingleDashboardComponent_Conditional_13_For_2_Template_div_mouseleave_0_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onMouseOut($event)); });
126
+ i0.ɵɵelementStart(1, "div", 26)(2, "div", 27);
127
+ i0.ɵɵelement(3, "i", 28);
129
128
  i0.ɵɵtext(4);
130
129
  i0.ɵɵelementEnd();
131
130
  i0.ɵɵconditionalCreate(5, SingleDashboardComponent_Conditional_13_For_2_Conditional_5_Template, 6, 0, "div");
132
131
  i0.ɵɵelementEnd();
133
- i0.ɵɵelementStart(6, "kendo-tilelayout-item-body", 28)(7, "mj-resource", 31);
134
- i0.ɵɵlistener("ContentLoadingStarted", function SingleDashboardComponent_Conditional_13_For_2_Template_mj_resource_ContentLoadingStarted_7_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.loadingStarted($event)); })("ContentLoadingComplete", function SingleDashboardComponent_Conditional_13_For_2_Template_mj_resource_ContentLoadingComplete_7_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.loadingComplete($event)); });
132
+ i0.ɵɵelementStart(6, "div", 29)(7, "mj-resource", 30);
133
+ i0.ɵɵlistener("ContentLoadingStarted", function SingleDashboardComponent_Conditional_13_For_2_Template_mj_resource_ContentLoadingStarted_7_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.loadingStarted($event)); })("ContentLoadingComplete", function SingleDashboardComponent_Conditional_13_For_2_Template_mj_resource_ContentLoadingComplete_7_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.loadingComplete($event)); });
135
134
  i0.ɵɵelementEnd()()();
136
135
  } if (rf & 2) {
137
- const item_r13 = ctx.$implicit;
136
+ const item_r12 = ctx.$implicit;
138
137
  const ctx_r1 = i0.ɵɵnextContext(2);
139
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(13, _c1, ctx_r1.getSelectedComponentStyle(ctx_r1)))("col", item_r13.col)("colSpan", item_r13.colSpan)("rowSpan", item_r13.rowSpan)("id", item_r13.uniqueId);
138
+ i0.ɵɵstyleProp("grid-column", item_r12.col + " / span " + item_r12.colSpan)("grid-row", "span " + item_r12.rowSpan);
139
+ i0.ɵɵproperty("id", item_r12.uniqueId);
140
140
  i0.ɵɵadvance();
141
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(15, _c2, ctx_r1.getIsEditingItemHeaderStyle()));
141
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(13, _c1, ctx_r1.getIsEditingItemHeaderStyle()));
142
142
  i0.ɵɵadvance(2);
143
- i0.ɵɵclassMap(ctx_r1.getResourceIcon(item_r13.ResourceData.ResourceType));
143
+ i0.ɵɵclassMap(ctx_r1.getResourceIcon(item_r12.ResourceData.ResourceType));
144
144
  i0.ɵɵadvance();
145
- i0.ɵɵtextInterpolate1(" ", item_r13.title, " ");
145
+ i0.ɵɵtextInterpolate1(" ", item_r12.title, " ");
146
146
  i0.ɵɵadvance();
147
147
  i0.ɵɵconditional(!ctx_r1.isEditingDashboard ? 5 : -1);
148
148
  i0.ɵɵadvance();
149
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(17, _c1, ctx_r1.getIsEditingItemBodyStyle()));
149
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(15, _c1, ctx_r1.getIsEditingItemBodyStyle()));
150
150
  i0.ɵɵadvance();
151
- i0.ɵɵproperty("Data", item_r13.ResourceData)("isVisible", true);
151
+ i0.ɵɵproperty("Data", item_r12.ResourceData)("isVisible", true);
152
152
  } }
153
153
  function SingleDashboardComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
154
- const _r10 = i0.ɵɵgetCurrentView();
155
- i0.ɵɵelementStart(0, "kendo-tilelayout", 25);
156
- i0.ɵɵlistener("reorder", function SingleDashboardComponent_Conditional_13_Template_kendo_tilelayout_reorder_0_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onReorder($event)); })("resize", function SingleDashboardComponent_Conditional_13_Template_kendo_tilelayout_resize_0_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onResize($event)); });
157
- i0.ɵɵrepeaterCreate(1, SingleDashboardComponent_Conditional_13_For_2_Template, 8, 19, "kendo-tilelayout-item", 26, _forTrack0);
154
+ i0.ɵɵelementStart(0, "div", 23);
155
+ i0.ɵɵrepeaterCreate(1, SingleDashboardComponent_Conditional_13_For_2_Template, 8, 17, "div", 24, _forTrack0);
158
156
  i0.ɵɵelementEnd();
159
157
  } if (rf & 2) {
160
158
  const ctx_r1 = i0.ɵɵnextContext();
161
- i0.ɵɵproperty("columns", ctx_r1.config.columns)("rowHeight", ctx_r1.config.rowHeight)("resizable", ctx_r1.allowResize)("reorderable", ctx_r1.allowReorder);
159
+ i0.ɵɵstyleProp("grid-template-columns", "repeat(" + ctx_r1.config.columns + ", 1fr)")("grid-auto-rows", ctx_r1.config.rowHeight + "px");
162
160
  i0.ɵɵadvance();
163
161
  i0.ɵɵrepeater(ctx_r1.items);
164
162
  } }
@@ -183,7 +181,6 @@ export class SingleDashboardComponent extends BaseDashboard {
183
181
  selectedResource;
184
182
  selectedDashboardItem;
185
183
  saveChangesSubject = new Subject();
186
- selectedComponent = null;
187
184
  editOnLoad = false;
188
185
  recentAccessService;
189
186
  get contentLoading() {
@@ -418,36 +415,28 @@ export class SingleDashboardComponent extends BaseDashboard {
418
415
  return this.isEditingDashboard ? "bg-dark-grey" : "bg-blue";
419
416
  }
420
417
  onReorder(e) {
421
- const item = this.items.find(i => i.uniqueId === parseInt(e.item.elem.nativeElement.id));
418
+ const item = e.uniqueId != null ? this.items.find(i => i.uniqueId === e.uniqueId) : this.items[e.oldIndex];
422
419
  if (item) {
423
- // move the item in our config state to the new index
424
420
  if (e.oldIndex !== e.newIndex) {
425
421
  this.items.splice(e.oldIndex, 1);
426
422
  this.items.splice(e.newIndex, 0, item);
427
423
  }
428
- //item.order = e.item.order;
429
- item.col = e.newCol ? e.newCol : item.col;
430
- item.row = e.newRow ? e.newRow : item.row;
424
+ item.col = e.newCol ?? item.col;
425
+ item.row = e.newRow ?? item.row;
431
426
  }
432
427
  }
433
428
  onResize(e) {
434
- const item = this.items.find(i => i.uniqueId === parseInt(e.item.elem.nativeElement.id));
429
+ const item = e.uniqueId != null ? this.items.find(i => i.uniqueId === e.uniqueId) : undefined;
435
430
  if (item) {
436
431
  item.colSpan = e.newColSpan;
437
432
  item.rowSpan = e.newRowSpan;
438
433
  }
439
434
  }
440
435
  onMouseEnter(e) {
441
- this.selectedComponent = e.target;
436
+ // Available for future drag-and-drop support
442
437
  }
443
438
  onMouseOut(e) {
444
- this.selectedComponent = null;
445
- }
446
- //Apply this style to the component we're hovering over
447
- //so that it is not offset by a wide margin when we click/drag it
448
- //https://github.com/telerik/kendo-angular/issues/3492
449
- getSelectedComponentStyle(component) {
450
- return this.selectedComponent === component ? "position: unset" : "";
439
+ // Available for future drag-and-drop support
451
440
  }
452
441
  /**
453
442
  * Get the appropriate icon for a resource type
@@ -474,7 +463,7 @@ export class SingleDashboardComponent extends BaseDashboard {
474
463
  } if (rf & 2) {
475
464
  let _t;
476
465
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.dashboardNameInput = _t.first);
477
- } }, inputs: { ResourceData: "ResourceData" }, outputs: { dashboardSaved: "dashboardSaved", loadComplete: "loadComplete", loadStarted: "loadStarted" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 14, vars: 7, consts: [["dashboardNameInput", ""], [3, "selectedResource"], [3, "dashboardItem"], [1, "dashboard-container"], [1, "main-head-dashboard"], [1, "dashboard-title"], [1, "dashboard-header", "k-d-flex", "k-flex-row", "k-justify-content-flex-end"], [1, "tile-resource-container"], [1, "empty-dashboard"], [3, "columns", "rowHeight", "resizable", "reorderable"], [3, "onClose", "selectedResource"], [3, "onClose", "triggerAddItem", "onSave", "items", "config"], [3, "removeDashboardItem", "onClose", "dashboardItem"], ["type", "text", "placeholder", "Enter name here", "id", "txtDashboardName", 1, "k-textbox", "k-input", "k-input-md", "k-rounded-md", "k-input-solid", 3, "keydown.enter"], ["kendoButton", "", 3, "click"], [1, "k-i-check", "k-button-icon", "k-icon", "ng-star-inserted"], [1, "k-icon", "k-i-cancel"], [1, "k-icon", "k-i-star"], [3, "click"], [1, "fa-solid", "fa-check"], [1, "fa-solid", "fa-xmark"], [1, "fa-solid", "fa-plus"], [1, "fa-solid", "fa-gear"], ["aria-hidden", "true", 1, "fa-solid", "fa-grip-vertical"], ["kendoButton", "", "themeColor", "primary", 3, "click"], [3, "reorder", "resize", "columns", "rowHeight", "resizable", "reorderable"], [3, "ngClass", "col", "colSpan", "rowSpan", "id"], [3, "mouseenter", "mouseleave", "ngClass", "col", "colSpan", "rowSpan", "id"], [3, "ngClass"], [1, "item-title"], ["aria-hidden", "true"], [3, "ContentLoadingStarted", "ContentLoadingComplete", "Data", "isVisible"], [1, "btn-wrapper"], ["kendoButton", "", "title", "Edit dashboard", 3, "click"], [1, "fa-solid", "fa-pen-to-square"], ["kendoButton", "", "title", "Remove item", 3, "click"], [1, "fa-solid", "fa-trash"]], template: function SingleDashboardComponent_Template(rf, ctx) { if (rf & 1) {
466
+ } }, inputs: { ResourceData: "ResourceData" }, outputs: { dashboardSaved: "dashboardSaved", loadComplete: "loadComplete", loadStarted: "loadStarted" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 14, vars: 7, consts: [["dashboardNameInput", ""], [3, "selectedResource"], [3, "dashboardItem"], [1, "dashboard-container"], [1, "main-head-dashboard"], [1, "dashboard-title"], [1, "dashboard-header"], [1, "tile-resource-container"], [1, "empty-dashboard"], [1, "mj-tile-layout", 3, "grid-template-columns", "grid-auto-rows"], [3, "onClose", "selectedResource"], [3, "onClose", "triggerAddItem", "onSave", "items", "config"], [3, "removeDashboardItem", "onClose", "dashboardItem"], ["type", "text", "placeholder", "Enter name here", "id", "txtDashboardName", 1, "mj-input", 3, "keydown.enter"], ["mjButton", "", 3, "click"], [1, "fa-solid", "fa-check"], [1, "fa-solid", "fa-xmark"], ["aria-hidden", "true", 1, "fa-solid", "fa-star", "dashboard-star-icon"], [3, "click"], [1, "fa-solid", "fa-plus"], [1, "fa-solid", "fa-gear"], ["aria-hidden", "true", 1, "fa-solid", "fa-grip-vertical"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "mj-tile-layout"], [1, "mj-tile-item", 3, "grid-column", "grid-row", "id"], [1, "mj-tile-item", 3, "mouseenter", "mouseleave", "id"], [1, "mj-tile-header", 3, "ngClass"], [1, "item-title"], ["aria-hidden", "true"], [1, "mj-tile-body", 3, "ngClass"], [3, "ContentLoadingStarted", "ContentLoadingComplete", "Data", "isVisible"], [1, "btn-wrapper"], ["mjButton", "", "title", "Edit dashboard", 3, "click"], [1, "fa-solid", "fa-pen-to-square"], ["mjButton", "", "title", "Remove item", 3, "click"], [1, "fa-solid", "fa-trash"]], template: function SingleDashboardComponent_Template(rf, ctx) { if (rf & 1) {
478
467
  i0.ɵɵconditionalCreate(0, SingleDashboardComponent_Conditional_0_Template, 1, 1, "app-add-item-dialog", 1);
479
468
  i0.ɵɵconditionalCreate(1, SingleDashboardComponent_Conditional_1_Template, 2, 2, "div");
480
469
  i0.ɵɵconditionalCreate(2, SingleDashboardComponent_Conditional_2_Template, 1, 1, "app-delete-item-dialog", 2);
@@ -486,7 +475,7 @@ export class SingleDashboardComponent extends BaseDashboard {
486
475
  i0.ɵɵelementEnd()();
487
476
  i0.ɵɵelementStart(11, "div", 7);
488
477
  i0.ɵɵconditionalCreate(12, SingleDashboardComponent_Conditional_12_Template, 9, 0, "div", 8);
489
- i0.ɵɵconditionalCreate(13, SingleDashboardComponent_Conditional_13_Template, 3, 4, "kendo-tilelayout", 9);
478
+ i0.ɵɵconditionalCreate(13, SingleDashboardComponent_Conditional_13_Template, 3, 4, "div", 9);
490
479
  i0.ɵɵelementEnd()();
491
480
  } if (rf & 2) {
492
481
  i0.ɵɵconditional(ctx.isItemDialogOpened ? 0 : -1);
@@ -502,11 +491,11 @@ export class SingleDashboardComponent extends BaseDashboard {
502
491
  i0.ɵɵconditional(ctx.items.length === 0 && !ctx.isEditingDashboard ? 12 : -1);
503
492
  i0.ɵɵadvance();
504
493
  i0.ɵɵconditional(ctx.items.length > 0 || ctx.isEditingDashboard ? 13 : -1);
505
- } }, styles: ["[_nghost-%COMP%] {\n display: block;\n padding: 20px;\n height: 100%;\n box-sizing: border-box;\n}\n\n.dashboard-container[_ngcontent-%COMP%] {\n height: calc(100% - 60px);\n overflow: auto;\n}\n\n.dashboard-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 15px;\n}\n\n.dashboard-title[_ngcontent-%COMP%] .k-icon[_ngcontent-%COMP%] {\n color: var(--border-blue);\n font-size: 25px;\n}\n\n.dashboard-title[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 28px;\n font-style: normal;\n font-weight: 300;\n line-height: 28px;\n margin: 0;\n cursor: pointer;\n}\n\n.dashboard-title[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]:hover {\n text-decoration: underline;\n}\n\n.dashboard-header[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n align-items: center;\n}\n\n .dashboard-header .k-button-solid-base {\n border: 1px solid var(--border-blue) !important;\n color: var(--border-blue) !important;\n border-radius: 10px;\n line-height: 34px;\n background: var(--white-color);\n}\n\n .dashboard-header .k-button-solid-primary {\n background: var(--border-blue) !important;\n color: var(--white-color) !important;\n border-radius: 10px;\n line-height: 34px;\n border-color: var(--border-blue);\n}\n\n .dashboard-header .btn-ref .k-button-text {\n display: flex;\n gap: 10px;\n}\n\n.dashboard-header[_ngcontent-%COMP%] .btn-ref[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n}\n\n.main-head-dashboard[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n padding-bottom: 20px;\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\n}\n\n.tile-resource-container[_ngcontent-%COMP%] {\n margin-top: 20px;\n padding: 15px;\n border-radius: 8px;\n background-color: var(--mj-bg-surface-card);\n}\n\n.tile-resource-container[_ngcontent-%COMP%] .k-tilelayout[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);\n border-radius: 8px;\n padding: 10px;\n}\n\n\n\n kendo-tilelayout-item {\n border-radius: 6px;\n overflow: hidden;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n margin: 5px;\n}\n\n.bg-light-grey[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.bg-dark-grey[_ngcontent-%COMP%] {\n background-color: var(--mj-text-secondary);\n color: white;\n}\n\n.bg-blue[_ngcontent-%COMP%] {\n background-color: var(--mj-brand-primary);\n color: white;\n}\n\n.dashboard-item-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 15px;\n font-weight: 500;\n}\n\n.dashboard-item-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 8px;\n}\n\n.button-spacing[_ngcontent-%COMP%] {\n margin-right: 8px;\n}\n\n.btn-wrapper[_ngcontent-%COMP%] {\n display: flex;\n gap: 5px;\n}\n\n.btn-wrapper[_ngcontent-%COMP%] > button[_ngcontent-%COMP%] {\n margin-left: 5px;\n}\n\n\n\n.empty-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n text-align: center;\n color: var(--mj-text-secondary);\n background-color: var(--mj-bg-surface-card);\n border-radius: 8px;\n margin-top: 20px;\n}\n\n.empty-dashboard[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n margin-bottom: 20px;\n color: var(--mj-border-strong);\n}\n\n.empty-dashboard[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin-bottom: 10px;\n}\n\n.empty-dashboard[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}"] });
494
+ } }, styles: ["[_nghost-%COMP%] {\n display: block;\n padding: 20px;\n height: 100%;\n box-sizing: border-box;\n}\n\n.dashboard-container[_ngcontent-%COMP%] {\n height: calc(100% - 60px);\n overflow: auto;\n}\n\n.dashboard-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 15px;\n}\n\n.dashboard-star-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 22px;\n}\n\n.dashboard-title[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 28px;\n font-style: normal;\n font-weight: 300;\n line-height: 28px;\n margin: 0;\n cursor: pointer;\n}\n\n.dashboard-title[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]:hover {\n text-decoration: underline;\n}\n\n.dashboard-header[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n align-items: center;\n justify-content: flex-end;\n}\n\n.button-spacing[_ngcontent-%COMP%] {\n margin-right: 8px;\n}\n\n.btn-wrapper[_ngcontent-%COMP%] {\n display: flex;\n gap: 5px;\n}\n\n.btn-wrapper[_ngcontent-%COMP%] > button[_ngcontent-%COMP%] {\n margin-left: 5px;\n}\n\n.main-head-dashboard[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n padding-bottom: 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.tile-resource-container[_ngcontent-%COMP%] {\n margin-top: 20px;\n padding: 15px;\n border-radius: 8px;\n background-color: var(--mj-bg-surface-card);\n}\n\n\n\n.mj-tile-layout[_ngcontent-%COMP%] {\n display: grid;\n gap: 16px;\n background: var(--mj-bg-surface);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);\n border-radius: 8px;\n padding: 10px;\n}\n\n.mj-tile-item[_ngcontent-%COMP%] {\n border-radius: 6px;\n overflow: hidden;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n background: var(--mj-bg-surface);\n display: flex;\n flex-direction: column;\n}\n\n.mj-tile-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 15px;\n font-weight: 500;\n background-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse, white);\n}\n\n.mj-tile-header[_ngcontent-%COMP%] .item-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mj-tile-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow: auto;\n}\n\n.bg-light-grey[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.bg-dark-grey[_ngcontent-%COMP%] {\n background-color: var(--mj-text-secondary);\n color: var(--mj-text-inverse, white);\n}\n\n.bg-blue[_ngcontent-%COMP%] {\n background-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse, white);\n}\n\n\n\n.empty-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n text-align: center;\n color: var(--mj-text-secondary);\n background-color: var(--mj-bg-surface-card);\n border-radius: 8px;\n margin-top: 20px;\n}\n\n.empty-dashboard[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n margin-bottom: 20px;\n color: var(--mj-border-strong);\n}\n\n.empty-dashboard[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin-bottom: 10px;\n}\n\n.empty-dashboard[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}"] });
506
495
  }
507
496
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SingleDashboardComponent, [{
508
497
  type: Component,
509
- args: [{ standalone: false, selector: 'mj-single-dashboard', template: "@if (isItemDialogOpened) {\n <app-add-item-dialog (onClose)=\"closeDialog($event)\" [selectedResource]=\"selectedResource\"></app-add-item-dialog>\n}\n@if (isEditDialogOpened) {\n <div>\n <app-edit-dashboard (onClose)=\"closeDashboardDialog($event)\" (triggerAddItem)=\"addItem($event)\" [items]=\"items\" [config]=\"config\" (onSave)=\"saveChanges($event)\"></app-edit-dashboard>\n </div>\n}\n\n@if (isDeletingDashboardItem) {\n <app-delete-item-dialog [dashboardItem]=\"selectedDashboardItem\" (removeDashboardItem)=\"deleteDashboardItem($event)\" (onClose)=\"closeDeleteItemComponent()\"></app-delete-item-dialog>\n}\n\n<div class=\"dashboard-container\">\n <div class=\"main-head-dashboard\">\n <div class=\"dashboard-title\">\n @if (isEditDashboardNameDialogOpened) {\n <div class=\"dashboard-header k-d-flex k-flex-row k-justify-content-flex-end\">\n <input class=\"k-textbox k-input k-input-md k-rounded-md k-input-solid\" (keydown.enter)=\"saveDashboardName()\" type=\"text\" placeholder=\"Enter name here\" id=\"txtDashboardName\" #dashboardNameInput>\n <button kendoButton (click)=\"saveDashboardName()\">\n <span class=\"k-i-check k-button-icon k-icon ng-star-inserted\"></span>\n Save\n </button>\n <button kendoButton (click)=\"cancelNameChange()\" >\n <span class=\"k-icon k-i-cancel\"></span>\n Cancel\n </button>\n </div>\n } @else {\n <span class=\"k-icon k-i-star\"></span>\n <h3 (click)=\"toggleInlineNameEdit(true)\">{{dashboardEntity ? dashboardEntity.Name : ''}}</h3>\n }\n </div>\n <div class=\"dashboard-header k-d-flex k-flex-row k-justify-content-flex-end\">\n @if (isEditingDashboard) {\n <div>\n <button kendoButton (click)=\"onClickSaveDashboard()\">\n <span class=\"fa-solid fa-check\"></span>\n Save\n </button>\n <button kendoButton (click)=\"onclickCancelChanges()\">\n <span class=\"fa-solid fa-xmark\"></span>\n Cancel\n </button>\n </div>\n } @else {\n <button kendoButton (click)=\"addItem()\">\n <span class=\"fa-solid fa-plus\"></span>\n Add Item\n </button>\n <button kendoButton (click)=\"toggleEditDashboard(true)\" >\n <span class=\"fa-solid fa-gear\"></span>\n Edit Dashboard\n </button>\n }\n </div>\n </div>\n <div class=\"tile-resource-container\">\n <!-- Show empty state if no items -->\n @if (items.length === 0 && !isEditingDashboard) {\n <div class=\"empty-dashboard\">\n <i class=\"fa-solid fa-grip-vertical\" aria-hidden=\"true\"></i>\n <h3>This dashboard is empty</h3>\n <p>Start by adding reports or user views to your dashboard</p>\n <button kendoButton themeColor=\"primary\" (click)=\"addItem()\">\n <span class=\"fa-solid fa-plus\"></span>\n Add Item\n </button>\n </div>\n }\n\n <!-- Show tile layout if there are items or if editing -->\n @if (items.length > 0 || isEditingDashboard) {\n <kendo-tilelayout\n [columns]=\"config.columns\"\n [rowHeight]=\"config.rowHeight\"\n [resizable]=\"allowResize\"\n [reorderable]=\"allowReorder\"\n (reorder)=\"onReorder($event)\"\n (resize)=\"onResize($event)\"\n >\n @for(item of items; track item.uniqueId) {\n <kendo-tilelayout-item (mouseenter)=\"onMouseEnter($event)\" (mouseleave)=\"onMouseOut($event)\" [ngClass]=\"[getSelectedComponentStyle(this)]\" [col]=\"item.col\" [colSpan]=\"item.colSpan\" [rowSpan]=\"item.rowSpan\" [id]=\"item.uniqueId\">\n <kendo-tilelayout-item-header [ngClass]=\"['dashboard-item-header', getIsEditingItemHeaderStyle()]\">\n <div class=\"item-title\">\n <i [class]=\"getResourceIcon(item.ResourceData.ResourceType)\" aria-hidden=\"true\"></i>\n {{item.title}}\n </div>\n @if(!isEditingDashboard) {\n <div>\n <div class=\"btn-wrapper\">\n <button kendoButton title=\"Edit dashboard\" (click)=\"toggleEditDashboard(true)\">\n <span class=\"fa-solid fa-pen-to-square\"></span>\n </button>\n <button kendoButton title=\"Remove item\" (click)=\"showConfirmDeleteDashboardItem(item)\">\n <span class=\"fa-solid fa-trash\"></span>\n </button>\n </div>\n </div>\n }\n </kendo-tilelayout-item-header>\n <kendo-tilelayout-item-body [ngClass]=\"[getIsEditingItemBodyStyle()]\">\n <mj-resource [Data]=\"item.ResourceData\" [isVisible]=\"true\" (ContentLoadingStarted)=\"loadingStarted($event)\" (ContentLoadingComplete)=\"loadingComplete($event)\"></mj-resource>\n </kendo-tilelayout-item-body>\n </kendo-tilelayout-item>\n }\n </kendo-tilelayout>\n }\n </div>\n</div>\n", styles: [":host {\n display: block;\n padding: 20px;\n height: 100%;\n box-sizing: border-box;\n}\n\n.dashboard-container {\n height: calc(100% - 60px);\n overflow: auto;\n}\n\n.dashboard-title {\n display: flex;\n align-items: center;\n gap: 15px;\n}\n\n.dashboard-title .k-icon {\n color: var(--border-blue);\n font-size: 25px;\n}\n\n.dashboard-title h3 {\n color: var(--mj-text-secondary);\n font-size: 28px;\n font-style: normal;\n font-weight: 300;\n line-height: 28px;\n margin: 0;\n cursor: pointer;\n}\n\n.dashboard-title h3:hover {\n text-decoration: underline;\n}\n\n.dashboard-header {\n display: flex;\n gap: 10px;\n align-items: center;\n}\n\n::ng-deep .dashboard-header .k-button-solid-base {\n border: 1px solid var(--border-blue) !important;\n color: var(--border-blue) !important;\n border-radius: 10px;\n line-height: 34px;\n background: var(--white-color);\n}\n\n::ng-deep .dashboard-header .k-button-solid-primary {\n background: var(--border-blue) !important;\n color: var(--white-color) !important;\n border-radius: 10px;\n line-height: 34px;\n border-color: var(--border-blue);\n}\n\n::ng-deep .dashboard-header .btn-ref .k-button-text {\n display: flex;\n gap: 10px;\n}\n\n.dashboard-header .btn-ref {\n border: none;\n background: transparent;\n}\n\n.main-head-dashboard {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n padding-bottom: 20px;\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\n}\n\n.tile-resource-container {\n margin-top: 20px;\n padding: 15px;\n border-radius: 8px;\n background-color: var(--mj-bg-surface-card);\n}\n\n.tile-resource-container .k-tilelayout {\n background: var(--mj-bg-surface);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);\n border-radius: 8px;\n padding: 10px;\n}\n\n/* Dashboard item styling */\n::ng-deep kendo-tilelayout-item {\n border-radius: 6px;\n overflow: hidden;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n margin: 5px;\n}\n\n.bg-light-grey {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.bg-dark-grey {\n background-color: var(--mj-text-secondary);\n color: white;\n}\n\n.bg-blue {\n background-color: var(--mj-brand-primary);\n color: white;\n}\n\n.dashboard-item-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 15px;\n font-weight: 500;\n}\n\n.dashboard-item-header i {\n margin-right: 8px;\n}\n\n.button-spacing {\n margin-right: 8px;\n}\n\n.btn-wrapper {\n display: flex;\n gap: 5px;\n}\n\n.btn-wrapper > button {\n margin-left: 5px;\n}\n\n/* Empty dashboard state */\n.empty-dashboard {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n text-align: center;\n color: var(--mj-text-secondary);\n background-color: var(--mj-bg-surface-card);\n border-radius: 8px;\n margin-top: 20px;\n}\n\n.empty-dashboard i {\n font-size: 48px;\n margin-bottom: 20px;\n color: var(--mj-border-strong);\n}\n\n.empty-dashboard h3 {\n margin-bottom: 10px;\n}\n\n.empty-dashboard p {\n margin-bottom: 20px;\n}\n"] }]
498
+ args: [{ standalone: false, selector: 'mj-single-dashboard', template: "@if (isItemDialogOpened) {\n <app-add-item-dialog (onClose)=\"closeDialog($event)\" [selectedResource]=\"selectedResource\"></app-add-item-dialog>\n}\n@if (isEditDialogOpened) {\n <div>\n <app-edit-dashboard (onClose)=\"closeDashboardDialog($event)\" (triggerAddItem)=\"addItem($event)\" [items]=\"items\" [config]=\"config\" (onSave)=\"saveChanges($event)\"></app-edit-dashboard>\n </div>\n}\n\n@if (isDeletingDashboardItem) {\n <app-delete-item-dialog [dashboardItem]=\"selectedDashboardItem\" (removeDashboardItem)=\"deleteDashboardItem($event)\" (onClose)=\"closeDeleteItemComponent()\"></app-delete-item-dialog>\n}\n\n<div class=\"dashboard-container\">\n <div class=\"main-head-dashboard\">\n <div class=\"dashboard-title\">\n @if (isEditDashboardNameDialogOpened) {\n <div class=\"dashboard-header\">\n <input class=\"mj-input\" (keydown.enter)=\"saveDashboardName()\" type=\"text\" placeholder=\"Enter name here\" id=\"txtDashboardName\" #dashboardNameInput>\n <button mjButton (click)=\"saveDashboardName()\">\n <span class=\"fa-solid fa-check\"></span>\n Save\n </button>\n <button mjButton (click)=\"cancelNameChange()\" >\n <span class=\"fa-solid fa-xmark\"></span>\n Cancel\n </button>\n </div>\n } @else {\n <i class=\"fa-solid fa-star dashboard-star-icon\" aria-hidden=\"true\"></i>\n <h3 (click)=\"toggleInlineNameEdit(true)\">{{dashboardEntity ? dashboardEntity.Name : ''}}</h3>\n }\n </div>\n <div class=\"dashboard-header\">\n @if (isEditingDashboard) {\n <div>\n <button mjButton (click)=\"onClickSaveDashboard()\">\n <span class=\"fa-solid fa-check\"></span>\n Save\n </button>\n <button mjButton (click)=\"onclickCancelChanges()\">\n <span class=\"fa-solid fa-xmark\"></span>\n Cancel\n </button>\n </div>\n } @else {\n <button mjButton (click)=\"addItem()\">\n <span class=\"fa-solid fa-plus\"></span>\n Add Item\n </button>\n <button mjButton (click)=\"toggleEditDashboard(true)\" >\n <span class=\"fa-solid fa-gear\"></span>\n Edit Dashboard\n </button>\n }\n </div>\n </div>\n <div class=\"tile-resource-container\">\n <!-- Show empty state if no items -->\n @if (items.length === 0 && !isEditingDashboard) {\n <div class=\"empty-dashboard\">\n <i class=\"fa-solid fa-grip-vertical\" aria-hidden=\"true\"></i>\n <h3>This dashboard is empty</h3>\n <p>Start by adding reports or user views to your dashboard</p>\n <button mjButton variant=\"primary\" (click)=\"addItem()\">\n <span class=\"fa-solid fa-plus\"></span>\n Add Item\n </button>\n </div>\n }\n\n <!-- Show tile layout if there are items or if editing -->\n @if (items.length > 0 || isEditingDashboard) {\n <div class=\"mj-tile-layout\"\n [style.grid-template-columns]=\"'repeat(' + config.columns + ', 1fr)'\"\n [style.grid-auto-rows]=\"config.rowHeight + 'px'\">\n @for (item of items; track item.uniqueId) {\n <div class=\"mj-tile-item\"\n [style.grid-column]=\"item.col + ' / span ' + item.colSpan\"\n [style.grid-row]=\"'span ' + item.rowSpan\"\n [id]=\"item.uniqueId\"\n (mouseenter)=\"onMouseEnter($event)\"\n (mouseleave)=\"onMouseOut($event)\">\n <div class=\"mj-tile-header\" [ngClass]=\"[getIsEditingItemHeaderStyle()]\">\n <div class=\"item-title\">\n <i [class]=\"getResourceIcon(item.ResourceData.ResourceType)\" aria-hidden=\"true\"></i>\n {{item.title}}\n </div>\n @if (!isEditingDashboard) {\n <div>\n <div class=\"btn-wrapper\">\n <button mjButton title=\"Edit dashboard\" (click)=\"toggleEditDashboard(true)\">\n <span class=\"fa-solid fa-pen-to-square\"></span>\n </button>\n <button mjButton title=\"Remove item\" (click)=\"showConfirmDeleteDashboardItem(item)\">\n <span class=\"fa-solid fa-trash\"></span>\n </button>\n </div>\n </div>\n }\n </div>\n <div class=\"mj-tile-body\" [ngClass]=\"[getIsEditingItemBodyStyle()]\">\n <mj-resource [Data]=\"item.ResourceData\" [isVisible]=\"true\" (ContentLoadingStarted)=\"loadingStarted($event)\" (ContentLoadingComplete)=\"loadingComplete($event)\"></mj-resource>\n </div>\n </div>\n }\n </div>\n }\n </div>\n</div>\n", styles: [":host {\n display: block;\n padding: 20px;\n height: 100%;\n box-sizing: border-box;\n}\n\n.dashboard-container {\n height: calc(100% - 60px);\n overflow: auto;\n}\n\n.dashboard-title {\n display: flex;\n align-items: center;\n gap: 15px;\n}\n\n.dashboard-star-icon {\n color: var(--mj-brand-primary);\n font-size: 22px;\n}\n\n.dashboard-title h3 {\n color: var(--mj-text-secondary);\n font-size: 28px;\n font-style: normal;\n font-weight: 300;\n line-height: 28px;\n margin: 0;\n cursor: pointer;\n}\n\n.dashboard-title h3:hover {\n text-decoration: underline;\n}\n\n.dashboard-header {\n display: flex;\n gap: 10px;\n align-items: center;\n justify-content: flex-end;\n}\n\n.button-spacing {\n margin-right: 8px;\n}\n\n.btn-wrapper {\n display: flex;\n gap: 5px;\n}\n\n.btn-wrapper > button {\n margin-left: 5px;\n}\n\n.main-head-dashboard {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n padding-bottom: 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.tile-resource-container {\n margin-top: 20px;\n padding: 15px;\n border-radius: 8px;\n background-color: var(--mj-bg-surface-card);\n}\n\n/* CSS Grid tile layout */\n.mj-tile-layout {\n display: grid;\n gap: 16px;\n background: var(--mj-bg-surface);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);\n border-radius: 8px;\n padding: 10px;\n}\n\n.mj-tile-item {\n border-radius: 6px;\n overflow: hidden;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n background: var(--mj-bg-surface);\n display: flex;\n flex-direction: column;\n}\n\n.mj-tile-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 15px;\n font-weight: 500;\n background-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse, white);\n}\n\n.mj-tile-header .item-title {\n display: flex;\n align-items: center;\n gap: 8px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mj-tile-body {\n flex: 1;\n overflow: auto;\n}\n\n.bg-light-grey {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.bg-dark-grey {\n background-color: var(--mj-text-secondary);\n color: var(--mj-text-inverse, white);\n}\n\n.bg-blue {\n background-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse, white);\n}\n\n/* Empty dashboard state */\n.empty-dashboard {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n text-align: center;\n color: var(--mj-text-secondary);\n background-color: var(--mj-bg-surface-card);\n border-radius: 8px;\n margin-top: 20px;\n}\n\n.empty-dashboard i {\n font-size: 48px;\n margin-bottom: 20px;\n color: var(--mj-border-strong);\n}\n\n.empty-dashboard h3 {\n margin-bottom: 10px;\n}\n\n.empty-dashboard p {\n margin-bottom: 20px;\n}\n"] }]
510
499
  }], () => [{ type: i1.ActivatedRoute }, { type: i2.SharedService }], { dashboardNameInput: [{
511
500
  type: ViewChild,
512
501
  args: ['dashboardNameInput']
@@ -519,7 +508,7 @@ export class SingleDashboardComponent extends BaseDashboard {
519
508
  }], loadStarted: [{
520
509
  type: Output
521
510
  }] }); })();
522
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SingleDashboardComponent, { className: "SingleDashboardComponent", filePath: "src/lib/single-dashboard/single-dashboard.component.ts", lineNumber: 18 }); })();
511
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SingleDashboardComponent, { className: "SingleDashboardComponent", filePath: "src/lib/single-dashboard/single-dashboard.component.ts", lineNumber: 17 }); })();
523
512
  export class DashboardConfigDetails {
524
513
  columns = 4;
525
514
  rowHeight = 150;
@@ -1 +1 @@
1
- {"version":3,"file":"single-dashboard.component.js","sourceRoot":"","sources":["../../../src/lib/single-dashboard/single-dashboard.component.ts","../../../src/lib/single-dashboard/single-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';\nimport { TileLayoutReorderEvent, TileLayoutResizeEvent } from \"@progress/kendo-angular-layout\";\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { MJDashboardEntityExtended, MJResourceTypeEntity } from '@memberjunction/core-entities';\nimport { Metadata } from '@memberjunction/core';\nimport { SharedService, RecentAccessService } from '@memberjunction/ng-shared';\nimport { ResourceContainerComponent } from '../generic/resource-container-component';\nimport { Subject, debounceTime } from 'rxjs';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\n\n@Component({\n standalone: false,\n selector: 'mj-single-dashboard',\n templateUrl: './single-dashboard.component.html',\n styleUrls: ['./single-dashboard.component.css']\n})\nexport class SingleDashboardComponent extends BaseDashboard implements OnInit {\n\n @ViewChild('dashboardNameInput') dashboardNameInput!: ElementRef<HTMLInputElement>\n\n @Input() public ResourceData!: ResourceData;\n @Output() public dashboardSaved: EventEmitter<MJDashboardEntityExtended> = new EventEmitter<MJDashboardEntityExtended>();\n @Output() public loadComplete: EventEmitter<any> = new EventEmitter<any>();\n @Output() public loadStarted: EventEmitter<any> = new EventEmitter<any>();\n\n public items: DashboardItem[] = [];\n public dashboardEntity!: MJDashboardEntityExtended;\n public config: DashboardConfigDetails = new DashboardConfigDetails();\n public isItemDialogOpened: boolean = false;\n public isEditDialogOpened: boolean = false;\n public isEditDashboardNameDialogOpened: boolean = false;\n public isDeletingDashboardItem: boolean = false;\n public allowResize: boolean = false;\n public allowReorder: boolean = false;\n public isEditingDashboard: boolean = false;\n public selectedResource!: MJResourceTypeEntity | null;\n public selectedDashboardItem!: DashboardItem | null;\n private saveChangesSubject: Subject<any> = new Subject();\n private selectedComponent: SingleDashboardComponent | null = null;\n private editOnLoad: boolean = false;\n private recentAccessService: RecentAccessService;\n\n public get contentLoading(): boolean {\n for (const item of this.items) {\n if (item.contentLoading) {\n return true;\n }\n }\n return false;\n }\n\n protected initDashboard(): void {\n \n }\n protected loadData(): void {\n \n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return \"Dashboard\"\n }\n\n constructor(private route: ActivatedRoute, public sharedService: SharedService) {\n super();\n this.recentAccessService = new RecentAccessService();\n\n this.saveChangesSubject\n .pipe(debounceTime(500))\n .subscribe(() => {\n this.SaveDashboard();\n });\n\n let edit = this.route.snapshot.queryParamMap.get('edit');\n if(edit){\n this.editOnLoad = true;\n }\n }\n\n async ngOnInit(): Promise<void> {\n // load up the dashboard\n const d = this.ResourceData;\n const config = this.ResourceData.Configuration;\n if (this.ResourceData) {\n const md = new Metadata();\n let uiConfig: any = {items:[]};\n this.dashboardEntity = await md.GetEntityObject<MJDashboardEntityExtended>('MJ: Dashboards');\n if (this.ResourceData.ResourceRecordID && this.ResourceData.ResourceRecordID.length > 0) {\n await this.dashboardEntity.Load(this.ResourceData.ResourceRecordID);\n // Log access to dashboard (fire-and-forget, don't await)\n this.recentAccessService.logAccess('Dashboards', this.ResourceData.ResourceRecordID, 'dashboard');\n\n // now we have loaded and we need to get the UIConfigDetails\n const raw = this.dashboardEntity.UIConfigDetails;\n if (raw) {\n uiConfig = JSON.parse(raw);\n this.config.columns = uiConfig.columns;\n this.config.rowHeight = uiConfig.rowHeight;\n this.config.resizable = uiConfig.resizable;\n this.config.reorderable = uiConfig.reorderable;\n }\n\n //the save and canel functions call this function\n //and we only want to show the edit view once\n if(this.editOnLoad){\n this.editOnLoad = false;\n this.toggleEditDashboard(true);\n }\n }\n else {\n this.dashboardEntity.NewRecord(); // creating a new dashboard\n this.dashboardEntity.UserID = md.CurrentUser.ID;\n \n // We should never get here now because dashboard creation is handled in dashboard-browser\n // But just in case, set a better default name\n this.dashboardEntity.Name = 'My Dashboard';\n \n // Set default configuration\n this.config.columns = 4; // 4-column layout\n this.config.rowHeight = 150;\n this.config.resizable = true;\n this.config.reorderable = true;\n \n // Automatically show edit mode for new dashboards to encourage adding items\n setTimeout(() => {\n this.toggleEditDashboard(true);\n }, 500);\n }\n\n // now we need to load up the items\n this.items = [];\n //const tempItems = uiConfig.items.sort((a: any, b: any) => a.order - b.order);\n for (const item of uiConfig.items) {\n const dashboardItem = this.CreateDashboardItem(item);\n this.items.push(dashboardItem);\n }\n }\n\n this.NotifyLoadComplete();\n }\n\n protected CreateDashboardItem(item: any): DashboardItem {\n const dashboardItem = new DashboardItem();\n if (item) {\n dashboardItem.title = item.title;\n dashboardItem.order = item.order ? item.order : 0;\n dashboardItem.col = item.col;\n dashboardItem.row = item.row;\n dashboardItem.rowSpan = item.rowSpan;\n dashboardItem.colSpan = item.colSpan;\n dashboardItem.ResourceData = new ResourceData(item.ResourceData); \n }\n return dashboardItem;\n }\n\n public loadingStarted(resourceComponent: ResourceContainerComponent) {\n // look up the copmonent in the \n const item = this.items.find(i => i.ResourceData === resourceComponent.Data);\n if (item) {\n item.contentLoading = true;\n this.loadStarted.emit();\n }\n }\n\n public loadingComplete(resourceComponent: ResourceContainerComponent) {\n // look up the copmonent in the \n const item = this.items.find(i => i.ResourceData === resourceComponent.Data);\n if (item) {\n item.contentLoading = false;\n if (!this.contentLoading) {\n this.loadComplete.emit();\n }\n }\n }\n\n public addItem(resourceType: any = null): void {\n this.selectedResource = resourceType;\n this.isItemDialogOpened = true;\n this.isEditDialogOpened = false;\n }\n\n public closeDialog(data: any): void {\n if(data) {\n const dashboardItem = this.CreateDashboardItem(data);\n this.items.push(dashboardItem);\n console.log(dashboardItem);\n this.saveChangesSubject.next(true);\n }\n this.selectedResource = null;\n this.isItemDialogOpened = false;\n }\n\n public toggleEditDashboard(allowEdit: boolean): void {\n this.allowReorder = allowEdit;\n this.allowResize = allowEdit;\n this.isEditingDashboard = allowEdit;\n this.toggleInlineNameEdit(false);\n }\n\n public async onClickSaveDashboard(): Promise<void> {\n this.toggleEditDashboard(false);\n let result = await this.SaveDashboard();\n if(result){\n this.sharedService.CreateSimpleNotification(\"Dashboard changes have been saved.\", \"success\", 1000);\n await this.ngOnInit();\n }\n else{\n this.sharedService.CreateSimpleNotification(\"An error occured saving the dashboard changes\", \"error\", 1000);\n }\n }\n\n public async onclickCancelChanges(): Promise<void> {\n this.toggleEditDashboard(false);\n await this.ngOnInit();\n }\n\n public closeDashboardDialog(data: any = null){\n this.isEditDialogOpened = false;\n }\n\n saveChanges(data: any): void {\n if(data.config){\n this.config = data.config;\n }\n if(data.itemsChanged && data.items){\n this.items = data.items;\n this.sharedService.InvokeManualResize();\n }\n this.SaveDashboard();\n this.closeDashboardDialog();\n }\n\n public async SaveDashboard(): Promise<boolean> {\n if (this.dashboardEntity) {\n const configData = {\n columns: this.config.columns,\n rowHeight: this.config.rowHeight,\n resizable: this.config.resizable,\n reorderable: this.config.reorderable,\n items: this.items\n }\n const configJSON = JSON.stringify(configData);\n this.dashboardEntity.UIConfigDetails = configJSON;\n const result = await this.dashboardEntity.Save();\n \n return result;\n }\n else \n return false;\n }\n\n public dashboardSaveComplete(entity: MJDashboardEntityExtended): void {\n this.dashboardSaved.emit(entity);\n }\n\n public toggleInlineNameEdit(visible: boolean): void {\n this.isEditDashboardNameDialogOpened = visible;\n if(this.isEditDashboardNameDialogOpened){\n this.dashboardNameInput?.nativeElement?.focus();\n }\n }\n\n public saveDashboardName(): void {\n this.toggleInlineNameEdit(true);\n const inputValue = this.dashboardNameInput.nativeElement.value;\n if(inputValue && inputValue.length > 3){\n this.dashboardEntity.Name = inputValue;\n this.SaveDashboard();\n }\n else {\n this.sharedService.CreateSimpleNotification('Invalid dashboard name: Must be at least 3 characters.','warning', 1000);\n }\n }\n\n public cancelNameChange(): void {\n this.toggleInlineNameEdit(false);\n }\n\n public closeDeleteItemComponent(): void {\n this.selectedDashboardItem = null;\n this.isDeletingDashboardItem = false;\n }\n\n public showConfirmDeleteDashboardItem(item: DashboardItem): void {\n this.selectedDashboardItem = item;\n this.isDeletingDashboardItem = true;\n }\n\n public async deleteDashboardItem(item: DashboardItem): Promise<void> {\n this.items = this.items.filter(i => i.uniqueId != item.uniqueId);\n let result = await this.SaveDashboard();\n if(result){\n this.sharedService.CreateSimpleNotification(`Dashboard item ${item.uniqueId} deleted successfully`, \"success\", 1000);\n }\n else{\n this.sharedService.CreateSimpleNotification(`Unable to delete dashboard item ${item.uniqueId}`, \"error\", 1000);\n }\n this.selectedDashboardItem = null;\n this.isDeletingDashboardItem = false;\n }\n\n public getIsEditingItemBodyStyle(): string {\n return this.isEditingDashboard ? \"bg-light-grey\" : \"\";\n }\n\n public getIsEditingItemHeaderStyle(): string {\n return this.isEditingDashboard ? \"bg-dark-grey\" : \"bg-blue\";\n }\n\n onReorder(e: TileLayoutReorderEvent): void {\n const item = this.items.find(i => i.uniqueId === parseInt(e.item.elem.nativeElement.id));\n if (item) {\n // move the item in our config state to the new index\n if (e.oldIndex !== e.newIndex) {\n this.items.splice(e.oldIndex, 1);\n this.items.splice(e.newIndex, 0, item); \n }\n //item.order = e.item.order;\n item.col = e.newCol ? e.newCol : item.col;\n item.row = e.newRow ? e.newRow : item.row;\n }\n }\n \n onResize(e: TileLayoutResizeEvent): void {\n const item = this.items.find(i => i.uniqueId === parseInt(e.item.elem.nativeElement.id));\n if (item) { \n item.colSpan = e.newColSpan;\n item.rowSpan = e.newRowSpan;\n }\n }\n\n onMouseEnter(e: MouseEvent): void {\n this.selectedComponent = <SingleDashboardComponent>(e.target as any);\n }\n\n onMouseOut(e: MouseEvent): void {\n this.selectedComponent = null;\n }\n\n //Apply this style to the component we're hovering over\n //so that it is not offset by a wide margin when we click/drag it\n //https://github.com/telerik/kendo-angular/issues/3492\n getSelectedComponentStyle(component: SingleDashboardComponent): string {\n return this.selectedComponent === component ? \"position: unset\" : \"\";\n }\n\n /**\n * Get the appropriate icon for a resource type\n * @param resourceType The type of resource\n * @returns FontAwesome icon class\n */\n getResourceIcon(resourceType: string | undefined): string {\n // Default to a cube icon if type is undefined\n if (!resourceType) return 'fa-solid fa-cube';\n \n // Map resource types to appropriate FontAwesome icons\n const iconMap: {[key: string]: string} = {\n 'Reports': 'fa-solid fa-chart-line',\n 'UserViews': 'fa-solid fa-table',\n 'Dashboards': 'fa-solid fa-grip',\n 'Lists': 'fa-solid fa-list',\n 'default': 'fa-solid fa-cube'\n };\n \n return iconMap[resourceType] || iconMap['default'];\n }\n}\n\nexport class DashboardConfigDetails {\n columns: number = 4;\n rowHeight: number = 150;\n resizable: boolean = true;\n reorderable: boolean = true;\n}\n\nexport class DashboardItem {\n private static nextUniqueId: number = 1;\n private getNextUniqueID(): number {\n return DashboardItem.nextUniqueId++;\n }\n constructor() {\n this.uniqueId = this.getNextUniqueID();\n }\n uniqueId!: number;\n title!: string;\n col!: number;\n row!: number;\n rowSpan!: number;\n colSpan!: number;\n order!: number;\n ResourceData!: ResourceData;\n contentLoading: boolean = false;\n}","@if (isItemDialogOpened) {\n <app-add-item-dialog (onClose)=\"closeDialog($event)\" [selectedResource]=\"selectedResource\"></app-add-item-dialog>\n}\n@if (isEditDialogOpened) {\n <div>\n <app-edit-dashboard (onClose)=\"closeDashboardDialog($event)\" (triggerAddItem)=\"addItem($event)\" [items]=\"items\" [config]=\"config\" (onSave)=\"saveChanges($event)\"></app-edit-dashboard>\n </div>\n}\n\n@if (isDeletingDashboardItem) {\n <app-delete-item-dialog [dashboardItem]=\"selectedDashboardItem\" (removeDashboardItem)=\"deleteDashboardItem($event)\" (onClose)=\"closeDeleteItemComponent()\"></app-delete-item-dialog>\n}\n\n<div class=\"dashboard-container\">\n <div class=\"main-head-dashboard\">\n <div class=\"dashboard-title\">\n @if (isEditDashboardNameDialogOpened) {\n <div class=\"dashboard-header k-d-flex k-flex-row k-justify-content-flex-end\">\n <input class=\"k-textbox k-input k-input-md k-rounded-md k-input-solid\" (keydown.enter)=\"saveDashboardName()\" type=\"text\" placeholder=\"Enter name here\" id=\"txtDashboardName\" #dashboardNameInput>\n <button kendoButton (click)=\"saveDashboardName()\">\n <span class=\"k-i-check k-button-icon k-icon ng-star-inserted\"></span>\n Save\n </button>\n <button kendoButton (click)=\"cancelNameChange()\" >\n <span class=\"k-icon k-i-cancel\"></span>\n Cancel\n </button>\n </div>\n } @else {\n <span class=\"k-icon k-i-star\"></span>\n <h3 (click)=\"toggleInlineNameEdit(true)\">{{dashboardEntity ? dashboardEntity.Name : ''}}</h3>\n }\n </div>\n <div class=\"dashboard-header k-d-flex k-flex-row k-justify-content-flex-end\">\n @if (isEditingDashboard) {\n <div>\n <button kendoButton (click)=\"onClickSaveDashboard()\">\n <span class=\"fa-solid fa-check\"></span>\n Save\n </button>\n <button kendoButton (click)=\"onclickCancelChanges()\">\n <span class=\"fa-solid fa-xmark\"></span>\n Cancel\n </button>\n </div>\n } @else {\n <button kendoButton (click)=\"addItem()\">\n <span class=\"fa-solid fa-plus\"></span>\n Add Item\n </button>\n <button kendoButton (click)=\"toggleEditDashboard(true)\" >\n <span class=\"fa-solid fa-gear\"></span>\n Edit Dashboard\n </button>\n }\n </div>\n </div>\n <div class=\"tile-resource-container\">\n <!-- Show empty state if no items -->\n @if (items.length === 0 && !isEditingDashboard) {\n <div class=\"empty-dashboard\">\n <i class=\"fa-solid fa-grip-vertical\" aria-hidden=\"true\"></i>\n <h3>This dashboard is empty</h3>\n <p>Start by adding reports or user views to your dashboard</p>\n <button kendoButton themeColor=\"primary\" (click)=\"addItem()\">\n <span class=\"fa-solid fa-plus\"></span>\n Add Item\n </button>\n </div>\n }\n\n <!-- Show tile layout if there are items or if editing -->\n @if (items.length > 0 || isEditingDashboard) {\n <kendo-tilelayout\n [columns]=\"config.columns\"\n [rowHeight]=\"config.rowHeight\"\n [resizable]=\"allowResize\"\n [reorderable]=\"allowReorder\"\n (reorder)=\"onReorder($event)\"\n (resize)=\"onResize($event)\"\n >\n @for(item of items; track item.uniqueId) {\n <kendo-tilelayout-item (mouseenter)=\"onMouseEnter($event)\" (mouseleave)=\"onMouseOut($event)\" [ngClass]=\"[getSelectedComponentStyle(this)]\" [col]=\"item.col\" [colSpan]=\"item.colSpan\" [rowSpan]=\"item.rowSpan\" [id]=\"item.uniqueId\">\n <kendo-tilelayout-item-header [ngClass]=\"['dashboard-item-header', getIsEditingItemHeaderStyle()]\">\n <div class=\"item-title\">\n <i [class]=\"getResourceIcon(item.ResourceData.ResourceType)\" aria-hidden=\"true\"></i>\n {{item.title}}\n </div>\n @if(!isEditingDashboard) {\n <div>\n <div class=\"btn-wrapper\">\n <button kendoButton title=\"Edit dashboard\" (click)=\"toggleEditDashboard(true)\">\n <span class=\"fa-solid fa-pen-to-square\"></span>\n </button>\n <button kendoButton title=\"Remove item\" (click)=\"showConfirmDeleteDashboardItem(item)\">\n <span class=\"fa-solid fa-trash\"></span>\n </button>\n </div>\n </div>\n }\n </kendo-tilelayout-item-header>\n <kendo-tilelayout-item-body [ngClass]=\"[getIsEditingItemBodyStyle()]\">\n <mj-resource [Data]=\"item.ResourceData\" [isVisible]=\"true\" (ContentLoadingStarted)=\"loadingStarted($event)\" (ContentLoadingComplete)=\"loadingComplete($event)\"></mj-resource>\n </kendo-tilelayout-item-body>\n </kendo-tilelayout-item>\n }\n </kendo-tilelayout>\n }\n </div>\n</div>\n"]}
1
+ {"version":3,"file":"single-dashboard.component.js","sourceRoot":"","sources":["../../../src/lib/single-dashboard/single-dashboard.component.ts","../../../src/lib/single-dashboard/single-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { MJDashboardEntityExtended, MJResourceTypeEntity } from '@memberjunction/core-entities';\nimport { Metadata } from '@memberjunction/core';\nimport { SharedService, RecentAccessService } from '@memberjunction/ng-shared';\nimport { ResourceContainerComponent } from '../generic/resource-container-component';\nimport { Subject, debounceTime } from 'rxjs';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\n\n@Component({\n standalone: false,\n selector: 'mj-single-dashboard',\n templateUrl: './single-dashboard.component.html',\n styleUrls: ['./single-dashboard.component.css']\n})\nexport class SingleDashboardComponent extends BaseDashboard implements OnInit {\n\n @ViewChild('dashboardNameInput') dashboardNameInput!: ElementRef<HTMLInputElement>\n\n @Input() public ResourceData!: ResourceData;\n @Output() public dashboardSaved: EventEmitter<MJDashboardEntityExtended> = new EventEmitter<MJDashboardEntityExtended>();\n @Output() public loadComplete: EventEmitter<any> = new EventEmitter<any>();\n @Output() public loadStarted: EventEmitter<any> = new EventEmitter<any>();\n\n public items: DashboardItem[] = [];\n public dashboardEntity!: MJDashboardEntityExtended;\n public config: DashboardConfigDetails = new DashboardConfigDetails();\n public isItemDialogOpened: boolean = false;\n public isEditDialogOpened: boolean = false;\n public isEditDashboardNameDialogOpened: boolean = false;\n public isDeletingDashboardItem: boolean = false;\n public allowResize: boolean = false;\n public allowReorder: boolean = false;\n public isEditingDashboard: boolean = false;\n public selectedResource!: MJResourceTypeEntity | null;\n public selectedDashboardItem!: DashboardItem | null;\n private saveChangesSubject: Subject<any> = new Subject();\n private editOnLoad: boolean = false;\n private recentAccessService: RecentAccessService;\n\n public get contentLoading(): boolean {\n for (const item of this.items) {\n if (item.contentLoading) {\n return true;\n }\n }\n return false;\n }\n\n protected initDashboard(): void {\n \n }\n protected loadData(): void {\n \n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return \"Dashboard\"\n }\n\n constructor(private route: ActivatedRoute, public sharedService: SharedService) {\n super();\n this.recentAccessService = new RecentAccessService();\n\n this.saveChangesSubject\n .pipe(debounceTime(500))\n .subscribe(() => {\n this.SaveDashboard();\n });\n\n let edit = this.route.snapshot.queryParamMap.get('edit');\n if(edit){\n this.editOnLoad = true;\n }\n }\n\n async ngOnInit(): Promise<void> {\n // load up the dashboard\n const d = this.ResourceData;\n const config = this.ResourceData.Configuration;\n if (this.ResourceData) {\n const md = new Metadata();\n let uiConfig: any = {items:[]};\n this.dashboardEntity = await md.GetEntityObject<MJDashboardEntityExtended>('MJ: Dashboards');\n if (this.ResourceData.ResourceRecordID && this.ResourceData.ResourceRecordID.length > 0) {\n await this.dashboardEntity.Load(this.ResourceData.ResourceRecordID);\n // Log access to dashboard (fire-and-forget, don't await)\n this.recentAccessService.logAccess('Dashboards', this.ResourceData.ResourceRecordID, 'dashboard');\n\n // now we have loaded and we need to get the UIConfigDetails\n const raw = this.dashboardEntity.UIConfigDetails;\n if (raw) {\n uiConfig = JSON.parse(raw);\n this.config.columns = uiConfig.columns;\n this.config.rowHeight = uiConfig.rowHeight;\n this.config.resizable = uiConfig.resizable;\n this.config.reorderable = uiConfig.reorderable;\n }\n\n //the save and canel functions call this function\n //and we only want to show the edit view once\n if(this.editOnLoad){\n this.editOnLoad = false;\n this.toggleEditDashboard(true);\n }\n }\n else {\n this.dashboardEntity.NewRecord(); // creating a new dashboard\n this.dashboardEntity.UserID = md.CurrentUser.ID;\n \n // We should never get here now because dashboard creation is handled in dashboard-browser\n // But just in case, set a better default name\n this.dashboardEntity.Name = 'My Dashboard';\n \n // Set default configuration\n this.config.columns = 4; // 4-column layout\n this.config.rowHeight = 150;\n this.config.resizable = true;\n this.config.reorderable = true;\n \n // Automatically show edit mode for new dashboards to encourage adding items\n setTimeout(() => {\n this.toggleEditDashboard(true);\n }, 500);\n }\n\n // now we need to load up the items\n this.items = [];\n //const tempItems = uiConfig.items.sort((a: any, b: any) => a.order - b.order);\n for (const item of uiConfig.items) {\n const dashboardItem = this.CreateDashboardItem(item);\n this.items.push(dashboardItem);\n }\n }\n\n this.NotifyLoadComplete();\n }\n\n protected CreateDashboardItem(item: any): DashboardItem {\n const dashboardItem = new DashboardItem();\n if (item) {\n dashboardItem.title = item.title;\n dashboardItem.order = item.order ? item.order : 0;\n dashboardItem.col = item.col;\n dashboardItem.row = item.row;\n dashboardItem.rowSpan = item.rowSpan;\n dashboardItem.colSpan = item.colSpan;\n dashboardItem.ResourceData = new ResourceData(item.ResourceData); \n }\n return dashboardItem;\n }\n\n public loadingStarted(resourceComponent: ResourceContainerComponent) {\n // look up the copmonent in the \n const item = this.items.find(i => i.ResourceData === resourceComponent.Data);\n if (item) {\n item.contentLoading = true;\n this.loadStarted.emit();\n }\n }\n\n public loadingComplete(resourceComponent: ResourceContainerComponent) {\n // look up the copmonent in the \n const item = this.items.find(i => i.ResourceData === resourceComponent.Data);\n if (item) {\n item.contentLoading = false;\n if (!this.contentLoading) {\n this.loadComplete.emit();\n }\n }\n }\n\n public addItem(resourceType: any = null): void {\n this.selectedResource = resourceType;\n this.isItemDialogOpened = true;\n this.isEditDialogOpened = false;\n }\n\n public closeDialog(data: any): void {\n if(data) {\n const dashboardItem = this.CreateDashboardItem(data);\n this.items.push(dashboardItem);\n console.log(dashboardItem);\n this.saveChangesSubject.next(true);\n }\n this.selectedResource = null;\n this.isItemDialogOpened = false;\n }\n\n public toggleEditDashboard(allowEdit: boolean): void {\n this.allowReorder = allowEdit;\n this.allowResize = allowEdit;\n this.isEditingDashboard = allowEdit;\n this.toggleInlineNameEdit(false);\n }\n\n public async onClickSaveDashboard(): Promise<void> {\n this.toggleEditDashboard(false);\n let result = await this.SaveDashboard();\n if(result){\n this.sharedService.CreateSimpleNotification(\"Dashboard changes have been saved.\", \"success\", 1000);\n await this.ngOnInit();\n }\n else{\n this.sharedService.CreateSimpleNotification(\"An error occured saving the dashboard changes\", \"error\", 1000);\n }\n }\n\n public async onclickCancelChanges(): Promise<void> {\n this.toggleEditDashboard(false);\n await this.ngOnInit();\n }\n\n public closeDashboardDialog(data: any = null){\n this.isEditDialogOpened = false;\n }\n\n saveChanges(data: any): void {\n if(data.config){\n this.config = data.config;\n }\n if(data.itemsChanged && data.items){\n this.items = data.items;\n this.sharedService.InvokeManualResize();\n }\n this.SaveDashboard();\n this.closeDashboardDialog();\n }\n\n public async SaveDashboard(): Promise<boolean> {\n if (this.dashboardEntity) {\n const configData = {\n columns: this.config.columns,\n rowHeight: this.config.rowHeight,\n resizable: this.config.resizable,\n reorderable: this.config.reorderable,\n items: this.items\n }\n const configJSON = JSON.stringify(configData);\n this.dashboardEntity.UIConfigDetails = configJSON;\n const result = await this.dashboardEntity.Save();\n \n return result;\n }\n else \n return false;\n }\n\n public dashboardSaveComplete(entity: MJDashboardEntityExtended): void {\n this.dashboardSaved.emit(entity);\n }\n\n public toggleInlineNameEdit(visible: boolean): void {\n this.isEditDashboardNameDialogOpened = visible;\n if(this.isEditDashboardNameDialogOpened){\n this.dashboardNameInput?.nativeElement?.focus();\n }\n }\n\n public saveDashboardName(): void {\n this.toggleInlineNameEdit(true);\n const inputValue = this.dashboardNameInput.nativeElement.value;\n if(inputValue && inputValue.length > 3){\n this.dashboardEntity.Name = inputValue;\n this.SaveDashboard();\n }\n else {\n this.sharedService.CreateSimpleNotification('Invalid dashboard name: Must be at least 3 characters.','warning', 1000);\n }\n }\n\n public cancelNameChange(): void {\n this.toggleInlineNameEdit(false);\n }\n\n public closeDeleteItemComponent(): void {\n this.selectedDashboardItem = null;\n this.isDeletingDashboardItem = false;\n }\n\n public showConfirmDeleteDashboardItem(item: DashboardItem): void {\n this.selectedDashboardItem = item;\n this.isDeletingDashboardItem = true;\n }\n\n public async deleteDashboardItem(item: DashboardItem): Promise<void> {\n this.items = this.items.filter(i => i.uniqueId != item.uniqueId);\n let result = await this.SaveDashboard();\n if(result){\n this.sharedService.CreateSimpleNotification(`Dashboard item ${item.uniqueId} deleted successfully`, \"success\", 1000);\n }\n else{\n this.sharedService.CreateSimpleNotification(`Unable to delete dashboard item ${item.uniqueId}`, \"error\", 1000);\n }\n this.selectedDashboardItem = null;\n this.isDeletingDashboardItem = false;\n }\n\n public getIsEditingItemBodyStyle(): string {\n return this.isEditingDashboard ? \"bg-light-grey\" : \"\";\n }\n\n public getIsEditingItemHeaderStyle(): string {\n return this.isEditingDashboard ? \"bg-dark-grey\" : \"bg-blue\";\n }\n\n onReorder(e: { oldIndex: number; newIndex: number; newCol?: number; newRow?: number; uniqueId?: number }): void {\n const item = e.uniqueId != null ? this.items.find(i => i.uniqueId === e.uniqueId) : this.items[e.oldIndex];\n if (item) {\n if (e.oldIndex !== e.newIndex) {\n this.items.splice(e.oldIndex, 1);\n this.items.splice(e.newIndex, 0, item);\n }\n item.col = e.newCol ?? item.col;\n item.row = e.newRow ?? item.row;\n }\n }\n\n onResize(e: { newColSpan: number; newRowSpan: number; uniqueId?: number }): void {\n const item = e.uniqueId != null ? this.items.find(i => i.uniqueId === e.uniqueId) : undefined;\n if (item) {\n item.colSpan = e.newColSpan;\n item.rowSpan = e.newRowSpan;\n }\n }\n\n onMouseEnter(e: MouseEvent): void {\n // Available for future drag-and-drop support\n }\n\n onMouseOut(e: MouseEvent): void {\n // Available for future drag-and-drop support\n }\n\n /**\n * Get the appropriate icon for a resource type\n * @param resourceType The type of resource\n * @returns FontAwesome icon class\n */\n getResourceIcon(resourceType: string | undefined): string {\n // Default to a cube icon if type is undefined\n if (!resourceType) return 'fa-solid fa-cube';\n \n // Map resource types to appropriate FontAwesome icons\n const iconMap: {[key: string]: string} = {\n 'Reports': 'fa-solid fa-chart-line',\n 'UserViews': 'fa-solid fa-table',\n 'Dashboards': 'fa-solid fa-grip',\n 'Lists': 'fa-solid fa-list',\n 'default': 'fa-solid fa-cube'\n };\n \n return iconMap[resourceType] || iconMap['default'];\n }\n}\n\nexport class DashboardConfigDetails {\n columns: number = 4;\n rowHeight: number = 150;\n resizable: boolean = true;\n reorderable: boolean = true;\n}\n\nexport class DashboardItem {\n private static nextUniqueId: number = 1;\n private getNextUniqueID(): number {\n return DashboardItem.nextUniqueId++;\n }\n constructor() {\n this.uniqueId = this.getNextUniqueID();\n }\n uniqueId!: number;\n title!: string;\n col!: number;\n row!: number;\n rowSpan!: number;\n colSpan!: number;\n order!: number;\n ResourceData!: ResourceData;\n contentLoading: boolean = false;\n}","@if (isItemDialogOpened) {\n <app-add-item-dialog (onClose)=\"closeDialog($event)\" [selectedResource]=\"selectedResource\"></app-add-item-dialog>\n}\n@if (isEditDialogOpened) {\n <div>\n <app-edit-dashboard (onClose)=\"closeDashboardDialog($event)\" (triggerAddItem)=\"addItem($event)\" [items]=\"items\" [config]=\"config\" (onSave)=\"saveChanges($event)\"></app-edit-dashboard>\n </div>\n}\n\n@if (isDeletingDashboardItem) {\n <app-delete-item-dialog [dashboardItem]=\"selectedDashboardItem\" (removeDashboardItem)=\"deleteDashboardItem($event)\" (onClose)=\"closeDeleteItemComponent()\"></app-delete-item-dialog>\n}\n\n<div class=\"dashboard-container\">\n <div class=\"main-head-dashboard\">\n <div class=\"dashboard-title\">\n @if (isEditDashboardNameDialogOpened) {\n <div class=\"dashboard-header\">\n <input class=\"mj-input\" (keydown.enter)=\"saveDashboardName()\" type=\"text\" placeholder=\"Enter name here\" id=\"txtDashboardName\" #dashboardNameInput>\n <button mjButton (click)=\"saveDashboardName()\">\n <span class=\"fa-solid fa-check\"></span>\n Save\n </button>\n <button mjButton (click)=\"cancelNameChange()\" >\n <span class=\"fa-solid fa-xmark\"></span>\n Cancel\n </button>\n </div>\n } @else {\n <i class=\"fa-solid fa-star dashboard-star-icon\" aria-hidden=\"true\"></i>\n <h3 (click)=\"toggleInlineNameEdit(true)\">{{dashboardEntity ? dashboardEntity.Name : ''}}</h3>\n }\n </div>\n <div class=\"dashboard-header\">\n @if (isEditingDashboard) {\n <div>\n <button mjButton (click)=\"onClickSaveDashboard()\">\n <span class=\"fa-solid fa-check\"></span>\n Save\n </button>\n <button mjButton (click)=\"onclickCancelChanges()\">\n <span class=\"fa-solid fa-xmark\"></span>\n Cancel\n </button>\n </div>\n } @else {\n <button mjButton (click)=\"addItem()\">\n <span class=\"fa-solid fa-plus\"></span>\n Add Item\n </button>\n <button mjButton (click)=\"toggleEditDashboard(true)\" >\n <span class=\"fa-solid fa-gear\"></span>\n Edit Dashboard\n </button>\n }\n </div>\n </div>\n <div class=\"tile-resource-container\">\n <!-- Show empty state if no items -->\n @if (items.length === 0 && !isEditingDashboard) {\n <div class=\"empty-dashboard\">\n <i class=\"fa-solid fa-grip-vertical\" aria-hidden=\"true\"></i>\n <h3>This dashboard is empty</h3>\n <p>Start by adding reports or user views to your dashboard</p>\n <button mjButton variant=\"primary\" (click)=\"addItem()\">\n <span class=\"fa-solid fa-plus\"></span>\n Add Item\n </button>\n </div>\n }\n\n <!-- Show tile layout if there are items or if editing -->\n @if (items.length > 0 || isEditingDashboard) {\n <div class=\"mj-tile-layout\"\n [style.grid-template-columns]=\"'repeat(' + config.columns + ', 1fr)'\"\n [style.grid-auto-rows]=\"config.rowHeight + 'px'\">\n @for (item of items; track item.uniqueId) {\n <div class=\"mj-tile-item\"\n [style.grid-column]=\"item.col + ' / span ' + item.colSpan\"\n [style.grid-row]=\"'span ' + item.rowSpan\"\n [id]=\"item.uniqueId\"\n (mouseenter)=\"onMouseEnter($event)\"\n (mouseleave)=\"onMouseOut($event)\">\n <div class=\"mj-tile-header\" [ngClass]=\"[getIsEditingItemHeaderStyle()]\">\n <div class=\"item-title\">\n <i [class]=\"getResourceIcon(item.ResourceData.ResourceType)\" aria-hidden=\"true\"></i>\n {{item.title}}\n </div>\n @if (!isEditingDashboard) {\n <div>\n <div class=\"btn-wrapper\">\n <button mjButton title=\"Edit dashboard\" (click)=\"toggleEditDashboard(true)\">\n <span class=\"fa-solid fa-pen-to-square\"></span>\n </button>\n <button mjButton title=\"Remove item\" (click)=\"showConfirmDeleteDashboardItem(item)\">\n <span class=\"fa-solid fa-trash\"></span>\n </button>\n </div>\n </div>\n }\n </div>\n <div class=\"mj-tile-body\" [ngClass]=\"[getIsEditingItemBodyStyle()]\">\n <mj-resource [Data]=\"item.ResourceData\" [isVisible]=\"true\" (ContentLoadingStarted)=\"loadingStarted($event)\" (ContentLoadingComplete)=\"loadingComplete($event)\"></mj-resource>\n </div>\n </div>\n }\n </div>\n }\n </div>\n</div>\n"]}
@@ -1,4 +1,4 @@
1
- import { OnInit, ChangeDetectorRef } from '@angular/core';
1
+ import { OnInit, ChangeDetectorRef, ElementRef } from '@angular/core';
2
2
  import { MJListEntity, MJUserViewEntityExtended } from '@memberjunction/core-entities';
3
3
  import { SharedService } from '@memberjunction/ng-shared';
4
4
  import { ListDetailGridComponent, ListGridRowClickedEvent } from '@memberjunction/ng-list-detail-grid';
@@ -17,6 +17,7 @@ interface AddableRecord {
17
17
  export declare class SingleListDetailComponent implements OnInit {
18
18
  private sharedService;
19
19
  private cdr;
20
+ private elementRef;
20
21
  ListID: string;
21
22
  listDetailGrid: ListDetailGridComponent | undefined;
22
23
  listRecord: MJListEntity | null;
@@ -44,8 +45,10 @@ export declare class SingleListDetailComponent implements OnInit {
44
45
  addFromViewProgress: number;
45
46
  addFromViewTotal: number;
46
47
  fetchingRecordsToSave: boolean;
48
+ showAddDropdown: boolean;
47
49
  addOptions: NewItemOption[];
48
- constructor(sharedService: SharedService, cdr: ChangeDetectorRef);
50
+ onDocumentClick(event: MouseEvent): void;
51
+ constructor(sharedService: SharedService, cdr: ChangeDetectorRef, elementRef: ElementRef);
49
52
  ngOnInit(): Promise<void>;
50
53
  /**
51
54
  * Load the list entity record
@@ -58,8 +61,12 @@ export declare class SingleListDetailComponent implements OnInit {
58
61
  totalCount: number;
59
62
  }): void;
60
63
  refreshGrid(): void;
64
+ get removeProgressPercent(): number;
65
+ get addProgressPercent(): number;
66
+ get addFromViewProgressPercent(): number;
61
67
  onRefreshClick(): void;
62
68
  onExportClick(): void;
69
+ toggleAddDropdown(): void;
63
70
  onDropdownItemClick(item: NewItemOption): void;
64
71
  openRemoveDialog(): void;
65
72
  closeRemoveDialog(): void;
@@ -67,6 +74,7 @@ export declare class SingleListDetailComponent implements OnInit {
67
74
  openAddRecordsDialog(): Promise<void>;
68
75
  closeAddRecordsDialog(): void;
69
76
  private loadExistingListDetailIds;
77
+ onAddRecordsSearchInputEvent(event: Event): void;
70
78
  onAddRecordsSearchChange(value: string): void;
71
79
  private searchRecords;
72
80
  toggleRecordSelection(record: AddableRecord): void;
@@ -1 +1 @@
1
- {"version":3,"file":"single-list-detail.component.d.ts","sourceRoot":"","sources":["../../../src/lib/single-list-detail/single-list-detail.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"single-list-detail.component.d.ts","sourceRoot":"","sources":["../../../src/lib/single-list-detail/single-list-detail.component.ts"],"names":[],"mappings":"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"}