@memberjunction/ng-explorer-core 2.48.0 → 2.50.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 (105) hide show
  1. package/dist/app-routing.module.js +40 -53
  2. package/dist/app-routing.module.js.map +1 -1
  3. package/dist/generic/Events.types.js +104 -0
  4. package/dist/generic/Events.types.js.map +1 -1
  5. package/dist/generic/Item.types.js +28 -14
  6. package/dist/generic/Item.types.js.map +1 -1
  7. package/dist/generic/PathData.types.js +5 -0
  8. package/dist/generic/PathData.types.js.map +1 -1
  9. package/dist/generic/app-nav-view.types.js +3 -1
  10. package/dist/generic/app-nav-view.types.js.map +1 -1
  11. package/dist/lib/app-view/application-view.component.js +273 -294
  12. package/dist/lib/app-view/application-view.component.js.map +1 -1
  13. package/dist/lib/auth-button/auth-button.component.js +13 -22
  14. package/dist/lib/auth-button/auth-button.component.js.map +1 -1
  15. package/dist/lib/base-browser-component/base-browser-component.js +96 -108
  16. package/dist/lib/base-browser-component/base-browser-component.js.map +1 -1
  17. package/dist/lib/dashboard-browser-component/dashboard-browser.component.js +106 -124
  18. package/dist/lib/dashboard-browser-component/dashboard-browser.component.js.map +1 -1
  19. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js +257 -281
  20. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js.map +1 -1
  21. package/dist/lib/data-browser-component/data-browser.component.js +122 -137
  22. package/dist/lib/data-browser-component/data-browser.component.js.map +1 -1
  23. package/dist/lib/expansion-panel-component/expansion-panel-component.js +100 -117
  24. package/dist/lib/expansion-panel-component/expansion-panel-component.js.map +1 -1
  25. package/dist/lib/favorites/favorites.component.js +44 -54
  26. package/dist/lib/favorites/favorites.component.js.map +1 -1
  27. package/dist/lib/files/files.component.js +12 -11
  28. package/dist/lib/files/files.component.js.map +1 -1
  29. package/dist/lib/generic/form-toolbar.js +21 -20
  30. package/dist/lib/generic/form-toolbar.js.map +1 -1
  31. package/dist/lib/generic/resource-container-component.js +23 -20
  32. package/dist/lib/generic/resource-container-component.js.map +1 -1
  33. package/dist/lib/generic-browse-list/generic-browse-list.component.js +48 -46
  34. package/dist/lib/generic-browse-list/generic-browse-list.component.js.map +1 -1
  35. package/dist/lib/generic-browser-list/generic-browser-list.component.js +353 -386
  36. package/dist/lib/generic-browser-list/generic-browser-list.component.js.map +1 -1
  37. package/dist/lib/guards/auth-guard.service.js +4 -2
  38. package/dist/lib/guards/auth-guard.service.js.map +1 -1
  39. package/dist/lib/guards/entities.guard.js +1 -1
  40. package/dist/lib/guards/entities.guard.js.map +1 -1
  41. package/dist/lib/header/MSFT_UserImageService.js +4 -3
  42. package/dist/lib/header/MSFT_UserImageService.js.map +1 -1
  43. package/dist/lib/header/header.component.js +111 -121
  44. package/dist/lib/header/header.component.js.map +1 -1
  45. package/dist/lib/home-component/home.component.js +34 -42
  46. package/dist/lib/home-component/home.component.js.map +1 -1
  47. package/dist/lib/home-wrapper/home-wrapper.component.js +6 -6
  48. package/dist/lib/home-wrapper/home-wrapper.component.js.map +1 -1
  49. package/dist/lib/list-view/list-view.component.js +132 -152
  50. package/dist/lib/list-view/list-view.component.js.map +1 -1
  51. package/dist/lib/navigation/navigation.component.js +568 -615
  52. package/dist/lib/navigation/navigation.component.js.map +1 -1
  53. package/dist/lib/query-browser-component/query-browser.component.js +30 -39
  54. package/dist/lib/query-browser-component/query-browser.component.js.map +1 -1
  55. package/dist/lib/report-browser-component/report-browser.component.js +18 -30
  56. package/dist/lib/report-browser-component/report-browser.component.js.map +1 -1
  57. package/dist/lib/resource-browser/resource-browser.component.js +435 -457
  58. package/dist/lib/resource-browser/resource-browser.component.js.map +1 -1
  59. package/dist/lib/resource-wrappers/dashboard-resource.component.js +12 -25
  60. package/dist/lib/resource-wrappers/dashboard-resource.component.js.map +1 -1
  61. package/dist/lib/resource-wrappers/list-detail-resource.component.js +18 -31
  62. package/dist/lib/resource-wrappers/list-detail-resource.component.js.map +1 -1
  63. package/dist/lib/resource-wrappers/query-resource.component.js +15 -28
  64. package/dist/lib/resource-wrappers/query-resource.component.js.map +1 -1
  65. package/dist/lib/resource-wrappers/record-resource.component.js +35 -47
  66. package/dist/lib/resource-wrappers/record-resource.component.js.map +1 -1
  67. package/dist/lib/resource-wrappers/report-resource.component.js +15 -28
  68. package/dist/lib/resource-wrappers/report-resource.component.js.map +1 -1
  69. package/dist/lib/resource-wrappers/search-results-resource.component.js +21 -34
  70. package/dist/lib/resource-wrappers/search-results-resource.component.js.map +1 -1
  71. package/dist/lib/resource-wrappers/view-resource.component.js +23 -37
  72. package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
  73. package/dist/lib/single-application/single-application.component.js +15 -20
  74. package/dist/lib/single-application/single-application.component.js.map +1 -1
  75. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js +81 -95
  76. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js.map +1 -1
  77. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js +28 -29
  78. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js.map +1 -1
  79. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js +51 -64
  80. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js.map +1 -1
  81. package/dist/lib/single-dashboard/single-dashboard.component.js +158 -165
  82. package/dist/lib/single-dashboard/single-dashboard.component.js.map +1 -1
  83. package/dist/lib/single-entity/single-entity.component.js +106 -118
  84. package/dist/lib/single-entity/single-entity.component.js.map +1 -1
  85. package/dist/lib/single-list-detail/single-list-detail.component.js +265 -287
  86. package/dist/lib/single-list-detail/single-list-detail.component.js.map +1 -1
  87. package/dist/lib/single-query/single-query.component.js +35 -44
  88. package/dist/lib/single-query/single-query.component.js.map +1 -1
  89. package/dist/lib/single-record/single-record.component.js +64 -73
  90. package/dist/lib/single-record/single-record.component.js.map +1 -1
  91. package/dist/lib/single-report/single-report.component.js +33 -43
  92. package/dist/lib/single-report/single-report.component.js.map +1 -1
  93. package/dist/lib/single-search-result/single-search-result.component.js +18 -30
  94. package/dist/lib/single-search-result/single-search-result.component.js.map +1 -1
  95. package/dist/lib/single-view/single-view.component.js +107 -124
  96. package/dist/lib/single-view/single-view.component.js.map +1 -1
  97. package/dist/lib/tabbed-dashboard/tabbed-dashboard.component.js +197 -210
  98. package/dist/lib/tabbed-dashboard/tabbed-dashboard.component.js.map +1 -1
  99. package/dist/lib/user-notifications/user-notifications.component.js +137 -155
  100. package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
  101. package/dist/lib/user-profile/user-profile.component.js +10 -8
  102. package/dist/lib/user-profile/user-profile.component.js.map +1 -1
  103. package/dist/module.js +51 -51
  104. package/dist/module.js.map +1 -1
  105. package/package.json +25 -25
@@ -1,12 +1,3 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
1
  import { Component, Input, ViewChild } from '@angular/core';
11
2
  import { Metadata, LogError, RunView } from '@memberjunction/core';
12
3
  import { ItemType } from '../../generic/Item.types';
@@ -151,6 +142,44 @@ function ApplicationViewComponent_div_0_Template(rf, ctx) { if (rf & 1) {
151
142
  i0.ɵɵproperty("ngIf", ctx_r1.LinkToSharedViewDialogVisible);
152
143
  } }
