@memberjunction/ng-explorer-core 5.30.1 → 5.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/app-routing.module.d.ts +9 -0
  2. package/dist/app-routing.module.d.ts.map +1 -1
  3. package/dist/app-routing.module.js +13 -1
  4. package/dist/app-routing.module.js.map +1 -1
  5. package/dist/generated/lazy-feature-config.d.ts +1 -1
  6. package/dist/generated/lazy-feature-config.d.ts.map +1 -1
  7. package/dist/generated/lazy-feature-config.js +5 -3
  8. package/dist/generated/lazy-feature-config.js.map +1 -1
  9. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.d.ts +2 -1
  10. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.d.ts.map +1 -1
  11. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js +12 -11
  12. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js.map +1 -1
  13. package/dist/lib/guards/entities.guard.d.ts +2 -1
  14. package/dist/lib/guards/entities.guard.d.ts.map +1 -1
  15. package/dist/lib/guards/entities.guard.js +14 -1
  16. package/dist/lib/guards/entities.guard.js.map +1 -1
  17. package/dist/lib/oauth/oauth-callback.component.d.ts +2 -1
  18. package/dist/lib/oauth/oauth-callback.component.d.ts.map +1 -1
  19. package/dist/lib/oauth/oauth-callback.component.js +7 -6
  20. package/dist/lib/oauth/oauth-callback.component.js.map +1 -1
  21. package/dist/lib/resource-wrappers/artifact-resource.component.js +2 -3
  22. package/dist/lib/resource-wrappers/artifact-resource.component.js.map +1 -1
  23. package/dist/lib/resource-wrappers/chat-collections-resource.component.js +3 -3
  24. package/dist/lib/resource-wrappers/chat-collections-resource.component.js.map +1 -1
  25. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +4 -4
  26. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
  27. package/dist/lib/resource-wrappers/chat-tasks-resource.component.js +1 -2
  28. package/dist/lib/resource-wrappers/chat-tasks-resource.component.js.map +1 -1
  29. package/dist/lib/resource-wrappers/dashboard-resource.component.js +5 -5
  30. package/dist/lib/resource-wrappers/dashboard-resource.component.js.map +1 -1
  31. package/dist/lib/resource-wrappers/list-detail-resource.component.js +2 -2
  32. package/dist/lib/resource-wrappers/list-detail-resource.component.js.map +1 -1
  33. package/dist/lib/resource-wrappers/query-resource.component.js +2 -2
  34. package/dist/lib/resource-wrappers/query-resource.component.js.map +1 -1
  35. package/dist/lib/resource-wrappers/record-resource.component.d.ts +2 -2
  36. package/dist/lib/resource-wrappers/record-resource.component.d.ts.map +1 -1
  37. package/dist/lib/resource-wrappers/record-resource.component.js +8 -7
  38. package/dist/lib/resource-wrappers/record-resource.component.js.map +1 -1
  39. package/dist/lib/resource-wrappers/search-results-resource.component.js +3 -3
  40. package/dist/lib/resource-wrappers/search-results-resource.component.js.map +1 -1
  41. package/dist/lib/resource-wrappers/view-resource.component.d.ts +1 -1
  42. package/dist/lib/resource-wrappers/view-resource.component.d.ts.map +1 -1
  43. package/dist/lib/resource-wrappers/view-resource.component.js +3 -3
  44. package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
  45. package/dist/lib/services/startup-validation.service.d.ts +9 -0
  46. package/dist/lib/services/startup-validation.service.d.ts.map +1 -1
  47. package/dist/lib/services/startup-validation.service.js +13 -1
  48. package/dist/lib/services/startup-validation.service.js.map +1 -1
  49. package/dist/lib/shell/components/tabs/tab-container.component.d.ts +2 -1
  50. package/dist/lib/shell/components/tabs/tab-container.component.d.ts.map +1 -1
  51. package/dist/lib/shell/components/tabs/tab-container.component.js +7 -5
  52. package/dist/lib/shell/components/tabs/tab-container.component.js.map +1 -1
  53. package/dist/lib/shell/shell.component.d.ts +5 -2
  54. package/dist/lib/shell/shell.component.d.ts.map +1 -1
  55. package/dist/lib/shell/shell.component.js +43 -27
  56. package/dist/lib/shell/shell.component.js.map +1 -1
  57. package/dist/lib/single-dashboard/Components/add-item/add-item.component.d.ts +3 -2
  58. package/dist/lib/single-dashboard/Components/add-item/add-item.component.d.ts.map +1 -1
  59. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js +8 -6
  60. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js.map +1 -1
  61. package/dist/lib/single-dashboard/single-dashboard.component.js +1 -2
  62. package/dist/lib/single-dashboard/single-dashboard.component.js.map +1 -1
  63. package/dist/lib/single-list-detail/single-list-detail.component.d.ts +2 -1
  64. package/dist/lib/single-list-detail/single-list-detail.component.d.ts.map +1 -1
  65. package/dist/lib/single-list-detail/single-list-detail.component.js +18 -16
  66. package/dist/lib/single-list-detail/single-list-detail.component.js.map +1 -1
  67. package/dist/lib/single-record/single-record.component.d.ts +2 -1
  68. package/dist/lib/single-record/single-record.component.d.ts.map +1 -1
  69. package/dist/lib/single-record/single-record.component.js +7 -5
  70. package/dist/lib/single-record/single-record.component.js.map +1 -1
  71. package/dist/lib/single-search-result/single-search-result.component.d.ts +2 -1
  72. package/dist/lib/single-search-result/single-search-result.component.d.ts.map +1 -1
  73. package/dist/lib/single-search-result/single-search-result.component.js +8 -6
  74. package/dist/lib/single-search-result/single-search-result.component.js.map +1 -1
  75. package/dist/lib/user-notifications/user-notifications.component.d.ts +2 -1
  76. package/dist/lib/user-notifications/user-notifications.component.d.ts.map +1 -1
  77. package/dist/lib/user-notifications/user-notifications.component.js +9 -7
  78. package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
  79. package/dist/lib/user-profile/user-profile.component.d.ts +2 -1
  80. package/dist/lib/user-profile/user-profile.component.d.ts.map +1 -1
  81. package/dist/lib/user-profile/user-profile.component.js +6 -5
  82. package/dist/lib/user-profile/user-profile.component.js.map +1 -1
  83. package/package.json +42 -41
