@memberjunction/ng-explorer-core 2.48.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 } from '@angular/core';
|
|
11
2
|
import { EntityFieldTSType, LogError, LogStatus, Metadata, RunView } from '@memberjunction/core';
|
|
12
3
|
import { Subject, debounceTime } from 'rxjs';
|
|
@@ -221,61 +212,64 @@ function SingleListDetailComponent_kendo_dialog_16_Template(rf, ctx) { if (rf &
|
|
|
221
212
|
i0.ɵɵproperty("disabled", ctx_r2.showDialogLoader);
|
|
222
213
|
} }
|
|
223
214
|
export class SingleListDetailComponent {
|
|
215
|
+
router;
|
|
216
|
+
route;
|
|
217
|
+
sharedService;
|
|
218
|
+
ListID = "";
|
|
219
|
+
listRecord = null;
|
|
220
|
+
sourceEntityInfo = null;
|
|
221
|
+
showLoader = false;
|
|
222
|
+
sourceGridData = [];
|
|
223
|
+
filteredGridData = [];
|
|
224
|
+
showAddDialog = false;
|
|
225
|
+
showAddLoader = false;
|
|
226
|
+
showDialogLoader = false;
|
|
227
|
+
userViews = null;
|
|
228
|
+
filterDebounceTime = 250;
|
|
229
|
+
filterItemsSubject = new Subject();
|
|
230
|
+
filter = '';
|
|
231
|
+
userViewsToAdd = [];
|
|
232
|
+
page = 0;
|
|
233
|
+
pageSize = 50;
|
|
234
|
+
gridHeight = 750;
|
|
235
|
+
sortSettings = [];
|
|
236
|
+
selectedKeys = [];
|
|
237
|
+
selectModeEnabled = false;
|
|
238
|
+
viewColumns = [];
|
|
239
|
+
visibleColumns = [];
|
|
240
|
+
totalRowCount = 0;
|
|
241
|
+
viewExecutionTime = 0;
|
|
242
|
+
recordsToSave = 0;
|
|
243
|
+
recordsSaved = 0;
|
|
244
|
+
fetchingRecordsToSave = false;
|
|
245
|
+
showAddSingleRecordsDialog = false;
|
|
246
|
+
fetchingListRecords = false;
|
|
247
|
+
listRecords = [];
|
|
248
|
+
selectedListRecords = [];
|
|
249
|
+
searchFilter = "";
|
|
250
|
+
filterListrecordsSubject = new Subject();
|
|
251
|
+
addOptions = [
|
|
252
|
+
{
|
|
253
|
+
Text: 'Add From View',
|
|
254
|
+
Description: 'Add all records of a view to this list',
|
|
255
|
+
Icon: 'folder',
|
|
256
|
+
Action: () => {
|
|
257
|
+
this.toggleAddFromViewDialog(true);
|
|
258
|
+
}
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
Text: 'Add a Record',
|
|
262
|
+
Description: 'Add a specific record to the list',
|
|
263
|
+
Icon: 'folder',
|
|
264
|
+
Action: () => {
|
|
265
|
+
this.toggleAddRecordsDialog(true);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
];
|
|
224
269
|
constructor(router, route, sharedService) {
|
|
225
270
|
this.router = router;
|
|
226
271
|
this.route = route;
|
|
227
272
|
this.sharedService = sharedService;
|
|
228
|
-
this.ListID = "";
|
|
229
|
-
this.listRecord = null;
|
|
230
|
-
this.sourceEntityInfo = null;
|
|
231
|
-
this.showLoader = false;
|
|
232
|
-
this.sourceGridData = [];
|
|
233
|
-
this.filteredGridData = [];
|
|
234
|
-
this.showAddDialog = false;
|
|
235
|
-
this.showAddLoader = false;
|
|
236
|
-
this.showDialogLoader = false;
|
|
237
|
-
this.userViews = null;
|
|
238
|
-
this.filterDebounceTime = 250;
|
|
239
|
-
this.filterItemsSubject = new Subject();
|
|
240
|
-
this.filter = '';
|
|
241
|
-
this.userViewsToAdd = [];
|
|
242
|
-
this.page = 0;
|
|
243
|
-
this.pageSize = 50;
|
|
244
|
-
this.gridHeight = 750;
|
|
245
|
-
this.sortSettings = [];
|
|
246
|
-
this.selectedKeys = [];
|
|
247
|
-
this.selectModeEnabled = false;
|
|
248
|
-
this.viewColumns = [];
|
|
249
|
-
this.visibleColumns = [];
|
|
250
|
-
this.totalRowCount = 0;
|
|
251
|
-
this.viewExecutionTime = 0;
|
|
252
|
-
this.recordsToSave = 0;
|
|
253
|
-
this.recordsSaved = 0;
|
|
254
|
-
this.fetchingRecordsToSave = false;
|
|
255
|
-
this.showAddSingleRecordsDialog = false;
|
|
256
|
-
this.fetchingListRecords = false;
|
|
257
|
-
this.listRecords = [];
|
|
258
|
-
this.selectedListRecords = [];
|
|
259
|
-
this.searchFilter = "";
|
|
260
|
-
this.filterListrecordsSubject = new Subject();
|
|
261
|
-
this.addOptions = [
|
|
262
|
-
{
|
|
263
|
-
Text: 'Add From View',
|
|
264
|
-
Description: 'Add all records of a view to this list',
|
|
265
|
-
Icon: 'folder',
|
|
266
|
-
Action: () => {
|
|
267
|
-
this.toggleAddFromViewDialog(true);
|
|
268
|
-
}
|
|
269
|
-
},
|
|
270
|
-
{
|
|
271
|
-
Text: 'Add a Record',
|
|
272
|
-
Description: 'Add a specific record to the list',
|
|
273
|
-
Icon: 'folder',
|
|
274
|
-
Action: () => {
|
|
275
|
-
this.toggleAddRecordsDialog(true);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
];
|
|
279
273
|
this.filterItemsSubject
|
|
280
274
|
.pipe(debounceTime(this.filterDebounceTime))
|
|
281
275
|
.subscribe(() => this.filterItems(this.filter));
|
|
@@ -283,61 +277,57 @@ export class SingleListDetailComponent {
|
|
|
283
277
|
.pipe(debounceTime(this.filterDebounceTime))
|
|
284
278
|
.subscribe(() => this.loadListRecords());
|
|
285
279
|
}
|
|
286
|
-
ngOnInit() {
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
}
|
|
291
|
-
});
|
|
280
|
+
async ngOnInit() {
|
|
281
|
+
if (this.ListID) {
|
|
282
|
+
await this.loadList(this.ListID);
|
|
283
|
+
}
|
|
292
284
|
}
|
|
293
|
-
loadList(listID) {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
LogError("Error loading list with ID " + listID, undefined, this.listRecord.LatestResult);
|
|
306
|
-
this.showLoader = false;
|
|
307
|
-
return;
|
|
308
|
-
}
|
|
309
|
-
this.sourceEntityInfo = md.EntityByID(this.listRecord.EntityID);
|
|
310
|
-
this.viewColumns = this.sourceEntityInfo.Fields.filter((field) => field.DefaultInView).map((field) => {
|
|
311
|
-
return {
|
|
312
|
-
ID: field.ID,
|
|
313
|
-
Name: field.CodeName,
|
|
314
|
-
DisplayName: field.DisplayName,
|
|
315
|
-
EntityField: field,
|
|
316
|
-
hidden: false,
|
|
317
|
-
orderIndex: field.Sequence,
|
|
318
|
-
width: field.DefaultColumnWidth || 100,
|
|
319
|
-
};
|
|
320
|
-
});
|
|
321
|
-
/*make sure there is an entity field linked*/
|
|
322
|
-
this.visibleColumns = this.viewColumns.filter(x => x.hidden === false && x.EntityField).sort((a, b) => {
|
|
323
|
-
const aOrder = a.orderIndex != null ? a.orderIndex : 9999;
|
|
324
|
-
const bOrder = b.orderIndex != null ? b.orderIndex : 9999;
|
|
325
|
-
return aOrder - bOrder;
|
|
326
|
-
});
|
|
327
|
-
const primaryKeyName = this.sourceEntityInfo.FirstPrimaryKey.Name;
|
|
328
|
-
const rvResult = yield rv.RunView({
|
|
329
|
-
EntityName: this.listRecord.Entity,
|
|
330
|
-
ExtraFilter: `${primaryKeyName} IN (SELECT [RecordID] FROM ${md.ConfigData.MJCoreSchemaName}.[vwListDetails] WHERE ListID = '${this.listRecord.ID}')`
|
|
331
|
-
}, md.CurrentUser);
|
|
332
|
-
if (!rvResult.Success) {
|
|
333
|
-
LogError(`Error loading ${this.listRecord.Entity} records: ${rvResult.ErrorMessage}`);
|
|
334
|
-
this.showLoader = false;
|
|
335
|
-
return;
|
|
336
|
-
}
|
|
337
|
-
this.sourceGridData = this.filteredGridData = rvResult.Results;
|
|
338
|
-
this.viewExecutionTime = (new Date().getTime() - startTime) / 1000; // in seconds
|
|
285
|
+
async loadList(listID) {
|
|
286
|
+
if (!listID) {
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
const startTime = new Date().getTime();
|
|
290
|
+
this.showLoader = true;
|
|
291
|
+
const md = new Metadata();
|
|
292
|
+
const rv = new RunView();
|
|
293
|
+
this.listRecord = await md.GetEntityObject("Lists");
|
|
294
|
+
const loadResult = await this.listRecord.Load(listID);
|
|
295
|
+
if (!loadResult) {
|
|
296
|
+
LogError("Error loading list with ID " + listID, undefined, this.listRecord.LatestResult);
|
|
339
297
|
this.showLoader = false;
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
this.sourceEntityInfo = md.EntityByID(this.listRecord.EntityID);
|
|
301
|
+
this.viewColumns = this.sourceEntityInfo.Fields.filter((field) => field.DefaultInView).map((field) => {
|
|
302
|
+
return {
|
|
303
|
+
ID: field.ID,
|
|
304
|
+
Name: field.CodeName,
|
|
305
|
+
DisplayName: field.DisplayName,
|
|
306
|
+
EntityField: field,
|
|
307
|
+
hidden: false,
|
|
308
|
+
orderIndex: field.Sequence,
|
|
309
|
+
width: field.DefaultColumnWidth || 100,
|
|
310
|
+
};
|
|
311
|
+
});
|
|
312
|
+
/*make sure there is an entity field linked*/
|
|
313
|
+
this.visibleColumns = this.viewColumns.filter(x => x.hidden === false && x.EntityField).sort((a, b) => {
|
|
314
|
+
const aOrder = a.orderIndex != null ? a.orderIndex : 9999;
|
|
315
|
+
const bOrder = b.orderIndex != null ? b.orderIndex : 9999;
|
|
316
|
+
return aOrder - bOrder;
|
|
340
317
|
});
|
|
318
|
+
const primaryKeyName = this.sourceEntityInfo.FirstPrimaryKey.Name;
|
|
319
|
+
const rvResult = await rv.RunView({
|
|
320
|
+
EntityName: this.listRecord.Entity,
|
|
321
|
+
ExtraFilter: `${primaryKeyName} IN (SELECT [RecordID] FROM ${md.ConfigData.MJCoreSchemaName}.[vwListDetails] WHERE ListID = '${this.listRecord.ID}')`
|
|
322
|
+
}, md.CurrentUser);
|
|
323
|
+
if (!rvResult.Success) {
|
|
324
|
+
LogError(`Error loading ${this.listRecord.Entity} records: ${rvResult.ErrorMessage}`);
|
|
325
|
+
this.showLoader = false;
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
this.sourceGridData = this.filteredGridData = rvResult.Results;
|
|
329
|
+
this.viewExecutionTime = (new Date().getTime() - startTime) / 1000; // in seconds
|
|
330
|
+
this.showLoader = false;
|
|
341
331
|
}
|
|
342
332
|
pageChange(event) {
|
|
343
333
|
this.page = event.skip;
|
|
@@ -390,89 +380,83 @@ export class SingleListDetailComponent {
|
|
|
390
380
|
return { 'text-align': 'left', 'vertical-align': 'top' };
|
|
391
381
|
}
|
|
392
382
|
}
|
|
393
|
-
toggleAddFromViewDialog(show) {
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
}
|
|
399
|
-
});
|
|
383
|
+
async toggleAddFromViewDialog(show) {
|
|
384
|
+
this.showAddDialog = show;
|
|
385
|
+
if (show && !this.userViews) {
|
|
386
|
+
await this.loadEntityViews();
|
|
387
|
+
}
|
|
400
388
|
}
|
|
401
|
-
loadEntityViews() {
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
389
|
+
async loadEntityViews() {
|
|
390
|
+
this.showAddLoader = true;
|
|
391
|
+
if (!this.listRecord || !this.listRecord.Entity) {
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
const rv = new RunView();
|
|
395
|
+
const md = new Metadata();
|
|
396
|
+
const runViewResult = await rv.RunView({
|
|
397
|
+
EntityName: "User Views",
|
|
398
|
+
ExtraFilter: `UserID = '${md.CurrentUser.ID}' AND EntityID = '${this.listRecord.EntityID}'`,
|
|
399
|
+
ResultType: 'entity_object'
|
|
400
|
+
}, md.CurrentUser);
|
|
401
|
+
if (!runViewResult.Success) {
|
|
402
|
+
this.showAddLoader = false;
|
|
403
|
+
LogError(`Error loading ${this.listRecord.Entity} User View records for user ${md.CurrentUser.ID}`);
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
this.userViews = runViewResult.Results;
|
|
407
|
+
this.showAddLoader = false;
|
|
408
|
+
}
|
|
409
|
+
async addTolist() {
|
|
410
|
+
if (!this.listRecord) {
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
if (!this.listRecord.Entity) {
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
this.showAddLoader = true;
|
|
417
|
+
this.fetchingRecordsToSave = true;
|
|
418
|
+
const rv = new RunView();
|
|
419
|
+
const md = new Metadata();
|
|
420
|
+
const hashMap = new Map();
|
|
421
|
+
await Promise.all(this.userViewsToAdd.map(async (userView) => {
|
|
422
|
+
const runViewResult = await rv.RunView({
|
|
410
423
|
EntityName: "User Views",
|
|
411
|
-
|
|
412
|
-
|
|
424
|
+
ViewEntity: userView,
|
|
425
|
+
Fields: ["ID"]
|
|
413
426
|
}, md.CurrentUser);
|
|
414
427
|
if (!runViewResult.Success) {
|
|
415
|
-
|
|
416
|
-
LogError(`Error loading ${this.listRecord.Entity} User View records for user ${md.CurrentUser.ID}`);
|
|
417
|
-
return;
|
|
418
|
-
}
|
|
419
|
-
this.userViews = runViewResult.Results;
|
|
420
|
-
this.showAddLoader = false;
|
|
421
|
-
});
|
|
422
|
-
}
|
|
423
|
-
addTolist() {
|
|
424
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
425
|
-
if (!this.listRecord) {
|
|
428
|
+
LogError(`Error loading view ${userView.Name} for user ${md.CurrentUser.ID}`);
|
|
426
429
|
return;
|
|
427
430
|
}
|
|
428
|
-
|
|
429
|
-
|
|
431
|
+
const records = runViewResult.Results;
|
|
432
|
+
for (const record of records) {
|
|
433
|
+
hashMap.set(record.ID, record);
|
|
430
434
|
}
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
const
|
|
447
|
-
|
|
448
|
-
|
|
435
|
+
}));
|
|
436
|
+
this.recordsToSave = hashMap.size;
|
|
437
|
+
this.recordsSaved = 0;
|
|
438
|
+
this.fetchingRecordsToSave = false;
|
|
439
|
+
LogStatus(`Adding ${hashMap.size} records to list ${this.listRecord.ID}`);
|
|
440
|
+
//now add the records to the list
|
|
441
|
+
const recordIDs = [...hashMap.keys()];
|
|
442
|
+
const chunkSize = 100;
|
|
443
|
+
for (let i = 0; i < recordIDs.length; i += chunkSize) {
|
|
444
|
+
const chunk = recordIDs.slice(i, i + chunkSize);
|
|
445
|
+
await Promise.all(chunk.map(async (recordID) => {
|
|
446
|
+
const listDetail = await md.GetEntityObject("List Details");
|
|
447
|
+
listDetail.ListID = this.listRecord.ID;
|
|
448
|
+
listDetail.RecordID = recordID.toString();
|
|
449
|
+
listDetail.ContextCurrentUser = md.CurrentUser;
|
|
450
|
+
const saveResult = await listDetail.Save();
|
|
451
|
+
if (!saveResult) {
|
|
452
|
+
LogError(`Error adding record ${recordID} to list ${this.listRecord.ID}`, undefined, listDetail.LatestResult);
|
|
449
453
|
}
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
const recordIDs = [...hashMap.keys()];
|
|
457
|
-
const chunkSize = 100;
|
|
458
|
-
for (let i = 0; i < recordIDs.length; i += chunkSize) {
|
|
459
|
-
const chunk = recordIDs.slice(i, i + chunkSize);
|
|
460
|
-
yield Promise.all(chunk.map((recordID) => __awaiter(this, void 0, void 0, function* () {
|
|
461
|
-
const listDetail = yield md.GetEntityObject("List Details");
|
|
462
|
-
listDetail.ListID = this.listRecord.ID;
|
|
463
|
-
listDetail.RecordID = recordID.toString();
|
|
464
|
-
listDetail.ContextCurrentUser = md.CurrentUser;
|
|
465
|
-
const saveResult = yield listDetail.Save();
|
|
466
|
-
if (!saveResult) {
|
|
467
|
-
LogError(`Error adding record ${recordID} to list ${this.listRecord.ID}`, undefined, listDetail.LatestResult);
|
|
468
|
-
}
|
|
469
|
-
this.recordsSaved++;
|
|
470
|
-
})));
|
|
471
|
-
}
|
|
472
|
-
this.showAddLoader = false;
|
|
473
|
-
this.toggleAddFromViewDialog(false);
|
|
474
|
-
this.loadList(this.listRecord.ID);
|
|
475
|
-
});
|
|
454
|
+
this.recordsSaved++;
|
|
455
|
+
}));
|
|
456
|
+
}
|
|
457
|
+
this.showAddLoader = false;
|
|
458
|
+
this.toggleAddFromViewDialog(false);
|
|
459
|
+
this.loadList(this.listRecord.ID);
|
|
476
460
|
}
|
|
477
461
|
onListSearchValueChange(Value) {
|
|
478
462
|
this.filter = Value;
|
|
@@ -516,114 +500,108 @@ export class SingleListDetailComponent {
|
|
|
516
500
|
}
|
|
517
501
|
item.Action();
|
|
518
502
|
}
|
|
519
|
-
toggleAddRecordsDialog(show) {
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
}
|
|
527
|
-
});
|
|
503
|
+
async toggleAddRecordsDialog(show) {
|
|
504
|
+
this.showAddSingleRecordsDialog = show;
|
|
505
|
+
if (show) {
|
|
506
|
+
this.listRecords = [];
|
|
507
|
+
this.searchFilter = "";
|
|
508
|
+
await this.loadListRecords();
|
|
509
|
+
}
|
|
528
510
|
}
|
|
529
|
-
loadListRecords() {
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
LogError(`Error loading list records for list ${this.listRecord.ID}`, undefined, rvResult.ErrorMessage);
|
|
554
|
-
this.fetchingListRecords = false;
|
|
555
|
-
return;
|
|
556
|
-
}
|
|
557
|
-
this.listRecords = rvResult.Results.filter((record) => {
|
|
558
|
-
const alreadyExits = this.sourceGridData.some((selectedRecord) => selectedRecord.ID === record[primaryKeyName]);
|
|
559
|
-
return !alreadyExits;
|
|
560
|
-
}).map((record) => {
|
|
561
|
-
let result = { ID: record[primaryKeyName], Name: record[nameField.Name] };
|
|
562
|
-
return result;
|
|
563
|
-
});
|
|
511
|
+
async loadListRecords() {
|
|
512
|
+
if (!this.listRecord) {
|
|
513
|
+
LogError("Error loading list records. List record is null");
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
if (!this.sourceEntityInfo) {
|
|
517
|
+
LogError("Error loading list records. Source entity info is null");
|
|
518
|
+
return;
|
|
519
|
+
}
|
|
520
|
+
this.fetchingListRecords = true;
|
|
521
|
+
const primaryKeyName = this.sourceEntityInfo.FirstPrimaryKey.Name;
|
|
522
|
+
let filter = undefined;
|
|
523
|
+
const nameField = this.sourceEntityInfo.Fields.find((field) => field.IsNameField);
|
|
524
|
+
if (nameField && this.searchFilter) {
|
|
525
|
+
filter = `${nameField.Name} LIKE '%${this.searchFilter}%'`;
|
|
526
|
+
}
|
|
527
|
+
const rv = new RunView();
|
|
528
|
+
const rvResult = await rv.RunView({
|
|
529
|
+
EntityName: this.listRecord.Entity,
|
|
530
|
+
ExtraFilter: filter,
|
|
531
|
+
MaxRows: 50
|
|
532
|
+
});
|
|
533
|
+
if (!rvResult.Success) {
|
|
534
|
+
LogError(`Error loading list records for list ${this.listRecord.ID}`, undefined, rvResult.ErrorMessage);
|
|
564
535
|
this.fetchingListRecords = false;
|
|
536
|
+
return;
|
|
537
|
+
}
|
|
538
|
+
this.listRecords = rvResult.Results.filter((record) => {
|
|
539
|
+
const alreadyExits = this.sourceGridData.some((selectedRecord) => selectedRecord.ID === record[primaryKeyName]);
|
|
540
|
+
return !alreadyExits;
|
|
541
|
+
}).map((record) => {
|
|
542
|
+
let result = { ID: record[primaryKeyName], Name: record[nameField.Name] };
|
|
543
|
+
return result;
|
|
565
544
|
});
|
|
545
|
+
this.fetchingListRecords = false;
|
|
566
546
|
}
|
|
567
|
-
addListRecord(listRecord) {
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
this.sharedService.CreateSimpleNotification("Record already exists in this list", 'error', 2500);
|
|
584
|
-
return;
|
|
585
|
-
}
|
|
586
|
-
this.sharedService.CreateSimpleNotification("Unable to add record to list", 'error', 2500);
|
|
547
|
+
async addListRecord(listRecord) {
|
|
548
|
+
if (!this.listRecord) {
|
|
549
|
+
LogError("Error adding list record. List record is null");
|
|
550
|
+
this.sharedService.CreateSimpleNotification("Unable to add record to list");
|
|
551
|
+
return;
|
|
552
|
+
}
|
|
553
|
+
const md = new Metadata();
|
|
554
|
+
const listEntity = await md.GetEntityObject("List Details", md.CurrentUser);
|
|
555
|
+
listEntity.ListID = this.listRecord.ID;
|
|
556
|
+
listEntity.RecordID = listRecord.ID;
|
|
557
|
+
const saveResult = await listEntity.Save();
|
|
558
|
+
if (!saveResult) {
|
|
559
|
+
LogError(`Error adding record ${listRecord.ID} to list ${this.listRecord.ID}`, undefined, listEntity.LatestResult);
|
|
560
|
+
const alreadyExists = listEntity.LatestResult.Message.includes("already exists in List");
|
|
561
|
+
if (alreadyExists) {
|
|
562
|
+
this.sharedService.CreateSimpleNotification("Record already exists in this list", 'error', 2500);
|
|
587
563
|
return;
|
|
588
564
|
}
|
|
589
|
-
this.sharedService.CreateSimpleNotification("Unable to add record to list", '
|
|
590
|
-
|
|
565
|
+
this.sharedService.CreateSimpleNotification("Unable to add record to list", 'error', 2500);
|
|
566
|
+
return;
|
|
567
|
+
}
|
|
568
|
+
this.sharedService.CreateSimpleNotification("Unable to add record to list", 'success', 2500);
|
|
591
569
|
}
|
|
570
|
+
static ɵfac = function SingleListDetailComponent_Factory(t) { return new (t || SingleListDetailComponent)(i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i1.ActivatedRoute), i0.ɵɵdirectiveInject(i2.SharedService)); };
|
|
571
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SingleListDetailComponent, selectors: [["mj-list-detail"]], inputs: { ListID: "ListID" }, decls: 17, vars: 7, consts: [["searchInput", ""], [1, "app-container"], [1, "flex-display-row-header"], ["textField", "Text", "themeColor", "info", 1, "add-btn", 3, "itemClick", "data"], [1, "fa-solid", "fa-plus"], [1, "title-wrapper"], [1, "search"], ["type", "text", "placeholder", "Search in List", "size", "large", "rounded", "large", "fillMode", "solid", 3, "keyup", "clearButton"], ["kendoTextBoxPrefixTemplate", "", 3, "showSeparator"], ["type", "converging-spinner"], [3, "data"], ["class", "dialog-wrapper", "title", "Select Views to Add", 3, "minWidth", "width", "height", "close", 4, "ngIf"], ["class", "dialog-wrapper", 3, "title", "minWidth", "width", "height", "close", 4, "ngIf"], [1, "fa-solid", "fa-magnifying-glass", "margin-left-small"], [3, "width", "headerStyle", "style", 4, "ngIf"], [3, "field", "title", "width", "editable", "editor", "headerStyle", "style", 4, "ngFor", "ngForOf"], [3, "width", "headerStyle"], [3, "field", "title", "width", "editable", "editor", "headerStyle"], [4, "ngIf"], ["kendoGridFooterTemplate", ""], [2, "font-size", "smaller", "font-weight", "normal"], ["title", "Select Views to Add", 1, "dialog-wrapper", 3, "close", "minWidth", "width", "height"], [1, "popup-actions-btn"], ["kendoButton", "", "themeColor", "info", 1, "cancel-btn", 3, "click", "disabled"], ["kendoButton", "", "fillMode", "outline", "themeColor", "info", 1, "yes-btn", 3, "click", "disabled"], [3, "min", "max", "value", "indeterminate"], [1, "search-header"], ["id", "listSearch", "placeholder", "Search Views...", "kendoTextBox", "", 1, "search-bar", 3, "clearButton"], [1, "overflow-y-scroll"], [1, "list-item"], [1, "list-text", 3, "ngClass"], ["kendoButton", "", 1, "btn-no-border", "btn-selected"], ["kendoButton", "", 1, "btn-no-border"], ["kendoButton", "", 1, "btn-no-border", "btn-selected", 3, "click"], [1, "fa-solid", "fa-minus"], ["kendoButton", "", 1, "btn-no-border", 3, "click"], [1, "btn-margin-right"], [1, "dialog-wrapper", 3, "close", "title", "minWidth", "width", "height"], ["id", "listRecordSearch", "kendoTextBox", "", 1, "search-bar", 3, "valueChange", "placeholder", "clearButton"], [1, "list-text"]], template: function SingleListDetailComponent_Template(rf, ctx) { if (rf & 1) {
|
|
572
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
573
|
+
i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "h1");
|
|
574
|
+
i0.ɵɵtext(3);
|
|
575
|
+
i0.ɵɵelementEnd();
|
|
576
|
+
i0.ɵɵelementStart(4, "kendo-dropdownbutton", 3);
|
|
577
|
+
i0.ɵɵlistener("itemClick", function SingleListDetailComponent_Template_kendo_dropdownbutton_itemClick_4_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onDropdownItemClick($event)); });
|
|
578
|
+
i0.ɵɵelement(5, "span", 4);
|
|
579
|
+
i0.ɵɵtext(6, " Add to List ");
|
|
580
|
+
i0.ɵɵelementEnd()();
|
|
581
|
+
i0.ɵɵelementStart(7, "div")(8, "div", 5)(9, "div", 6)(10, "kendo-textbox", 7, 0);
|
|
582
|
+
i0.ɵɵlistener("keyup", function SingleListDetailComponent_Template_kendo_textbox_keyup_10_listener() { i0.ɵɵrestoreView(_r1); const searchInput_r2 = i0.ɵɵreference(11); return i0.ɵɵresetView(ctx.onListSearchValueChange(searchInput_r2.value)); });
|
|
583
|
+
i0.ɵɵtemplate(12, SingleListDetailComponent_ng_template_12_Template, 1, 0, "ng-template", 8);
|
|
584
|
+
i0.ɵɵelementEnd()()()();
|
|
585
|
+
i0.ɵɵtemplate(13, SingleListDetailComponent_Conditional_13_Template, 1, 0, "kendo-loader", 9)(14, SingleListDetailComponent_Conditional_14_Template, 3, 3, "kendo-grid", 10);
|
|
586
|
+
i0.ɵɵelementEnd();
|
|
587
|
+
i0.ɵɵtemplate(15, SingleListDetailComponent_kendo_dialog_15_Template, 8, 6, "kendo-dialog", 11)(16, SingleListDetailComponent_kendo_dialog_16_Template, 6, 6, "kendo-dialog", 12);
|
|
588
|
+
} if (rf & 2) {
|
|
589
|
+
i0.ɵɵadvance(3);
|
|
590
|
+
i0.ɵɵtextInterpolate(ctx.listRecord ? ctx.listRecord.Name : "List");
|
|
591
|
+
i0.ɵɵadvance();
|
|
592
|
+
i0.ɵɵproperty("data", ctx.addOptions);
|
|
593
|
+
i0.ɵɵadvance(6);
|
|
594
|
+
i0.ɵɵproperty("clearButton", true);
|
|
595
|
+
i0.ɵɵadvance(2);
|
|
596
|
+
i0.ɵɵproperty("showSeparator", true);
|
|
597
|
+
i0.ɵɵadvance();
|
|
598
|
+
i0.ɵɵconditional(ctx.showLoader ? 13 : 14);
|
|
599
|
+
i0.ɵɵadvance(2);
|
|
600
|
+
i0.ɵɵproperty("ngIf", ctx.showAddDialog);
|
|
601
|
+
i0.ɵɵadvance();
|
|
602
|
+
i0.ɵɵproperty("ngIf", ctx.showAddSingleRecordsDialog);
|
|
603
|
+
} }, dependencies: [i3.NgClass, i3.NgForOf, i3.NgIf, i4.GridComponent, i4.ColumnComponent, i4.FooterTemplateDirective, i4.CheckboxColumnComponent, i5.DialogComponent, i5.DialogActionsComponent, i6.LoaderComponent, i7.ButtonComponent, i7.DropDownButtonComponent, i8.TextBoxComponent, i8.TextBoxPrefixTemplateDirective, i9.ProgressBarComponent, i3.DecimalPipe], styles: [".app-container[_ngcontent-%COMP%] {\n padding: 20px;\n}\n\n.flex-display-row-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: 10px;\n}\n\n.title-wrapper[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 14px 0;\n border-bottom: 1px solid var(--med-gray);\n}\n\n.title-wrapper[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 24px;\n line-height: 28px;\n}\n\n.title-wrapper[_ngcontent-%COMP%] .search[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n font-size: 16px;\n background: transparent;\n border: none;\n box-sizing: border-box;\n padding-left: 40px;\n}\n\n .title-wrapper[_ngcontent-%COMP%] .search[_ngcontent-%COMP%] {\n background: var(--light-shade);\n width: 360px;\n height: 44px;\n position: relative;\n border-radius: 10px;\n}\n\n.title-wrapper[_ngcontent-%COMP%] .search[_ngcontent-%COMP%] svg[_ngcontent-%COMP%] {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n left: 12px;\n}\n\n.add-btn[_ngcontent-%COMP%] {\n padding: 10px 30px;\n border-radius: 10px;\n color: white;\n background-color: var(--border-blue);\n font-size: initial;\n cursor: pointer;\n}\n\n.add-btn[_ngcontent-%COMP%]:hover {\n filter: brightness(85%);\n}\n\n.margin-left-small[_ngcontent-%COMP%] {\n margin-left: 10px;\n}\n\n\n.overflow-y-scroll[_ngcontent-%COMP%] {\n overflow-y: auto;\n max-height: 300px;\n}\n\n.padding-bottom-small[_ngcontent-%COMP%] {\n padding-bottom: 10px;\n}\n\n.list-item[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n padding-bottom: 5px;\n align-items: center;\n}\n\n.btn-no-border[_ngcontent-%COMP%] {\n border: none;\n background: none;\n color: var(--border-blue);\n font-size: 16px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.btn-selected[_ngcontent-%COMP%] {\n font-weight: bold;\n}\n\n.list-text[_ngcontent-%COMP%] {\n font-size: large;\n}\n.list-selected[_ngcontent-%COMP%] {\n font-weight: bold;\n color: var(--border-blue);\n}\n\n.btn-margin-right[_ngcontent-%COMP%] {\n margin-right: 35px;\n}\n\n.divider[_ngcontent-%COMP%] {\n color: lightgray\n}\n\n.search-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 0;\n}\n\n.search-bar[_ngcontent-%COMP%] {\n width: 65%;\n padding-bottom: 10px;\n}\n\n.dialog-wrapper[_ngcontent-%COMP%] {\n padding: 15px 25px;\n}\n\n.btn-outline[_ngcontent-%COMP%] {\n border: 2px solid var(--border-blue);\n border-radius: 8px;\n padding: 5px 30px;\n\n background: none;\n color: var(--border-blue);\n font-size: 16px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.k-dropdown-button[_ngcontent-%COMP%] .k-button[_ngcontent-%COMP%] {\n background: var(--border-blue);\n color: var(--white-color);\n font-size: 16px;\n border: none;\n padding: 8px 25px;\n border-radius: 10px;\n}\n\n.k-dropdown-button[_ngcontent-%COMP%] .k-button[_ngcontent-%COMP%] .k-button-text[_ngcontent-%COMP%] .card-header-entity[_ngcontent-%COMP%] .add-item[_ngcontent-%COMP%] .k-button[_ngcontent-%COMP%] .k-button-text[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn-cmn[_ngcontent-%COMP%] {\n width: 44px;\n height: 44px;\n min-width: 44px;\n background: transparent;\n border-radius: 8px;\n border: 1px solid var(--gray-color);\n}\n\n.btn-cmn.active[_ngcontent-%COMP%] {\n border: 1px solid var(--border-blue);\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}"] });
|
|
592
604
|
}
|
|
593
|
-
SingleListDetailComponent.ɵfac = function SingleListDetailComponent_Factory(t) { return new (t || SingleListDetailComponent)(i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i1.ActivatedRoute), i0.ɵɵdirectiveInject(i2.SharedService)); };
|
|
594
|
-
SingleListDetailComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SingleListDetailComponent, selectors: [["mj-list-detail"]], inputs: { ListID: "ListID" }, decls: 17, vars: 7, consts: [["searchInput", ""], [1, "app-container"], [1, "flex-display-row-header"], ["textField", "Text", "themeColor", "info", 1, "add-btn", 3, "itemClick", "data"], [1, "fa-solid", "fa-plus"], [1, "title-wrapper"], [1, "search"], ["type", "text", "placeholder", "Search in List", "size", "large", "rounded", "large", "fillMode", "solid", 3, "keyup", "clearButton"], ["kendoTextBoxPrefixTemplate", "", 3, "showSeparator"], ["type", "converging-spinner"], [3, "data"], ["class", "dialog-wrapper", "title", "Select Views to Add", 3, "minWidth", "width", "height", "close", 4, "ngIf"], ["class", "dialog-wrapper", 3, "title", "minWidth", "width", "height", "close", 4, "ngIf"], [1, "fa-solid", "fa-magnifying-glass", "margin-left-small"], [3, "width", "headerStyle", "style", 4, "ngIf"], [3, "field", "title", "width", "editable", "editor", "headerStyle", "style", 4, "ngFor", "ngForOf"], [3, "width", "headerStyle"], [3, "field", "title", "width", "editable", "editor", "headerStyle"], [4, "ngIf"], ["kendoGridFooterTemplate", ""], [2, "font-size", "smaller", "font-weight", "normal"], ["title", "Select Views to Add", 1, "dialog-wrapper", 3, "close", "minWidth", "width", "height"], [1, "popup-actions-btn"], ["kendoButton", "", "themeColor", "info", 1, "cancel-btn", 3, "click", "disabled"], ["kendoButton", "", "fillMode", "outline", "themeColor", "info", 1, "yes-btn", 3, "click", "disabled"], [3, "min", "max", "value", "indeterminate"], [1, "search-header"], ["id", "listSearch", "placeholder", "Search Views...", "kendoTextBox", "", 1, "search-bar", 3, "clearButton"], [1, "overflow-y-scroll"], [1, "list-item"], [1, "list-text", 3, "ngClass"], ["kendoButton", "", 1, "btn-no-border", "btn-selected"], ["kendoButton", "", 1, "btn-no-border"], ["kendoButton", "", 1, "btn-no-border", "btn-selected", 3, "click"], [1, "fa-solid", "fa-minus"], ["kendoButton", "", 1, "btn-no-border", 3, "click"], [1, "btn-margin-right"], [1, "dialog-wrapper", 3, "close", "title", "minWidth", "width", "height"], ["id", "listRecordSearch", "kendoTextBox", "", 1, "search-bar", 3, "valueChange", "placeholder", "clearButton"], [1, "list-text"]], template: function SingleListDetailComponent_Template(rf, ctx) { if (rf & 1) {
|
|
595
|
-
const _r1 = i0.ɵɵgetCurrentView();
|
|
596
|
-
i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "h1");
|
|
597
|
-
i0.ɵɵtext(3);
|
|
598
|
-
i0.ɵɵelementEnd();
|
|
599
|
-
i0.ɵɵelementStart(4, "kendo-dropdownbutton", 3);
|
|
600
|
-
i0.ɵɵlistener("itemClick", function SingleListDetailComponent_Template_kendo_dropdownbutton_itemClick_4_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onDropdownItemClick($event)); });
|
|
601
|
-
i0.ɵɵelement(5, "span", 4);
|
|
602
|
-
i0.ɵɵtext(6, " Add to List ");
|
|
603
|
-
i0.ɵɵelementEnd()();
|
|
604
|
-
i0.ɵɵelementStart(7, "div")(8, "div", 5)(9, "div", 6)(10, "kendo-textbox", 7, 0);
|
|
605
|
-
i0.ɵɵlistener("keyup", function SingleListDetailComponent_Template_kendo_textbox_keyup_10_listener() { i0.ɵɵrestoreView(_r1); const searchInput_r2 = i0.ɵɵreference(11); return i0.ɵɵresetView(ctx.onListSearchValueChange(searchInput_r2.value)); });
|
|
606
|
-
i0.ɵɵtemplate(12, SingleListDetailComponent_ng_template_12_Template, 1, 0, "ng-template", 8);
|
|
607
|
-
i0.ɵɵelementEnd()()()();
|
|
608
|
-
i0.ɵɵtemplate(13, SingleListDetailComponent_Conditional_13_Template, 1, 0, "kendo-loader", 9)(14, SingleListDetailComponent_Conditional_14_Template, 3, 3, "kendo-grid", 10);
|
|
609
|
-
i0.ɵɵelementEnd();
|
|
610
|
-
i0.ɵɵtemplate(15, SingleListDetailComponent_kendo_dialog_15_Template, 8, 6, "kendo-dialog", 11)(16, SingleListDetailComponent_kendo_dialog_16_Template, 6, 6, "kendo-dialog", 12);
|
|
611
|
-
} if (rf & 2) {
|
|
612
|
-
i0.ɵɵadvance(3);
|
|
613
|
-
i0.ɵɵtextInterpolate(ctx.listRecord ? ctx.listRecord.Name : "List");
|
|
614
|
-
i0.ɵɵadvance();
|
|
615
|
-
i0.ɵɵproperty("data", ctx.addOptions);
|
|
616
|
-
i0.ɵɵadvance(6);
|
|
617
|
-
i0.ɵɵproperty("clearButton", true);
|
|
618
|
-
i0.ɵɵadvance(2);
|
|
619
|
-
i0.ɵɵproperty("showSeparator", true);
|
|
620
|
-
i0.ɵɵadvance();
|
|
621
|
-
i0.ɵɵconditional(ctx.showLoader ? 13 : 14);
|
|
622
|
-
i0.ɵɵadvance(2);
|
|
623
|
-
i0.ɵɵproperty("ngIf", ctx.showAddDialog);
|
|
624
|
-
i0.ɵɵadvance();
|
|
625
|
-
i0.ɵɵproperty("ngIf", ctx.showAddSingleRecordsDialog);
|
|
626
|
-
} }, dependencies: [i3.NgClass, i3.NgForOf, i3.NgIf, i4.GridComponent, i4.ColumnComponent, i4.FooterTemplateDirective, i4.CheckboxColumnComponent, i5.DialogComponent, i5.DialogActionsComponent, i6.LoaderComponent, i7.ButtonComponent, i7.DropDownButtonComponent, i8.TextBoxComponent, i8.TextBoxPrefixTemplateDirective, i9.ProgressBarComponent, i3.DecimalPipe], styles: [".app-container[_ngcontent-%COMP%] {\n padding: 20px;\n}\n\n.flex-display-row-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: 10px;\n}\n\n.title-wrapper[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 14px 0;\n border-bottom: 1px solid var(--med-gray);\n}\n\n.title-wrapper[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 24px;\n line-height: 28px;\n}\n\n.title-wrapper[_ngcontent-%COMP%] .search[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n font-size: 16px;\n background: transparent;\n border: none;\n box-sizing: border-box;\n padding-left: 40px;\n}\n\n .title-wrapper[_ngcontent-%COMP%] .search[_ngcontent-%COMP%] {\n background: var(--light-shade);\n width: 360px;\n height: 44px;\n position: relative;\n border-radius: 10px;\n}\n\n.title-wrapper[_ngcontent-%COMP%] .search[_ngcontent-%COMP%] svg[_ngcontent-%COMP%] {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n left: 12px;\n}\n\n.add-btn[_ngcontent-%COMP%] {\n padding: 10px 30px;\n border-radius: 10px;\n color: white;\n background-color: var(--border-blue);\n font-size: initial;\n cursor: pointer;\n}\n\n.add-btn[_ngcontent-%COMP%]:hover {\n filter: brightness(85%);\n}\n\n.margin-left-small[_ngcontent-%COMP%] {\n margin-left: 10px;\n}\n\n\n.overflow-y-scroll[_ngcontent-%COMP%] {\n overflow-y: auto;\n max-height: 300px;\n}\n\n.padding-bottom-small[_ngcontent-%COMP%] {\n padding-bottom: 10px;\n}\n\n.list-item[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n padding-bottom: 5px;\n align-items: center;\n}\n\n.btn-no-border[_ngcontent-%COMP%] {\n border: none;\n background: none;\n color: var(--border-blue);\n font-size: 16px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.btn-selected[_ngcontent-%COMP%] {\n font-weight: bold;\n}\n\n.list-text[_ngcontent-%COMP%] {\n font-size: large;\n}\n.list-selected[_ngcontent-%COMP%] {\n font-weight: bold;\n color: var(--border-blue);\n}\n\n.btn-margin-right[_ngcontent-%COMP%] {\n margin-right: 35px;\n}\n\n.divider[_ngcontent-%COMP%] {\n color: lightgray\n}\n\n.search-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 0;\n}\n\n.search-bar[_ngcontent-%COMP%] {\n width: 65%;\n padding-bottom: 10px;\n}\n\n.dialog-wrapper[_ngcontent-%COMP%] {\n padding: 15px 25px;\n}\n\n.btn-outline[_ngcontent-%COMP%] {\n border: 2px solid var(--border-blue);\n border-radius: 8px;\n padding: 5px 30px;\n\n background: none;\n color: var(--border-blue);\n font-size: 16px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.k-dropdown-button[_ngcontent-%COMP%] .k-button[_ngcontent-%COMP%] {\n background: var(--border-blue);\n color: var(--white-color);\n font-size: 16px;\n border: none;\n padding: 8px 25px;\n border-radius: 10px;\n}\n\n.k-dropdown-button[_ngcontent-%COMP%] .k-button[_ngcontent-%COMP%] .k-button-text[_ngcontent-%COMP%] .card-header-entity[_ngcontent-%COMP%] .add-item[_ngcontent-%COMP%] .k-button[_ngcontent-%COMP%] .k-button-text[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn-cmn[_ngcontent-%COMP%] {\n width: 44px;\n height: 44px;\n min-width: 44px;\n background: transparent;\n border-radius: 8px;\n border: 1px solid var(--gray-color);\n}\n\n.btn-cmn.active[_ngcontent-%COMP%] {\n border: 1px solid var(--border-blue);\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}"] });
|
|
627
605
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SingleListDetailComponent, [{
|
|
628
606
|
type: Component,
|
|
629
607
|
args: [{ selector: 'mj-list-detail', template: "<div class=\"app-container\">\n <div class=\"flex-display-row-header\">\n <h1>{{listRecord ? listRecord.Name: \"List\"}}</h1>\n <kendo-dropdownbutton \n class=\"add-btn\" \n (itemClick)=\"onDropdownItemClick($event)\" \n [data]=\"addOptions\" \n textField=\"Text\"\n themeColor=\"info\">\n <span class=\"fa-solid fa-plus\"></span>\n Add to List\n </kendo-dropdownbutton> \n </div>\n <div>\n <div class=\"title-wrapper\">\n <div class=\"search\">\n <kendo-textbox \n type=\"text\" \n #searchInput \n placeholder=\"Search in List\" \n (keyup)=\"onListSearchValueChange(searchInput.value)\"\n [clearButton]=\"true\"\n size=\"large\"\n rounded=\"large\"\n fillMode=\"solid\"\n >\n <ng-template kendoTextBoxPrefixTemplate [showSeparator]=\"true\">\n <span class=\"fa-solid fa-magnifying-glass margin-left-small\"></span>\n </ng-template>\n </kendo-textbox>\n </div>\n </div>\n </div>\n @if(showLoader){\n <kendo-loader type=\"converging-spinner\"></kendo-loader>\n }\n @else{\n <kendo-grid [data]=\"filteredGridData\">\n <kendo-grid-checkbox-column \n *ngIf=\"selectModeEnabled\" \n [width]=\"50\" \n [headerStyle]=\"{ 'font-weight' : 'bold', 'background-color': 'white' }\" \n [style]=\"{'text-align': 'center', 'vertical-align': 'center'}\">\n </kendo-grid-checkbox-column>\n \n <kendo-grid-column \n *ngFor=\"let item of visibleColumns\" \n [field]=\"item.Name || ''\" \n [title]=\"GetColumnTitle(item)\"\n [width]=\"item.width ? item.width : 100\"\n [editable]=\"item.EntityField?.AllowUpdateAPI || false\"\n [editor]=\"getEditor(item.EntityField)\"\n [headerStyle]=\"{ 'font-weight' : 'bold', 'background-color': 'white' }\"\n [style]=\"this.GetColumnCellStyle(item)\"\n >\n <ng-template *ngIf=\"item===visibleColumns[0]\" kendoGridFooterTemplate >\n {{this.filteredGridData.length | number}}{{this.totalRowCount > this.filteredGridData.length ? ' of ' + (this.totalRowCount | number) : ' rows'}}<br/><span style=\"font-size: smaller; font-weight: normal;\">{{viewExecutionTime | number:'1.2-2'}} seconds</span>\n </ng-template>\n </kendo-grid-column>\n\n <!--\n <kendo-excelexport #excelExport [data]=\"exportData\" [fileName]=\"(_viewEntity ? _viewEntity.Get('Name') : _entityInfo?.Name) + '.xlsx'\">\n <kendo-excelexport-column *ngFor=\"let exportCol of exportColumns\" [field]=\"exportCol.Name\" [title]=\"exportCol.Name\">\n </kendo-excelexport-column>\n </kendo-excelexport>\n -->\n </kendo-grid>\n }\n</div>\n\n<kendo-dialog\nclass=\"dialog-wrapper\"\ntitle=\"Select Views to Add\"\n*ngIf=\"showAddDialog\"\n(close)=\"toggleAddFromViewDialog(false)\"\n[minWidth]=\"250\"\n[width]=\"650\"\n[height]=\"550\"\n>\n@if(showAddLoader){\n <kendo-loader type=\"converging-spinner\"></kendo-loader>\n <kendo-progressbar \n [min]=\"0\"\n [max]=\"recordsToSave\"\n [value]=\"recordsSaved\"\n [indeterminate]=\"fetchingRecordsToSave\"\n />\n}\n@else {\n <div class=\"search-header\">\n <kendo-textbox\n id=\"listSearch\"\n placeholder=\"Search Views...\"\n kendoTextBox\n [clearButton]=\"true\"\n class=\"search-bar\"\n />\n </div>\n <hr>\n @for(userView of userViews; track userView){\n <div class=\"overflow-y-scroll\">\n <div class=\"list-item\">\n <div class=\"list-text\" [ngClass]=\"{'list-selected': userViewsToAdd.includes(userView)}\">\n {{userView.Name}}\n </div>\n @if(userViewsToAdd.includes(userView)){\n <button kendoButton class=\"btn-no-border btn-selected\" (click)=\"removeViewFromSelectedList(userView)\">\n <span class=\"fa-solid fa-minus\"></span>\n Remove\n </button>\n }\n @else {\n <button kendoButton class=\"btn-no-border\" (click)=\"addViewToSelectedList(userView)\">\n <div class=\"btn-margin-right\">\n <span class=\"fa-solid fa-plus\"></span>\n Add\n </div>\n </button>\n }\n </div>\n <hr>\n </div>\n }\n}\n <kendo-dialog-actions class=\"popup-actions-btn\">\n <button class=\"cancel-btn\" (click)=\"addTolist()\" [disabled]=\"showAddLoader\" kendoButton themeColor=\"info\">\n Done\n </button>\n <button class=\"yes-btn\" (click)=\"toggleAddFromViewDialog(false)\" [disabled]=\"showAddLoader\" kendoButton fillMode=\"outline\" themeColor=\"info\">\n Cancel\n </button>\n </kendo-dialog-actions>\n</kendo-dialog>\n\n<kendo-dialog\nclass=\"dialog-wrapper\"\n[title]=\"'Select ' + (listRecord ? listRecord.Entity : 'Records') + ' to Add to List'\"\n*ngIf=\"showAddSingleRecordsDialog\"\n(close)=\"toggleAddRecordsDialog(false)\"\n[minWidth]=\"250\"\n[width]=\"650\"\n[height]=\"550\"\n>\n@if(showDialogLoader){\n <kendo-loader type=\"converging-spinner\"></kendo-loader>\n <kendo-progressbar \n [min]=\"0\"\n [max]=\"recordsToSave\"\n [value]=\"recordsSaved\"\n [indeterminate]=\"fetchingRecordsToSave\"\n />\n}\n@else {\n <div class=\"search-header\">\n <kendo-textbox\n id=\"listRecordSearch\"\n (valueChange)=\"onListRecordDialogValueChange($event)\"\n [placeholder]=\"'Search ' + (listRecord ? listRecord.Entity : 'Records') + '...'\"\n kendoTextBox\n [clearButton]=\"true\"\n class=\"search-bar\"\n />\n </div>\n <hr>\n @if(fetchingListRecords){\n <kendo-loader type=\"converging-spinner\"></kendo-loader>\n }\n @else {\n @for(listRecord of listRecords; track listRecord){\n <div class=\"overflow-y-scroll\">\n <div class=\"list-item\">\n <div class=\"list-text\">\n {{listRecord.Name}}\n </div>\n <button kendoButton class=\"btn-no-border\" (click)=\"addListRecord(listRecord)\">\n <div class=\"btn-margin-right\">\n <span class=\"fa-solid fa-plus\"></span>\n Add\n </div>\n </button>\n </div>\n <hr>\n </div>\n }\n }\n}\n <kendo-dialog-actions class=\"popup-actions-btn\">\n <button class=\"yes-btn\" (click)=\"toggleAddRecordsDialog(false)\" [disabled]=\"showDialogLoader\" kendoButton fillMode=\"outline\" themeColor=\"info\">\n Close\n </button>\n </kendo-dialog-actions>\n</kendo-dialog>", styles: [".app-container {\n padding: 20px;\n}\n\n.flex-display-row-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: 10px;\n}\n\n.title-wrapper {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 14px 0;\n border-bottom: 1px solid var(--med-gray);\n}\n\n.title-wrapper h4 {\n margin: 0;\n font-size: 24px;\n line-height: 28px;\n}\n\n.title-wrapper .search input {\n width: 100%;\n height: 100%;\n font-size: 16px;\n background: transparent;\n border: none;\n box-sizing: border-box;\n padding-left: 40px;\n}\n\n .title-wrapper .search {\n background: var(--light-shade);\n width: 360px;\n height: 44px;\n position: relative;\n border-radius: 10px;\n}\n\n.title-wrapper .search svg {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n left: 12px;\n}\n\n.add-btn {\n padding: 10px 30px;\n border-radius: 10px;\n color: white;\n background-color: var(--border-blue);\n font-size: initial;\n cursor: pointer;\n}\n\n.add-btn:hover {\n filter: brightness(85%);\n}\n\n.margin-left-small {\n margin-left: 10px;\n}\n\n\n.overflow-y-scroll {\n overflow-y: auto;\n max-height: 300px;\n}\n\n.padding-bottom-small {\n padding-bottom: 10px;\n}\n\n.list-item {\n display: flex;\n justify-content: space-between;\n padding-bottom: 5px;\n align-items: center;\n}\n\n.btn-no-border {\n border: none;\n background: none;\n color: var(--border-blue);\n font-size: 16px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.btn-selected {\n font-weight: bold;\n}\n\n.list-text {\n font-size: large;\n}\n.list-selected {\n font-weight: bold;\n color: var(--border-blue);\n}\n\n.btn-margin-right {\n margin-right: 35px;\n}\n\n.divider {\n color: lightgray\n}\n\n.search-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 0;\n}\n\n.search-bar {\n width: 65%;\n padding-bottom: 10px;\n}\n\n.dialog-wrapper {\n padding: 15px 25px;\n}\n\n.btn-outline {\n border: 2px solid var(--border-blue);\n border-radius: 8px;\n padding: 5px 30px;\n\n background: none;\n color: var(--border-blue);\n font-size: 16px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.k-dropdown-button .k-button {\n background: var(--border-blue);\n color: var(--white-color);\n font-size: 16px;\n border: none;\n padding: 8px 25px;\n border-radius: 10px;\n}\n\n.k-dropdown-button .k-button .k-button-text .card-header-entity .add-item .k-button .k-button-text {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn-cmn {\n width: 44px;\n height: 44px;\n min-width: 44px;\n background: transparent;\n border-radius: 8px;\n border: 1px solid var(--gray-color);\n}\n\n.btn-cmn.active {\n border: 1px solid var(--border-blue);\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"] }]
|