@dragonworks/ngx-dashboard 20.0.4 → 20.0.6

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 (78) hide show
  1. package/ng-package.json +7 -0
  2. package/package.json +34 -45
  3. package/src/lib/__tests__/dashboard-component-widget-state-integration.spec.ts +537 -0
  4. package/src/lib/cell/__tests__/cell-resize.component.spec.ts +442 -0
  5. package/src/lib/cell/__tests__/cell.component.spec.ts +541 -0
  6. package/src/lib/cell/cell-context-menu.component.ts +138 -0
  7. package/src/lib/cell/cell-context-menu.service.ts +36 -0
  8. package/src/lib/cell/cell.component.html +37 -0
  9. package/src/lib/cell/cell.component.scss +198 -0
  10. package/src/lib/cell/cell.component.ts +375 -0
  11. package/src/lib/dashboard/dashboard.component.html +18 -0
  12. package/src/lib/dashboard/dashboard.component.scss +17 -0
  13. package/src/lib/dashboard/dashboard.component.ts +187 -0
  14. package/src/lib/dashboard-editor/dashboard-editor.component.html +57 -0
  15. package/src/lib/dashboard-editor/dashboard-editor.component.scss +87 -0
  16. package/src/lib/dashboard-editor/dashboard-editor.component.ts +219 -0
  17. package/src/lib/dashboard-viewer/__tests__/dashboard-viewer.component.spec.ts +258 -0
  18. package/src/lib/dashboard-viewer/dashboard-viewer.component.html +20 -0
  19. package/src/lib/dashboard-viewer/dashboard-viewer.component.scss +50 -0
  20. package/src/lib/dashboard-viewer/dashboard-viewer.component.ts +70 -0
  21. package/src/lib/drop-zone/__tests__/drop-zone.component.spec.ts +465 -0
  22. package/src/lib/drop-zone/drop-zone.component.html +20 -0
  23. package/src/lib/drop-zone/drop-zone.component.scss +67 -0
  24. package/src/lib/drop-zone/drop-zone.component.ts +122 -0
  25. package/src/lib/internal-widgets/unknown-widget/unknown-widget.component.ts +72 -0
  26. package/src/lib/models/cell-data.ts +13 -0
  27. package/src/lib/models/cell-dialog.ts +7 -0
  28. package/src/lib/models/cell-id.ts +85 -0
  29. package/src/lib/models/cell-position.ts +15 -0
  30. package/src/lib/models/dashboard-data.dto.ts +44 -0
  31. package/src/lib/models/dashboard-data.utils.ts +49 -0
  32. package/src/lib/models/drag-data.ts +6 -0
  33. package/src/lib/models/index.ts +11 -0
  34. package/src/lib/models/reserved-space.ts +24 -0
  35. package/src/lib/models/widget-factory.ts +33 -0
  36. package/src/lib/models/widget-id.ts +70 -0
  37. package/src/lib/models/widget.ts +21 -0
  38. package/src/lib/providers/cell-settings-dialog/cell-settings-dialog.component.ts +127 -0
  39. package/src/lib/providers/cell-settings-dialog/cell-settings-dialog.provider.ts +15 -0
  40. package/src/lib/providers/cell-settings-dialog/cell-settings-dialog.tokens.ts +20 -0
  41. package/src/lib/providers/cell-settings-dialog/default-cell-settings-dialog.provider.ts +32 -0
  42. package/src/lib/providers/cell-settings-dialog/index.ts +3 -0
  43. package/src/lib/providers/index.ts +1 -0
  44. package/src/lib/services/__tests__/dashboard-bridge.service.spec.ts +220 -0
  45. package/src/lib/services/__tests__/dashboard-viewport.service.spec.ts +362 -0
  46. package/src/lib/services/dashboard-bridge.service.ts +155 -0
  47. package/src/lib/services/dashboard-viewport.service.ts +148 -0
  48. package/src/lib/services/dashboard.service.ts +62 -0
  49. package/src/lib/store/__tests__/dashboard-store-collision-detection.spec.ts +756 -0
  50. package/src/lib/store/__tests__/dashboard-store-computed-properties.spec.ts +974 -0
  51. package/src/lib/store/__tests__/dashboard-store-drag-drop.spec.ts +279 -0
  52. package/src/lib/store/__tests__/dashboard-store-export-import.spec.ts +780 -0
  53. package/src/lib/store/__tests__/dashboard-store-grid-config.spec.ts +128 -0
  54. package/src/lib/store/__tests__/dashboard-store-query-methods.spec.ts +229 -0
  55. package/src/lib/store/__tests__/dashboard-store-resize-operations.spec.ts +652 -0
  56. package/src/lib/store/__tests__/dashboard-store-widget-management.spec.ts +461 -0
  57. package/src/lib/store/__tests__/dashboard-store-widget-state-preservation.spec.ts +369 -0
  58. package/src/lib/store/dashboard-store.ts +239 -0
  59. package/src/lib/store/features/drag-drop.feature.ts +140 -0
  60. package/src/lib/store/features/grid-config.feature.ts +43 -0
  61. package/src/lib/store/features/resize.feature.ts +140 -0
  62. package/src/lib/store/features/utils/collision.utils.ts +89 -0
  63. package/src/lib/store/features/utils/grid-query-internal.utils.ts +37 -0
  64. package/src/lib/store/features/utils/resize.utils.ts +165 -0
  65. package/src/lib/store/features/widget-management.feature.ts +158 -0
  66. package/src/lib/styles/_dashboard-grid-vars.scss +11 -0
  67. package/src/lib/widget-list/__tests__/widget-list-bridge-integration.spec.ts +137 -0
  68. package/src/lib/widget-list/widget-list.component.html +22 -0
  69. package/src/lib/widget-list/widget-list.component.scss +154 -0
  70. package/src/lib/widget-list/widget-list.component.ts +106 -0
  71. package/src/public-api.ts +21 -0
  72. package/src/test-setup.ts +10 -0
  73. package/tsconfig.lib.json +15 -0
  74. package/tsconfig.lib.prod.json +11 -0
  75. package/tsconfig.spec.json +14 -0
  76. package/fesm2022/dragonworks-ngx-dashboard.mjs +0 -2192
  77. package/fesm2022/dragonworks-ngx-dashboard.mjs.map +0 -1
  78. package/index.d.ts +0 -678