@@ -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, HostListener, ElementRef } 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 button toggle state\n public showAddDropdown: 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 @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (this.showAddDropdown) {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.querySelector('.add-dropdown-wrapper')?.contains(target)) {\n this.showAddDropdown = false;\n }\n }\n }\n\n constructor(\n private sharedService: SharedService,\n private cdr: ChangeDetectorRef,\n private elementRef: ElementRef\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 // ==========================================\n // Progress Percentage Getters\n // ==========================================\n\n get removeProgressPercent(): number {\n return this.removeTotal > 0 ? Math.round((this.removeProgress / this.removeTotal) * 100) : 0;\n }\n\n get addProgressPercent(): number {\n return this.addTotal > 0 ? Math.round((this.addProgress / this.addTotal) * 100) : 0;\n }\n\n get addFromViewProgressPercent(): number {\n return this.addFromViewTotal > 0 ? Math.round((this.addFromViewProgress / this.addFromViewTotal) * 100) : 0;\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 toggleAddDropdown(): void {\n this.showAddDropdown = !this.showAddDropdown;\n }\n\n onDropdownItemClick(item: NewItemOption): void {\n this.showAddDropdown = false;\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 onAddRecordsSearchInputEvent(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.onAddRecordsSearchChange(value);\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 <div class=\"add-dropdown-wrapper\">\n <button mjButton variant=\"primary\" class=\"add-btn\" (click)=\"toggleAddDropdown()\">\n <span class=\"fa-solid fa-plus\"></span>\n Add to List\n <span class=\"fa-solid fa-chevron-down add-dropdown-arrow\"></span>\n </button>\n @if (showAddDropdown) {\n <div class=\"add-dropdown-panel\">\n @for (option of addOptions; track option.Text) {\n <div class=\"add-dropdown-item\" (click)=\"onDropdownItemClick(option)\">\n <span class=\"add-dropdown-item-text\">{{ option.Text }}</span>\n @if (option.Description) {\n <span class=\"add-dropdown-item-desc\">{{ option.Description }}</span>\n }\n </div>\n }\n </div>\n }\n </div>\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 mjButton\n (click)=\"openRemoveDialog()\"\n variant=\"flat\"\n class=\"toolbar-button remove-btn\">\n <span class=\"fa-solid fa-trash\"></span>\n Remove from List\n </button>\n }\n <button mjButton\n (click)=\"onRefreshClick()\"\n variant=\"flat\"\n class=\"toolbar-button\">\n <span class=\"fa-solid fa-rotate\"></span>\n Refresh\n </button>\n <button mjButton\n (click)=\"onExportClick()\"\n variant=\"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 <mj-dialog\n [Visible]=\"true\"\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 <mj-progress-bar\n [Value]=\"removeProgressPercent\"\n class=\"progress-bar\">\n </mj-progress-bar>\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 <mj-dialog-actions>\n <button mjButton\n (click)=\"confirmRemoveFromList()\"\n [disabled]=\"isRemoving\"\n variant=\"danger\">\n Remove\n </button>\n <button mjButton\n (click)=\"closeRemoveDialog()\"\n [disabled]=\"isRemoving\"\n variant=\"outline\">\n Cancel\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n\n<!-- Add Records Dialog -->\n@if (showAddRecordsDialog) {\n <mj-dialog\n [Visible]=\"true\"\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 <mj-progress-bar\n [Value]=\"addProgressPercent\"\n class=\"progress-bar\">\n </mj-progress-bar>\n }\n </div>\n } @else {\n <!-- Search Input -->\n <div class=\"search-section\">\n <div class=\"search-input-wrapper\">\n <span class=\"fa-solid fa-search search-icon\"></span>\n <input\n class=\"mj-input search-input\"\n type=\"text\"\n [placeholder]=\"'Search ' + (listRecord?.Entity || 'records') + '...'\"\n [value]=\"addRecordsSearchFilter\"\n (input)=\"onAddRecordsSearchInputEvent($event)\" />\n </div>\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 mjButton variant=\"flat\" size=\"sm\" (click)=\"selectAllAddable()\">Select All</button>\n <button mjButton variant=\"flat\" size=\"sm\" (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 <mj-dialog-actions>\n <button mjButton\n (click)=\"confirmAddRecords()\"\n [disabled]=\"addDialogSaving || selectedAddableRecords.length === 0\"\n variant=\"primary\">\n Add {{ selectedAddableRecords.length > 0 ? selectedAddableRecords.length : '' }} Record{{ selectedAddableRecords.length !== 1 ? 's' : '' }}\n </button>\n <button mjButton\n (click)=\"closeAddRecordsDialog()\"\n [disabled]=\"addDialogSaving\"\n variant=\"outline\">\n Cancel\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n\n<!-- Add From View Dialog -->\n@if (showAddFromViewDialog) {\n <mj-dialog\n [Visible]=\"true\"\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 <mj-progress-bar\n [Value]=\"addFromViewProgressPercent\"\n class=\"progress-bar\">\n </mj-progress-bar>\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 <mj-dialog-actions>\n <button mjButton\n (click)=\"confirmAddFromView()\"\n [disabled]=\"showAddFromViewLoader || userViewsToAdd.length === 0\"\n variant=\"primary\">\n Add from {{ userViewsToAdd.length }} View{{ userViewsToAdd.length !== 1 ? 's' : '' }}\n </button>\n <button mjButton\n (click)=\"closeAddFromViewDialog()\"\n [disabled]=\"showAddFromViewLoader\"\n variant=\"outline\">\n Cancel\n </button>\n </mj-dialog-actions>\n </mj-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, HostListener, ElementRef } 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\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\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 extends BaseAngularComponent 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 button toggle state\n public showAddDropdown: 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 @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (this.showAddDropdown) {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.querySelector('.add-dropdown-wrapper')?.contains(target)) {\n this.showAddDropdown = false;\n }\n }\n }\n\n constructor(\n private sharedService: SharedService,\n private cdr: ChangeDetectorRef,\n private elementRef: ElementRef\n ) {\n super();\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 = this.ProviderToUse;\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 // ==========================================\n // Progress Percentage Getters\n // ==========================================\n\n get removeProgressPercent(): number {\n return this.removeTotal > 0 ? Math.round((this.removeProgress / this.removeTotal) * 100) : 0;\n }\n\n get addProgressPercent(): number {\n return this.addTotal > 0 ? Math.round((this.addProgress / this.addTotal) * 100) : 0;\n }\n\n get addFromViewProgressPercent(): number {\n return this.addFromViewTotal > 0 ? Math.round((this.addFromViewProgress / this.addFromViewTotal) * 100) : 0;\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 toggleAddDropdown(): void {\n this.showAddDropdown = !this.showAddDropdown;\n }\n\n onDropdownItemClick(item: NewItemOption): void {\n this.showAddDropdown = false;\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 = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\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 = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\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 onAddRecordsSearchInputEvent(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.onAddRecordsSearchChange(value);\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 = this.ProviderToUse;\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 = RunView.FromMetadataProvider(this.ProviderToUse);\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 = this.ProviderToUse;\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 = RunView.FromMetadataProvider(this.ProviderToUse);\n const md = this.ProviderToUse;\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 = RunView.FromMetadataProvider(this.ProviderToUse);\n const md = this.ProviderToUse;\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 <div class=\"add-dropdown-wrapper\">\n <button mjButton variant=\"primary\" class=\"add-btn\" (click)=\"toggleAddDropdown()\">\n <span class=\"fa-solid fa-plus\"></span>\n Add to List\n <span class=\"fa-solid fa-chevron-down add-dropdown-arrow\"></span>\n </button>\n @if (showAddDropdown) {\n <div class=\"add-dropdown-panel\">\n @for (option of addOptions; track option.Text) {\n <div class=\"add-dropdown-item\" (click)=\"onDropdownItemClick(option)\">\n <span class=\"add-dropdown-item-text\">{{ option.Text }}</span>\n @if (option.Description) {\n <span class=\"add-dropdown-item-desc\">{{ option.Description }}</span>\n }\n </div>\n }\n </div>\n }\n </div>\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 mjButton\n (click)=\"openRemoveDialog()\"\n variant=\"flat\"\n class=\"toolbar-button remove-btn\">\n <span class=\"fa-solid fa-trash\"></span>\n Remove from List\n </button>\n }\n <button mjButton\n (click)=\"onRefreshClick()\"\n variant=\"flat\"\n class=\"toolbar-button\">\n <span class=\"fa-solid fa-rotate\"></span>\n Refresh\n </button>\n <button mjButton\n (click)=\"onExportClick()\"\n variant=\"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 <mj-dialog\n [Visible]=\"true\"\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 <mj-progress-bar\n [Value]=\"removeProgressPercent\"\n class=\"progress-bar\">\n </mj-progress-bar>\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 <mj-dialog-actions>\n <button mjButton\n (click)=\"confirmRemoveFromList()\"\n [disabled]=\"isRemoving\"\n variant=\"danger\">\n Remove\n </button>\n <button mjButton\n (click)=\"closeRemoveDialog()\"\n [disabled]=\"isRemoving\"\n variant=\"outline\">\n Cancel\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n\n<!-- Add Records Dialog -->\n@if (showAddRecordsDialog) {\n <mj-dialog\n [Visible]=\"true\"\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 <mj-progress-bar\n [Value]=\"addProgressPercent\"\n class=\"progress-bar\">\n </mj-progress-bar>\n }\n </div>\n } @else {\n <!-- Search Input -->\n <div class=\"search-section\">\n <div class=\"search-input-wrapper\">\n <span class=\"fa-solid fa-search search-icon\"></span>\n <input\n class=\"mj-input search-input\"\n type=\"text\"\n [placeholder]=\"'Search ' + (listRecord?.Entity || 'records') + '...'\"\n [value]=\"addRecordsSearchFilter\"\n (input)=\"onAddRecordsSearchInputEvent($event)\" />\n </div>\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 mjButton variant=\"flat\" size=\"sm\" (click)=\"selectAllAddable()\">Select All</button>\n <button mjButton variant=\"flat\" size=\"sm\" (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 <mj-dialog-actions>\n <button mjButton\n (click)=\"confirmAddRecords()\"\n [disabled]=\"addDialogSaving || selectedAddableRecords.length === 0\"\n variant=\"primary\">\n Add {{ selectedAddableRecords.length > 0 ? selectedAddableRecords.length : '' }} Record{{ selectedAddableRecords.length !== 1 ? 's' : '' }}\n </button>\n <button mjButton\n (click)=\"closeAddRecordsDialog()\"\n [disabled]=\"addDialogSaving\"\n variant=\"outline\">\n Cancel\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n\n<!-- Add From View Dialog -->\n@if (showAddFromViewDialog) {\n <mj-dialog\n [Visible]=\"true\"\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 <mj-progress-bar\n [Value]=\"addFromViewProgressPercent\"\n class=\"progress-bar\">\n </mj-progress-bar>\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 <mj-dialog-actions>\n <button mjButton\n (click)=\"confirmAddFromView()\"\n [disabled]=\"showAddFromViewLoader || userViewsToAdd.length === 0\"\n variant=\"primary\">\n Add from {{ userViewsToAdd.length }} View{{ userViewsToAdd.length !== 1 ? 's' : '' }}\n </button>\n <button mjButton\n (click)=\"closeAddFromViewDialog()\"\n [disabled]=\"showAddFromViewLoader\"\n variant=\"outline\">\n Cancel\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n"]}
@@ -2,8 +2,9 @@ import { AfterViewInit, EventEmitter, OnDestroy, OnInit } from '@angular/core';
2
2
  import { ActivatedRoute } from '@angular/router';
3
3
  import { CompositeKey, BaseEntity } from '@memberjunction/core';
4
4
  import { Container } from '@memberjunction/ng-container-directives';
5
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
5
6
  import * as i0 from "@angular/core";
6
- export declare class SingleRecordComponent implements OnInit, AfterViewInit, OnDestroy {
7
+ export declare class SingleRecordComponent extends BaseAngularComponent implements OnInit, AfterViewInit, OnDestroy {
7
8
  private route;
8
9
  formContainer: Container;
9
10
  PrimaryKey: CompositeKey;
@@ -1 +1 @@
1
- {"version":3,"file":"single-record.component.d.ts","sourceRoot":"","sources":["../../../src/lib/single-record/single-record.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA8C,YAAY,EAAiB,SAAS,EAAE,MAAM,EAAqB,MAAM,eAAe,CAAC;AAC7J,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAA0B,YAAY,EAAE,UAAU,EAA4D,MAAM,sBAAsB,CAAC;AAGlJ,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;;AAKpE,qBAMa,qBAAsB,YAAW,MAAM,EAAE,aAAa,EAAE,SAAS;IAc/D,OAAO,CAAC,KAAK;IAbY,aAAa,EAAG,SAAS,CAAC;IAChD,UAAU,EAAE,YAAY,CAAsB;IAC9C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAM;IAC/B,eAAe,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAM;IAE7D,YAAY,EAAE,YAAY,CAAC,GAAG,CAAC,CAA2B;IAC1D,WAAW,EAAE,YAAY,CAAC,UAAU,CAAC,CAAkC;IAExF,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,GAAG,CAA6B;gBAEnB,KAAK,EAAE,cAAc;IAInC,cAAc,EAAE,MAAM,CAAK;IAC3B,cAAc,EAAE,OAAO,CAAS;IAChC,OAAO,EAAE,OAAO,CAAQ;IAG/B,OAAO,CAAC,iBAAiB,CAAgD;IACzE,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,yBAAyB,CAA6B;IAC9D,OAAO,CAAC,uBAAuB,CAAsB;IAErD,QAAQ,IAAI,IAAI;IAGhB,eAAe;IAIF,QAAQ,CAAC,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM;IAuElE,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,UAAU;IA8E/C;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,wBAAwB;IAOhC,WAAW,IAAI,IAAI;yCAjOR,qBAAqB;2CAArB,qBAAqB;CA+PjC"}
1
+ {"version":3,"file":"single-record.component.d.ts","sourceRoot":"","sources":["../../../src/lib/single-record/single-record.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA8C,YAAY,EAAiB,SAAS,EAAE,MAAM,EAAqB,MAAM,eAAe,CAAC;AAC7J,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAA0B,YAAY,EAAE,UAAU,EAA4D,MAAM,sBAAsB,CAAC;AAGlJ,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AACrE,qBAMa,qBAAsB,SAAQ,oBAAqB,YAAW,MAAM,EAAE,aAAa,EAAE,SAAS;IAc5F,OAAO,CAAC,KAAK;IAbY,aAAa,EAAG,SAAS,CAAC;IAChD,UAAU,EAAE,YAAY,CAAsB;IAC9C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAM;IAC/B,eAAe,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAM;IAE7D,YAAY,EAAE,YAAY,CAAC,GAAG,CAAC,CAA2B;IAC1D,WAAW,EAAE,YAAY,CAAC,UAAU,CAAC,CAAkC;IAExF,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,GAAG,CAA6B;gBAEnB,KAAK,EAAE,cAAc;IAKnC,cAAc,EAAE,MAAM,CAAK;IAC3B,cAAc,EAAE,OAAO,CAAS;IAChC,OAAO,EAAE,OAAO,CAAQ;IAG/B,OAAO,CAAC,iBAAiB,CAAgD;IACzE,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,yBAAyB,CAA6B;IAC9D,OAAO,CAAC,uBAAuB,CAAsB;IAErD,QAAQ,IAAI,IAAI;IAGhB,eAAe;IAIF,QAAQ,CAAC,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM;IAuElE,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,UAAU;IA8E/C;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,wBAAwB;IAOhC,WAAW,IAAI,IAAI;yCAlOR,qBAAqB;2CAArB,qBAAqB;CAgQjC"}
@@ -1,9 +1,10 @@
1
1
  import { ChangeDetectorRef, Component, EventEmitter, inject, Input, Output, ViewChild } from '@angular/core';
2
- import { Metadata, CompositeKey, FieldValueCollection, EntityFieldTSType } from '@memberjunction/core';
2
+ import { CompositeKey, FieldValueCollection, EntityFieldTSType } from '@memberjunction/core';
3
3
  import { MJGlobal } from '@memberjunction/global';
4
4
  import { Container } from '@memberjunction/ng-container-directives';
5
5
  import { BaseFormComponent } from '@memberjunction/ng-base-forms';
6
6
  import { NavigationService, RecentAccessService, SharedService } from '@memberjunction/ng-shared';
7
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
7
8
  import * as i0 from "@angular/core";
8
9
  import * as i1 from "@angular/router";
9
10
  import * as i2 from "@memberjunction/ng-container-directives";
@@ -14,7 +15,7 @@ function SingleRecordComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
14
15
  i0.ɵɵproperty("showText", false);
15
16
  } }
16
17
  function SingleRecordComponent_ng_template_1_Template(rf, ctx) { }
17
- export class SingleRecordComponent {
18
+ export class SingleRecordComponent extends BaseAngularComponent {
18
19
  route;
19
20
  formContainer;
20
21
  PrimaryKey = new CompositeKey();
@@ -27,6 +28,7 @@ export class SingleRecordComponent {
27
28
  sharedService = inject(SharedService);
28
29
  cdr = inject(ChangeDetectorRef);
29
30
  constructor(route) {
31
+ super();
30
32
  this.route = route;
31
33
  this.recentAccessService = new RecentAccessService();
32
34
  }
@@ -58,7 +60,7 @@ export class SingleRecordComponent {
58
60
  this.PrimaryKey = new CompositeKey();
59
61
  }
60
62
  const formReg = MJGlobal.Instance.ClassFactory.GetRegistration(BaseFormComponent, entityName);
61
- const md = new Metadata();
63
+ const md = this.ProviderToUse;
62
64
  const entity = md.Entities.find(e => {
63
65
  return e.Name === entityName;
64
66
  });
@@ -241,7 +243,7 @@ export class SingleRecordComponent {
241
243
  } if (rf & 2) {
242
244
  let _t;
243
245
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.formContainer = _t.first);
244
- } }, inputs: { PrimaryKey: "PrimaryKey", entityName: "entityName", newRecordValues: "newRecordValues" }, outputs: { loadComplete: "loadComplete", recordSaved: "recordSaved" }, standalone: false, decls: 2, vars: 1, consts: [["size", "large", 3, "showText"], ["mjContainer", ""]], template: function SingleRecordComponent_Template(rf, ctx) { if (rf & 1) {
246
+ } }, inputs: { PrimaryKey: "PrimaryKey", entityName: "entityName", newRecordValues: "newRecordValues" }, outputs: { loadComplete: "loadComplete", recordSaved: "recordSaved" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [["size", "large", 3, "showText"], ["mjContainer", ""]], template: function SingleRecordComponent_Template(rf, ctx) { if (rf & 1) {
245
247
  i0.ɵɵconditionalCreate(0, SingleRecordComponent_Conditional_0_Template, 1, 1, "mj-loading", 0);
246
248
  i0.ɵɵtemplate(1, SingleRecordComponent_ng_template_1_Template, 0, 0, "ng-template", 1);
247
249
  } if (rf & 2) {
@@ -265,5 +267,5 @@ export class SingleRecordComponent {
265
267
  }], recordSaved: [{
266
268
  type: Output
267
269
  }] }); })();
268
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SingleRecordComponent, { className: "SingleRecordComponent", filePath: "src/lib/single-record/single-record.component.ts", lineNumber: 17 }); })();
270
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SingleRecordComponent, { className: "SingleRecordComponent", filePath: "src/lib/single-record/single-record.component.ts", lineNumber: 18 }); })();
269
271
  //# sourceMappingURL=single-record.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"single-record.component.js","sourceRoot":"","sources":["../../../src/lib/single-record/single-record.component.ts","../../../src/lib/single-record/single-record.component.html"],"names":[],"mappings":"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","sourcesContent":["import { AfterViewInit, ChangeDetectorRef, Component, ComponentRef, EventEmitter, inject, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router'\nimport { Metadata, KeyValuePair, CompositeKey, BaseEntity, BaseEntityEvent, FieldValueCollection, EntityFieldTSType } from '@memberjunction/core';\nimport { Subscription } from 'rxjs';\nimport { MJGlobal } from '@memberjunction/global';\nimport { Container } from '@memberjunction/ng-container-directives';\nimport { BaseFormComponent, FormNavigationEvent, FormNotificationEvent } from '@memberjunction/ng-base-forms';\nimport { NavigationService, RecentAccessService, SharedService } from '@memberjunction/ng-shared';\n\n\n@Component({\n standalone: false,\n selector: 'mj-single-record',\n templateUrl: './single-record.component.html',\n styleUrls: ['./single-record.component.css']\n})\nexport class SingleRecordComponent implements OnInit, AfterViewInit, OnDestroy {\n @ViewChild(Container, {static: true}) formContainer!: Container;\n @Input() public PrimaryKey: CompositeKey = new CompositeKey();\n @Input() public entityName: string | null = '';\n @Input() public newRecordValues: string | Record<string, unknown> | null = '';\n\n @Output() public loadComplete: EventEmitter<any> = new EventEmitter<any>();\n @Output() public recordSaved: EventEmitter<BaseEntity> = new EventEmitter<BaseEntity>();\n\n private recentAccessService: RecentAccessService;\n private navigationService = inject(NavigationService);\n private sharedService = inject(SharedService);\n private cdr = inject(ChangeDetectorRef);\n\n constructor (private route: ActivatedRoute) {\n this.recentAccessService = new RecentAccessService();\n }\n\n public appDescription: string = ''\n public useGenericForm: boolean = false;\n public loading: boolean = true;\n\n // Track dynamically created components and entities for cleanup\n private _formComponentRef: ComponentRef<BaseFormComponent> | null = null;\n private _currentRecord: BaseEntity | null = null;\n private _eventHandlerSubscription: Subscription | null = null;\n private _formEventSubscriptions: Subscription[] = [];\n\n ngOnInit(): void {\n }\n\n ngAfterViewInit() {\n this.LoadForm(this.PrimaryKey, <string>this.entityName)\n }\n\n public async LoadForm(primaryKey: CompositeKey, entityName: string) {\n \n // Perform any necessary actions with the ViewID, such as fetching data\n if (!entityName || entityName.trim().length === 0) {\n return; // not ready to load\n }\n\n this.entityName = entityName;\n if (primaryKey.HasValue) {\n // we have an existing record to load up\n this.PrimaryKey = primaryKey;\n }\n else {\n // new record, no existing primary key\n this.PrimaryKey = new CompositeKey();\n }\n\n const formReg = MJGlobal.Instance.ClassFactory.GetRegistration(BaseFormComponent, entityName);\n \n const md = new Metadata();\n const entity = md.Entities.find(e => {\n return e.Name === entityName\n });\n const permissions = entity?.GetUserPermisions(md.CurrentUser);\n\n if (formReg) {\n const record = await md.GetEntityObject<BaseEntity>(entityName);\n if (record) {\n if (primaryKey.HasValue) {\n await record.InnerLoad(primaryKey);\n // Log access to existing record (fire-and-forget, don't await)\n this.recentAccessService.logAccess(entityName, primaryKey, 'record');\n }\n else {\n record.NewRecord();\n this.SetNewRecordValues(record);\n }\n\n // CRITICAL: Track the event handler subscription for cleanup\n this._eventHandlerSubscription = record.RegisterEventHandler((eventType: BaseEntityEvent) => {\n if (eventType.type === 'save')\n this.recordSaved.emit(record);\n });\n \n const viewContainerRef = this.formContainer.viewContainerRef;\n viewContainerRef.clear();\n\n const componentRef = viewContainerRef.createComponent<typeof formReg.SubClass>(formReg.SubClass);\n \n // Track component and record for cleanup\n this._formComponentRef = componentRef;\n this._currentRecord = record;\n \n componentRef.instance.record = record\n componentRef.instance.userPermissions = permissions\n componentRef.instance.EditMode = !primaryKey.HasValue; // for new records go direct into edit mode\n\n // Subscribe to form @Output events and map them to Explorer services\n this.subscribeToFormEvents(componentRef.instance);\n\n this.useGenericForm = false;\n this.loadComplete.emit();\n }\n else\n throw new Error(`Unable to load entity ${entityName} with primary key values: ${primaryKey.ToString()}`);\n }\n\n this.loading = false;\n this.cdr.detectChanges();\n }\n\n protected SetNewRecordValues(record: BaseEntity) {\n if (!this.newRecordValues) {\n return;\n }\n\n // Handle both object and string (URL segment) formats\n if (typeof this.newRecordValues === 'string') {\n if (this.newRecordValues.length === 0) {\n return;\n }\n // we have a URL segment string format: \"field1|value1||field2|value2\"\n const fv = new FieldValueCollection();\n fv.SimpleLoadFromURLSegment(this.newRecordValues);\n // now apply the values to the record\n fv.KeyValuePairs.filter(kvp => kvp.Value !== null && kvp.Value !== undefined).forEach(kvp => {\n const f = record.Fields.find(f => f.Name.trim().toLowerCase() === kvp.FieldName.trim().toLowerCase());\n if (f) {\n // make sure we set the value to the right type based on the f.TSType property\n switch (f.EntityFieldInfo.TSType) {\n case EntityFieldTSType.String:\n record.Set(kvp.FieldName, kvp.Value);\n break;\n case EntityFieldTSType.Number:\n record.Set(kvp.FieldName, parseFloat(kvp.Value));\n break;\n case EntityFieldTSType.Boolean:\n if (kvp.Value === 'false' || kvp.Value === '0' || kvp.Value.toString().trim().length === 0 )\n record.Set(kvp.FieldName, false);\n else\n record.Set(kvp.FieldName, true);\n break;\n case EntityFieldTSType.Date:\n record.Set(kvp.FieldName, new Date(kvp.Value));\n break;\n }\n }\n });\n }\n else {\n // we have a plain object format: { field1: value1, field2: value2 }\n const recordValues = this.newRecordValues as Record<string, unknown>;\n Object.keys(recordValues)\n .filter(key => recordValues[key] !== null && recordValues[key] !== undefined)\n .forEach(key => {\n const f = record.Fields.find(f => f.Name.trim().toLowerCase() === key.trim().toLowerCase());\n if (f) {\n const value = recordValues[key];\n // Set the value with proper type conversion\n switch (f.EntityFieldInfo.TSType) {\n case EntityFieldTSType.String:\n record.Set(key, value?.toString() || '');\n break;\n case EntityFieldTSType.Number:\n record.Set(key, typeof value === 'number' ? value : parseFloat(value?.toString() || '0'));\n break;\n case EntityFieldTSType.Boolean:\n if (typeof value === 'boolean') {\n record.Set(key, value);\n }\n else if (typeof value === 'string') {\n record.Set(key, value !== 'false' && value !== '0' && value.trim().length > 0);\n }\n else {\n record.Set(key, !!value);\n }\n break;\n case EntityFieldTSType.Date:\n record.Set(key, value instanceof Date ? value : new Date(value?.toString() || ''));\n break;\n default:\n record.Set(key, value);\n break;\n }\n }\n });\n }\n }\n\n /**\n * Subscribe to BaseFormComponent @Output events and map them to Explorer services.\n */\n private subscribeToFormEvents(form: BaseFormComponent): void {\n this.cleanupFormSubscriptions();\n\n this._formEventSubscriptions.push(\n form.Navigate.subscribe((event: FormNavigationEvent) => this.handleNavigation(event)),\n form.Notification.subscribe((event: FormNotificationEvent) => {\n this.sharedService.CreateSimpleNotification(event.Message, event.Type, event.Duration);\n })\n );\n }\n\n private handleNavigation(event: FormNavigationEvent): void {\n switch (event.Kind) {\n case 'record':\n this.navigationService.OpenEntityRecord(event.EntityName, event.PrimaryKey, { forceNewTab: event.OpenInNewTab });\n break;\n case 'new-record':\n this.navigationService.OpenNewEntityRecord(event.EntityName, { newRecordValues: event.DefaultValues });\n break;\n case 'entity-hierarchy':\n this.navigationService.OpenEntityRecord(event.EntityName, event.PrimaryKey);\n break;\n case 'external-link':\n window.open(event.Url, '_blank');\n break;\n case 'email':\n window.open(`mailto:${event.EmailAddress}`, '_self');\n break;\n }\n }\n\n private cleanupFormSubscriptions(): void {\n for (const sub of this._formEventSubscriptions) {\n sub.unsubscribe();\n }\n this._formEventSubscriptions = [];\n }\n\n ngOnDestroy(): void {\n // CRITICAL: Clean up form event subscriptions first\n this.cleanupFormSubscriptions();\n\n // CRITICAL: Clean up dynamically created form component to prevent zombie components\n if (this._formComponentRef) {\n this._formComponentRef.destroy();\n this._formComponentRef = null;\n }\n\n // CRITICAL: Unsubscribe from event handler to prevent memory leaks\n if (this._eventHandlerSubscription) {\n this._eventHandlerSubscription.unsubscribe();\n this._eventHandlerSubscription = null;\n }\n \n // Clean up record reference\n if (this._currentRecord) {\n this._currentRecord = null;\n }\n \n // Clear the view container to ensure no lingering references\n if (this.formContainer?.viewContainerRef) {\n this.formContainer.viewContainerRef.clear();\n }\n \n // Reset state\n this.loading = true;\n this.useGenericForm = false;\n }\n}\n","@if (loading) {\n <mj-loading [showText]=\"false\" size=\"large\"></mj-loading>\n}\n<ng-template mjContainer></ng-template>"]}