153
144
  export class ApplicationViewComponent extends BaseBrowserComponent {
145
+ router;
146
+ route;
147
+ location;
148
+ sharedService;
149
+ cdr;
150
+ entityRowRef;
151
+ viewPropertiesDialog;
152
+ availableResourcesComponent;
153
+ categoryEntityID;
154
+ currentlySelectedAppEntity;
155
+ ResourceItemFilter = "";
156
+ AppEntitySelectionDialogVisible = false;
157
+ AllAppEntities = [];
158
+ SelectedAppEntities = [];
159
+ UnselectedAppEntities = [];
160
+ app;
161
+ userApp;
162
+ currentUser;
163
+ FilterOutCurrentUserViews;
164
+ NewItemOptions = [
165
+ {
166
+ Text: 'New View',
167
+ Description: 'Create a new User View',
168
+ Icon: 'folder',
169
+ Action: () => {
170
+ this.createNewView();
171
+ }
172
+ },
173
+ {
174
+ Text: 'New Record',
175
+ Description: `Create a new record for the currently selected entity`,
176
+ Icon: 'plus',
177
+ Action: () => {
178
+ this.createNewRecord();
179
+ }
180
+ }
181
+ ];
182
+ ViewResourceTypeID;
154
183
  constructor(router, route, location, sharedService, cdr) {
155
184
  super();
156
185
  this.router = router;
@@ -158,123 +187,94 @@ export class ApplicationViewComponent extends BaseBrowserComponent {
158
187
  this.location = location;
159
188
  this.sharedService = sharedService;
160
189
  this.cdr = cdr;
161
- this.ResourceItemFilter = "";
162
- this.AppEntitySelectionDialogVisible = false;
163
- this.AllAppEntities = [];
164
- this.SelectedAppEntities = [];
165
- this.UnselectedAppEntities = [];
166
- this.NewItemOptions = [
167
- {
168
- Text: 'New View',
169
- Description: 'Create a new User View',
170
- Icon: 'folder',
171
- Action: () => {
172
- this.createNewView();
173
- }
174
- },
175
- {
176
- Text: 'New Record',
177
- Description: `Create a new record for the currently selected entity`,
178
- Icon: 'plus',
179
- Action: () => {
180
- this.createNewRecord();
181
- }
182
- }
183
- ];
184
- this.LinkToSharedViewDialogVisible = false;
185
190
  this.categoryEntityName = "User View Categories";
186
191
  this.itemEntityName = "User Views";
187
192
  }
188
- ngOnInit() {
189
- return __awaiter(this, void 0, void 0, function* () {
190
- var _a;
191
- const md = new Metadata();
192
- this.currentUser = md.CurrentUser;
193
- this.ViewResourceTypeID = ((_a = this.sharedService.ResourceTypeByName('User Views')) === null || _a === void 0 ? void 0 : _a.ID) || '';
194
- this.route.paramMap.subscribe((params) => __awaiter(this, void 0, void 0, function* () {
195
- var _b;
196
- const appName = params.get('appName');
197
- const entityName = params.get('entityName');
198
- const folderID = params.get('folderID');
199
- this.showLoader = true;
200
- if (folderID) {
201
- this.selectedFolderID = folderID;
193
+ async ngOnInit() {
194
+ const md = new Metadata();
195
+ this.currentUser = md.CurrentUser;
196
+ this.ViewResourceTypeID = this.sharedService.ResourceTypeByName('User Views')?.ID || '';
197
+ this.route.paramMap.subscribe(async (params) => {
198
+ const appName = params.get('appName');
199
+ const entityName = params.get('entityName');
200
+ const folderID = params.get('folderID');
201
+ this.showLoader = true;
202
+ if (folderID) {
203
+ this.selectedFolderID = folderID;
204
+ }
205
+ if (appName && appName !== this.app?.Name) {
206
+ const md = new Metadata();
207
+ const rv = new RunView();
208
+ const appNameToLower = appName.toLowerCase();
209
+ this.app = md.Applications.find(a => a.Name.toLowerCase() === appNameToLower);
210
+ // if we get here and we have a blank app, problem
211
+ if (!this.app) {
212
+ throw new Error(`Application ${appName} not found`);
202
213
  }
203
- if (appName && appName !== ((_b = this.app) === null || _b === void 0 ? void 0 : _b.Name)) {
204
- const md = new Metadata();
205
- const rv = new RunView();
206
- const appNameToLower = appName.toLowerCase();
207
- this.app = md.Applications.find(a => a.Name.toLowerCase() === appNameToLower);
208
- // if we get here and we have a blank app, problem
209
- if (!this.app) {
210
- throw new Error(`Application ${appName} not found`);
214
+ // next up we need to find the UserApplication record based on the app and the current user
215
+ const userAppResult = await rv.RunView({
216
+ EntityName: "User Applications",
217
+ ExtraFilter: `UserID='${md.CurrentUser.ID}' AND ApplicationID='${this.app.ID}'`,
218
+ ResultType: 'entity_object'
219
+ });
220
+ if (!userAppResult || userAppResult.Success === false || userAppResult.Results.length === 0)
221
+ throw new Error('User Application Record for current user and selected application not found');
222
+ this.userApp = userAppResult.Results[0];
223
+ const matches = this.app.ApplicationEntities
224
+ .map(ae => md.Entities.find(e => e.ID === ae.EntityID))
225
+ .filter(e => e) // filter out null entries
226
+ .sort((a, b) => {
227
+ if (!a || !b) {
228
+ return 0;
211
229
  }
212
- // next up we need to find the UserApplication record based on the app and the current user
213
- const userAppResult = yield rv.RunView({
214
- EntityName: "User Applications",
215
- ExtraFilter: `UserID='${md.CurrentUser.ID}' AND ApplicationID='${this.app.ID}'`,
216
- ResultType: 'entity_object'
217
- });
218
- if (!userAppResult || userAppResult.Success === false || userAppResult.Results.length === 0)
219
- throw new Error('User Application Record for current user and selected application not found');
220
- this.userApp = userAppResult.Results[0];
221
- const matches = this.app.ApplicationEntities
222
- .map(ae => md.Entities.find(e => e.ID === ae.EntityID))
223
- .filter(e => e) // filter out null entries
224
- .sort((a, b) => {
225
- if (!a || !b) {
226
- return 0;
227
- }
228
- return a.Name.localeCompare(b.Name);
229
- }); // sort by name
230
- // store the entire list of POSSIBLE app entities in this list
231
- this.AllAppEntities = matches; // we filter out null above so this cast is safe;
232
- const userAppEntities = yield rv.RunView({
233
- EntityName: 'User Application Entities',
234
- ResultType: 'entity_object',
235
- ExtraFilter: `UserApplicationID = '${this.userApp.ID}'`,
236
- OrderBy: 'Sequence, Entity'
237
- });
238
- if (userAppEntities && userAppEntities.Success) {
239
- this.SelectedAppEntities = userAppEntities.Results.map(uae => this.AllAppEntities.find(ae => uae.EntityID === ae.ID)).filter(val => val); // now we have our selected app entities and they're sorted properly
240
- this.UnselectedAppEntities = this.AllAppEntities.filter(e => !this.SelectedAppEntities.some(sa => sa.ID === e.ID));
241
- // special case - if we have NO user app entities and the application has entities that are marked as DefaultForNewUser=1 we will add them now
242
- const defaultEntities = this.app.ApplicationEntities.filter(a => a.DefaultForNewUser);
243
- if (this.SelectedAppEntities.length === 0 && defaultEntities.length > 0) {
244
- // there are some entities that should default for a new user, so let's add them to the selected entities and remove from the Unselected
245
- // app entities and then call the Save method that we use when the user dialog ends
246
- this.SelectedAppEntities = defaultEntities.map(de => this.AllAppEntities.find(aae => de.EntityID === aae.ID)).filter(val => val);
247
- // now we have the default entities in place for the app, remove them from the Unselected array
248
- this.UnselectedAppEntities = this.UnselectedAppEntities.filter(e => !this.SelectedAppEntities.some(se => se.ID === e.ID));
249
- // now save
250
- yield this.OnAppEntitySelectionDialogClosed(true);
251
- }
230
+ return a.Name.localeCompare(b.Name);
231
+ }); // sort by name
232
+ // store the entire list of POSSIBLE app entities in this list
233
+ this.AllAppEntities = matches; // we filter out null above so this cast is safe;
234
+ const userAppEntities = await rv.RunView({
235
+ EntityName: 'User Application Entities',
236
+ ResultType: 'entity_object',
237
+ ExtraFilter: `UserApplicationID = '${this.userApp.ID}'`,
238
+ OrderBy: 'Sequence, Entity'
239
+ });
240
+ if (userAppEntities && userAppEntities.Success) {
241
+ this.SelectedAppEntities = userAppEntities.Results.map(uae => this.AllAppEntities.find(ae => uae.EntityID === ae.ID)).filter(val => val); // now we have our selected app entities and they're sorted properly
242
+ this.UnselectedAppEntities = this.AllAppEntities.filter(e => !this.SelectedAppEntities.some(sa => sa.ID === e.ID));
243
+ // special case - if we have NO user app entities and the application has entities that are marked as DefaultForNewUser=1 we will add them now
244
+ const defaultEntities = this.app.ApplicationEntities.filter(a => a.DefaultForNewUser);
245
+ if (this.SelectedAppEntities.length === 0 && defaultEntities.length > 0) {
246
+ // there are some entities that should default for a new user, so let's add them to the selected entities and remove from the Unselected
247
+ // app entities and then call the Save method that we use when the user dialog ends
248
+ this.SelectedAppEntities = defaultEntities.map(de => this.AllAppEntities.find(aae => de.EntityID === aae.ID)).filter(val => val);
249
+ // now we have the default entities in place for the app, remove them from the Unselected array
250
+ this.UnselectedAppEntities = this.UnselectedAppEntities.filter(e => !this.SelectedAppEntities.some(se => se.ID === e.ID));
251
+ // now save
252
+ await this.OnAppEntitySelectionDialogClosed(true);
252
253
  }
253
254
  }
254
- // now down here we have either loaded the app above, or already had the current app loaded. Now we move on to set the current entity and load er up
255
- if (this.app && this.SelectedAppEntities.length) {
256
- if (entityName) {
257
- // sometimes the entity name contains a ? and values after it, look for that and only grab stuff to left of ?
258
- const entityNameParts = entityName.split('?');
259
- const entityNameToLower = entityNameParts[0].toLowerCase().trim();
260
- const selectedAppEntity = this.SelectedAppEntities.find(e => e.Name.toLocaleLowerCase() === entityNameToLower);
261
- if (selectedAppEntity) {
262
- yield this.loadEntityAndFolders(selectedAppEntity);
263
- }
264
- else
265
- yield this.loadEntityAndFolders(this.SelectedAppEntities[0]);
266
- }
267
- else {
268
- yield this.loadEntityAndFolders(this.SelectedAppEntities[0]);
255
+ }
256
+ // now down here we have either loaded the app above, or already had the current app loaded. Now we move on to set the current entity and load er up
257
+ if (this.app && this.SelectedAppEntities.length) {
258
+ if (entityName) {
259
+ // sometimes the entity name contains a ? and values after it, look for that and only grab stuff to left of ?
260
+ const entityNameParts = entityName.split('?');
261
+ const entityNameToLower = entityNameParts[0].toLowerCase().trim();
262
+ const selectedAppEntity = this.SelectedAppEntities.find(e => e.Name.toLocaleLowerCase() === entityNameToLower);
263
+ if (selectedAppEntity) {
264
+ await this.loadEntityAndFolders(selectedAppEntity);
269
265
  }
266
+ else
267
+ await this.loadEntityAndFolders(this.SelectedAppEntities[0]);
270
268
  }
271
- this.showLoader = false;
272
- }));
269
+ else {
270
+ await this.loadEntityAndFolders(this.SelectedAppEntities[0]);
271
+ }
272
+ }
273
+ this.showLoader = false;
273
274
  });
274
275
  }
275
276
  IsEntitySelected(entity) {
276
- var _a;
277
- if (((_a = this.currentlySelectedAppEntity) === null || _a === void 0 ? void 0 : _a.ID) === entity.ID)
277
+ if (this.currentlySelectedAppEntity?.ID === entity.ID)
278
278
  return true;
279
279
  else
280
280
  return false;
@@ -282,116 +282,107 @@ export class ApplicationViewComponent extends BaseBrowserComponent {
282
282
  ShowAppEntitySelectionDialog() {
283
283
  this.AppEntitySelectionDialogVisible = true;
284
284
  }
285
- OnAppEntitySelectionDialogClosed(save) {
286
- return __awaiter(this, void 0, void 0, function* () {
287
- this.AppEntitySelectionDialogVisible = false;
288
- // now we need to process the changes if the user hit save
289
- if (save) {
290
- // we need to basically make sure the User Application Entities entity for this user maps to the set of selected Entities within the application, in the order selected as well
291
- const rv = new RunView();
292
- const md = new Metadata();
293
- const userAppEntities = yield rv.RunView({
294
- EntityName: 'User Application Entities',
295
- ResultType: 'entity_object',
296
- ExtraFilter: `UserApplicationID = '${this.userApp.ID}'`,
297
- OrderBy: 'Sequence'
298
- });
299
- // userAppEntities.results is the current DB state, we need to now compare it to the SelectedAppEntities array
300
- // and if there are changes either update sequence values or delete records that aren't selected anymore.
301
- const existingUserAppEntities = userAppEntities.Results;
302
- const userAppEntitiesToSave = [];
303
- const userAppEntitiesToDelete = [];
304
- // first we need to update the sequence values for the selected applications
305
- for (let index = 0; index < this.SelectedAppEntities.length; index++) {
306
- const e = this.SelectedAppEntities[index];
307
- const existing = existingUserAppEntities.find(uae => uae.EntityID === e.ID);
308
- if (existing) {
309
- if (existing.Sequence !== index) {
310
- existing.Sequence = index;
311
- userAppEntitiesToSave.push(existing);
312
- }
313
- }
314
- else {
315
- // this is a new app entity that the user has selected
316
- const newApp = yield md.GetEntityObject("User Application Entities");
317
- newApp.UserApplicationID = this.userApp.ID;
318
- newApp.Sequence = index;
319
- newApp.EntityID = e.ID;
320
- userAppEntitiesToSave.push(newApp);
321
- }
322
- }
323
- // now we need to add the records that aren't selected anymore to a delete array
324
- for (let index = 0; index < existingUserAppEntities.length; index++) {
325
- const existing = existingUserAppEntities[index];
326
- if (!this.SelectedAppEntities.some(sa => sa.ID === existing.EntityID)) {
327
- userAppEntitiesToDelete.push(existing);
285
+ async OnAppEntitySelectionDialogClosed(save) {
286
+ this.AppEntitySelectionDialogVisible = false;
287
+ // now we need to process the changes if the user hit save
288
+ if (save) {
289
+ // we need to basically make sure the User Application Entities entity for this user maps to the set of selected Entities within the application, in the order selected as well
290
+ const rv = new RunView();
291
+ const md = new Metadata();
292
+ const userAppEntities = await rv.RunView({
293
+ EntityName: 'User Application Entities',
294
+ ResultType: 'entity_object',
295
+ ExtraFilter: `UserApplicationID = '${this.userApp.ID}'`,
296
+ OrderBy: 'Sequence'
297
+ });
298
+ // userAppEntities.results is the current DB state, we need to now compare it to the SelectedAppEntities array
299
+ // and if there are changes either update sequence values or delete records that aren't selected anymore.
300
+ const existingUserAppEntities = userAppEntities.Results;
301
+ const userAppEntitiesToSave = [];
302
+ const userAppEntitiesToDelete = [];
303
+ // first we need to update the sequence values for the selected applications
304
+ for (let index = 0; index < this.SelectedAppEntities.length; index++) {
305
+ const e = this.SelectedAppEntities[index];
306
+ const existing = existingUserAppEntities.find(uae => uae.EntityID === e.ID);
307
+ if (existing) {
308
+ if (existing.Sequence !== index) {
309
+ existing.Sequence = index;
310
+ userAppEntitiesToSave.push(existing);
328
311
  }
329
312
  }
330
- // finally, we need to submit a single transaction so we have one server round trip to commit all this good stuff
331
- const tg = yield md.CreateTransactionGroup();
332
- for (const toSave of userAppEntitiesToSave) {
333
- toSave.TransactionGroup = tg;
334
- yield toSave.Save();
335
- }
336
- for (const d of userAppEntitiesToDelete) {
337
- d.TransactionGroup = tg;
338
- yield d.Delete();
313
+ else {
314
+ // this is a new app entity that the user has selected
315
+ const newApp = await md.GetEntityObject("User Application Entities");
316
+ newApp.UserApplicationID = this.userApp.ID;
317
+ newApp.Sequence = index;
318
+ newApp.EntityID = e.ID;
319
+ userAppEntitiesToSave.push(newApp);
339
320
  }
340
- if (!(yield tg.Submit())) {
341
- // the data doesn't need to be updated when we are succesful because we're all bound to the same data which is cool
342
- // but in this case we need to notify the user it failed
343
- this.sharedService.CreateSimpleNotification('There was an error saving your entity selections. Please try again later or notify a system administrator.', "error", 3500);
321
+ }
322
+ // now we need to add the records that aren't selected anymore to a delete array
323
+ for (let index = 0; index < existingUserAppEntities.length; index++) {
324
+ const existing = existingUserAppEntities[index];
325
+ if (!this.SelectedAppEntities.some(sa => sa.ID === existing.EntityID)) {
326
+ userAppEntitiesToDelete.push(existing);
344
327
  }
345
328
  }
346
- });
329
+ // finally, we need to submit a single transaction so we have one server round trip to commit all this good stuff
330
+ const tg = await md.CreateTransactionGroup();
331
+ for (const toSave of userAppEntitiesToSave) {
332
+ toSave.TransactionGroup = tg;
333
+ await toSave.Save();
334
+ }
335
+ for (const d of userAppEntitiesToDelete) {
336
+ d.TransactionGroup = tg;
337
+ await d.Delete();
338
+ }
339
+ if (!await tg.Submit()) {
340
+ // the data doesn't need to be updated when we are succesful because we're all bound to the same data which is cool
341
+ // but in this case we need to notify the user it failed
342
+ this.sharedService.CreateSimpleNotification('There was an error saving your entity selections. Please try again later or notify a system administrator.', "error", 3500);
343
+ }
344
+ }
347
345
  }
348
346
  onAppEntityButtonClicked(e) {
349
- var _a;
350
- if (e.ID === ((_a = this.currentlySelectedAppEntity) === null || _a === void 0 ? void 0 : _a.ID))
347
+ if (e.ID === this.currentlySelectedAppEntity?.ID)
351
348
  return;
352
349
  this.selectedFolderID = null;
353
350
  this.currentlySelectedAppEntity = e;
354
351
  this.navigateToCurrentPage();
355
352
  }
356
- loadEntityAndFolders(entity) {
357
- const _super = Object.create(null, {
358
- RunView: { get: () => super.RunView },
359
- LoadData: { get: () => super.LoadData }
360
- });
361
- return __awaiter(this, void 0, void 0, function* () {
362
- if (!entity) {
363
- this.currentlySelectedAppEntity = undefined; // make sure our current selection is wiped out here
364
- return;
365
- }
366
- this.showLoader = true;
367
- this.currentlySelectedAppEntity = entity;
368
- this.categoryEntityID = entity.ID;
369
- this.ResourceItemFilter = `EntityID='${entity.ID}'`;
370
- this.FilterOutCurrentUserViews = `UserID <> '${this.currentUser.ID}' AND EntityID = '${entity.ID}'`;
371
- if (this.selectedFolderID) {
372
- let viewResult = yield _super.RunView.call(this, this.categoryEntityName, `ID='${this.selectedFolderID}'`);
373
- if (viewResult.length > 0) {
374
- this.pageTitle = viewResult[0].Name;
375
- }
376
- }
377
- else {
378
- this.pageTitle = this.currentlySelectedAppEntity.Name;
353
+ async loadEntityAndFolders(entity) {
354
+ if (!entity) {
355
+ this.currentlySelectedAppEntity = undefined; // make sure our current selection is wiped out here
356
+ return;
357
+ }
358
+ this.showLoader = true;
359
+ this.currentlySelectedAppEntity = entity;
360
+ this.categoryEntityID = entity.ID;
361
+ this.ResourceItemFilter = `EntityID='${entity.ID}'`;
362
+ this.FilterOutCurrentUserViews = `UserID <> '${this.currentUser.ID}' AND EntityID = '${entity.ID}'`;
363
+ if (this.selectedFolderID) {
364
+ let viewResult = await super.RunView(this.categoryEntityName, `ID='${this.selectedFolderID}'`);
365
+ if (viewResult.length > 0) {
366
+ this.pageTitle = viewResult[0].Name;
379
367
  }
380
- const md = new Metadata();
381
- const parentFolderIDFilter = this.selectedFolderID ? `ParentID='${this.selectedFolderID}'` : 'ParentID IS NULL';
382
- const categoryFilter = `UserID='${md.CurrentUser.ID}' AND EntityID='${this.currentlySelectedAppEntity.ID}' AND ` + parentFolderIDFilter;
383
- const categoryIDFilter = this.selectedFolderID ? `CategoryID='${this.selectedFolderID}'` : 'CategoryID IS NULL';
384
- const userViewFilter = `UserID = '${md.CurrentUser.ID}' AND EntityID='${this.currentlySelectedAppEntity.ID}' AND ` + categoryIDFilter;
385
- yield _super.LoadData.call(this, {
386
- sortItemsAfterLoad: true,
387
- categoryItemFilter: categoryFilter,
388
- entityItemFilter: userViewFilter,
389
- linkItemFilter: `EntityID='${this.currentlySelectedAppEntity.ID}'`,
390
- showLoader: true
391
- });
392
- this.showLoader = false;
393
- this.cdr.detectChanges(); // tell Angular to detect changes as we just change the current entity so that affects some UI elements visualy like which button shows as selected
368
+ }
369
+ else {
370
+ this.pageTitle = this.currentlySelectedAppEntity.Name;
371
+ }
372
+ const md = new Metadata();
373
+ const parentFolderIDFilter = this.selectedFolderID ? `ParentID='${this.selectedFolderID}'` : 'ParentID IS NULL';
374
+ const categoryFilter = `UserID='${md.CurrentUser.ID}' AND EntityID='${this.currentlySelectedAppEntity.ID}' AND ` + parentFolderIDFilter;
375
+ const categoryIDFilter = this.selectedFolderID ? `CategoryID='${this.selectedFolderID}'` : 'CategoryID IS NULL';
376
+ const userViewFilter = `UserID = '${md.CurrentUser.ID}' AND EntityID='${this.currentlySelectedAppEntity.ID}' AND ` + categoryIDFilter;
377
+ await super.LoadData({
378
+ sortItemsAfterLoad: true,
379
+ categoryItemFilter: categoryFilter,
380
+ entityItemFilter: userViewFilter,
381
+ linkItemFilter: `EntityID='${this.currentlySelectedAppEntity.ID}'`,
382
+ showLoader: true
394
383
  });
384
+ this.showLoader = false;
385
+ this.cdr.detectChanges(); // tell Angular to detect changes as we just change the current entity so that affects some UI elements visualy like which button shows as selected
395
386
  }
396
387
  onItemClick(item) {
397
388
  if (!item) {
@@ -423,7 +414,6 @@ export class ApplicationViewComponent extends BaseBrowserComponent {
423
414
  }
424
415
  }
425
416
  navigateToCurrentPage() {
426
- var _a;
427
417
  if (!this.app) {
428
418
  throw new Error('Application Not Loaded');
429
419
  }
@@ -433,7 +423,7 @@ export class ApplicationViewComponent extends BaseBrowserComponent {
433
423
  //so its easier if we instead navigate to this page with an updated url and leverage angular's router
434
424
  let folderID = this.selectedFolderID;
435
425
  let url = ["/app", this.app.Name];
436
- let appEntityName = ((_a = this.currentlySelectedAppEntity) === null || _a === void 0 ? void 0 : _a.Name) || null;
426
+ let appEntityName = this.currentlySelectedAppEntity?.Name || null;
437
427
  if (appEntityName) {
438
428
  url.push(`${appEntityName}`);
439
429
  if (folderID) {
@@ -445,6 +435,7 @@ export class ApplicationViewComponent extends BaseBrowserComponent {
445
435
  onViewModeChange(viewMode) {
446
436
  this.viewMode = viewMode;
447
437
  }
438
+ LinkToSharedViewDialogVisible = false;
448
439
  createItemClickedEvent(event) {
449
440
  switch (event.Text.trim().toLowerCase()) {
450
441
  case 'link to shared view':
@@ -455,32 +446,30 @@ export class ApplicationViewComponent extends BaseBrowserComponent {
455
446
  break;
456
447
  }
457
448
  }
458
- HandleLinkToSharedView(okClicked) {
459
- return __awaiter(this, void 0, void 0, function* () {
460
- this.LinkToSharedViewDialogVisible = false;
461
- if (okClicked) {
462
- const resources = this.availableResourcesComponent.SelectedResources;
463
- const md = new Metadata();
464
- let success = true;
465
- for (const r of resources) {
466
- const newResourceLink = yield md.GetEntityObject('Resource Links');
467
- newResourceLink.ResourceRecordID = r.ResourceRecordID;
468
- newResourceLink.ResourceTypeID = r.ResourceTypeID;
469
- newResourceLink.UserID = this.currentUser.ID;
470
- newResourceLink.FolderID = this.selectedFolderID;
471
- if (!(yield newResourceLink.Save())) {
472
- LogError('Error saving new resource link: ' + newResourceLink.LatestResult.Message);
473
- success = false;
474
- }
475
- else {
476
- yield this.loadEntityAndFolders(this.currentlySelectedAppEntity); // refresh the view
477
- }
449
+ async HandleLinkToSharedView(okClicked) {
450
+ this.LinkToSharedViewDialogVisible = false;
451
+ if (okClicked) {
452
+ const resources = this.availableResourcesComponent.SelectedResources;
453
+ const md = new Metadata();
454
+ let success = true;
455
+ for (const r of resources) {
456
+ const newResourceLink = await md.GetEntityObject('Resource Links');
457
+ newResourceLink.ResourceRecordID = r.ResourceRecordID;
458
+ newResourceLink.ResourceTypeID = r.ResourceTypeID;
459
+ newResourceLink.UserID = this.currentUser.ID;
460
+ newResourceLink.FolderID = this.selectedFolderID;
461
+ if (!await newResourceLink.Save()) {
462
+ LogError('Error saving new resource link: ' + newResourceLink.LatestResult.Message);
463
+ success = false;
478
464
  }
479
- if (!success) {
480
- this.sharedService.CreateSimpleNotification('There was an error linking to the shared view(s). Please try again later or notify a system administrator.', 'error', 3500);
465
+ else {
466
+ await this.loadEntityAndFolders(this.currentlySelectedAppEntity); // refresh the view
481
467
  }
482
468
  }
483
- });
469
+ if (!success) {
470
+ this.sharedService.CreateSimpleNotification('There was an error linking to the shared view(s). Please try again later or notify a system administrator.', 'error', 3500);
471
+ }
472
+ }
484
473
  }
485
474
  createNewView() {
486
475
  if (this.viewPropertiesDialog && this.currentlySelectedAppEntity) {
@@ -491,55 +480,45 @@ export class ApplicationViewComponent extends BaseBrowserComponent {
491
480
  LogError("View Properties Dialog not found");
492
481
  }
493
482
  }
494
- editView(event) {
495
- return __awaiter(this, void 0, void 0, function* () {
496
- event.Cancel = true;
497
- if (this.viewPropertiesDialog) {
498
- let data = event.Item.Data;
499
- this.viewPropertiesDialog.Open(data.ID);
500
- }
501
- else {
502
- LogError("View Properties Dialog not found");
503
- }
504
- });
483
+ async editView(event) {
484
+ event.Cancel = true;
485
+ if (this.viewPropertiesDialog) {
486
+ let data = event.Item.Data;
487
+ this.viewPropertiesDialog.Open(data.ID);
488
+ }
489
+ else {
490
+ LogError("View Properties Dialog not found");
491
+ }
505
492
  }
506
- OnViewPropertiesDialogClose(args) {
507
- return __awaiter(this, void 0, void 0, function* () {
508
- //user view properties dialog handles navigating to the newly created views
509
- //so we only need to worry about saves to existing views
510
- if (args && args.Saved && this.currentlySelectedAppEntity) {
511
- args.Cancel = true;
512
- yield this.loadEntityAndFolders(this.currentlySelectedAppEntity);
513
- }
514
- });
493
+ async OnViewPropertiesDialogClose(args) {
494
+ //user view properties dialog handles navigating to the newly created views
495
+ //so we only need to worry about saves to existing views
496
+ if (args && args.Saved && this.currentlySelectedAppEntity) {
497
+ args.Cancel = true;
498
+ await this.loadEntityAndFolders(this.currentlySelectedAppEntity);
499
+ }
515
500
  }
516
- navigateToParentFolder() {
517
- return __awaiter(this, void 0, void 0, function* () {
518
- if (this.selectedFolderID) {
519
- const rv = new RunView();
520
- const parentResult = yield rv.RunView({
521
- EntityName: "User View Categories",
522
- ExtraFilter: `ID='${this.selectedFolderID}'`,
523
- });
524
- if (parentResult && parentResult.Success && parentResult.Results.length > 0) {
525
- this.selectedFolderID = parentResult.Results[0].ParentID;
526
- this.navigateToCurrentPage();
527
- }
501
+ async navigateToParentFolder() {
502
+ if (this.selectedFolderID) {
503
+ const rv = new RunView();
504
+ const parentResult = await rv.RunView({
505
+ EntityName: "User View Categories",
506
+ ExtraFilter: `ID='${this.selectedFolderID}'`,
507
+ });
508
+ if (parentResult && parentResult.Success && parentResult.Results.length > 0) {
509
+ this.selectedFolderID = parentResult.Results[0].ParentID;
510
+ this.navigateToCurrentPage();
528
511
  }
529
- });
512
+ }
530
513
  }
531
- GoToApps(event) {
532
- return __awaiter(this, void 0, void 0, function* () {
533
- event.preventDefault();
534
- this.router.navigate(['data']);
535
- });
514
+ async GoToApps(event) {
515
+ event.preventDefault();
516
+ this.router.navigate(['data']);
536
517
  }
537
- GoHome(event) {
538
- return __awaiter(this, void 0, void 0, function* () {
539
- event.preventDefault();
540
- // tell the router to go to /home
541
- this.router.navigate(['home']);
542
- });
518
+ async GoHome(event) {
519
+ event.preventDefault();
520
+ // tell the router to go to /home
521
+ this.router.navigate(['home']);
543
522
  }
544
523
  createNewRecord() {
545
524
  if (!this.currentlySelectedAppEntity) {
@@ -565,22 +544,22 @@ export class ApplicationViewComponent extends BaseBrowserComponent {
565
544
  }
566
545
  });
567
546
  }
547
+ static ɵfac = function ApplicationViewComponent_Factory(t) { return new (t || ApplicationViewComponent)(i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i1.ActivatedRoute), i0.ɵɵdirectiveInject(i2.Location), i0.ɵɵdirectiveInject(i3.SharedService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
548
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ApplicationViewComponent, selectors: [["mj-application-view"]], viewQuery: function ApplicationViewComponent_Query(rf, ctx) { if (rf & 1) {
549
+ i0.ɵɵviewQuery(_c0, 5);
550
+ i0.ɵɵviewQuery(_c1, 5);
551
+ i0.ɵɵviewQuery(_c2, 5);
552
+ } if (rf & 2) {
553
+ let _t;
554
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.entityRowRef = _t.first);
555
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.viewPropertiesDialog = _t.first);
556
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.availableResourcesComponent = _t.first);
557
+ } }, inputs: { categoryEntityID: "categoryEntityID" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [["entityRow", ""], ["userViewDialog", ""], ["availableResourcesComponent", ""], ["class", "app-container", 4, "ngIf"], [1, "app-container"], [1, "card-header-entity", "cloumn"], [1, "header-wrap"], [1, "title-icon"], [1, "title-wrap"], [1, "title-wrap-inner"], [1, "breadcrumb", 3, "click"], [1, "breadcrumb-separator"], [1, "fa-solid", "fa-chevron-right"], [1, "breadcrumb-end"], [1, "config-button"], ["kendoButton", "", 3, "click"], [1, "fa-solid", "fa-gear"], ["EntityName", "Entities", "DisplayField", "Name", "DisplayIconField", "Icon", 3, "DialogClosed", "AvailableRecords", "SelectedRecords", "UnselectedRecords", "DialogVisible"], [1, "row", 2, "max-width", "100%"], [1, "col-xs-12", "col-sm-6", "example-col"], ["kendoButton", "", "fillMode", "flat", 3, "toggleable", "selected", "click", 4, "ngFor", "ngForOf"], [1, "main-area", "margin-top-neg-20"], [3, "dialogClosed", "ShowPropertiesButton"], ["DialogTitle", "Available Resources", 3, "DialogClosed", "DialogVisible"], ["ExtraColumns", "UserName, Description", "SelectionMode", "Multiple", 3, "User", "ResourceTypeID", "ResourceExtraFilter", 4, "ngIf"], [3, "ngClass"], ["kendoButton", "", "fillMode", "flat", 3, "click", "toggleable", "selected"], [3, "click"], ["class", "main-area margin-top-neg-20", 4, "ngIf"], ["ResourceTypeName", "User Views", "DisplayMode", "Tile", 3, "ResourceSelected", "NavigateToParentEvent", "EditItemEvent", "EnableCategories", "CategoryEntityID", "CurrentCategoryID", "Title", "ItemFilter", "NewItemOptions"], ["ExtraColumns", "UserName, Description", "SelectionMode", "Multiple", 3, "User", "ResourceTypeID", "ResourceExtraFilter"]], template: function ApplicationViewComponent_Template(rf, ctx) { if (rf & 1) {
558
+ i0.ɵɵtemplate(0, ApplicationViewComponent_div_0_Template, 31, 12, "div", 3);
559
+ } if (rf & 2) {
560
+ i0.ɵɵproperty("ngIf", ctx.app);
561
+ } }, dependencies: [i2.NgClass, i2.NgForOf, i2.NgIf, i4.LoaderComponent, i5.ButtonComponent, i6.UserViewPropertiesDialogComponent, i7.RecordSelectorDialogComponent, i8.AvailableResourcesComponent, i9.GenericDialogComponent, i10.ResourceBrowserComponent], styles: [".app-container[_ngcontent-%COMP%] {\n padding: 15px;\n}\n \n.entity-list[_ngcontent-%COMP%] {\n width: 500px;\n}\n.favorites-list[_ngcontent-%COMP%] {\n width: 400px;\n}\n\n.cloumn[_ngcontent-%COMP%] {\n flex-direction: column;\n}\n.example-col[_ngcontent-%COMP%] {\n overflow-x: auto;\n}\n.example-col[_ngcontent-%COMP%] .k-selected[_ngcontent-%COMP%] {\n font-weight: 800;\n color: var(--tdata-color);\n border-bottom: 3px solid var(--border-blue) !important;\n background: var(--white-color);\n}\n\n.margin-top-neg-20[_ngcontent-%COMP%] {\n margin-top: -20px;\n padding: 0px !important\n}\n\n.header-wrap[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 10px;\n width: 100%;\n}\n\n.title-wrap[_ngcontent-%COMP%] {\n flex-grow: 1;\n font-size: 24px;\n}\n.title-wrap-inner[_ngcontent-%COMP%] {\n display: block;\n}\n\n.breadcrumb[_ngcontent-%COMP%] {\n color: darkblue;\n cursor: pointer;\n display: inline;\n margin-left: 5px;\n margin-right: 5px;\n}\n\n.breadcrumb-end[_ngcontent-%COMP%] {\n display: inline;\n margin-left: 5px;\n}\n\n\n.breadcrumb-separator[_ngcontent-%COMP%] {\n font-size: 14px;\n display: inline;\n margin-left: 5px;\n margin-right: 5px;\n}\n.home-icon[_ngcontent-%COMP%] {\n margin-right: 5px;\n font-size: 18px;\n vertical-align: middle;\n}\n \n.title-icon[_ngcontent-%COMP%] {\n font-size: 32px;\n margin-right: 15px;\n}\n\n.config-button[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n}\n\n.button-icon[_ngcontent-%COMP%] {\n margin-right: 5px;\n font-size: 16px;\n}", ".main-area[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n gap: 24px;\n padding: 24px 0;\n}\n.list-view[_ngcontent-%COMP%] {\n padding: 16px;\n min-width: 300px;\n border-radius: 4px;\n background: #FAFAFA;\n border: none;\n}\n .list-view .k-listview-header, \n .list-view .k-listview-footer {\n border: none;\n}\n .list-view .k-listview-content {\n border: 1px solid rgba(0, 0, 0, 0.08);\n border-radius: 4px;\n background: #fff;\n padding: 16px;\n}\n\n.header[_ngcontent-%COMP%], \n.footer[_ngcontent-%COMP%] {\n color: #424242;\n font-size: 16px;\n height: auto;\n margin:0;\n}\n\n.header[_ngcontent-%COMP%] {\n color: #424242;\n margin-bottom: 16px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.header[_ngcontent-%COMP%] .head-tag[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #424242;\nfont-size: 16px;\nfont-style: normal;\nfont-weight: 400;\nline-height: 20px;\n}\n\n.header[_ngcontent-%COMP%] .count[_ngcontent-%COMP%] {\n width: 24px;\n height: 24px;\n min-width: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n font-size: 10px;\n background: rgba(0, 0, 0, 0.08);\n border-radius: 50%;\n}\n.footer[_ngcontent-%COMP%] {\n font-size: 14px;\n margin-top: 16px;\n}\n\n.list-item[_ngcontent-%COMP%] {\n color: #424242;\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 30px;\n cursor: pointer;\n margin: 4px;\n}\n.card-container[_ngcontent-%COMP%] {\n margin: 0;\n padding: 0;\n box-shadow: none;\n}\n.card-header-entity[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding-bottom: 20px;\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\n}\n.card-header-entity[_ngcontent-%COMP%] .title-wrap[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] {\n color: #424242;\n font-size: 28px;\n font-style: normal;\n font-weight: 300;\n line-height: 28px;\n margin-bottom: 15px;\n}\n.card-header-entity[_ngcontent-%COMP%] .title-wrap[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n.card-header-entity[_ngcontent-%COMP%] .title-wrap[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n color: #424242;\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n}\n\n\n\n\n \n.view-card[_ngcontent-%COMP%] .view-icon[_ngcontent-%COMP%] {\n color: var(--sideNav);\n}\n.card-wrapper[_ngcontent-%COMP%] {\n border: 1px solid rgba(0, 0, 0, 0.08);\n border-radius: 6px;\n width: 100% !important;\n}\n.card-wrapper[_ngcontent-%COMP%] .k-card-body[_ngcontent-%COMP%] {\n background: #fff;\n padding: 12px 20px;\n}\n.card-wrapper[_ngcontent-%COMP%] .view-card[_ngcontent-%COMP%] {\n overflow: auto;\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: #fafafa;\n padding: 4px 15px;\n}\n.view-card[_ngcontent-%COMP%] .btn-wrapper[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n}\n\n.k-card-body[_ngcontent-%COMP%] .view-card-content[_ngcontent-%COMP%] h5[_ngcontent-%COMP%] {\n color: #424242;\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n margin-bottom: 0;\n letter-spacing: 0.18px;\n}\n.k-card-body[_ngcontent-%COMP%] .view-card-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n color: #666;\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n height: 48px;\n margin-bottom: 0;\n}\n.card-container[_ngcontent-%COMP%] {\n padding: 0;\n margin: 0;\n box-shadow: none;\n}\n.card-header-entity[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding-bottom: 20px;\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\n}\n\n.card-header-entity[_ngcontent-%COMP%] .title-wrap[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] {\n color: #424242;\n font-size: 28px;\n font-style: normal;\n font-weight: 300;\n line-height: 28px;\n margin-bottom: 15px;\n}\n.card-header-entity[_ngcontent-%COMP%] .title-wrap[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n.card-header-entity[_ngcontent-%COMP%] .title-wrap[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n color: #424242;\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n}\n.main-area[_ngcontent-%COMP%] .card-list[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 20px;\n}"] });
568
562
  }
569
- ApplicationViewComponent.ɵfac = function ApplicationViewComponent_Factory(t) { return new (t || ApplicationViewComponent)(i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i1.ActivatedRoute), i0.ɵɵdirectiveInject(i2.Location), i0.ɵɵdirectiveInject(i3.SharedService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
570
- ApplicationViewComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ApplicationViewComponent, selectors: [["mj-application-view"]], viewQuery: function ApplicationViewComponent_Query(rf, ctx) { if (rf & 1) {
571
- i0.ɵɵviewQuery(_c0, 5);
572
- i0.ɵɵviewQuery(_c1, 5);
573
- i0.ɵɵviewQuery(_c2, 5);
574
- } if (rf & 2) {
575
- let _t;
576
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.entityRowRef = _t.first);
577
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.viewPropertiesDialog = _t.first);
578
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.availableResourcesComponent = _t.first);
579
- } }, inputs: { categoryEntityID: "categoryEntityID" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [["entityRow", ""], ["userViewDialog", ""], ["availableResourcesComponent", ""], ["class", "app-container", 4, "ngIf"], [1, "app-container"], [1, "card-header-entity", "cloumn"], [1, "header-wrap"], [1, "title-icon"], [1, "title-wrap"], [1, "title-wrap-inner"], [1, "breadcrumb", 3, "click"], [1, "breadcrumb-separator"], [1, "fa-solid", "fa-chevron-right"], [1, "breadcrumb-end"], [1, "config-button"], ["kendoButton", "", 3, "click"], [1, "fa-solid", "fa-gear"], ["EntityName", "Entities", "DisplayField", "Name", "DisplayIconField", "Icon", 3, "DialogClosed", "AvailableRecords", "SelectedRecords", "UnselectedRecords", "DialogVisible"], [1, "row", 2, "max-width", "100%"], [1, "col-xs-12", "col-sm-6", "example-col"], ["kendoButton", "", "fillMode", "flat", 3, "toggleable", "selected", "click", 4, "ngFor", "ngForOf"], [1, "main-area", "margin-top-neg-20"], [3, "dialogClosed", "ShowPropertiesButton"], ["DialogTitle", "Available Resources", 3, "DialogClosed", "DialogVisible"], ["ExtraColumns", "UserName, Description", "SelectionMode", "Multiple", 3, "User", "ResourceTypeID", "ResourceExtraFilter", 4, "ngIf"], [3, "ngClass"], ["kendoButton", "", "fillMode", "flat", 3, "click", "toggleable", "selected"], [3, "click"], ["class", "main-area margin-top-neg-20", 4, "ngIf"], ["ResourceTypeName", "User Views", "DisplayMode", "Tile", 3, "ResourceSelected", "NavigateToParentEvent", "EditItemEvent", "EnableCategories", "CategoryEntityID", "CurrentCategoryID", "Title", "ItemFilter", "NewItemOptions"], ["ExtraColumns", "UserName, Description", "SelectionMode", "Multiple", 3, "User", "ResourceTypeID", "ResourceExtraFilter"]], template: function ApplicationViewComponent_Template(rf, ctx) { if (rf & 1) {
580
- i0.ɵɵtemplate(0, ApplicationViewComponent_div_0_Template, 31, 12, "div", 3);
581
- } if (rf & 2) {
582
- i0.ɵɵproperty("ngIf", ctx.app);
583
- } }, dependencies: [i2.NgClass, i2.NgForOf, i2.NgIf, i4.LoaderComponent, i5.ButtonComponent, i6.UserViewPropertiesDialogComponent, i7.RecordSelectorDialogComponent, i8.AvailableResourcesComponent, i9.GenericDialogComponent, i10.ResourceBrowserComponent], styles: [".app-container[_ngcontent-%COMP%] {\n padding: 15px;\n}\n \n.entity-list[_ngcontent-%COMP%] {\n width: 500px;\n}\n.favorites-list[_ngcontent-%COMP%] {\n width: 400px;\n}\n\n.cloumn[_ngcontent-%COMP%] {\n flex-direction: column;\n}\n.example-col[_ngcontent-%COMP%] {\n overflow-x: auto;\n}\n.example-col[_ngcontent-%COMP%] .k-selected[_ngcontent-%COMP%] {\n font-weight: 800;\n color: var(--tdata-color);\n border-bottom: 3px solid var(--border-blue) !important;\n background: var(--white-color);\n}\n\n.margin-top-neg-20[_ngcontent-%COMP%] {\n margin-top: -20px;\n padding: 0px !important\n}\n\n.header-wrap[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 10px;\n width: 100%;\n}\n\n.title-wrap[_ngcontent-%COMP%] {\n flex-grow: 1;\n font-size: 24px;\n}\n.title-wrap-inner[_ngcontent-%COMP%] {\n display: block;\n}\n\n.breadcrumb[_ngcontent-%COMP%] {\n color: darkblue;\n cursor: pointer;\n display: inline;\n margin-left: 5px;\n margin-right: 5px;\n}\n\n.breadcrumb-end[_ngcontent-%COMP%] {\n display: inline;\n margin-left: 5px;\n}\n\n\n.breadcrumb-separator[_ngcontent-%COMP%] {\n font-size: 14px;\n display: inline;\n margin-left: 5px;\n margin-right: 5px;\n}\n.home-icon[_ngcontent-%COMP%] {\n margin-right: 5px;\n font-size: 18px;\n vertical-align: middle;\n}\n \n.title-icon[_ngcontent-%COMP%] {\n font-size: 32px;\n margin-right: 15px;\n}\n\n.config-button[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n}\n\n.button-icon[_ngcontent-%COMP%] {\n margin-right: 5px;\n font-size: 16px;\n}", ".main-area[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n gap: 24px;\n padding: 24px 0;\n}\n.list-view[_ngcontent-%COMP%] {\n padding: 16px;\n min-width: 300px;\n border-radius: 4px;\n background: #FAFAFA;\n border: none;\n}\n .list-view .k-listview-header, \n .list-view .k-listview-footer {\n border: none;\n}\n .list-view .k-listview-content {\n border: 1px solid rgba(0, 0, 0, 0.08);\n border-radius: 4px;\n background: #fff;\n padding: 16px;\n}\n\n.header[_ngcontent-%COMP%], \n.footer[_ngcontent-%COMP%] {\n color: #424242;\n font-size: 16px;\n height: auto;\n margin:0;\n}\n\n.header[_ngcontent-%COMP%] {\n color: #424242;\n margin-bottom: 16px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.header[_ngcontent-%COMP%] .head-tag[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #424242;\nfont-size: 16px;\nfont-style: normal;\nfont-weight: 400;\nline-height: 20px;\n}\n\n.header[_ngcontent-%COMP%] .count[_ngcontent-%COMP%] {\n width: 24px;\n height: 24px;\n min-width: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n font-size: 10px;\n background: rgba(0, 0, 0, 0.08);\n border-radius: 50%;\n}\n.footer[_ngcontent-%COMP%] {\n font-size: 14px;\n margin-top: 16px;\n}\n\n.list-item[_ngcontent-%COMP%] {\n color: #424242;\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 30px;\n cursor: pointer;\n margin: 4px;\n}\n.card-container[_ngcontent-%COMP%] {\n margin: 0;\n padding: 0;\n box-shadow: none;\n}\n.card-header-entity[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding-bottom: 20px;\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\n}\n.card-header-entity[_ngcontent-%COMP%] .title-wrap[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] {\n color: #424242;\n font-size: 28px;\n font-style: normal;\n font-weight: 300;\n line-height: 28px;\n margin-bottom: 15px;\n}\n.card-header-entity[_ngcontent-%COMP%] .title-wrap[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n.card-header-entity[_ngcontent-%COMP%] .title-wrap[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n color: #424242;\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n}\n\n\n\n\n \n.view-card[_ngcontent-%COMP%] .view-icon[_ngcontent-%COMP%] {\n color: var(--sideNav);\n}\n.card-wrapper[_ngcontent-%COMP%] {\n border: 1px solid rgba(0, 0, 0, 0.08);\n border-radius: 6px;\n width: 100% !important;\n}\n.card-wrapper[_ngcontent-%COMP%] .k-card-body[_ngcontent-%COMP%] {\n background: #fff;\n padding: 12px 20px;\n}\n.card-wrapper[_ngcontent-%COMP%] .view-card[_ngcontent-%COMP%] {\n overflow: auto;\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: #fafafa;\n padding: 4px 15px;\n}\n.view-card[_ngcontent-%COMP%] .btn-wrapper[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n}\n\n.k-card-body[_ngcontent-%COMP%] .view-card-content[_ngcontent-%COMP%] h5[_ngcontent-%COMP%] {\n color: #424242;\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n margin-bottom: 0;\n letter-spacing: 0.18px;\n}\n.k-card-body[_ngcontent-%COMP%] .view-card-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n color: #666;\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n height: 48px;\n margin-bottom: 0;\n}\n.card-container[_ngcontent-%COMP%] {\n padding: 0;\n margin: 0;\n box-shadow: none;\n}\n.card-header-entity[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding-bottom: 20px;\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\n}\n\n.card-header-entity[_ngcontent-%COMP%] .title-wrap[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] {\n color: #424242;\n font-size: 28px;\n font-style: normal;\n font-weight: 300;\n line-height: 28px;\n margin-bottom: 15px;\n}\n.card-header-entity[_ngcontent-%COMP%] .title-wrap[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n.card-header-entity[_ngcontent-%COMP%] .title-wrap[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n color: #424242;\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n}\n.main-area[_ngcontent-%COMP%] .card-list[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 20px;\n}"] });
584
563
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ApplicationViewComponent, [{
585
564
  type: Component,
586
565
  args: [{ selector: 'mj-application-view', template: "<div class=\"app-container\" *ngIf=\"this.app\">\n <div class=\"card-header-entity cloumn\">\n <div class=\"header-wrap\"> \n @if (this.app.Icon && this.app.Icon.length > 0) {\n <div class=\"title-icon\">\n <span [ngClass]=\"this.app.Icon\"></span>\n </div> \n }\n <div class=\"title-wrap\">\n <div class=\"title-wrap-inner\">\n <span class=\"breadcrumb\" (click)=\"GoHome($event)\">Home</span> \n <span class=\"breadcrumb-separator\"><span class=\"fa-solid fa-chevron-right\"></span></span>\n <span class=\"breadcrumb\" (click)=\"GoToApps($event)\">Applications</span>\n <span class=\"breadcrumb-separator\"><span class=\"fa-solid fa-chevron-right\"></span></span>\n <span class=\"breadcrumb-end\">{{this.app.Name}}</span>\n </div>\n </div>\n <div class=\"config-button\">\n <button kendoButton (click)=\"ShowAppEntitySelectionDialog()\"><span class=\"fa-solid fa-gear\"></span></button>\n <mj-record-selector-dialog \n EntityName=\"Entities\"\n [AvailableRecords]=\"AllAppEntities\" \n [SelectedRecords]=\"SelectedAppEntities\" \n [UnselectedRecords]=\"UnselectedAppEntities\"\n [DialogVisible]=\"AppEntitySelectionDialogVisible\"\n DisplayField=\"Name\"\n DisplayIconField=\"Icon\"\n (DialogClosed)=\"OnAppEntitySelectionDialogClosed($event)\"\n >\n </mj-record-selector-dialog>\n </div>\n </div> \n <div class=\"row\" #entityRow style=\"max-width: 100%;\">\n <div class=\"col-xs-12 col-sm-6 example-col\">\n <button\n *ngFor=\"let item of SelectedAppEntities\"\n kendoButton\n fillMode=\"flat\"\n [toggleable]=\"true\"\n [selected]=\"IsEntitySelected(item)\"\n (click)=\"onAppEntityButtonClicked(item)\"\n >\n <span>\n @if (item.Icon && item.Icon.length > 0) {\n <span [ngClass]=\"item.Icon + ' button-icon'\" ></span>\n }\n {{item.Name}}\n </span>\n </button>\n </div>\n </div>\n </div>\n @if (SelectedAppEntities.length === 0 && !showLoader) {\n <div (click)=\"ShowAppEntitySelectionDialog()\">\n <span class=\"fa-solid fa-gear\"></span>\n Click Here to Select Entities\n </div>\n }\n @if(showLoader) {\n <kendo-loader></kendo-loader>\n }\n @else {\n <div class=\"main-area margin-top-neg-20\" *ngIf=\"SelectedAppEntities.length > 0\">\n <mj-resource-browser\n ResourceTypeName=\"User Views\"\n [EnableCategories]=\"true\"\n [CategoryEntityID]=\"currentlySelectedAppEntity?.ID\"\n [CurrentCategoryID]=\"selectedFolderID\"\n [Title]=\"currentlySelectedAppEntity?.Name\"\n [ItemFilter]=\"ResourceItemFilter\"\n DisplayMode=\"Tile\"\n [NewItemOptions]=\"NewItemOptions\"\n (ResourceSelected)=\"onItemClick($event)\"\n (NavigateToParentEvent)=\"navigateToParentFolder()\"\n (EditItemEvent)=\"editView($event)\"\n />\n \n <!--\n <app-generic-browser-list \n iconName=\"aggregateFields\" \n [items]=\"items\"\n [categoryEntityID]=\"categoryEntityID\"\n addText=\"Create New View\"\n ItemEntityName=\"User Views\"\n resourceName=\"View\"\n [title]=\"pageTitle\"\n [extraDropdownOptions]=\"extraDropdownOptions\"\n [CategoryEntityName]=\"categoryEntityName\"\n (itemClickEvent)=\"onItemClick($event)\" \n [selectedFolderID]=\"selectedFolderID\"\n [showLoader]=\"showLoader\"\n [viewingResource]=false\n [displayAsGrid]=\"displayAsGrid\"\n (AfterAddFolderEvent)=\"onEvent($event)\"\n (AfterAddItemEvent)=\"onEvent($event)\"\n (AfterDeleteItemEvent)=\"onEvent($event)\"\n (AfterDeleteFolderEvent)=\"onEvent($event)\"\n (AfterUnlinkItemEvent)=\"onEvent($event)\"\n (viewModeChangeEvent)=\"onViewModeChange($event)\"\n (BeforeAddItemEvent)=\"createNewView($event)\"\n (BeforeUpdateItemEvent)=\"editView($event)\"\n (dropdownOptionClickEvent)=\"createItemClickedEvent($event)\"\n (NavigateToParentEvent)=\"navigateToParentFolder()\"\n />\n -->\n </div>\n }\n\n <mj-user-view-properties-dialog #userViewDialog [ShowPropertiesButton]=\"false\"(dialogClosed)=\"OnViewPropertiesDialogClose($event)\"></mj-user-view-properties-dialog>\n\n <mj-generic-dialog\n DialogTitle=\"Available Resources\"\n (DialogClosed)=\"HandleLinkToSharedView($event)\"\n [DialogVisible]=\"LinkToSharedViewDialogVisible\"\n >\n <mj-available-resources\n *ngIf=\"LinkToSharedViewDialogVisible\" \n #availableResourcesComponent\n [User]=\"currentUser\"\n [ResourceTypeID]=\"ViewResourceTypeID\"\n [ResourceExtraFilter]=\"FilterOutCurrentUserViews\"\n ExtraColumns= \"UserName, Description\"\n SelectionMode=\"Multiple\"\n >\n </mj-available-resources>\n </mj-generic-dialog> \n</div>\n", styles: [".app-container {\n padding: 15px;\n}\n \n.entity-list {\n width: 500px;\n}\n.favorites-list {\n width: 400px;\n}\n\n.cloumn {\n flex-direction: column;\n}\n.example-col {\n overflow-x: auto;\n}\n.example-col .k-selected {\n font-weight: 800;\n color: var(--tdata-color);\n border-bottom: 3px solid var(--border-blue) !important;\n background: var(--white-color);\n}\n\n.margin-top-neg-20 {\n margin-top: -20px;\n padding: 0px !important\n}\n\n.header-wrap {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 10px;\n width: 100%;\n}\n\n.title-wrap {\n flex-grow: 1;\n font-size: 24px;\n}\n.title-wrap-inner {\n display: block;\n}\n\n.breadcrumb {\n color: darkblue;\n cursor: pointer;\n display: inline;\n margin-left: 5px;\n margin-right: 5px;\n}\n\n.breadcrumb-end {\n display: inline;\n margin-left: 5px;\n}\n\n\n.breadcrumb-separator {\n font-size: 14px;\n display: inline;\n margin-left: 5px;\n margin-right: 5px;\n}\n.home-icon {\n margin-right: 5px;\n font-size: 18px;\n vertical-align: middle;\n}\n \n.title-icon {\n font-size: 32px;\n margin-right: 15px;\n}\n\n.config-button {\n display: flex;\n align-items: center;\n}\n\n.button-icon {\n margin-right: 5px;\n font-size: 16px;\n}", "\n.main-area {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n gap: 24px;\n padding: 24px 0;\n}\n.list-view {\n padding: 16px;\n min-width: 300px;\n border-radius: 4px;\n background: #FAFAFA;\n border: none;\n}\n::ng-deep .list-view .k-listview-header, \n::ng-deep .list-view .k-listview-footer {\n border: none;\n}\n::ng-deep .list-view .k-listview-content {\n border: 1px solid rgba(0, 0, 0, 0.08);\n border-radius: 4px;\n background: #fff;\n padding: 16px;\n}\n\n.header,\n.footer {\n color: #424242;\n font-size: 16px;\n height: auto;\n margin:0;\n}\n\n.header {\n color: #424242;\n margin-bottom: 16px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.header .head-tag {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #424242;\nfont-size: 16px;\nfont-style: normal;\nfont-weight: 400;\nline-height: 20px;\n}\n\n.header .count {\n width: 24px;\n height: 24px;\n min-width: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n font-size: 10px;\n background: rgba(0, 0, 0, 0.08);\n border-radius: 50%;\n}\n.footer {\n font-size: 14px;\n margin-top: 16px;\n}\n\n.list-item {\n color: #424242;\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 30px;\n cursor: pointer;\n margin: 4px;\n}\n.card-container {\n margin: 0;\n padding: 0;\n box-shadow: none;\n}\n.card-header-entity {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding-bottom: 20px;\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\n}\n.card-header-entity .title-wrap h1 {\n color: #424242;\n font-size: 28px;\n font-style: normal;\n font-weight: 300;\n line-height: 28px;\n margin-bottom: 15px;\n}\n.card-header-entity .title-wrap {\n display: flex;\n flex-direction: column;\n}\n.card-header-entity .title-wrap p {\n margin: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n color: #424242;\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n}\n\n\n\n\n \n.view-card .view-icon {\n color: var(--sideNav);\n}\n.card-wrapper {\n border: 1px solid rgba(0, 0, 0, 0.08);\n border-radius: 6px;\n width: 100% !important;\n}\n.card-wrapper .k-card-body {\n background: #fff;\n padding: 12px 20px;\n}\n.card-wrapper .view-card {\n overflow: auto;\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: #fafafa;\n padding: 4px 15px;\n}\n.view-card .btn-wrapper {\n display: flex;\n align-items: center;\n}\n\n.k-card-body .view-card-content h5 {\n color: #424242;\n font-size: 16px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n margin-bottom: 0;\n letter-spacing: 0.18px;\n}\n.k-card-body .view-card-content p {\n color: #666;\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n height: 48px;\n margin-bottom: 0;\n}\n.card-container {\n padding: 0;\n margin: 0;\n box-shadow: none;\n}\n.card-header-entity {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding-bottom: 20px;\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\n}\n\n.card-header-entity .title-wrap h1 {\n color: #424242;\n font-size: 28px;\n font-style: normal;\n font-weight: 300;\n line-height: 28px;\n margin-bottom: 15px;\n}\n.card-header-entity .title-wrap {\n display: flex;\n flex-direction: column;\n}\n.card-header-entity .title-wrap p {\n margin: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n color: #424242;\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n}\n.main-area .card-list {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 20px;\n}\n"] }]