@memberjunction/ng-explorer-core 2.47.0 → 2.49.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.
- package/dist/app-routing.module.js +40 -53
- package/dist/app-routing.module.js.map +1 -1
- package/dist/generic/Events.types.js +104 -0
- package/dist/generic/Events.types.js.map +1 -1
- package/dist/generic/Item.types.js +28 -14
- package/dist/generic/Item.types.js.map +1 -1
- package/dist/generic/PathData.types.js +5 -0
- package/dist/generic/PathData.types.js.map +1 -1
- package/dist/generic/app-nav-view.types.js +3 -1
- package/dist/generic/app-nav-view.types.js.map +1 -1
- package/dist/lib/app-view/application-view.component.js +273 -294
- package/dist/lib/app-view/application-view.component.js.map +1 -1
- package/dist/lib/auth-button/auth-button.component.js +13 -22
- package/dist/lib/auth-button/auth-button.component.js.map +1 -1
- package/dist/lib/base-browser-component/base-browser-component.js +96 -108
- package/dist/lib/base-browser-component/base-browser-component.js.map +1 -1
- package/dist/lib/dashboard-browser-component/dashboard-browser.component.js +106 -124
- package/dist/lib/dashboard-browser-component/dashboard-browser.component.js.map +1 -1
- package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js +257 -281
- package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js.map +1 -1
- package/dist/lib/data-browser-component/data-browser.component.js +122 -137
- package/dist/lib/data-browser-component/data-browser.component.js.map +1 -1
- package/dist/lib/expansion-panel-component/expansion-panel-component.js +100 -117
- package/dist/lib/expansion-panel-component/expansion-panel-component.js.map +1 -1
- package/dist/lib/favorites/favorites.component.js +44 -54
- package/dist/lib/favorites/favorites.component.js.map +1 -1
- package/dist/lib/files/files.component.js +12 -11
- package/dist/lib/files/files.component.js.map +1 -1
- package/dist/lib/generic/form-toolbar.js +21 -20
- package/dist/lib/generic/form-toolbar.js.map +1 -1
- package/dist/lib/generic/resource-container-component.js +23 -20
- package/dist/lib/generic/resource-container-component.js.map +1 -1
- package/dist/lib/generic-browse-list/generic-browse-list.component.js +48 -46
- package/dist/lib/generic-browse-list/generic-browse-list.component.js.map +1 -1
- package/dist/lib/generic-browser-list/generic-browser-list.component.js +353 -386
- package/dist/lib/generic-browser-list/generic-browser-list.component.js.map +1 -1
- package/dist/lib/guards/auth-guard.service.js +4 -2
- package/dist/lib/guards/auth-guard.service.js.map +1 -1
- package/dist/lib/guards/entities.guard.js +1 -1
- package/dist/lib/guards/entities.guard.js.map +1 -1
- package/dist/lib/header/MSFT_UserImageService.js +4 -3
- package/dist/lib/header/MSFT_UserImageService.js.map +1 -1
- package/dist/lib/header/header.component.js +111 -121
- package/dist/lib/header/header.component.js.map +1 -1
- package/dist/lib/home-component/home.component.js +34 -42
- package/dist/lib/home-component/home.component.js.map +1 -1
- package/dist/lib/home-wrapper/home-wrapper.component.js +6 -6
- package/dist/lib/home-wrapper/home-wrapper.component.js.map +1 -1
- package/dist/lib/list-view/list-view.component.js +132 -152
- package/dist/lib/list-view/list-view.component.js.map +1 -1
- package/dist/lib/navigation/navigation.component.js +568 -615
- package/dist/lib/navigation/navigation.component.js.map +1 -1
- package/dist/lib/query-browser-component/query-browser.component.js +30 -39
- package/dist/lib/query-browser-component/query-browser.component.js.map +1 -1
- package/dist/lib/report-browser-component/report-browser.component.js +18 -30
- package/dist/lib/report-browser-component/report-browser.component.js.map +1 -1
- package/dist/lib/resource-browser/resource-browser.component.js +435 -457
- package/dist/lib/resource-browser/resource-browser.component.js.map +1 -1
- package/dist/lib/resource-wrappers/dashboard-resource.component.js +12 -25
- package/dist/lib/resource-wrappers/dashboard-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/list-detail-resource.component.js +18 -31
- package/dist/lib/resource-wrappers/list-detail-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/query-resource.component.js +15 -28
- package/dist/lib/resource-wrappers/query-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/record-resource.component.js +35 -47
- package/dist/lib/resource-wrappers/record-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/report-resource.component.js +15 -28
- package/dist/lib/resource-wrappers/report-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/search-results-resource.component.js +21 -34
- package/dist/lib/resource-wrappers/search-results-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/view-resource.component.js +23 -37
- package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
- package/dist/lib/single-application/single-application.component.js +15 -20
- package/dist/lib/single-application/single-application.component.js.map +1 -1
- package/dist/lib/single-dashboard/Components/add-item/add-item.component.js +81 -95
- package/dist/lib/single-dashboard/Components/add-item/add-item.component.js.map +1 -1
- package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js +28 -29
- package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js.map +1 -1
- package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js +51 -64
- package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js.map +1 -1
- package/dist/lib/single-dashboard/single-dashboard.component.js +158 -165
- package/dist/lib/single-dashboard/single-dashboard.component.js.map +1 -1
- package/dist/lib/single-entity/single-entity.component.js +106 -118
- package/dist/lib/single-entity/single-entity.component.js.map +1 -1
- package/dist/lib/single-list-detail/single-list-detail.component.js +265 -287
- package/dist/lib/single-list-detail/single-list-detail.component.js.map +1 -1
- package/dist/lib/single-query/single-query.component.js +35 -44
- package/dist/lib/single-query/single-query.component.js.map +1 -1
- package/dist/lib/single-record/single-record.component.js +64 -73
- package/dist/lib/single-record/single-record.component.js.map +1 -1
- package/dist/lib/single-report/single-report.component.js +33 -43
- package/dist/lib/single-report/single-report.component.js.map +1 -1
- package/dist/lib/single-search-result/single-search-result.component.js +18 -30
- package/dist/lib/single-search-result/single-search-result.component.js.map +1 -1
- package/dist/lib/single-view/single-view.component.js +107 -124
- package/dist/lib/single-view/single-view.component.js.map +1 -1
- package/dist/lib/tabbed-dashboard/tabbed-dashboard.component.js +197 -210
- package/dist/lib/tabbed-dashboard/tabbed-dashboard.component.js.map +1 -1
- package/dist/lib/user-notifications/user-notifications.component.js +137 -155
- package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
- package/dist/lib/user-profile/user-profile.component.js +10 -8
- package/dist/lib/user-profile/user-profile.component.js.map +1 -1
- package/dist/module.js +51 -51
- package/dist/module.js.map +1 -1
- 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
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
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
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
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
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
if (existing) {
|
|
309
|
-
|
|
310
|
-
|
|
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
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
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
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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
|
-
|
|
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
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
this.
|
|
368
|
-
|
|
369
|
-
|
|
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
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
this.
|
|
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 =
|
|
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
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
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
|
-
|
|
480
|
-
this.
|
|
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
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
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
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
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
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
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
|
-
|
|
533
|
-
|
|
534
|
-
this.router.navigate(['data']);
|
|
535
|
-
});
|
|
514
|
+
async GoToApps(event) {
|
|
515
|
+
event.preventDefault();
|
|
516
|
+
this.router.navigate(['data']);
|
|
536
517
|
}
|
|
537
|
-
GoHome(event) {
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
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"] }]
|