1
+ {"version":3,"file":"single-record.component.js","sourceRoot":"","sources":["../../../src/lib/single-record/single-record.component.ts","../../../src/lib/single-record/single-record.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAiB,iBAAiB,EAAE,SAAS,EAAgB,YAAY,EAAE,MAAM,EAAE,KAAK,EAAqB,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE7J,OAAO,EAA0B,YAAY,EAA+B,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAElJ,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAA8C,MAAM,+BAA+B,CAAC;AAC9G,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAGlG,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;;;;;ICTnE,gCAAyD;;IAA7C,gCAAkB;;;ADgBhC,MAAM,OAAO,qBAAsB,SAAQ,oBAAoB;IAcxC;IAbiB,aAAa,CAAa;IAChD,UAAU,GAAiB,IAAI,YAAY,EAAE,CAAC;IAC9C,UAAU,GAAkB,EAAE,CAAC;IAC/B,eAAe,GAA4C,EAAE,CAAC;IAE7D,YAAY,GAAsB,IAAI,YAAY,EAAO,CAAC;IAC1D,WAAW,GAA6B,IAAI,YAAY,EAAc,CAAC;IAEhF,mBAAmB,CAAsB;IACzC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC9C,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IACtC,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAExC,YAAqB,KAAqB;QACxC,KAAK,EAAE,CAAC;QADW,UAAK,GAAL,KAAK,CAAgB;QAExC,IAAI,CAAC,mBAAmB,GAAG,IAAI,mBAAmB,EAAE,CAAC;IACvD,CAAC;IAEM,cAAc,GAAW,EAAE,CAAA;IAC3B,cAAc,GAAY,KAAK,CAAC;IAChC,OAAO,GAAY,IAAI,CAAC;IAE/B,gEAAgE;IACxD,iBAAiB,GAA2C,IAAI,CAAC;IACjE,cAAc,GAAsB,IAAI,CAAC;IACzC,yBAAyB,GAAwB,IAAI,CAAC;IACtD,uBAAuB,GAAmB,EAAE,CAAC;IAErD,QAAQ;IACR,CAAC;IAED,eAAe;QACb,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAU,IAAI,CAAC,UAAU,CAAC,CAAA;IACzD,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,UAAwB,EAAE,UAAkB;QAEhE,uEAAuE;QACvE,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClD,OAAO,CAAC,oBAAoB;QAC9B,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;YACxB,wCAAwC;YACxC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC/B,CAAC;aACI,CAAC;YACJ,sCAAsC;YACtC,IAAI,CAAC,UAAU,GAAG,IAAI,YAAY,EAAE,CAAC;QACvC,CAAC;QAED,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;QAE9F,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;QAC9B,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;YAClC,OAAO,CAAC,CAAC,IAAI,KAAK,UAAU,CAAA;QAC9B,CAAC,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,EAAE,iBAAiB,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;QAE9D,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,eAAe,CAAa,UAAU,CAAC,CAAC;YAChE,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;oBACxB,MAAM,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;oBACnC,+DAA+D;oBAC/D,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;gBACvE,CAAC;qBACI,CAAC;oBACJ,MAAM,CAAC,SAAS,EAAE,CAAC;oBACnB,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBAClC,CAAC;gBAED,6DAA6D;gBAC7D,IAAI,CAAC,yBAAyB,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC,SAA0B,EAAE,EAAE;oBAC1F,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM;wBAC3B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClC,CAAC,CAAC,CAAC;gBAEH,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC;gBAC7D,gBAAgB,CAAC,KAAK,EAAE,CAAC;gBAEzB,MAAM,YAAY,GAAG,gBAAgB,CAAC,eAAe,CAA0B,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAEjG,yCAAyC;gBACzC,IAAI,CAAC,iBAAiB,GAAG,YAAY,CAAC;gBACtC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;gBAE7B,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAA;gBACrC,YAAY,CAAC,QAAQ,CAAC,eAAe,GAAG,WAAW,CAAA;gBACnD,YAAY,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,2CAA2C;gBAElG,qEAAqE;gBACrE,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAElD,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;gBAC5B,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;YAC3B,CAAC;;gBAEC,MAAM,IAAI,KAAK,CAAC,yBAAyB,UAAU,6BAA6B,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC7G,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAES,kBAAkB,CAAC,MAAkB;QAC7C,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,sDAAsD;QACtD,IAAI,OAAO,IAAI,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC;YAC7C,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtC,OAAO;YACT,CAAC;YACD,sEAAsE;YACtE,MAAM,EAAE,GAAG,IAAI,oBAAoB,EAAE,CAAC;YACtC,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAClD,qCAAqC;YACrC,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBAC1F,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;gBACtG,IAAI,CAAC,EAAE,CAAC;oBACN,8EAA8E;oBAC9E,QAAQ,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;wBACjC,KAAK,iBAAiB,CAAC,MAAM;4BAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;4BACrC,MAAM;wBACR,KAAK,iBAAiB,CAAC,MAAM;4BAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;4BACjD,MAAM;wBACR,KAAK,iBAAiB,CAAC,OAAO;4BAC5B,IAAI,GAAG,CAAC,KAAK,KAAK,OAAO,IAAI,GAAG,CAAC,KAAK,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;gCACxF,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;;gCAEjC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;4BAClC,MAAM;wBACR,KAAK,iBAAiB,CAAC,IAAI;4BACzB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;4BAC/C,MAAM;oBACV,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;aACI,CAAC;YACJ,oEAAoE;YACpE,MAAM,YAAY,GAAG,IAAI,CAAC,eAA0C,CAAC;YACrE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;iBACtB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;iBAC5E,OAAO,CAAC,GAAG,CAAC,EAAE;gBACb,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC5F,IAAI,CAAC,EAAE,CAAC;oBACN,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;oBAChC,4CAA4C;oBAC5C,QAAQ,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;wBACjC,KAAK,iBAAiB,CAAC,MAAM;4BAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;4BACzC,MAAM;wBACR,KAAK,iBAAiB,CAAC,MAAM;4BAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;4BAC1F,MAAM;wBACR,KAAK,iBAAiB,CAAC,OAAO;4BAC5B,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;gCAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;4BACzB,CAAC;iCACI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gCACnC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;4BACjF,CAAC;iCACI,CAAC;gCACJ,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;4BAC3B,CAAC;4BACD,MAAM;wBACR,KAAK,iBAAiB,CAAC,IAAI;4BACzB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;4BACnF,MAAM;wBACR;4BACE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;4BACvB,MAAM;oBACV,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACP,CAAC;IACH,CAAC;IAED;;OAEG;IACK,qBAAqB,CAAC,IAAuB;QACnD,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAC/B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,KAA0B,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EACrF,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,KAA4B,EAAE,EAAE;YAC3D,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzF,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAEO,gBAAgB,CAAC,KAA0B;QACjD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,QAAQ;gBACX,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;gBACjH,MAAM;YACR,KAAK,YAAY;gBACf,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;gBACvG,MAAM;YACR,KAAK,kBAAkB;gBACrB,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC5E,MAAM;YACR,KAAK,eAAe;gBAClB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBACjC,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;gBACrD,MAAM;QACV,CAAC;IACH,CAAC;IAEO,wBAAwB;QAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC/C,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,uBAAuB,GAAG,EAAE,CAAC;IACpC,CAAC;IAED,WAAW;QACT,oDAAoD;QACpD,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,qFAAqF;QACrF,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAChC,CAAC;QAED,mEAAmE;QACnE,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACnC,IAAI,CAAC,yBAAyB,CAAC,WAAW,EAAE,CAAC;YAC7C,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC;QACxC,CAAC;QAED,4BAA4B;QAC5B,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QAED,6DAA6D;QAC7D,IAAI,IAAI,CAAC,aAAa,EAAE,gBAAgB,EAAE,CAAC;YACzC,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC9C,CAAC;QAED,cAAc;QACd,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;+GA/PU,qBAAqB;6DAArB,qBAAqB;2BACrB,SAAS;;;;;YClBtB,8FAAe;YAGf,sFAAyB;;YAHzB,sCAEC;;;iFDeY,qBAAqB;cANjC,SAAS;6BACI,KAAK,YACP,kBAAkB;;kBAK3B,SAAS;mBAAC,SAAS,EAAE,EAAC,MAAM,EAAE,IAAI,EAAC;;kBACnC,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAEL,MAAM;;kBACN,MAAM;;kFAPI,qBAAqB","sourcesContent":["import { AfterViewInit, ChangeDetectorRef, Component, ComponentRef, EventEmitter, inject, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router'\nimport { Metadata, KeyValuePair, CompositeKey, BaseEntity, BaseEntityEvent, FieldValueCollection, EntityFieldTSType } from '@memberjunction/core';\nimport { Subscription } from 'rxjs';\nimport { MJGlobal } from '@memberjunction/global';\nimport { Container } from '@memberjunction/ng-container-directives';\nimport { BaseFormComponent, FormNavigationEvent, FormNotificationEvent } from '@memberjunction/ng-base-forms';\nimport { NavigationService, RecentAccessService, SharedService } from '@memberjunction/ng-shared';\n\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n@Component({\n standalone: false,\n selector: 'mj-single-record',\n templateUrl: './single-record.component.html',\n styleUrls: ['./single-record.component.css']\n})\nexport class SingleRecordComponent extends BaseAngularComponent implements OnInit, AfterViewInit, OnDestroy {\n @ViewChild(Container, {static: true}) formContainer!: Container;\n @Input() public PrimaryKey: CompositeKey = new CompositeKey();\n @Input() public entityName: string | null = '';\n @Input() public newRecordValues: string | Record<string, unknown> | null = '';\n\n @Output() public loadComplete: EventEmitter<any> = new EventEmitter<any>();\n @Output() public recordSaved: EventEmitter<BaseEntity> = new EventEmitter<BaseEntity>();\n\n private recentAccessService: RecentAccessService;\n private navigationService = inject(NavigationService);\n private sharedService = inject(SharedService);\n private cdr = inject(ChangeDetectorRef);\n\n constructor (private route: ActivatedRoute) {\n super();\n this.recentAccessService = new RecentAccessService();\n }\n\n public appDescription: string = ''\n public useGenericForm: boolean = false;\n public loading: boolean = true;\n\n // Track dynamically created components and entities for cleanup\n private _formComponentRef: ComponentRef<BaseFormComponent> | null = null;\n private _currentRecord: BaseEntity | null = null;\n private _eventHandlerSubscription: Subscription | null = null;\n private _formEventSubscriptions: Subscription[] = [];\n\n ngOnInit(): void {\n }\n\n ngAfterViewInit() {\n this.LoadForm(this.PrimaryKey, <string>this.entityName)\n }\n\n public async LoadForm(primaryKey: CompositeKey, entityName: string) {\n \n // Perform any necessary actions with the ViewID, such as fetching data\n if (!entityName || entityName.trim().length === 0) {\n return; // not ready to load\n }\n\n this.entityName = entityName;\n if (primaryKey.HasValue) {\n // we have an existing record to load up\n this.PrimaryKey = primaryKey;\n }\n else {\n // new record, no existing primary key\n this.PrimaryKey = new CompositeKey();\n }\n\n const formReg = MJGlobal.Instance.ClassFactory.GetRegistration(BaseFormComponent, entityName);\n \n const md = this.ProviderToUse;\n const entity = md.Entities.find(e => {\n return e.Name === entityName\n });\n const permissions = entity?.GetUserPermisions(md.CurrentUser);\n\n if (formReg) {\n const record = await md.GetEntityObject<BaseEntity>(entityName);\n if (record) {\n if (primaryKey.HasValue) {\n await record.InnerLoad(primaryKey);\n // Log access to existing record (fire-and-forget, don't await)\n this.recentAccessService.logAccess(entityName, primaryKey, 'record');\n }\n else {\n record.NewRecord();\n this.SetNewRecordValues(record);\n }\n\n // CRITICAL: Track the event handler subscription for cleanup\n this._eventHandlerSubscription = record.RegisterEventHandler((eventType: BaseEntityEvent) => {\n if (eventType.type === 'save')\n this.recordSaved.emit(record);\n });\n \n const viewContainerRef = this.formContainer.viewContainerRef;\n viewContainerRef.clear();\n\n const componentRef = viewContainerRef.createComponent<typeof formReg.SubClass>(formReg.SubClass);\n \n // Track component and record for cleanup\n this._formComponentRef = componentRef;\n this._currentRecord = record;\n \n componentRef.instance.record = record\n componentRef.instance.userPermissions = permissions\n componentRef.instance.EditMode = !primaryKey.HasValue; // for new records go direct into edit mode\n\n // Subscribe to form @Output events and map them to Explorer services\n this.subscribeToFormEvents(componentRef.instance);\n\n this.useGenericForm = false;\n this.loadComplete.emit();\n }\n else\n throw new Error(`Unable to load entity ${entityName} with primary key values: ${primaryKey.ToString()}`);\n }\n\n this.loading = false;\n this.cdr.detectChanges();\n }\n\n protected SetNewRecordValues(record: BaseEntity) {\n if (!this.newRecordValues) {\n return;\n }\n\n // Handle both object and string (URL segment) formats\n if (typeof this.newRecordValues === 'string') {\n if (this.newRecordValues.length === 0) {\n return;\n }\n // we have a URL segment string format: \"field1|value1||field2|value2\"\n const fv = new FieldValueCollection();\n fv.SimpleLoadFromURLSegment(this.newRecordValues);\n // now apply the values to the record\n fv.KeyValuePairs.filter(kvp => kvp.Value !== null && kvp.Value !== undefined).forEach(kvp => {\n const f = record.Fields.find(f => f.Name.trim().toLowerCase() === kvp.FieldName.trim().toLowerCase());\n if (f) {\n // make sure we set the value to the right type based on the f.TSType property\n switch (f.EntityFieldInfo.TSType) {\n case EntityFieldTSType.String:\n record.Set(kvp.FieldName, kvp.Value);\n break;\n case EntityFieldTSType.Number:\n record.Set(kvp.FieldName, parseFloat(kvp.Value));\n break;\n case EntityFieldTSType.Boolean:\n if (kvp.Value === 'false' || kvp.Value === '0' || kvp.Value.toString().trim().length === 0 )\n record.Set(kvp.FieldName, false);\n else\n record.Set(kvp.FieldName, true);\n break;\n case EntityFieldTSType.Date:\n record.Set(kvp.FieldName, new Date(kvp.Value));\n break;\n }\n }\n });\n }\n else {\n // we have a plain object format: { field1: value1, field2: value2 }\n const recordValues = this.newRecordValues as Record<string, unknown>;\n Object.keys(recordValues)\n .filter(key => recordValues[key] !== null && recordValues[key] !== undefined)\n .forEach(key => {\n const f = record.Fields.find(f => f.Name.trim().toLowerCase() === key.trim().toLowerCase());\n if (f) {\n const value = recordValues[key];\n // Set the value with proper type conversion\n switch (f.EntityFieldInfo.TSType) {\n case EntityFieldTSType.String:\n record.Set(key, value?.toString() || '');\n break;\n case EntityFieldTSType.Number:\n record.Set(key, typeof value === 'number' ? value : parseFloat(value?.toString() || '0'));\n break;\n case EntityFieldTSType.Boolean:\n if (typeof value === 'boolean') {\n record.Set(key, value);\n }\n else if (typeof value === 'string') {\n record.Set(key, value !== 'false' && value !== '0' && value.trim().length > 0);\n }\n else {\n record.Set(key, !!value);\n }\n break;\n case EntityFieldTSType.Date:\n record.Set(key, value instanceof Date ? value : new Date(value?.toString() || ''));\n break;\n default:\n record.Set(key, value);\n break;\n }\n }\n });\n }\n }\n\n /**\n * Subscribe to BaseFormComponent @Output events and map them to Explorer services.\n */\n private subscribeToFormEvents(form: BaseFormComponent): void {\n this.cleanupFormSubscriptions();\n\n this._formEventSubscriptions.push(\n form.Navigate.subscribe((event: FormNavigationEvent) => this.handleNavigation(event)),\n form.Notification.subscribe((event: FormNotificationEvent) => {\n this.sharedService.CreateSimpleNotification(event.Message, event.Type, event.Duration);\n })\n );\n }\n\n private handleNavigation(event: FormNavigationEvent): void {\n switch (event.Kind) {\n case 'record':\n this.navigationService.OpenEntityRecord(event.EntityName, event.PrimaryKey, { forceNewTab: event.OpenInNewTab });\n break;\n case 'new-record':\n this.navigationService.OpenNewEntityRecord(event.EntityName, { newRecordValues: event.DefaultValues });\n break;\n case 'entity-hierarchy':\n this.navigationService.OpenEntityRecord(event.EntityName, event.PrimaryKey);\n break;\n case 'external-link':\n window.open(event.Url, '_blank');\n break;\n case 'email':\n window.open(`mailto:${event.EmailAddress}`, '_self');\n break;\n }\n }\n\n private cleanupFormSubscriptions(): void {\n for (const sub of this._formEventSubscriptions) {\n sub.unsubscribe();\n }\n this._formEventSubscriptions = [];\n }\n\n ngOnDestroy(): void {\n // CRITICAL: Clean up form event subscriptions first\n this.cleanupFormSubscriptions();\n\n // CRITICAL: Clean up dynamically created form component to prevent zombie components\n if (this._formComponentRef) {\n this._formComponentRef.destroy();\n this._formComponentRef = null;\n }\n\n // CRITICAL: Unsubscribe from event handler to prevent memory leaks\n if (this._eventHandlerSubscription) {\n this._eventHandlerSubscription.unsubscribe();\n this._eventHandlerSubscription = null;\n }\n \n // Clean up record reference\n if (this._currentRecord) {\n this._currentRecord = null;\n }\n \n // Clear the view container to ensure no lingering references\n if (this.formContainer?.viewContainerRef) {\n this.formContainer.viewContainerRef.clear();\n }\n \n // Reset state\n this.loading = true;\n this.useGenericForm = false;\n }\n}\n","@if (loading) {\n <mj-loading [showText]=\"false\" size=\"large\"></mj-loading>\n}\n<ng-template mjContainer></ng-template>"]}
@@ -2,9 +2,10 @@ import { EventEmitter, ChangeDetectorRef, OnChanges, SimpleChanges } from '@angu
2
2
  import { EntityInfo } from '@memberjunction/core';
3
3
  import { NavigationService } from '@memberjunction/ng-shared';
4
4
  import { DataLoadedEvent, RecordOpenedEvent, EntityViewerConfig, EntityViewMode, GridToolbarConfig } from '@memberjunction/ng-entity-viewer';
5
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
5
6
  import * as i0 from "@angular/core";
6
7
  type SearchState = 'loading' | 'no-results' | 'single-result' | 'viewer';
7
- export declare class SingleSearchResultComponent implements OnChanges {
8
+ export declare class SingleSearchResultComponent extends BaseAngularComponent implements OnChanges {
8
9
  private navigationService;
9
10
  private cdr;
10
11
  entity: string;
@@ -1 +1 @@
1
- {"version":3,"file":"single-search-result.component.d.ts","sourceRoot":"","sources":["../../../src/lib/single-search-result/single-search-result.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAiB,iBAAiB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACpH,OAAO,EAAyB,UAAU,EAA+B,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;;AAE7I,KAAK,WAAW,GAAG,SAAS,GAAG,YAAY,GAAG,eAAe,GAAG,QAAQ,CAAC;AAEzE,qBAMa,2BAA4B,YAAW,SAAS;IAiDzD,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,GAAG;IAjDG,MAAM,EAAE,MAAM,CAAM;IACpB,WAAW,EAAE,MAAM,CAAM;IACxB,YAAY,wBAA+B;IAC3C,WAAW,wBAA+B;IAEpD,WAAW,EAAE,WAAW,CAAa;IACrC,WAAW,SAAK;IAChB,UAAU,EAAE,UAAU,GAAG,IAAI,CAAQ;IACrC,eAAe,EAAE,cAAc,CAAU;IAEhD,gFAAgF;IAChF,IAAW,aAAa,IAAI,OAAO,CAGlC;IAED,0EAA0E;IAC1E,IAAW,UAAU,IAAI,MAAM,CAK9B;IAED,8EAA8E;IACvE,YAAY,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAQ9C;IAEF,8EAA8E;IACvE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,CAAC,CASlD;gBAGQ,iBAAiB,EAAE,iBAAiB,EACpC,GAAG,EAAE,iBAAiB;IAGhC,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMzC;;;OAGG;YACW,aAAa;IAgC3B,OAAO,CAAC,cAAc;YAOR,WAAW;IAazB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,sBAAsB;IAavB,WAAW,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAKvC,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAK7C,iBAAiB,IAAI,IAAI;IAQzB,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAM1C,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAIrD,oEAAoE;IACpE,OAAO,CAAC,gBAAgB;yCApKb,2BAA2B;2CAA3B,2BAA2B;CAkLvC"}
1
+ {"version":3,"file":"single-search-result.component.d.ts","sourceRoot":"","sources":["../../../src/lib/single-search-result/single-search-result.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAiB,iBAAiB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACpH,OAAO,EAAyB,UAAU,EAA+B,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAE7I,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AACrE,KAAK,WAAW,GAAG,SAAS,GAAG,YAAY,GAAG,eAAe,GAAG,QAAQ,CAAC;AAEzE,qBAMa,2BAA4B,SAAQ,oBAAqB,YAAW,SAAS;IAiDtF,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,GAAG;IAjDG,MAAM,EAAE,MAAM,CAAM;IACpB,WAAW,EAAE,MAAM,CAAM;IACxB,YAAY,wBAA+B;IAC3C,WAAW,wBAA+B;IAEpD,WAAW,EAAE,WAAW,CAAa;IACrC,WAAW,SAAK;IAChB,UAAU,EAAE,UAAU,GAAG,IAAI,CAAQ;IACrC,eAAe,EAAE,cAAc,CAAU;IAEhD,gFAAgF;IAChF,IAAW,aAAa,IAAI,OAAO,CAGlC;IAED,0EAA0E;IAC1E,IAAW,UAAU,IAAI,MAAM,CAK9B;IAED,8EAA8E;IACvE,YAAY,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAQ9C;IAEF,8EAA8E;IACvE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,CAAC,CASlD;gBAGQ,iBAAiB,EAAE,iBAAiB,EACpC,GAAG,EAAE,iBAAiB;IAIhC,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMzC;;;OAGG;YACW,aAAa;IAgC3B,OAAO,CAAC,cAAc;YAOR,WAAW;IAazB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,sBAAsB;IAavB,WAAW,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAKvC,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAK7C,iBAAiB,IAAI,IAAI;IAQzB,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAM1C,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAIrD,oEAAoE;IACpE,OAAO,CAAC,gBAAgB;yCArKb,2BAA2B;2CAA3B,2BAA2B;CAmLvC"}
@@ -1,5 +1,6 @@
1
1
  import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import { RunView, CompositeKey, EntityFieldTSType, Metadata } from '@memberjunction/core';
2
+ import { RunView, CompositeKey, EntityFieldTSType } from '@memberjunction/core';
3
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
4
  import * as i0 from "@angular/core";
4
5
  import * as i1 from "@memberjunction/ng-shared";
5
6
  import * as i2 from "@memberjunction/ng-shared-generic";
@@ -110,7 +111,7 @@ function SingleSearchResultComponent_Conditional_13_Template(rf, ctx) { if (rf &
110
111
  i0.ɵɵadvance();
111
112
  i0.ɵɵproperty("entity", ctx_r0.EntityInfo)("viewMode", ctx_r0.CurrentViewMode)("filterText", ctx_r0.searchInput)("config", ctx_r0.ViewerConfig)("showGridToolbar", true)("gridToolbarConfig", ctx_r0.GridToolbarConfig);
112
113
  } }
113
- export class SingleSearchResultComponent {
114
+ export class SingleSearchResultComponent extends BaseAngularComponent {
114
115
  navigationService;
115
116
  cdr;
116
117
  entity = '';
@@ -156,6 +157,7 @@ export class SingleSearchResultComponent {
156
157
  showSelectionCount: false
157
158
  };
158
159
  constructor(navigationService, cdr) {
160
+ super();
159
161
  this.navigationService = navigationService;
160
162
  this.cdr = cdr;
161
163
  }
@@ -195,11 +197,11 @@ export class SingleSearchResultComponent {
195
197
  this.cdr.detectChanges();
196
198
  }
197
199
  findEntityInfo() {
198
- const md = new Metadata();
200
+ const md = this.ProviderToUse;
199
201
  return md.Entities.find(e => e.Name.trim().toLowerCase() === this.entity.trim().toLowerCase());
200
202
  }
201
203
  async runPreQuery(entityInfo) {
202
- const rv = new RunView();
204
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
203
205
  const pkFields = entityInfo.PrimaryKeys.map(pk => pk.Name);
204
206
  return rv.RunView({
205
207
  EntityName: this.entity,
@@ -264,7 +266,7 @@ export class SingleSearchResultComponent {
264
266
  return `fa-solid fa-${icon}`;
265
267
  }
266
268
  static ɵfac = function SingleSearchResultComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SingleSearchResultComponent)(i0.ɵɵdirectiveInject(i1.NavigationService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
267
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SingleSearchResultComponent, selectors: [["mj-single-search-result"]], inputs: { entity: "entity", searchInput: "searchInput" }, outputs: { loadComplete: "loadComplete", loadStarted: "loadStarted" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 14, vars: 9, consts: [[1, "search-result-container"], [1, "content-header"], [1, "header-left"], [1, "entity-icon"], [1, "entity-title"], [1, "record-count"], [1, "header-right"], [1, "loading-container"], [1, "empty-state"], [1, "single-result-state"], [1, "viewer-container"], ["title", "New Record", 1, "header-action-btn", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "view-mode-toggle"], ["title", "Grid View", 1, "toggle-btn", 3, "click"], [1, "fa-solid", "fa-list"], ["title", "Cards View", 1, "toggle-btn", 3, "click"], [1, "fa-solid", "fa-grip"], ["title", "Timeline View", 1, "toggle-btn", 3, "active"], ["title", "Timeline View", 1, "toggle-btn", 3, "click"], [1, "fa-solid", "fa-timeline"], ["text", "Searching..."], [1, "fa-solid", "fa-magnifying-glass", "empty-icon"], [1, "empty-hint"], [1, "fa-solid", "fa-arrow-right", "redirect-icon"], [3, "viewModeChange", "dataLoaded", "recordOpened", "addRequested", "entity", "viewMode", "filterText", "config", "showGridToolbar", "gridToolbarConfig"]], template: function SingleSearchResultComponent_Template(rf, ctx) { if (rf & 1) {
269
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SingleSearchResultComponent, selectors: [["mj-single-search-result"]], inputs: { entity: "entity", searchInput: "searchInput" }, outputs: { loadComplete: "loadComplete", loadStarted: "loadStarted" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 14, vars: 9, consts: [[1, "search-result-container"], [1, "content-header"], [1, "header-left"], [1, "entity-icon"], [1, "entity-title"], [1, "record-count"], [1, "header-right"], [1, "loading-container"], [1, "empty-state"], [1, "single-result-state"], [1, "viewer-container"], ["title", "New Record", 1, "header-action-btn", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "view-mode-toggle"], ["title", "Grid View", 1, "toggle-btn", 3, "click"], [1, "fa-solid", "fa-list"], ["title", "Cards View", 1, "toggle-btn", 3, "click"], [1, "fa-solid", "fa-grip"], ["title", "Timeline View", 1, "toggle-btn", 3, "active"], ["title", "Timeline View", 1, "toggle-btn", 3, "click"], [1, "fa-solid", "fa-timeline"], ["text", "Searching..."], [1, "fa-solid", "fa-magnifying-glass", "empty-icon"], [1, "empty-hint"], [1, "fa-solid", "fa-arrow-right", "redirect-icon"], [3, "viewModeChange", "dataLoaded", "recordOpened", "addRequested", "entity", "viewMode", "filterText", "config", "showGridToolbar", "gridToolbarConfig"]], template: function SingleSearchResultComponent_Template(rf, ctx) { if (rf & 1) {
268
270
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2);
269
271
  i0.ɵɵelement(3, "i", 3);
270
272
  i0.ɵɵelementStart(4, "h2", 4);
@@ -310,5 +312,5 @@ export class SingleSearchResultComponent {
310
312
  }], loadStarted: [{
311
313
  type: Output
312
314
  }] }); })();
313
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SingleSearchResultComponent, { className: "SingleSearchResultComponent", filePath: "src/lib/single-search-result/single-search-result.component.ts", lineNumber: 14 }); })();
315
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SingleSearchResultComponent, { className: "SingleSearchResultComponent", filePath: "src/lib/single-search-result/single-search-result.component.ts", lineNumber: 15 }); })();
314
316
  //# sourceMappingURL=single-search-result.component.js.map