@memberjunction/ng-explorer-core 5.12.0 → 5.13.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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"single-list-detail.component.d.ts","sourceRoot":"","sources":["../../../src/lib/single-list-detail/single-list-detail.component.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"single-list-detail.component.d.ts","sourceRoot":"","sources":["../../../src/lib/single-list-detail/single-list-detail.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Component, Input, ViewChild } from '@angular/core';
|
|
2
2
|
import { CompositeKey, LogError, LogErrorEx, LogStatus, Metadata, RunView } from '@memberjunction/core';
|
|
3
3
|
import { Subject, debounceTime } from 'rxjs';
|
|
4
|
-
import { UUIDsEqual } from '@memberjunction/global';
|
|
4
|
+
import { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
import * as i1 from "@memberjunction/ng-shared";
|
|
7
7
|
import * as i2 from "@progress/kendo-angular-dialog";
|
|
@@ -619,7 +619,7 @@ export class SingleListDetailComponent {
|
|
|
619
619
|
ResultType: 'simple'
|
|
620
620
|
}, md.CurrentUser);
|
|
621
621
|
if (result.Success) {
|
|
622
|
-
this.existingListDetailIds = new Set(result.Results.map(r => r.RecordID));
|
|
622
|
+
this.existingListDetailIds = new Set(result.Results.map(r => NormalizeUUID(r.RecordID)));
|
|
623
623
|
}
|
|
624
624
|
}
|
|
625
625
|
onAddRecordsSearchChange(value) {
|
|
@@ -657,7 +657,7 @@ export class SingleListDetailComponent {
|
|
|
657
657
|
return {
|
|
658
658
|
ID: recordId,
|
|
659
659
|
Name: nameField ? String(record[nameField.Name]) : recordId,
|
|
660
|
-
isInList: this.existingListDetailIds.has(recordId),
|
|
660
|
+
isInList: this.existingListDetailIds.has(NormalizeUUID(recordId)),
|
|
661
661
|
isSelected: false
|
|
662
662
|
};
|
|
663
663
|
});
|
|
@@ -759,6 +759,7 @@ export class SingleListDetailComponent {
|
|
|
759
759
|
this.userViews = runViewResult.Results;
|
|
760
760
|
}
|
|
761
761
|
this.showAddFromViewLoader = false;
|
|
762
|
+
this.cdr.detectChanges();
|
|
762
763
|
}
|
|
763
764
|
toggleViewSelection(view) {
|
|
764
765
|
const index = this.userViewsToAdd.findIndex(v => UUIDsEqual(v.ID, view.ID));
|
|
@@ -777,19 +778,20 @@ export class SingleListDetailComponent {
|
|
|
777
778
|
return;
|
|
778
779
|
this.showAddFromViewLoader = true;
|
|
779
780
|
this.fetchingRecordsToSave = true;
|
|
781
|
+
this.cdr.detectChanges();
|
|
780
782
|
const rv = new RunView();
|
|
781
783
|
const md = new Metadata();
|
|
782
784
|
// Collect all unique record IDs from selected views
|
|
783
785
|
const recordIdSet = new Set();
|
|
784
786
|
for (const userView of this.userViewsToAdd) {
|
|
785
787
|
const runViewResult = await rv.RunView({
|
|
786
|
-
|
|
788
|
+
ViewID: userView.ID,
|
|
787
789
|
ViewEntity: userView,
|
|
788
790
|
Fields: ["ID"]
|
|
789
791
|
}, md.CurrentUser);
|
|
790
792
|
if (runViewResult.Success) {
|
|
791
793
|
const records = runViewResult.Results;
|
|
792
|
-
records.forEach(r => recordIdSet.add(r.ID));
|
|
794
|
+
records.forEach(r => recordIdSet.add(NormalizeUUID(r.ID)));
|
|
793
795
|
}
|
|
794
796
|
}
|
|
795
797
|
// Filter out records already in the list
|
|
@@ -798,10 +800,12 @@ export class SingleListDetailComponent {
|
|
|
798
800
|
this.addFromViewTotal = recordsToAdd.length;
|
|
799
801
|
this.addFromViewProgress = 0;
|
|
800
802
|
this.fetchingRecordsToSave = false;
|
|
803
|
+
this.cdr.detectChanges();
|
|
801
804
|
const progressPerRecord = 0.8 / Math.max(recordsToAdd.length, 1); // 80% for individual saves
|
|
802
805
|
if (recordsToAdd.length === 0) {
|
|
803
806
|
this.sharedService.CreateSimpleNotification("All records already in list", 'info', 2500);
|
|
804
807
|
this.showAddFromViewLoader = false;
|
|
808
|
+
this.cdr.detectChanges();
|
|
805
809
|
return;
|
|
806
810
|
}
|
|
807
811
|
LogStatus(`Adding ${recordsToAdd.length} records to list`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"single-list-detail.component.js","sourceRoot":"","sources":["../../../src/lib/single-list-detail/single-list-detail.component.ts","../../../src/lib/single-list-detail/single-list-detail.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnInit, ViewChild, ChangeDetectorRef } from '@angular/core';\nimport { BaseEntity, CompositeKey, LogError, LogErrorEx, LogStatus, Metadata, RunView, RunViewResult } from '@memberjunction/core';\nimport { MJListDetailEntity, MJListDetailEntityExtended, MJListEntity, MJUserViewEntityExtended } from '@memberjunction/core-entities';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { ListDetailGridComponent, ListGridRowClickedEvent } from '@memberjunction/ng-list-detail-grid';\nimport { GridToolbarConfig } from '@memberjunction/ng-entity-viewer';\nimport { Subject, debounceTime } from 'rxjs';\nimport { NewItemOption } from '../../generic/Item.types';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Represents a record that can be added to a list\n */\ninterface AddableRecord {\n ID: string;\n Name: string;\n isInList: boolean;\n isSelected: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-list-detail',\n templateUrl: './single-list-detail.component.html',\n styleUrls: ['./single-list-detail.component.css', '../../shared/first-tab-styles.css']\n})\nexport class SingleListDetailComponent implements OnInit {\n\n @Input() public ListID: string = \"\";\n\n @ViewChild('listDetailGrid') listDetailGrid: ListDetailGridComponent | undefined;\n\n // List record\n public listRecord: MJListEntity | null = null;\n public showLoader: boolean = false;\n\n // Grid state\n public selectedKeys: string[] = [];\n public rowCount: number = 0;\n\n // Toolbar config - hide EDG toolbar, we'll use our own\n public gridToolbarConfig: GridToolbarConfig = {\n showSearch: false,\n showRefresh: false,\n showAdd: false,\n showDelete: false,\n showExport: false,\n showRowCount: false,\n showSelectionCount: false\n };\n\n // Remove from list dialog\n public showRemoveDialog: boolean = false;\n public isRemoving: boolean = false;\n public removeProgress: number = 0;\n public removeTotal: number = 0;\n\n // Add records dialog\n public showAddRecordsDialog: boolean = false;\n public addDialogLoading: boolean = false;\n public addDialogSaving: boolean = false;\n public addableRecords: AddableRecord[] = [];\n public addRecordsSearchFilter: string = \"\";\n public existingListDetailIds: Set<string> = new Set();\n public addProgress: number = 0;\n public addTotal: number = 0;\n private searchSubject: Subject<string> = new Subject();\n\n // Add from view dialog (existing)\n public showAddFromViewDialog: boolean = false;\n public showAddFromViewLoader: boolean = false;\n public userViews: MJUserViewEntityExtended[] | null = null;\n public userViewsToAdd: MJUserViewEntityExtended[] = [];\n public addFromViewProgress: number = 0;\n public addFromViewTotal: number = 0;\n public fetchingRecordsToSave: boolean = false;\n\n // Dropdown menu options\n public addOptions: NewItemOption[] = [\n {\n Text: 'Add Records',\n Description: 'Search and add specific records to this list',\n Icon: 'search',\n Action: () => this.openAddRecordsDialog()\n },\n {\n Text: 'Add From View',\n Description: 'Add all records from a saved view',\n Icon: 'folder',\n Action: () => this.openAddFromViewDialog()\n }\n ];\n\n constructor(\n private sharedService: SharedService,\n private cdr: ChangeDetectorRef\n ) {\n // Debounce search input\n this.searchSubject\n .pipe(debounceTime(300))\n .subscribe((searchText) => this.searchRecords(searchText));\n }\n\n public async ngOnInit(): Promise<void> {\n if (this.ListID) {\n await this.loadListRecord();\n }\n }\n\n /**\n * Load the list entity record\n */\n private async loadListRecord(): Promise<void> {\n if (!this.ListID) return;\n\n this.showLoader = true;\n\n try {\n const md = new Metadata();\n this.listRecord = await md.GetEntityObject<MJListEntity>(\"MJ: Lists\");\n const loadResult = await this.listRecord.Load(this.ListID);\n\n if (!loadResult) {\n LogError(\"Error loading list with ID \" + this.ListID, undefined, this.listRecord.LatestResult);\n this.listRecord = null;\n }\n } catch (error) {\n LogError(\"Error loading list\", undefined, error);\n this.listRecord = null;\n } finally {\n this.showLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n // ==========================================\n // Grid Event Handlers\n // ==========================================\n\n onRowClicked(_event: ListGridRowClickedEvent): void {\n // Selection is handled by the grid\n }\n\n onRowDoubleClicked(_event: ListGridRowClickedEvent): void {\n // Navigation is handled by mj-list-detail-grid\n }\n\n onSelectionChange(keys: string[]): void {\n this.selectedKeys = keys;\n }\n\n onDataLoaded(event: { totalCount: number }): void {\n this.rowCount = event.totalCount;\n }\n\n refreshGrid(): void {\n if (this.listDetailGrid) {\n this.listDetailGrid.refresh();\n }\n }\n\n // ==========================================\n // Toolbar Actions\n // ==========================================\n\n onRefreshClick(): void {\n this.refreshGrid();\n }\n\n onExportClick(): void {\n // Trigger export on the underlying grid\n if (this.listDetailGrid) {\n this.listDetailGrid.export();\n }\n }\n\n onDropdownItemClick(item: NewItemOption): void {\n if (item.Action) {\n item.Action();\n }\n }\n\n // ==========================================\n // Remove from List Dialog\n // ==========================================\n\n openRemoveDialog(): void {\n if (this.selectedKeys.length === 0) {\n this.sharedService.CreateSimpleNotification(\"Please select records to remove\", 'warning', 2500);\n return;\n }\n this.showRemoveDialog = true;\n }\n\n closeRemoveDialog(): void {\n this.showRemoveDialog = false;\n this.isRemoving = false;\n this.removeProgress = 0;\n this.removeTotal = 0;\n }\n\n async confirmRemoveFromList(): Promise<void> {\n if (!this.listRecord || this.selectedKeys.length === 0) return;\n\n this.isRemoving = true;\n this.removeTotal = this.selectedKeys.length;\n this.removeProgress = 0;\n\n const md = new Metadata();\n const rv = new RunView();\n const entityInfo = md.EntityByID(this.listRecord.EntityID);\n\n // selectedKeys from grid are in concatenated format (ID|value)\n // For single PK entities, RecordID in DB is just the raw value\n // For composite PK entities, RecordID in DB is the concatenated format\n // Extract the appropriate format for the query\n const selectedRecordIds = this.selectedKeys.map(key => {\n if (entityInfo && entityInfo.PrimaryKeys.length === 1) {\n // Single PK: extract just the value from concatenated format\n const compositeKey = new CompositeKey();\n compositeKey.LoadFromConcatenatedString(key);\n return compositeKey.KeyValuePairs[0]?.Value || key;\n } else {\n // Composite PK: use full concatenated format as-is\n return key;\n }\n });\n\n const listDetailsFilter = `ListID = '${this.listRecord.ID}' AND RecordID IN (${selectedRecordIds.map(id => `'${id}'`).join(',')})`;\n\n const listDetailsResult = await rv.RunView<MJListDetailEntity>({\n EntityName: 'MJ: List Details',\n ExtraFilter: listDetailsFilter,\n ResultType: 'entity_object'\n }, md.CurrentUser);\n\n if (!listDetailsResult.Success) {\n LogError(\"Error loading list details for removal\", undefined, listDetailsResult.ErrorMessage);\n this.sharedService.CreateSimpleNotification(\"Failed to remove records\", 'error', 2500);\n this.isRemoving = false;\n return;\n }\n\n // Use transaction group for bulk delete\n const tg = await md.CreateTransactionGroup();\n const listDetails = listDetailsResult.Results;\n\n for (const listDetail of listDetails) {\n listDetail.TransactionGroup = tg;\n await listDetail.Delete();\n }\n\n const success = await tg.Submit();\n\n if (success) {\n this.removeProgress = this.removeTotal;\n this.sharedService.CreateSimpleNotification(\n `Removed ${listDetails.length} record${listDetails.length !== 1 ? 's' : ''} from list`,\n 'success',\n 2500\n );\n this.closeRemoveDialog();\n this.listDetailGrid?.clearSelection();\n this.refreshGrid();\n } else {\n LogError(\"Error removing records from list\");\n this.sharedService.CreateSimpleNotification(\"Failed to remove some records\", 'error', 2500);\n this.isRemoving = false;\n }\n }\n\n // ==========================================\n // Add Records Dialog\n // ==========================================\n\n async openAddRecordsDialog(): Promise<void> {\n this.showAddRecordsDialog = true;\n this.addableRecords = [];\n this.addRecordsSearchFilter = \"\";\n this.addDialogLoading = true;\n this.addDialogSaving = false;\n\n // Load existing list detail IDs to mark which records are already in the list\n await this.loadExistingListDetailIds();\n this.addDialogLoading = false;\n }\n\n closeAddRecordsDialog(): void {\n this.showAddRecordsDialog = false;\n this.addableRecords = [];\n this.addRecordsSearchFilter = \"\";\n this.existingListDetailIds.clear();\n this.addDialogSaving = false;\n this.addProgress = 0;\n this.addTotal = 0;\n }\n\n private async loadExistingListDetailIds(): Promise<void> {\n if (!this.listRecord) return;\n\n const md = new Metadata();\n const rv = new RunView();\n\n const result = await rv.RunView<{ RecordID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID = '${this.listRecord.ID}'`,\n Fields: ['RecordID'],\n ResultType: 'simple'\n }, md.CurrentUser);\n\n if (result.Success) {\n this.existingListDetailIds = new Set(result.Results.map(r => r.RecordID));\n }\n }\n\n onAddRecordsSearchChange(value: string): void {\n this.addRecordsSearchFilter = value;\n this.searchSubject.next(value);\n }\n\n private async searchRecords(searchText: string): Promise<void> {\n if (!this.listRecord || !searchText || searchText.length < 2) {\n this.addableRecords = [];\n return;\n }\n\n this.addDialogLoading = true;\n\n const md = new Metadata();\n const sourceEntityInfo = md.EntityByID(this.listRecord.EntityID);\n if (!sourceEntityInfo) {\n this.addDialogLoading = false;\n return;\n }\n\n const nameField = sourceEntityInfo.Fields.find(field => field.IsNameField);\n const pkField = sourceEntityInfo.FirstPrimaryKey?.Name || 'ID';\n\n let filter: string | undefined;\n if (nameField) {\n filter = `${nameField.Name} LIKE '%${searchText}%'`;\n }\n\n const rv = new RunView();\n const result: RunViewResult = await rv.RunView({\n EntityName: this.listRecord.Entity,\n ExtraFilter: filter,\n MaxRows: 100,\n ResultType: 'simple'\n });\n\n if (result.Success) {\n this.addableRecords = result.Results.map((record: Record<string, unknown>) => {\n const recordId = String(record[pkField]);\n return {\n ID: recordId,\n Name: nameField ? String(record[nameField.Name]) : recordId,\n isInList: this.existingListDetailIds.has(recordId),\n isSelected: false\n };\n });\n }\n\n this.addDialogLoading = false;\n this.cdr.detectChanges();\n }\n\n toggleRecordSelection(record: AddableRecord): void {\n if (record.isInList) return; // Can't select records already in list\n record.isSelected = !record.isSelected;\n }\n\n get selectedAddableRecords(): AddableRecord[] {\n return this.addableRecords.filter(r => r.isSelected);\n }\n\n selectAllAddable(): void {\n this.addableRecords.forEach(r => {\n if (!r.isInList) r.isSelected = true;\n });\n }\n\n deselectAllAddable(): void {\n this.addableRecords.forEach(r => r.isSelected = false);\n }\n\n async confirmAddRecords(): Promise<void> {\n const recordsToAdd = this.selectedAddableRecords;\n if (recordsToAdd.length === 0 || !this.listRecord) return;\n\n this.addDialogSaving = true;\n // Reserve 20% of progress for tg.Submit()\n this.addTotal = recordsToAdd.length;\n this.addProgress = 0;\n const progressPerRecord = 0.8 / recordsToAdd.length; // 80% for individual saves\n\n const md = new Metadata();\n\n // Use transaction group for bulk insert\n const tg = await md.CreateTransactionGroup();\n\n for (let i = 0; i < recordsToAdd.length; i++) {\n const record = recordsToAdd[i];\n const listDetail = await md.GetEntityObject<MJListDetailEntityExtended>(\"MJ: List Details\", md.CurrentUser);\n listDetail.ListID = this.listRecord.ID;\n listDetail.RecordID = record.ID;\n listDetail.TransactionGroup = tg;\n const result = await listDetail.Save();\n if (!result) {\n LogErrorEx({\n message: listDetail.LatestResult?.CompleteMessage\n });\n }\n // Update progress (0-80%)\n this.addProgress = Math.round((i + 1) * progressPerRecord * this.addTotal);\n }\n\n // Show 80% complete before submit\n this.addProgress = Math.round(this.addTotal * 0.8);\n\n const success = await tg.Submit();\n\n if (success) {\n this.addProgress = this.addTotal;\n this.sharedService.CreateSimpleNotification(\n `Added ${recordsToAdd.length} record${recordsToAdd.length !== 1 ? 's' : ''} to list`,\n 'success',\n 2500\n );\n this.closeAddRecordsDialog();\n this.refreshGrid();\n } else {\n LogError(\"Error adding records to list\");\n this.sharedService.CreateSimpleNotification(\"Failed to add some records\", 'error', 2500);\n this.addDialogSaving = false;\n }\n }\n\n // ==========================================\n // Add From View Dialog (existing functionality, cleaned up)\n // ==========================================\n\n async openAddFromViewDialog(): Promise<void> {\n this.showAddFromViewDialog = true;\n this.userViewsToAdd = [];\n\n if (!this.userViews) {\n await this.loadEntityViews();\n }\n }\n\n closeAddFromViewDialog(): void {\n this.showAddFromViewDialog = false;\n this.userViewsToAdd = [];\n this.showAddFromViewLoader = false;\n this.addFromViewProgress = 0;\n this.addFromViewTotal = 0;\n }\n\n private async loadEntityViews(): Promise<void> {\n if (!this.listRecord || !this.listRecord.Entity) return;\n\n this.showAddFromViewLoader = true;\n\n const rv = new RunView();\n const md = new Metadata();\n\n const runViewResult = await rv.RunView<MJUserViewEntityExtended>({\n EntityName: \"MJ: User Views\",\n ExtraFilter: `UserID = '${md.CurrentUser.ID}' AND EntityID = '${this.listRecord.EntityID}'`,\n ResultType: 'entity_object'\n }, md.CurrentUser);\n\n if (!runViewResult.Success) {\n LogError(`Error loading User Views for entity ${this.listRecord.Entity}`);\n } else {\n this.userViews = runViewResult.Results;\n }\n\n this.showAddFromViewLoader = false;\n }\n\n toggleViewSelection(view: MJUserViewEntityExtended): void {\n const index = this.userViewsToAdd.findIndex(v => UUIDsEqual(v.ID, view.ID));\n if (index >= 0) {\n this.userViewsToAdd.splice(index, 1);\n } else {\n this.userViewsToAdd.push(view);\n }\n }\n\n isViewSelected(view: MJUserViewEntityExtended): boolean {\n return this.userViewsToAdd.some(v => UUIDsEqual(v.ID, view.ID));\n }\n\n async confirmAddFromView(): Promise<void> {\n if (!this.listRecord || this.userViewsToAdd.length === 0) return;\n\n this.showAddFromViewLoader = true;\n this.fetchingRecordsToSave = true;\n\n const rv = new RunView();\n const md = new Metadata();\n\n // Collect all unique record IDs from selected views\n const recordIdSet = new Set<string>();\n\n for (const userView of this.userViewsToAdd) {\n const runViewResult = await rv.RunView({\n EntityName: \"MJ: User Views\",\n ViewEntity: userView,\n Fields: [\"ID\"]\n }, md.CurrentUser);\n\n if (runViewResult.Success) {\n const records = runViewResult.Results as Array<{ ID: string }>;\n records.forEach(r => recordIdSet.add(r.ID));\n }\n }\n\n // Filter out records already in the list\n await this.loadExistingListDetailIds();\n const recordsToAdd = [...recordIdSet].filter(id => !this.existingListDetailIds.has(id));\n\n this.addFromViewTotal = recordsToAdd.length;\n this.addFromViewProgress = 0;\n this.fetchingRecordsToSave = false;\n const progressPerRecord = 0.8 / Math.max(recordsToAdd.length, 1); // 80% for individual saves\n\n if (recordsToAdd.length === 0) {\n this.sharedService.CreateSimpleNotification(\"All records already in list\", 'info', 2500);\n this.showAddFromViewLoader = false;\n return;\n }\n\n LogStatus(`Adding ${recordsToAdd.length} records to list`);\n\n // Use transaction group for bulk insert\n const tg = await md.CreateTransactionGroup();\n\n for (let i = 0; i < recordsToAdd.length; i++) {\n const recordID = recordsToAdd[i];\n const listDetail = await md.GetEntityObject<MJListDetailEntityExtended>(\"MJ: List Details\", md.CurrentUser);\n listDetail.ListID = this.listRecord.ID;\n listDetail.RecordID = recordID;\n listDetail.TransactionGroup = tg;\n const result = await listDetail.Save();\n if (!result) {\n LogErrorEx({\n message: listDetail.LatestResult?.CompleteMessage\n });\n }\n // Update progress (0-80%)\n this.addFromViewProgress = Math.round((i + 1) * progressPerRecord * this.addFromViewTotal);\n }\n\n // Show 80% complete before submit\n this.addFromViewProgress = Math.round(this.addFromViewTotal * 0.8);\n\n const success = await tg.Submit();\n\n if (success) {\n this.addFromViewProgress = this.addFromViewTotal;\n this.sharedService.CreateSimpleNotification(\n `Added ${recordsToAdd.length} record${recordsToAdd.length !== 1 ? 's' : ''} to list`,\n 'success',\n 2500\n );\n this.closeAddFromViewDialog();\n this.refreshGrid();\n } else {\n LogError(\"Error adding records from view to list\");\n this.sharedService.CreateSimpleNotification(\"Failed to add some records\", 'error', 2500);\n this.showAddFromViewLoader = false;\n }\n }\n}\n","<div class=\"list-detail-container\">\n <!-- Header with title and Add button -->\n <div class=\"list-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\n <!-- Custom Toolbar -->\n @if (!showLoader && listRecord) {\n <div class=\"custom-toolbar\">\n <div class=\"toolbar-left\">\n <span class=\"row-count\">{{ rowCount }} row{{ rowCount !== 1 ? 's' : '' }}</span>\n @if (selectedKeys.length > 0) {\n <span class=\"selection-count\">({{ selectedKeys.length }} selected)</span>\n }\n </div>\n <div class=\"toolbar-right\">\n @if (selectedKeys.length > 0) {\n <button kendoButton\n (click)=\"openRemoveDialog()\"\n fillMode=\"flat\"\n themeColor=\"error\"\n class=\"toolbar-button remove-btn\">\n <span class=\"fa-solid fa-trash\"></span>\n Remove from List\n </button>\n }\n <button kendoButton\n (click)=\"onRefreshClick()\"\n fillMode=\"flat\"\n class=\"toolbar-button\">\n <span class=\"fa-solid fa-rotate\"></span>\n Refresh\n </button>\n <button kendoButton\n (click)=\"onExportClick()\"\n fillMode=\"flat\"\n class=\"toolbar-button\">\n <span class=\"fa-solid fa-file-export\"></span>\n Export\n </button>\n </div>\n </div>\n }\n\n <!-- Loading State -->\n @if (showLoader) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading list...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n <!-- Grid -->\n @if (!showLoader && listRecord) {\n <div class=\"grid-container\">\n <mj-list-detail-grid\n #listDetailGrid\n [listId]=\"ListID\"\n [listEntity]=\"listRecord\"\n [autoNavigate]=\"true\"\n [height]=\"'auto'\"\n [showToolbar]=\"false\"\n [toolbarConfig]=\"gridToolbarConfig\"\n [selectionMode]=\"'checkbox'\"\n (rowClicked)=\"onRowClicked($event)\"\n (rowDoubleClicked)=\"onRowDoubleClicked($event)\"\n (selectionChange)=\"onSelectionChange($event)\"\n (dataLoaded)=\"onDataLoaded($event)\">\n </mj-list-detail-grid>\n </div>\n }\n</div>\n\n<!-- Remove from List Confirmation Dialog -->\n@if (showRemoveDialog) {\n <kendo-dialog\n title=\"Remove from List\"\n (close)=\"closeRemoveDialog()\"\n [minWidth]=\"350\"\n [width]=\"450\">\n <div class=\"dialog-content\">\n @if (isRemoving) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Removing records...\" size=\"small\"></mj-loading>\n @if (removeTotal > 0) {\n <kendo-progressbar\n [min]=\"0\"\n [max]=\"removeTotal\"\n [value]=\"removeProgress\"\n [label]=\"false\"\n class=\"progress-bar\">\n </kendo-progressbar>\n }\n </div>\n } @else {\n <div class=\"dialog-message\">\n <span class=\"fa-solid fa-triangle-exclamation warning-icon\"></span>\n <p>Are you sure you want to remove <strong>{{ selectedKeys.length }}</strong> record{{ selectedKeys.length !== 1 ? 's' : '' }} from this list?</p>\n <p class=\"dialog-note\">This will not delete the records, only remove them from this list.</p>\n </div>\n }\n </div>\n <kendo-dialog-actions>\n <button kendoButton\n (click)=\"confirmRemoveFromList()\"\n [disabled]=\"isRemoving\"\n themeColor=\"error\">\n Remove\n </button>\n <button kendoButton\n (click)=\"closeRemoveDialog()\"\n [disabled]=\"isRemoving\"\n fillMode=\"outline\">\n Cancel\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n}\n\n<!-- Add Records Dialog -->\n@if (showAddRecordsDialog) {\n <kendo-dialog\n [title]=\"'Add ' + (listRecord?.Entity || 'Records') + ' to List'\"\n (close)=\"closeAddRecordsDialog()\"\n [minWidth]=\"500\"\n [width]=\"700\"\n [height]=\"650\">\n <div class=\"dialog-content add-records-dialog\">\n @if (addDialogSaving) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Adding records to list...\" size=\"small\"></mj-loading>\n @if (addTotal > 0) {\n <kendo-progressbar\n [min]=\"0\"\n [max]=\"addTotal\"\n [value]=\"addProgress\"\n [label]=\"false\"\n class=\"progress-bar\">\n </kendo-progressbar>\n }\n </div>\n } @else {\n <!-- Search Input -->\n <div class=\"search-section\">\n <kendo-textbox\n [placeholder]=\"'Search ' + (listRecord?.Entity || 'records') + '...'\"\n [clearButton]=\"true\"\n (valueChange)=\"onAddRecordsSearchChange($event)\"\n [value]=\"addRecordsSearchFilter\"\n class=\"search-input\">\n <ng-template kendoTextBoxPrefixTemplate>\n <span class=\"fa-solid fa-search search-icon\"></span>\n </ng-template>\n </kendo-textbox>\n <span class=\"search-hint\">Type at least 2 characters to search</span>\n </div>\n <!-- Records List -->\n <div class=\"records-list\">\n @if (addDialogLoading) {\n <div class=\"list-loading\">\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n </div>\n } @else if (addableRecords.length === 0 && addRecordsSearchFilter.length >= 2) {\n <div class=\"empty-results\">\n <span class=\"fa-solid fa-search empty-icon\"></span>\n <p>No records found matching \"{{ addRecordsSearchFilter }}\"</p>\n </div>\n } @else if (addableRecords.length === 0) {\n <div class=\"empty-results\">\n <span class=\"fa-solid fa-list empty-icon\"></span>\n <p>Search for records to add to this list</p>\n </div>\n } @else {\n <!-- Selection controls -->\n <div class=\"selection-controls\">\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"selectAllAddable()\">Select All</button>\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"deselectAllAddable()\">Deselect All</button>\n <span class=\"selection-info\">{{ selectedAddableRecords.length }} selected</span>\n </div>\n <!-- Records -->\n <div class=\"records-scroll\">\n @for (record of addableRecords; track record.ID) {\n <div class=\"record-item\"\n [class.in-list]=\"record.isInList\"\n [class.selected]=\"record.isSelected\"\n (click)=\"toggleRecordSelection(record)\">\n <div class=\"record-checkbox\">\n @if (record.isInList) {\n <span class=\"fa-solid fa-check in-list-icon\" title=\"Already in list\"></span>\n } @else {\n <input type=\"checkbox\"\n [checked]=\"record.isSelected\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRecordSelection(record)\">\n }\n </div>\n <div class=\"record-name\">{{ record.Name }}</div>\n @if (record.isInList) {\n <span class=\"in-list-badge\">In List</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n <kendo-dialog-actions>\n <button kendoButton\n (click)=\"confirmAddRecords()\"\n [disabled]=\"addDialogSaving || selectedAddableRecords.length === 0\"\n themeColor=\"info\">\n Add {{ selectedAddableRecords.length > 0 ? selectedAddableRecords.length : '' }} Record{{ selectedAddableRecords.length !== 1 ? 's' : '' }}\n </button>\n <button kendoButton\n (click)=\"closeAddRecordsDialog()\"\n [disabled]=\"addDialogSaving\"\n fillMode=\"outline\">\n Cancel\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n}\n\n<!-- Add From View Dialog -->\n@if (showAddFromViewDialog) {\n <kendo-dialog\n title=\"Add Records from Views\"\n (close)=\"closeAddFromViewDialog()\"\n [minWidth]=\"400\"\n [width]=\"600\"\n [height]=\"500\">\n <div class=\"dialog-content\">\n @if (showAddFromViewLoader && fetchingRecordsToSave) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Loading records from views...\" size=\"small\"></mj-loading>\n </div>\n } @else if (showAddFromViewLoader && addFromViewTotal > 0) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Adding records to list...\" size=\"small\"></mj-loading>\n <kendo-progressbar\n [min]=\"0\"\n [max]=\"addFromViewTotal\"\n [value]=\"addFromViewProgress\"\n [label]=\"false\"\n class=\"progress-bar\">\n </kendo-progressbar>\n </div>\n } @else if (showAddFromViewLoader) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Loading views...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <p class=\"dialog-instruction\">Select views to add their records to this list:</p>\n <div class=\"views-list\">\n @if (!userViews || userViews.length === 0) {\n <div class=\"empty-results\">\n <span class=\"fa-solid fa-folder-open empty-icon\"></span>\n <p>No saved views found for this entity</p>\n </div>\n } @else {\n @for (view of userViews; track view.ID) {\n <div class=\"view-item\"\n [class.selected]=\"isViewSelected(view)\"\n (click)=\"toggleViewSelection(view)\">\n <input type=\"checkbox\"\n [checked]=\"isViewSelected(view)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleViewSelection(view)\">\n <span class=\"fa-solid fa-table-list view-icon\"></span>\n <span class=\"view-name\">{{ view.Name }}</span>\n </div>\n }\n }\n </div>\n }\n </div>\n <kendo-dialog-actions>\n <button kendoButton\n (click)=\"confirmAddFromView()\"\n [disabled]=\"showAddFromViewLoader || userViewsToAdd.length === 0\"\n themeColor=\"info\">\n Add from {{ userViewsToAdd.length }} View{{ userViewsToAdd.length !== 1 ? 's' : '' }}\n </button>\n <button kendoButton\n (click)=\"closeAddFromViewDialog()\"\n [disabled]=\"showAddFromViewLoader\"\n fillMode=\"outline\">\n Cancel\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"single-list-detail.component.js","sourceRoot":"","sources":["../../../src/lib/single-list-detail/single-list-detail.component.ts","../../../src/lib/single-list-detail/single-list-detail.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnInit, ViewChild, ChangeDetectorRef } from '@angular/core';\nimport { BaseEntity, CompositeKey, LogError, LogErrorEx, LogStatus, Metadata, RunView, RunViewResult } from '@memberjunction/core';\nimport { MJListDetailEntity, MJListDetailEntityExtended, MJListEntity, MJUserViewEntityExtended } from '@memberjunction/core-entities';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { ListDetailGridComponent, ListGridRowClickedEvent } from '@memberjunction/ng-list-detail-grid';\nimport { GridToolbarConfig } from '@memberjunction/ng-entity-viewer';\nimport { Subject, debounceTime } from 'rxjs';\nimport { NewItemOption } from '../../generic/Item.types';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\n\n/**\n * Represents a record that can be added to a list\n */\ninterface AddableRecord {\n ID: string;\n Name: string;\n isInList: boolean;\n isSelected: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-list-detail',\n templateUrl: './single-list-detail.component.html',\n styleUrls: ['./single-list-detail.component.css', '../../shared/first-tab-styles.css']\n})\nexport class SingleListDetailComponent implements OnInit {\n\n @Input() public ListID: string = \"\";\n\n @ViewChild('listDetailGrid') listDetailGrid: ListDetailGridComponent | undefined;\n\n // List record\n public listRecord: MJListEntity | null = null;\n public showLoader: boolean = false;\n\n // Grid state\n public selectedKeys: string[] = [];\n public rowCount: number = 0;\n\n // Toolbar config - hide EDG toolbar, we'll use our own\n public gridToolbarConfig: GridToolbarConfig = {\n showSearch: false,\n showRefresh: false,\n showAdd: false,\n showDelete: false,\n showExport: false,\n showRowCount: false,\n showSelectionCount: false\n };\n\n // Remove from list dialog\n public showRemoveDialog: boolean = false;\n public isRemoving: boolean = false;\n public removeProgress: number = 0;\n public removeTotal: number = 0;\n\n // Add records dialog\n public showAddRecordsDialog: boolean = false;\n public addDialogLoading: boolean = false;\n public addDialogSaving: boolean = false;\n public addableRecords: AddableRecord[] = [];\n public addRecordsSearchFilter: string = \"\";\n public existingListDetailIds: Set<string> = new Set();\n public addProgress: number = 0;\n public addTotal: number = 0;\n private searchSubject: Subject<string> = new Subject();\n\n // Add from view dialog (existing)\n public showAddFromViewDialog: boolean = false;\n public showAddFromViewLoader: boolean = false;\n public userViews: MJUserViewEntityExtended[] | null = null;\n public userViewsToAdd: MJUserViewEntityExtended[] = [];\n public addFromViewProgress: number = 0;\n public addFromViewTotal: number = 0;\n public fetchingRecordsToSave: boolean = false;\n\n // Dropdown menu options\n public addOptions: NewItemOption[] = [\n {\n Text: 'Add Records',\n Description: 'Search and add specific records to this list',\n Icon: 'search',\n Action: () => this.openAddRecordsDialog()\n },\n {\n Text: 'Add From View',\n Description: 'Add all records from a saved view',\n Icon: 'folder',\n Action: () => this.openAddFromViewDialog()\n }\n ];\n\n constructor(\n private sharedService: SharedService,\n private cdr: ChangeDetectorRef\n ) {\n // Debounce search input\n this.searchSubject\n .pipe(debounceTime(300))\n .subscribe((searchText) => this.searchRecords(searchText));\n }\n\n public async ngOnInit(): Promise<void> {\n if (this.ListID) {\n await this.loadListRecord();\n }\n }\n\n /**\n * Load the list entity record\n */\n private async loadListRecord(): Promise<void> {\n if (!this.ListID) return;\n\n this.showLoader = true;\n\n try {\n const md = new Metadata();\n this.listRecord = await md.GetEntityObject<MJListEntity>(\"MJ: Lists\");\n const loadResult = await this.listRecord.Load(this.ListID);\n\n if (!loadResult) {\n LogError(\"Error loading list with ID \" + this.ListID, undefined, this.listRecord.LatestResult);\n this.listRecord = null;\n }\n } catch (error) {\n LogError(\"Error loading list\", undefined, error);\n this.listRecord = null;\n } finally {\n this.showLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n // ==========================================\n // Grid Event Handlers\n // ==========================================\n\n onRowClicked(_event: ListGridRowClickedEvent): void {\n // Selection is handled by the grid\n }\n\n onRowDoubleClicked(_event: ListGridRowClickedEvent): void {\n // Navigation is handled by mj-list-detail-grid\n }\n\n onSelectionChange(keys: string[]): void {\n this.selectedKeys = keys;\n }\n\n onDataLoaded(event: { totalCount: number }): void {\n this.rowCount = event.totalCount;\n }\n\n refreshGrid(): void {\n if (this.listDetailGrid) {\n this.listDetailGrid.refresh();\n }\n }\n\n // ==========================================\n // Toolbar Actions\n // ==========================================\n\n onRefreshClick(): void {\n this.refreshGrid();\n }\n\n onExportClick(): void {\n // Trigger export on the underlying grid\n if (this.listDetailGrid) {\n this.listDetailGrid.export();\n }\n }\n\n onDropdownItemClick(item: NewItemOption): void {\n if (item.Action) {\n item.Action();\n }\n }\n\n // ==========================================\n // Remove from List Dialog\n // ==========================================\n\n openRemoveDialog(): void {\n if (this.selectedKeys.length === 0) {\n this.sharedService.CreateSimpleNotification(\"Please select records to remove\", 'warning', 2500);\n return;\n }\n this.showRemoveDialog = true;\n }\n\n closeRemoveDialog(): void {\n this.showRemoveDialog = false;\n this.isRemoving = false;\n this.removeProgress = 0;\n this.removeTotal = 0;\n }\n\n async confirmRemoveFromList(): Promise<void> {\n if (!this.listRecord || this.selectedKeys.length === 0) return;\n\n this.isRemoving = true;\n this.removeTotal = this.selectedKeys.length;\n this.removeProgress = 0;\n\n const md = new Metadata();\n const rv = new RunView();\n const entityInfo = md.EntityByID(this.listRecord.EntityID);\n\n // selectedKeys from grid are in concatenated format (ID|value)\n // For single PK entities, RecordID in DB is just the raw value\n // For composite PK entities, RecordID in DB is the concatenated format\n // Extract the appropriate format for the query\n const selectedRecordIds = this.selectedKeys.map(key => {\n if (entityInfo && entityInfo.PrimaryKeys.length === 1) {\n // Single PK: extract just the value from concatenated format\n const compositeKey = new CompositeKey();\n compositeKey.LoadFromConcatenatedString(key);\n return compositeKey.KeyValuePairs[0]?.Value || key;\n } else {\n // Composite PK: use full concatenated format as-is\n return key;\n }\n });\n\n const listDetailsFilter = `ListID = '${this.listRecord.ID}' AND RecordID IN (${selectedRecordIds.map(id => `'${id}'`).join(',')})`;\n\n const listDetailsResult = await rv.RunView<MJListDetailEntity>({\n EntityName: 'MJ: List Details',\n ExtraFilter: listDetailsFilter,\n ResultType: 'entity_object'\n }, md.CurrentUser);\n\n if (!listDetailsResult.Success) {\n LogError(\"Error loading list details for removal\", undefined, listDetailsResult.ErrorMessage);\n this.sharedService.CreateSimpleNotification(\"Failed to remove records\", 'error', 2500);\n this.isRemoving = false;\n return;\n }\n\n // Use transaction group for bulk delete\n const tg = await md.CreateTransactionGroup();\n const listDetails = listDetailsResult.Results;\n\n for (const listDetail of listDetails) {\n listDetail.TransactionGroup = tg;\n await listDetail.Delete();\n }\n\n const success = await tg.Submit();\n\n if (success) {\n this.removeProgress = this.removeTotal;\n this.sharedService.CreateSimpleNotification(\n `Removed ${listDetails.length} record${listDetails.length !== 1 ? 's' : ''} from list`,\n 'success',\n 2500\n );\n this.closeRemoveDialog();\n this.listDetailGrid?.clearSelection();\n this.refreshGrid();\n } else {\n LogError(\"Error removing records from list\");\n this.sharedService.CreateSimpleNotification(\"Failed to remove some records\", 'error', 2500);\n this.isRemoving = false;\n }\n }\n\n // ==========================================\n // Add Records Dialog\n // ==========================================\n\n async openAddRecordsDialog(): Promise<void> {\n this.showAddRecordsDialog = true;\n this.addableRecords = [];\n this.addRecordsSearchFilter = \"\";\n this.addDialogLoading = true;\n this.addDialogSaving = false;\n\n // Load existing list detail IDs to mark which records are already in the list\n await this.loadExistingListDetailIds();\n this.addDialogLoading = false;\n }\n\n closeAddRecordsDialog(): void {\n this.showAddRecordsDialog = false;\n this.addableRecords = [];\n this.addRecordsSearchFilter = \"\";\n this.existingListDetailIds.clear();\n this.addDialogSaving = false;\n this.addProgress = 0;\n this.addTotal = 0;\n }\n\n private async loadExistingListDetailIds(): Promise<void> {\n if (!this.listRecord) return;\n\n const md = new Metadata();\n const rv = new RunView();\n\n const result = await rv.RunView<{ RecordID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID = '${this.listRecord.ID}'`,\n Fields: ['RecordID'],\n ResultType: 'simple'\n }, md.CurrentUser);\n\n if (result.Success) {\n this.existingListDetailIds = new Set(result.Results.map(r => NormalizeUUID(r.RecordID)));\n }\n }\n\n onAddRecordsSearchChange(value: string): void {\n this.addRecordsSearchFilter = value;\n this.searchSubject.next(value);\n }\n\n private async searchRecords(searchText: string): Promise<void> {\n if (!this.listRecord || !searchText || searchText.length < 2) {\n this.addableRecords = [];\n return;\n }\n\n this.addDialogLoading = true;\n\n const md = new Metadata();\n const sourceEntityInfo = md.EntityByID(this.listRecord.EntityID);\n if (!sourceEntityInfo) {\n this.addDialogLoading = false;\n return;\n }\n\n const nameField = sourceEntityInfo.Fields.find(field => field.IsNameField);\n const pkField = sourceEntityInfo.FirstPrimaryKey?.Name || 'ID';\n\n let filter: string | undefined;\n if (nameField) {\n filter = `${nameField.Name} LIKE '%${searchText}%'`;\n }\n\n const rv = new RunView();\n const result: RunViewResult = await rv.RunView({\n EntityName: this.listRecord.Entity,\n ExtraFilter: filter,\n MaxRows: 100,\n ResultType: 'simple'\n });\n\n if (result.Success) {\n this.addableRecords = result.Results.map((record: Record<string, unknown>) => {\n const recordId = String(record[pkField]);\n return {\n ID: recordId,\n Name: nameField ? String(record[nameField.Name]) : recordId,\n isInList: this.existingListDetailIds.has(NormalizeUUID(recordId)),\n isSelected: false\n };\n });\n }\n\n this.addDialogLoading = false;\n this.cdr.detectChanges();\n }\n\n toggleRecordSelection(record: AddableRecord): void {\n if (record.isInList) return; // Can't select records already in list\n record.isSelected = !record.isSelected;\n }\n\n get selectedAddableRecords(): AddableRecord[] {\n return this.addableRecords.filter(r => r.isSelected);\n }\n\n selectAllAddable(): void {\n this.addableRecords.forEach(r => {\n if (!r.isInList) r.isSelected = true;\n });\n }\n\n deselectAllAddable(): void {\n this.addableRecords.forEach(r => r.isSelected = false);\n }\n\n async confirmAddRecords(): Promise<void> {\n const recordsToAdd = this.selectedAddableRecords;\n if (recordsToAdd.length === 0 || !this.listRecord) return;\n\n this.addDialogSaving = true;\n // Reserve 20% of progress for tg.Submit()\n this.addTotal = recordsToAdd.length;\n this.addProgress = 0;\n const progressPerRecord = 0.8 / recordsToAdd.length; // 80% for individual saves\n\n const md = new Metadata();\n\n // Use transaction group for bulk insert\n const tg = await md.CreateTransactionGroup();\n\n for (let i = 0; i < recordsToAdd.length; i++) {\n const record = recordsToAdd[i];\n const listDetail = await md.GetEntityObject<MJListDetailEntityExtended>(\"MJ: List Details\", md.CurrentUser);\n listDetail.ListID = this.listRecord.ID;\n listDetail.RecordID = record.ID;\n listDetail.TransactionGroup = tg;\n const result = await listDetail.Save();\n if (!result) {\n LogErrorEx({\n message: listDetail.LatestResult?.CompleteMessage\n });\n }\n // Update progress (0-80%)\n this.addProgress = Math.round((i + 1) * progressPerRecord * this.addTotal);\n }\n\n // Show 80% complete before submit\n this.addProgress = Math.round(this.addTotal * 0.8);\n\n const success = await tg.Submit();\n\n if (success) {\n this.addProgress = this.addTotal;\n this.sharedService.CreateSimpleNotification(\n `Added ${recordsToAdd.length} record${recordsToAdd.length !== 1 ? 's' : ''} to list`,\n 'success',\n 2500\n );\n this.closeAddRecordsDialog();\n this.refreshGrid();\n } else {\n LogError(\"Error adding records to list\");\n this.sharedService.CreateSimpleNotification(\"Failed to add some records\", 'error', 2500);\n this.addDialogSaving = false;\n }\n }\n\n // ==========================================\n // Add From View Dialog (existing functionality, cleaned up)\n // ==========================================\n\n async openAddFromViewDialog(): Promise<void> {\n this.showAddFromViewDialog = true;\n this.userViewsToAdd = [];\n\n if (!this.userViews) {\n await this.loadEntityViews();\n }\n }\n\n closeAddFromViewDialog(): void {\n this.showAddFromViewDialog = false;\n this.userViewsToAdd = [];\n this.showAddFromViewLoader = false;\n this.addFromViewProgress = 0;\n this.addFromViewTotal = 0;\n }\n\n private async loadEntityViews(): Promise<void> {\n if (!this.listRecord || !this.listRecord.Entity) return;\n\n this.showAddFromViewLoader = true;\n\n const rv = new RunView();\n const md = new Metadata();\n\n const runViewResult = await rv.RunView<MJUserViewEntityExtended>({\n EntityName: \"MJ: User Views\",\n ExtraFilter: `UserID = '${md.CurrentUser.ID}' AND EntityID = '${this.listRecord.EntityID}'`,\n ResultType: 'entity_object'\n }, md.CurrentUser);\n\n if (!runViewResult.Success) {\n LogError(`Error loading User Views for entity ${this.listRecord.Entity}`);\n } else {\n this.userViews = runViewResult.Results;\n }\n\n this.showAddFromViewLoader = false;\n this.cdr.detectChanges();\n }\n\n toggleViewSelection(view: MJUserViewEntityExtended): void {\n const index = this.userViewsToAdd.findIndex(v => UUIDsEqual(v.ID, view.ID));\n if (index >= 0) {\n this.userViewsToAdd.splice(index, 1);\n } else {\n this.userViewsToAdd.push(view);\n }\n }\n\n isViewSelected(view: MJUserViewEntityExtended): boolean {\n return this.userViewsToAdd.some(v => UUIDsEqual(v.ID, view.ID));\n }\n\n async confirmAddFromView(): Promise<void> {\n if (!this.listRecord || this.userViewsToAdd.length === 0) return;\n\n this.showAddFromViewLoader = true;\n this.fetchingRecordsToSave = true;\n this.cdr.detectChanges();\n\n const rv = new RunView();\n const md = new Metadata();\n\n // Collect all unique record IDs from selected views\n const recordIdSet = new Set<string>();\n\n for (const userView of this.userViewsToAdd) {\n const runViewResult = await rv.RunView({\n ViewID: userView.ID,\n ViewEntity: userView,\n Fields: [\"ID\"]\n }, md.CurrentUser);\n\n if (runViewResult.Success) {\n const records = runViewResult.Results as Array<Record<string, string>>;\n records.forEach(r => recordIdSet.add(NormalizeUUID(r.ID)));\n }\n }\n\n // Filter out records already in the list\n await this.loadExistingListDetailIds();\n const recordsToAdd = [...recordIdSet].filter(id => !this.existingListDetailIds.has(id));\n\n this.addFromViewTotal = recordsToAdd.length;\n this.addFromViewProgress = 0;\n this.fetchingRecordsToSave = false;\n this.cdr.detectChanges();\n const progressPerRecord = 0.8 / Math.max(recordsToAdd.length, 1); // 80% for individual saves\n\n if (recordsToAdd.length === 0) {\n this.sharedService.CreateSimpleNotification(\"All records already in list\", 'info', 2500);\n this.showAddFromViewLoader = false;\n this.cdr.detectChanges();\n return;\n }\n\n LogStatus(`Adding ${recordsToAdd.length} records to list`);\n\n // Use transaction group for bulk insert\n const tg = await md.CreateTransactionGroup();\n\n for (let i = 0; i < recordsToAdd.length; i++) {\n const recordID = recordsToAdd[i];\n const listDetail = await md.GetEntityObject<MJListDetailEntityExtended>(\"MJ: List Details\", md.CurrentUser);\n listDetail.ListID = this.listRecord.ID;\n listDetail.RecordID = recordID;\n listDetail.TransactionGroup = tg;\n const result = await listDetail.Save();\n if (!result) {\n LogErrorEx({\n message: listDetail.LatestResult?.CompleteMessage\n });\n }\n // Update progress (0-80%)\n this.addFromViewProgress = Math.round((i + 1) * progressPerRecord * this.addFromViewTotal);\n }\n\n // Show 80% complete before submit\n this.addFromViewProgress = Math.round(this.addFromViewTotal * 0.8);\n\n const success = await tg.Submit();\n\n if (success) {\n this.addFromViewProgress = this.addFromViewTotal;\n this.sharedService.CreateSimpleNotification(\n `Added ${recordsToAdd.length} record${recordsToAdd.length !== 1 ? 's' : ''} to list`,\n 'success',\n 2500\n );\n this.closeAddFromViewDialog();\n this.refreshGrid();\n } else {\n LogError(\"Error adding records from view to list\");\n this.sharedService.CreateSimpleNotification(\"Failed to add some records\", 'error', 2500);\n this.showAddFromViewLoader = false;\n }\n }\n}\n","<div class=\"list-detail-container\">\n <!-- Header with title and Add button -->\n <div class=\"list-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\n <!-- Custom Toolbar -->\n @if (!showLoader && listRecord) {\n <div class=\"custom-toolbar\">\n <div class=\"toolbar-left\">\n <span class=\"row-count\">{{ rowCount }} row{{ rowCount !== 1 ? 's' : '' }}</span>\n @if (selectedKeys.length > 0) {\n <span class=\"selection-count\">({{ selectedKeys.length }} selected)</span>\n }\n </div>\n <div class=\"toolbar-right\">\n @if (selectedKeys.length > 0) {\n <button kendoButton\n (click)=\"openRemoveDialog()\"\n fillMode=\"flat\"\n themeColor=\"error\"\n class=\"toolbar-button remove-btn\">\n <span class=\"fa-solid fa-trash\"></span>\n Remove from List\n </button>\n }\n <button kendoButton\n (click)=\"onRefreshClick()\"\n fillMode=\"flat\"\n class=\"toolbar-button\">\n <span class=\"fa-solid fa-rotate\"></span>\n Refresh\n </button>\n <button kendoButton\n (click)=\"onExportClick()\"\n fillMode=\"flat\"\n class=\"toolbar-button\">\n <span class=\"fa-solid fa-file-export\"></span>\n Export\n </button>\n </div>\n </div>\n }\n\n <!-- Loading State -->\n @if (showLoader) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading list...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n <!-- Grid -->\n @if (!showLoader && listRecord) {\n <div class=\"grid-container\">\n <mj-list-detail-grid\n #listDetailGrid\n [listId]=\"ListID\"\n [listEntity]=\"listRecord\"\n [autoNavigate]=\"true\"\n [height]=\"'auto'\"\n [showToolbar]=\"false\"\n [toolbarConfig]=\"gridToolbarConfig\"\n [selectionMode]=\"'checkbox'\"\n (rowClicked)=\"onRowClicked($event)\"\n (rowDoubleClicked)=\"onRowDoubleClicked($event)\"\n (selectionChange)=\"onSelectionChange($event)\"\n (dataLoaded)=\"onDataLoaded($event)\">\n </mj-list-detail-grid>\n </div>\n }\n</div>\n\n<!-- Remove from List Confirmation Dialog -->\n@if (showRemoveDialog) {\n <kendo-dialog\n title=\"Remove from List\"\n (close)=\"closeRemoveDialog()\"\n [minWidth]=\"350\"\n [width]=\"450\">\n <div class=\"dialog-content\">\n @if (isRemoving) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Removing records...\" size=\"small\"></mj-loading>\n @if (removeTotal > 0) {\n <kendo-progressbar\n [min]=\"0\"\n [max]=\"removeTotal\"\n [value]=\"removeProgress\"\n [label]=\"false\"\n class=\"progress-bar\">\n </kendo-progressbar>\n }\n </div>\n } @else {\n <div class=\"dialog-message\">\n <span class=\"fa-solid fa-triangle-exclamation warning-icon\"></span>\n <p>Are you sure you want to remove <strong>{{ selectedKeys.length }}</strong> record{{ selectedKeys.length !== 1 ? 's' : '' }} from this list?</p>\n <p class=\"dialog-note\">This will not delete the records, only remove them from this list.</p>\n </div>\n }\n </div>\n <kendo-dialog-actions>\n <button kendoButton\n (click)=\"confirmRemoveFromList()\"\n [disabled]=\"isRemoving\"\n themeColor=\"error\">\n Remove\n </button>\n <button kendoButton\n (click)=\"closeRemoveDialog()\"\n [disabled]=\"isRemoving\"\n fillMode=\"outline\">\n Cancel\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n}\n\n<!-- Add Records Dialog -->\n@if (showAddRecordsDialog) {\n <kendo-dialog\n [title]=\"'Add ' + (listRecord?.Entity || 'Records') + ' to List'\"\n (close)=\"closeAddRecordsDialog()\"\n [minWidth]=\"500\"\n [width]=\"700\"\n [height]=\"650\">\n <div class=\"dialog-content add-records-dialog\">\n @if (addDialogSaving) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Adding records to list...\" size=\"small\"></mj-loading>\n @if (addTotal > 0) {\n <kendo-progressbar\n [min]=\"0\"\n [max]=\"addTotal\"\n [value]=\"addProgress\"\n [label]=\"false\"\n class=\"progress-bar\">\n </kendo-progressbar>\n }\n </div>\n } @else {\n <!-- Search Input -->\n <div class=\"search-section\">\n <kendo-textbox\n [placeholder]=\"'Search ' + (listRecord?.Entity || 'records') + '...'\"\n [clearButton]=\"true\"\n (valueChange)=\"onAddRecordsSearchChange($event)\"\n [value]=\"addRecordsSearchFilter\"\n class=\"search-input\">\n <ng-template kendoTextBoxPrefixTemplate>\n <span class=\"fa-solid fa-search search-icon\"></span>\n </ng-template>\n </kendo-textbox>\n <span class=\"search-hint\">Type at least 2 characters to search</span>\n </div>\n <!-- Records List -->\n <div class=\"records-list\">\n @if (addDialogLoading) {\n <div class=\"list-loading\">\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n </div>\n } @else if (addableRecords.length === 0 && addRecordsSearchFilter.length >= 2) {\n <div class=\"empty-results\">\n <span class=\"fa-solid fa-search empty-icon\"></span>\n <p>No records found matching \"{{ addRecordsSearchFilter }}\"</p>\n </div>\n } @else if (addableRecords.length === 0) {\n <div class=\"empty-results\">\n <span class=\"fa-solid fa-list empty-icon\"></span>\n <p>Search for records to add to this list</p>\n </div>\n } @else {\n <!-- Selection controls -->\n <div class=\"selection-controls\">\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"selectAllAddable()\">Select All</button>\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"deselectAllAddable()\">Deselect All</button>\n <span class=\"selection-info\">{{ selectedAddableRecords.length }} selected</span>\n </div>\n <!-- Records -->\n <div class=\"records-scroll\">\n @for (record of addableRecords; track record.ID) {\n <div class=\"record-item\"\n [class.in-list]=\"record.isInList\"\n [class.selected]=\"record.isSelected\"\n (click)=\"toggleRecordSelection(record)\">\n <div class=\"record-checkbox\">\n @if (record.isInList) {\n <span class=\"fa-solid fa-check in-list-icon\" title=\"Already in list\"></span>\n } @else {\n <input type=\"checkbox\"\n [checked]=\"record.isSelected\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRecordSelection(record)\">\n }\n </div>\n <div class=\"record-name\">{{ record.Name }}</div>\n @if (record.isInList) {\n <span class=\"in-list-badge\">In List</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n <kendo-dialog-actions>\n <button kendoButton\n (click)=\"confirmAddRecords()\"\n [disabled]=\"addDialogSaving || selectedAddableRecords.length === 0\"\n themeColor=\"info\">\n Add {{ selectedAddableRecords.length > 0 ? selectedAddableRecords.length : '' }} Record{{ selectedAddableRecords.length !== 1 ? 's' : '' }}\n </button>\n <button kendoButton\n (click)=\"closeAddRecordsDialog()\"\n [disabled]=\"addDialogSaving\"\n fillMode=\"outline\">\n Cancel\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n}\n\n<!-- Add From View Dialog -->\n@if (showAddFromViewDialog) {\n <kendo-dialog\n title=\"Add Records from Views\"\n (close)=\"closeAddFromViewDialog()\"\n [minWidth]=\"400\"\n [width]=\"600\"\n [height]=\"500\">\n <div class=\"dialog-content\">\n @if (showAddFromViewLoader && fetchingRecordsToSave) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Loading records from views...\" size=\"small\"></mj-loading>\n </div>\n } @else if (showAddFromViewLoader && addFromViewTotal > 0) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Adding records to list...\" size=\"small\"></mj-loading>\n <kendo-progressbar\n [min]=\"0\"\n [max]=\"addFromViewTotal\"\n [value]=\"addFromViewProgress\"\n [label]=\"false\"\n class=\"progress-bar\">\n </kendo-progressbar>\n </div>\n } @else if (showAddFromViewLoader) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Loading views...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <p class=\"dialog-instruction\">Select views to add their records to this list:</p>\n <div class=\"views-list\">\n @if (!userViews || userViews.length === 0) {\n <div class=\"empty-results\">\n <span class=\"fa-solid fa-folder-open empty-icon\"></span>\n <p>No saved views found for this entity</p>\n </div>\n } @else {\n @for (view of userViews; track view.ID) {\n <div class=\"view-item\"\n [class.selected]=\"isViewSelected(view)\"\n (click)=\"toggleViewSelection(view)\">\n <input type=\"checkbox\"\n [checked]=\"isViewSelected(view)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleViewSelection(view)\">\n <span class=\"fa-solid fa-table-list view-icon\"></span>\n <span class=\"view-name\">{{ view.Name }}</span>\n </div>\n }\n }\n </div>\n }\n </div>\n <kendo-dialog-actions>\n <button kendoButton\n (click)=\"confirmAddFromView()\"\n [disabled]=\"showAddFromViewLoader || userViewsToAdd.length === 0\"\n themeColor=\"info\">\n Add from {{ userViewsToAdd.length }} View{{ userViewsToAdd.length !== 1 ? 's' : '' }}\n </button>\n <button kendoButton\n (click)=\"closeAddFromViewDialog()\"\n [disabled]=\"showAddFromViewLoader\"\n fillMode=\"outline\">\n Cancel\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-explorer-core",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.13.0",
|
|
4
4
|
"description": "MemberJunction Explorer: Core Angular Components",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -30,39 +30,39 @@
|
|
|
30
30
|
"@angular/cdk": "21.1.3",
|
|
31
31
|
"@angular/platform-browser": "21.1.3",
|
|
32
32
|
"@auth0/auth0-angular": "^2.6.0",
|
|
33
|
-
"@memberjunction/ai-core-plus": "5.
|
|
34
|
-
"@memberjunction/ai-engine-base": "5.
|
|
35
|
-
"@memberjunction/communication-types": "5.
|
|
36
|
-
"@memberjunction/core": "5.
|
|
37
|
-
"@memberjunction/core-entities": "5.
|
|
38
|
-
"@memberjunction/entity-communications-client": "5.
|
|
39
|
-
"@memberjunction/global": "5.
|
|
40
|
-
"@memberjunction/graphql-dataprovider": "5.
|
|
41
|
-
"@memberjunction/ng-ai-test-harness": "5.
|
|
42
|
-
"@memberjunction/ng-artifacts": "5.
|
|
43
|
-
"@memberjunction/ng-auth-services": "5.
|
|
44
|
-
"@memberjunction/ng-base-application": "5.
|
|
45
|
-
"@memberjunction/ng-base-forms": "5.
|
|
46
|
-
"@memberjunction/ng-container-directives": "5.
|
|
47
|
-
"@memberjunction/ng-conversations": "5.
|
|
48
|
-
"@memberjunction/ng-dashboards": "5.
|
|
49
|
-
"@memberjunction/ng-entity-form-dialog": "5.
|
|
50
|
-
"@memberjunction/ng-entity-permissions": "5.
|
|
51
|
-
"@memberjunction/ng-dashboard-viewer": "5.
|
|
52
|
-
"@memberjunction/ng-entity-viewer": "5.
|
|
53
|
-
"@memberjunction/ng-list-detail-grid": "5.
|
|
54
|
-
"@memberjunction/ng-explorer-settings": "5.
|
|
55
|
-
"@memberjunction/ng-file-storage": "5.
|
|
56
|
-
"@memberjunction/ng-generic-dialog": "5.
|
|
57
|
-
"@memberjunction/ng-notifications": "5.
|
|
58
|
-
"@memberjunction/ng-query-viewer": "5.
|
|
59
|
-
"@memberjunction/ng-record-changes": "5.
|
|
60
|
-
"@memberjunction/ng-record-selector": "5.
|
|
61
|
-
"@memberjunction/ng-resource-permissions": "5.
|
|
62
|
-
"@memberjunction/ng-shared": "5.
|
|
63
|
-
"@memberjunction/ng-shared-generic": "5.
|
|
64
|
-
"@memberjunction/ng-user-avatar": "5.
|
|
65
|
-
"@memberjunction/templates-base-types": "5.
|
|
33
|
+
"@memberjunction/ai-core-plus": "5.13.0",
|
|
34
|
+
"@memberjunction/ai-engine-base": "5.13.0",
|
|
35
|
+
"@memberjunction/communication-types": "5.13.0",
|
|
36
|
+
"@memberjunction/core": "5.13.0",
|
|
37
|
+
"@memberjunction/core-entities": "5.13.0",
|
|
38
|
+
"@memberjunction/entity-communications-client": "5.13.0",
|
|
39
|
+
"@memberjunction/global": "5.13.0",
|
|
40
|
+
"@memberjunction/graphql-dataprovider": "5.13.0",
|
|
41
|
+
"@memberjunction/ng-ai-test-harness": "5.13.0",
|
|
42
|
+
"@memberjunction/ng-artifacts": "5.13.0",
|
|
43
|
+
"@memberjunction/ng-auth-services": "5.13.0",
|
|
44
|
+
"@memberjunction/ng-base-application": "5.13.0",
|
|
45
|
+
"@memberjunction/ng-base-forms": "5.13.0",
|
|
46
|
+
"@memberjunction/ng-container-directives": "5.13.0",
|
|
47
|
+
"@memberjunction/ng-conversations": "5.13.0",
|
|
48
|
+
"@memberjunction/ng-dashboards": "5.13.0",
|
|
49
|
+
"@memberjunction/ng-entity-form-dialog": "5.13.0",
|
|
50
|
+
"@memberjunction/ng-entity-permissions": "5.13.0",
|
|
51
|
+
"@memberjunction/ng-dashboard-viewer": "5.13.0",
|
|
52
|
+
"@memberjunction/ng-entity-viewer": "5.13.0",
|
|
53
|
+
"@memberjunction/ng-list-detail-grid": "5.13.0",
|
|
54
|
+
"@memberjunction/ng-explorer-settings": "5.13.0",
|
|
55
|
+
"@memberjunction/ng-file-storage": "5.13.0",
|
|
56
|
+
"@memberjunction/ng-generic-dialog": "5.13.0",
|
|
57
|
+
"@memberjunction/ng-notifications": "5.13.0",
|
|
58
|
+
"@memberjunction/ng-query-viewer": "5.13.0",
|
|
59
|
+
"@memberjunction/ng-record-changes": "5.13.0",
|
|
60
|
+
"@memberjunction/ng-record-selector": "5.13.0",
|
|
61
|
+
"@memberjunction/ng-resource-permissions": "5.13.0",
|
|
62
|
+
"@memberjunction/ng-shared": "5.13.0",
|
|
63
|
+
"@memberjunction/ng-shared-generic": "5.13.0",
|
|
64
|
+
"@memberjunction/ng-user-avatar": "5.13.0",
|
|
65
|
+
"@memberjunction/templates-base-types": "5.13.0",
|
|
66
66
|
"@progress/kendo-angular-buttons": "22.0.1",
|
|
67
67
|
"@progress/kendo-angular-dateinputs": "22.0.1",
|
|
68
68
|
"@progress/kendo-angular-dialog": "22.0.1",
|