@@ -0,0 +1,279 @@
1
+ import { TestBed } from '@angular/core/testing';
2
+ import { DashboardStore } from '../dashboard-store';
3
+ import { CellIdUtils, WidgetIdUtils, DragData, WidgetMetadata, WidgetFactory } from '../../models';
4
+ import { DashboardService } from '../../services/dashboard.service';
5
+
6
+ describe('DashboardStore - Drag & Drop Operations', () => {
7
+ let store: InstanceType<typeof DashboardStore>;
8
+ let testWidgetMetadata: WidgetMetadata;
9
+ let mockWidgetFactory: WidgetFactory;
10
+ let dashboardService: jasmine.SpyObj<DashboardService>;
11
+
12
+ beforeEach(() => {
13
+ const spy = jasmine.createSpyObj('DashboardService', ['getFactory']);
14
+
15
+ TestBed.configureTestingModule({
16
+ providers: [
17
+ DashboardStore,
18
+ { provide: DashboardService, useValue: spy }
19
+ ]
20
+ });
21
+
22
+ store = TestBed.inject(DashboardStore);
23
+ dashboardService = TestBed.inject(DashboardService) as jasmine.SpyObj<DashboardService>;
24
+ store.setGridConfig({ rows: 16, columns: 16 });
25
+
26
+ testWidgetMetadata = {
27
+ widgetTypeid: 'test-widget',
28
+ name: 'Test Widget',
29
+ description: 'A test widget for unit tests',
30
+ svgIcon: '<svg></svg>'
31
+ };
32
+
33
+ mockWidgetFactory = {
34
+ widgetTypeid: 'test-widget',
35
+ createComponent: jasmine.createSpy('createComponent')
36
+ } as any;
37
+
38
+ dashboardService.getFactory.and.returnValue(mockWidgetFactory);
39
+ });
40
+
41
+ describe('dragData management', () => {
42
+ it('should start drag with widget data', () => {
43
+ const dragData: DragData = {
44
+ kind: 'widget',
45
+ content: testWidgetMetadata
46
+ };
47
+
48
+ store.startDrag(dragData);
49
+ expect(store.dragData()).toEqual(dragData);
50
+ });
51
+
52
+ it('should start drag with cell data', () => {
53
+ const dragData: DragData = {
54
+ kind: 'cell',
55
+ content: {
56
+ widgetId: WidgetIdUtils.generate(),
57
+ cellId: CellIdUtils.create(5, 5),
58
+ row: 5,
59
+ col: 5,
60
+ rowSpan: 2,
61
+ colSpan: 2,
62
+ }
63
+ };
64
+
65
+ store.startDrag(dragData);
66
+ expect(store.dragData()).toEqual(dragData);
67
+ });
68
+
69
+ it('should clear drag data when ended', () => {
70
+ // First set some drag data
71
+ const dragData: DragData = {
72
+ kind: 'widget',
73
+ content: testWidgetMetadata
74
+ };
75
+ store.startDrag(dragData);
76
+ expect(store.dragData()).toEqual(dragData);
77
+
78
+ // Then clear it
79
+ store.endDrag();
80
+ expect(store.dragData()).toBeNull();
81
+ });
82
+
83
+ it('should overwrite existing drag data', () => {
84
+ const dragData1: DragData = {
85
+ kind: 'widget',
86
+ content: testWidgetMetadata
87
+ };
88
+
89
+ const dragData2: DragData = {
90
+ kind: 'cell',
91
+ content: {
92
+ widgetId: WidgetIdUtils.generate(),
93
+ cellId: CellIdUtils.create(3, 3),
94
+ row: 3,
95
+ col: 3,
96
+ rowSpan: 1,
97
+ colSpan: 1,
98
+ }
99
+ };
100
+
101
+ store.startDrag(dragData1);
102
+ expect(store.dragData()).toEqual(dragData1);
103
+
104
+ store.startDrag(dragData2);
105
+ expect(store.dragData()).toEqual(dragData2);
106
+ });
107
+ });
108
+
109
+
110
+ describe('endDrag', () => {
111
+ it('should clear drag data and hovered drop zone', () => {
112
+ const dragData: DragData = {
113
+ kind: 'widget',
114
+ content: testWidgetMetadata
115
+ };
116
+
117
+ store.startDrag(dragData);
118
+ store.setHoveredDropZone({ row: 5, col: 5 });
119
+
120
+ expect(store.dragData()).toEqual(dragData);
121
+ expect(store.hoveredDropZone()).toEqual({ row: 5, col: 5 });
122
+
123
+ store.endDrag();
124
+
125
+ expect(store.dragData()).toBeNull();
126
+ expect(store.hoveredDropZone()).toBeNull();
127
+ });
128
+
129
+ it('should work when no drag is active', () => {
130
+ expect(store.dragData()).toBeNull();
131
+ expect(store.hoveredDropZone()).toBeNull();
132
+
133
+ store.endDrag();
134
+
135
+ expect(store.dragData()).toBeNull();
136
+ expect(store.hoveredDropZone()).toBeNull();
137
+ });
138
+
139
+ it('should clear drag data without affecting hovered zone if it was null', () => {
140
+ const dragData: DragData = {
141
+ kind: 'widget',
142
+ content: testWidgetMetadata
143
+ };
144
+
145
+ store.startDrag(dragData);
146
+ expect(store.dragData()).toEqual(dragData);
147
+ expect(store.hoveredDropZone()).toBeNull();
148
+
149
+ store.endDrag();
150
+
151
+ expect(store.dragData()).toBeNull();
152
+ expect(store.hoveredDropZone()).toBeNull();
153
+ });
154
+ });
155
+
156
+ describe('setHoveredDropZone', () => {
157
+ it('should set hovered drop zone', () => {
158
+ const zone = { row: 8, col: 12 };
159
+ store.setHoveredDropZone(zone);
160
+ expect(store.hoveredDropZone()).toEqual(zone);
161
+ });
162
+
163
+ it('should update hovered drop zone', () => {
164
+ const zone1 = { row: 5, col: 5 };
165
+ const zone2 = { row: 10, col: 15 };
166
+
167
+ store.setHoveredDropZone(zone1);
168
+ expect(store.hoveredDropZone()).toEqual(zone1);
169
+
170
+ store.setHoveredDropZone(zone2);
171
+ expect(store.hoveredDropZone()).toEqual(zone2);
172
+ });
173
+
174
+ it('should clear hovered drop zone when null', () => {
175
+ const zone = { row: 5, col: 5 };
176
+ store.setHoveredDropZone(zone);
177
+ expect(store.hoveredDropZone()).toEqual(zone);
178
+
179
+ store.setHoveredDropZone(null);
180
+ expect(store.hoveredDropZone()).toBeNull();
181
+ });
182
+
183
+ it('should handle boundary positions', () => {
184
+ const zone1 = { row: 1, col: 1 };
185
+ const zone2 = { row: 16, col: 16 };
186
+
187
+ store.setHoveredDropZone(zone1);
188
+ expect(store.hoveredDropZone()).toEqual(zone1);
189
+
190
+ store.setHoveredDropZone(zone2);
191
+ expect(store.hoveredDropZone()).toEqual(zone2);
192
+ });
193
+
194
+ it('should allow setting same zone multiple times', () => {
195
+ const zone = { row: 7, col: 9 };
196
+
197
+ store.setHoveredDropZone(zone);
198
+ expect(store.hoveredDropZone()).toEqual(zone);
199
+
200
+ store.setHoveredDropZone(zone);
201
+ expect(store.hoveredDropZone()).toEqual(zone);
202
+ });
203
+ });
204
+
205
+ describe('Drag & Drop Integration', () => {
206
+ it('should maintain drag state during hover changes', () => {
207
+ const dragData: DragData = {
208
+ kind: 'widget',
209
+ content: testWidgetMetadata
210
+ };
211
+
212
+ store.startDrag(dragData);
213
+ store.setHoveredDropZone({ row: 5, col: 5 });
214
+ store.setHoveredDropZone({ row: 8, col: 8 });
215
+
216
+ expect(store.dragData()).toEqual(dragData);
217
+ expect(store.hoveredDropZone()).toEqual({ row: 8, col: 8 });
218
+ });
219
+
220
+ it('should maintain hover state during drag changes', () => {
221
+ const zone = { row: 10, col: 10 };
222
+ const dragData1: DragData = {
223
+ kind: 'widget',
224
+ content: testWidgetMetadata
225
+ };
226
+ const dragData2: DragData = {
227
+ kind: 'cell',
228
+ content: {
229
+ widgetId: WidgetIdUtils.generate(),
230
+ cellId: CellIdUtils.create(3, 3),
231
+ row: 3,
232
+ col: 3,
233
+ rowSpan: 1,
234
+ colSpan: 1,
235
+ }
236
+ };
237
+
238
+ store.setHoveredDropZone(zone);
239
+ store.startDrag(dragData1);
240
+ store.startDrag(dragData2);
241
+
242
+ expect(store.hoveredDropZone()).toEqual(zone);
243
+ expect(store.dragData()).toEqual(dragData2);
244
+ });
245
+
246
+ it('should handle complex drag operation sequence', () => {
247
+ const dragData: DragData = {
248
+ kind: 'cell',
249
+ content: {
250
+ widgetId: WidgetIdUtils.generate(),
251
+ cellId: CellIdUtils.create(5, 5),
252
+ row: 5,
253
+ col: 5,
254
+ rowSpan: 2,
255
+ colSpan: 3,
256
+ }
257
+ };
258
+
259
+ // Start drag
260
+ store.startDrag(dragData);
261
+ expect(store.dragData()).toEqual(dragData);
262
+
263
+ // Move through different zones
264
+ store.setHoveredDropZone({ row: 1, col: 1 });
265
+ expect(store.hoveredDropZone()).toEqual({ row: 1, col: 1 });
266
+
267
+ store.setHoveredDropZone({ row: 5, col: 8 });
268
+ expect(store.hoveredDropZone()).toEqual({ row: 5, col: 8 });
269
+
270
+ store.setHoveredDropZone({ row: 12, col: 15 });
271
+ expect(store.hoveredDropZone()).toEqual({ row: 12, col: 15 });
272
+
273
+ // End drag
274
+ store.endDrag();
275
+ expect(store.dragData()).toBeNull();
276
+ expect(store.hoveredDropZone()).toBeNull();
277
+ });
278
+ });
279
+ });