@memberjunction/ng-explorer-core 5.11.0 → 5.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/lib/command-palette/command-palette.component.js +2 -2
  2. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js +2 -2
  3. package/dist/lib/oauth/oauth-callback.component.js +2 -2
  4. package/dist/lib/resource-wrappers/chat-collections-resource.component.js +2 -2
  5. package/dist/lib/resource-wrappers/chat-collections-resource.component.js.map +1 -1
  6. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +2 -2
  7. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
  8. package/dist/lib/resource-wrappers/dashboard-resource.component.js +2 -2
  9. package/dist/lib/resource-wrappers/dashboard-resource.component.js.map +1 -1
  10. package/dist/lib/resource-wrappers/view-resource.component.js +2 -2
  11. package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
  12. package/dist/lib/shell/components/dialogs/app-access-dialog.component.js +4 -4
  13. package/dist/lib/shell/components/dialogs/app-access-dialog.component.js.map +1 -1
  14. package/dist/lib/shell/components/header/app-nav.component.d.ts.map +1 -1
  15. package/dist/lib/shell/components/header/app-nav.component.js +5 -5
  16. package/dist/lib/shell/components/header/app-nav.component.js.map +1 -1
  17. package/dist/lib/shell/components/header/app-switcher.component.js +22 -21
  18. package/dist/lib/shell/components/header/app-switcher.component.js.map +1 -1
  19. package/dist/lib/shell/components/tabs/tab-container.component.js +2 -2
  20. package/dist/lib/shell/loading-themes.js +1 -1
  21. package/dist/lib/shell/loading-themes.js.map +1 -1
  22. package/dist/lib/shell/shell.component.js +3 -3
  23. package/dist/lib/shell/shell.component.js.map +1 -1
  24. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js +2 -2
  25. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js +2 -2
  26. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js +2 -2
  27. package/dist/lib/single-dashboard/single-dashboard.component.js +2 -2
  28. package/dist/lib/single-list-detail/single-list-detail.component.d.ts.map +1 -1
  29. package/dist/lib/single-list-detail/single-list-detail.component.js +11 -7
  30. package/dist/lib/single-list-detail/single-list-detail.component.js.map +1 -1
  31. package/dist/lib/single-search-result/single-search-result.component.js +2 -2
  32. package/dist/lib/system-validation/system-validation-banner.component.js +2 -2
  33. package/dist/lib/system-validation/system-validation-banner.component.js.map +1 -1
  34. package/dist/lib/user-notifications/user-notifications.component.d.ts +15 -2
  35. package/dist/lib/user-notifications/user-notifications.component.d.ts.map +1 -1
  36. package/dist/lib/user-notifications/user-notifications.component.js +76 -8
  37. package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
  38. package/dist/lib/user-profile/user-profile.component.js +2 -2
  39. package/package.json +34 -34
@@ -1 +1 @@
1
- {"version":3,"file":"single-list-detail.component.js","sourceRoot":"","sources":["../../../src/lib/single-list-detail/single-list-detail.component.ts","../../../src/lib/single-list-detail/single-list-detail.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnInit, ViewChild, ChangeDetectorRef } from '@angular/core';\nimport { BaseEntity, CompositeKey, LogError, LogErrorEx, LogStatus, Metadata, RunView, RunViewResult } from '@memberjunction/core';\nimport { MJListDetailEntity, MJListDetailEntityExtended, MJListEntity, MJUserViewEntityExtended } from '@memberjunction/core-entities';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { ListDetailGridComponent, ListGridRowClickedEvent } from '@memberjunction/ng-list-detail-grid';\nimport { GridToolbarConfig } from '@memberjunction/ng-entity-viewer';\nimport { Subject, debounceTime } from 'rxjs';\nimport { NewItemOption } from '../../generic/Item.types';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Represents a record that can be added to a list\n */\ninterface AddableRecord {\n ID: string;\n Name: string;\n isInList: boolean;\n isSelected: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-list-detail',\n templateUrl: './single-list-detail.component.html',\n styleUrls: ['./single-list-detail.component.css', '../../shared/first-tab-styles.css']\n})\nexport class SingleListDetailComponent implements OnInit {\n\n @Input() public ListID: string = \"\";\n\n @ViewChild('listDetailGrid') listDetailGrid: ListDetailGridComponent | undefined;\n\n // List record\n public listRecord: MJListEntity | null = null;\n public showLoader: boolean = false;\n\n // Grid state\n public selectedKeys: string[] = [];\n public rowCount: number = 0;\n\n // Toolbar config - hide EDG toolbar, we'll use our own\n public gridToolbarConfig: GridToolbarConfig = {\n showSearch: false,\n showRefresh: false,\n showAdd: false,\n showDelete: false,\n showExport: false,\n showRowCount: false,\n showSelectionCount: false\n };\n\n // Remove from list dialog\n public showRemoveDialog: boolean = false;\n public isRemoving: boolean = false;\n public removeProgress: number = 0;\n public removeTotal: number = 0;\n\n // Add records dialog\n public showAddRecordsDialog: boolean = false;\n public addDialogLoading: boolean = false;\n public addDialogSaving: boolean = false;\n public addableRecords: AddableRecord[] = [];\n public addRecordsSearchFilter: string = \"\";\n public existingListDetailIds: Set<string> = new Set();\n public addProgress: number = 0;\n public addTotal: number = 0;\n private searchSubject: Subject<string> = new Subject();\n\n // Add from view dialog (existing)\n public showAddFromViewDialog: boolean = false;\n public showAddFromViewLoader: boolean = false;\n public userViews: MJUserViewEntityExtended[] | null = null;\n public userViewsToAdd: MJUserViewEntityExtended[] = [];\n public addFromViewProgress: number = 0;\n public addFromViewTotal: number = 0;\n public fetchingRecordsToSave: boolean = false;\n\n // Dropdown menu options\n public addOptions: NewItemOption[] = [\n {\n Text: 'Add Records',\n Description: 'Search and add specific records to this list',\n Icon: 'search',\n Action: () => this.openAddRecordsDialog()\n },\n {\n Text: 'Add From View',\n Description: 'Add all records from a saved view',\n Icon: 'folder',\n Action: () => this.openAddFromViewDialog()\n }\n ];\n\n constructor(\n private sharedService: SharedService,\n private cdr: ChangeDetectorRef\n ) {\n // Debounce search input\n this.searchSubject\n .pipe(debounceTime(300))\n .subscribe((searchText) => this.searchRecords(searchText));\n }\n\n public async ngOnInit(): Promise<void> {\n if (this.ListID) {\n await this.loadListRecord();\n }\n }\n\n /**\n * Load the list entity record\n */\n private async loadListRecord(): Promise<void> {\n if (!this.ListID) return;\n\n this.showLoader = true;\n\n try {\n const md = new Metadata();\n this.listRecord = await md.GetEntityObject<MJListEntity>(\"MJ: Lists\");\n const loadResult = await this.listRecord.Load(this.ListID);\n\n if (!loadResult) {\n LogError(\"Error loading list with ID \" + this.ListID, undefined, this.listRecord.LatestResult);\n this.listRecord = null;\n }\n } catch (error) {\n LogError(\"Error loading list\", undefined, error);\n this.listRecord = null;\n } finally {\n this.showLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n // ==========================================\n // Grid Event Handlers\n // ==========================================\n\n onRowClicked(_event: ListGridRowClickedEvent): void {\n // Selection is handled by the grid\n }\n\n onRowDoubleClicked(_event: ListGridRowClickedEvent): void {\n // Navigation is handled by mj-list-detail-grid\n }\n\n onSelectionChange(keys: string[]): void {\n this.selectedKeys = keys;\n }\n\n onDataLoaded(event: { totalCount: number }): void {\n this.rowCount = event.totalCount;\n }\n\n refreshGrid(): void {\n if (this.listDetailGrid) {\n this.listDetailGrid.refresh();\n }\n }\n\n // ==========================================\n // Toolbar Actions\n // ==========================================\n\n onRefreshClick(): void {\n this.refreshGrid();\n }\n\n onExportClick(): void {\n // Trigger export on the underlying grid\n if (this.listDetailGrid) {\n this.listDetailGrid.export();\n }\n }\n\n onDropdownItemClick(item: NewItemOption): void {\n if (item.Action) {\n item.Action();\n }\n }\n\n // ==========================================\n // Remove from List Dialog\n // ==========================================\n\n openRemoveDialog(): void {\n if (this.selectedKeys.length === 0) {\n this.sharedService.CreateSimpleNotification(\"Please select records to remove\", 'warning', 2500);\n return;\n }\n this.showRemoveDialog = true;\n }\n\n closeRemoveDialog(): void {\n this.showRemoveDialog = false;\n this.isRemoving = false;\n this.removeProgress = 0;\n this.removeTotal = 0;\n }\n\n async confirmRemoveFromList(): Promise<void> {\n if (!this.listRecord || this.selectedKeys.length === 0) return;\n\n this.isRemoving = true;\n this.removeTotal = this.selectedKeys.length;\n this.removeProgress = 0;\n\n const md = new Metadata();\n const rv = new RunView();\n const entityInfo = md.EntityByID(this.listRecord.EntityID);\n\n // selectedKeys from grid are in concatenated format (ID|value)\n // For single PK entities, RecordID in DB is just the raw value\n // For composite PK entities, RecordID in DB is the concatenated format\n // Extract the appropriate format for the query\n const selectedRecordIds = this.selectedKeys.map(key => {\n if (entityInfo && entityInfo.PrimaryKeys.length === 1) {\n // Single PK: extract just the value from concatenated format\n const compositeKey = new CompositeKey();\n compositeKey.LoadFromConcatenatedString(key);\n return compositeKey.KeyValuePairs[0]?.Value || key;\n } else {\n // Composite PK: use full concatenated format as-is\n return key;\n }\n });\n\n const listDetailsFilter = `ListID = '${this.listRecord.ID}' AND RecordID IN (${selectedRecordIds.map(id => `'${id}'`).join(',')})`;\n\n const listDetailsResult = await rv.RunView<MJListDetailEntity>({\n EntityName: 'MJ: List Details',\n ExtraFilter: listDetailsFilter,\n ResultType: 'entity_object'\n }, md.CurrentUser);\n\n if (!listDetailsResult.Success) {\n LogError(\"Error loading list details for removal\", undefined, listDetailsResult.ErrorMessage);\n this.sharedService.CreateSimpleNotification(\"Failed to remove records\", 'error', 2500);\n this.isRemoving = false;\n return;\n }\n\n // Use transaction group for bulk delete\n const tg = await md.CreateTransactionGroup();\n const listDetails = listDetailsResult.Results;\n\n for (const listDetail of listDetails) {\n listDetail.TransactionGroup = tg;\n await listDetail.Delete();\n }\n\n const success = await tg.Submit();\n\n if (success) {\n this.removeProgress = this.removeTotal;\n this.sharedService.CreateSimpleNotification(\n `Removed ${listDetails.length} record${listDetails.length !== 1 ? 's' : ''} from list`,\n 'success',\n 2500\n );\n this.closeRemoveDialog();\n this.listDetailGrid?.clearSelection();\n this.refreshGrid();\n } else {\n LogError(\"Error removing records from list\");\n this.sharedService.CreateSimpleNotification(\"Failed to remove some records\", 'error', 2500);\n this.isRemoving = false;\n }\n }\n\n // ==========================================\n // Add Records Dialog\n // ==========================================\n\n async openAddRecordsDialog(): Promise<void> {\n this.showAddRecordsDialog = true;\n this.addableRecords = [];\n this.addRecordsSearchFilter = \"\";\n this.addDialogLoading = true;\n this.addDialogSaving = false;\n\n // Load existing list detail IDs to mark which records are already in the list\n await this.loadExistingListDetailIds();\n this.addDialogLoading = false;\n }\n\n closeAddRecordsDialog(): void {\n this.showAddRecordsDialog = false;\n this.addableRecords = [];\n this.addRecordsSearchFilter = \"\";\n this.existingListDetailIds.clear();\n this.addDialogSaving = false;\n this.addProgress = 0;\n this.addTotal = 0;\n }\n\n private async loadExistingListDetailIds(): Promise<void> {\n if (!this.listRecord) return;\n\n const md = new Metadata();\n const rv = new RunView();\n\n const result = await rv.RunView<{ RecordID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID = '${this.listRecord.ID}'`,\n Fields: ['RecordID'],\n ResultType: 'simple'\n }, md.CurrentUser);\n\n if (result.Success) {\n this.existingListDetailIds = new Set(result.Results.map(r => r.RecordID));\n }\n }\n\n onAddRecordsSearchChange(value: string): void {\n this.addRecordsSearchFilter = value;\n this.searchSubject.next(value);\n }\n\n private async searchRecords(searchText: string): Promise<void> {\n if (!this.listRecord || !searchText || searchText.length < 2) {\n this.addableRecords = [];\n return;\n }\n\n this.addDialogLoading = true;\n\n const md = new Metadata();\n const sourceEntityInfo = md.EntityByID(this.listRecord.EntityID);\n if (!sourceEntityInfo) {\n this.addDialogLoading = false;\n return;\n }\n\n const nameField = sourceEntityInfo.Fields.find(field => field.IsNameField);\n const pkField = sourceEntityInfo.FirstPrimaryKey?.Name || 'ID';\n\n let filter: string | undefined;\n if (nameField) {\n filter = `${nameField.Name} LIKE '%${searchText}%'`;\n }\n\n const rv = new RunView();\n const result: RunViewResult = await rv.RunView({\n EntityName: this.listRecord.Entity,\n ExtraFilter: filter,\n MaxRows: 100,\n ResultType: 'simple'\n });\n\n if (result.Success) {\n this.addableRecords = result.Results.map((record: Record<string, unknown>) => {\n const recordId = String(record[pkField]);\n return {\n ID: recordId,\n Name: nameField ? String(record[nameField.Name]) : recordId,\n isInList: this.existingListDetailIds.has(recordId),\n isSelected: false\n };\n });\n }\n\n this.addDialogLoading = false;\n this.cdr.detectChanges();\n }\n\n toggleRecordSelection(record: AddableRecord): void {\n if (record.isInList) return; // Can't select records already in list\n record.isSelected = !record.isSelected;\n }\n\n get selectedAddableRecords(): AddableRecord[] {\n return this.addableRecords.filter(r => r.isSelected);\n }\n\n selectAllAddable(): void {\n this.addableRecords.forEach(r => {\n if (!r.isInList) r.isSelected = true;\n });\n }\n\n deselectAllAddable(): void {\n this.addableRecords.forEach(r => r.isSelected = false);\n }\n\n async confirmAddRecords(): Promise<void> {\n const recordsToAdd = this.selectedAddableRecords;\n if (recordsToAdd.length === 0 || !this.listRecord) return;\n\n this.addDialogSaving = true;\n // Reserve 20% of progress for tg.Submit()\n this.addTotal = recordsToAdd.length;\n this.addProgress = 0;\n const progressPerRecord = 0.8 / recordsToAdd.length; // 80% for individual saves\n\n const md = new Metadata();\n\n // Use transaction group for bulk insert\n const tg = await md.CreateTransactionGroup();\n\n for (let i = 0; i < recordsToAdd.length; i++) {\n const record = recordsToAdd[i];\n const listDetail = await md.GetEntityObject<MJListDetailEntityExtended>(\"MJ: List Details\", md.CurrentUser);\n listDetail.ListID = this.listRecord.ID;\n listDetail.RecordID = record.ID;\n listDetail.TransactionGroup = tg;\n const result = await listDetail.Save();\n if (!result) {\n LogErrorEx({\n message: listDetail.LatestResult?.CompleteMessage\n });\n }\n // Update progress (0-80%)\n this.addProgress = Math.round((i + 1) * progressPerRecord * this.addTotal);\n }\n\n // Show 80% complete before submit\n this.addProgress = Math.round(this.addTotal * 0.8);\n\n const success = await tg.Submit();\n\n if (success) {\n this.addProgress = this.addTotal;\n this.sharedService.CreateSimpleNotification(\n `Added ${recordsToAdd.length} record${recordsToAdd.length !== 1 ? 's' : ''} to list`,\n 'success',\n 2500\n );\n this.closeAddRecordsDialog();\n this.refreshGrid();\n } else {\n LogError(\"Error adding records to list\");\n this.sharedService.CreateSimpleNotification(\"Failed to add some records\", 'error', 2500);\n this.addDialogSaving = false;\n }\n }\n\n // ==========================================\n // Add From View Dialog (existing functionality, cleaned up)\n // ==========================================\n\n async openAddFromViewDialog(): Promise<void> {\n this.showAddFromViewDialog = true;\n this.userViewsToAdd = [];\n\n if (!this.userViews) {\n await this.loadEntityViews();\n }\n }\n\n closeAddFromViewDialog(): void {\n this.showAddFromViewDialog = false;\n this.userViewsToAdd = [];\n this.showAddFromViewLoader = false;\n this.addFromViewProgress = 0;\n this.addFromViewTotal = 0;\n }\n\n private async loadEntityViews(): Promise<void> {\n if (!this.listRecord || !this.listRecord.Entity) return;\n\n this.showAddFromViewLoader = true;\n\n const rv = new RunView();\n const md = new Metadata();\n\n const runViewResult = await rv.RunView<MJUserViewEntityExtended>({\n EntityName: \"MJ: User Views\",\n ExtraFilter: `UserID = '${md.CurrentUser.ID}' AND EntityID = '${this.listRecord.EntityID}'`,\n ResultType: 'entity_object'\n }, md.CurrentUser);\n\n if (!runViewResult.Success) {\n LogError(`Error loading User Views for entity ${this.listRecord.Entity}`);\n } else {\n this.userViews = runViewResult.Results;\n }\n\n this.showAddFromViewLoader = false;\n }\n\n toggleViewSelection(view: MJUserViewEntityExtended): void {\n const index = this.userViewsToAdd.findIndex(v => UUIDsEqual(v.ID, view.ID));\n if (index >= 0) {\n this.userViewsToAdd.splice(index, 1);\n } else {\n this.userViewsToAdd.push(view);\n }\n }\n\n isViewSelected(view: MJUserViewEntityExtended): boolean {\n return this.userViewsToAdd.some(v => UUIDsEqual(v.ID, view.ID));\n }\n\n async confirmAddFromView(): Promise<void> {\n if (!this.listRecord || this.userViewsToAdd.length === 0) return;\n\n this.showAddFromViewLoader = true;\n this.fetchingRecordsToSave = true;\n\n const rv = new RunView();\n const md = new Metadata();\n\n // Collect all unique record IDs from selected views\n const recordIdSet = new Set<string>();\n\n for (const userView of this.userViewsToAdd) {\n const runViewResult = await rv.RunView({\n EntityName: \"MJ: User Views\",\n ViewEntity: userView,\n Fields: [\"ID\"]\n }, md.CurrentUser);\n\n if (runViewResult.Success) {\n const records = runViewResult.Results as Array<{ ID: string }>;\n records.forEach(r => recordIdSet.add(r.ID));\n }\n }\n\n // Filter out records already in the list\n await this.loadExistingListDetailIds();\n const recordsToAdd = [...recordIdSet].filter(id => !this.existingListDetailIds.has(id));\n\n this.addFromViewTotal = recordsToAdd.length;\n this.addFromViewProgress = 0;\n this.fetchingRecordsToSave = false;\n const progressPerRecord = 0.8 / Math.max(recordsToAdd.length, 1); // 80% for individual saves\n\n if (recordsToAdd.length === 0) {\n this.sharedService.CreateSimpleNotification(\"All records already in list\", 'info', 2500);\n this.showAddFromViewLoader = false;\n return;\n }\n\n LogStatus(`Adding ${recordsToAdd.length} records to list`);\n\n // Use transaction group for bulk insert\n const tg = await md.CreateTransactionGroup();\n\n for (let i = 0; i < recordsToAdd.length; i++) {\n const recordID = recordsToAdd[i];\n const listDetail = await md.GetEntityObject<MJListDetailEntityExtended>(\"MJ: List Details\", md.CurrentUser);\n listDetail.ListID = this.listRecord.ID;\n listDetail.RecordID = recordID;\n listDetail.TransactionGroup = tg;\n const result = await listDetail.Save();\n if (!result) {\n LogErrorEx({\n message: listDetail.LatestResult?.CompleteMessage\n });\n }\n // Update progress (0-80%)\n this.addFromViewProgress = Math.round((i + 1) * progressPerRecord * this.addFromViewTotal);\n }\n\n // Show 80% complete before submit\n this.addFromViewProgress = Math.round(this.addFromViewTotal * 0.8);\n\n const success = await tg.Submit();\n\n if (success) {\n this.addFromViewProgress = this.addFromViewTotal;\n this.sharedService.CreateSimpleNotification(\n `Added ${recordsToAdd.length} record${recordsToAdd.length !== 1 ? 's' : ''} to list`,\n 'success',\n 2500\n );\n this.closeAddFromViewDialog();\n this.refreshGrid();\n } else {\n LogError(\"Error adding records from view to list\");\n this.sharedService.CreateSimpleNotification(\"Failed to add some records\", 'error', 2500);\n this.showAddFromViewLoader = false;\n }\n }\n}\n","<div class=\"list-detail-container\">\n <!-- Header with title and Add button -->\n <div class=\"list-header\">\n <h1>{{ listRecord ? listRecord.Name : \"List\" }}</h1>\n <kendo-dropdownbutton\n class=\"add-btn\"\n (itemClick)=\"onDropdownItemClick($event)\"\n [data]=\"addOptions\"\n textField=\"Text\"\n themeColor=\"info\">\n <span class=\"fa-solid fa-plus\"></span>\n Add to List\n </kendo-dropdownbutton>\n </div>\n\n <!-- Custom Toolbar -->\n @if (!showLoader && listRecord) {\n <div class=\"custom-toolbar\">\n <div class=\"toolbar-left\">\n <span class=\"row-count\">{{ rowCount }} row{{ rowCount !== 1 ? 's' : '' }}</span>\n @if (selectedKeys.length > 0) {\n <span class=\"selection-count\">({{ selectedKeys.length }} selected)</span>\n }\n </div>\n <div class=\"toolbar-right\">\n @if (selectedKeys.length > 0) {\n <button kendoButton\n (click)=\"openRemoveDialog()\"\n fillMode=\"flat\"\n themeColor=\"error\"\n class=\"toolbar-button remove-btn\">\n <span class=\"fa-solid fa-trash\"></span>\n Remove from List\n </button>\n }\n <button kendoButton\n (click)=\"onRefreshClick()\"\n fillMode=\"flat\"\n class=\"toolbar-button\">\n <span class=\"fa-solid fa-rotate\"></span>\n Refresh\n </button>\n <button kendoButton\n (click)=\"onExportClick()\"\n fillMode=\"flat\"\n class=\"toolbar-button\">\n <span class=\"fa-solid fa-file-export\"></span>\n Export\n </button>\n </div>\n </div>\n }\n\n <!-- Loading State -->\n @if (showLoader) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading list...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n <!-- Grid -->\n @if (!showLoader && listRecord) {\n <div class=\"grid-container\">\n <mj-list-detail-grid\n #listDetailGrid\n [listId]=\"ListID\"\n [listEntity]=\"listRecord\"\n [autoNavigate]=\"true\"\n [height]=\"'auto'\"\n [showToolbar]=\"false\"\n [toolbarConfig]=\"gridToolbarConfig\"\n [selectionMode]=\"'checkbox'\"\n (rowClicked)=\"onRowClicked($event)\"\n (rowDoubleClicked)=\"onRowDoubleClicked($event)\"\n (selectionChange)=\"onSelectionChange($event)\"\n (dataLoaded)=\"onDataLoaded($event)\">\n </mj-list-detail-grid>\n </div>\n }\n</div>\n\n<!-- Remove from List Confirmation Dialog -->\n@if (showRemoveDialog) {\n <kendo-dialog\n title=\"Remove from List\"\n (close)=\"closeRemoveDialog()\"\n [minWidth]=\"350\"\n [width]=\"450\">\n <div class=\"dialog-content\">\n @if (isRemoving) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Removing records...\" size=\"small\"></mj-loading>\n @if (removeTotal > 0) {\n <kendo-progressbar\n [min]=\"0\"\n [max]=\"removeTotal\"\n [value]=\"removeProgress\"\n [label]=\"false\"\n class=\"progress-bar\">\n </kendo-progressbar>\n }\n </div>\n } @else {\n <div class=\"dialog-message\">\n <span class=\"fa-solid fa-triangle-exclamation warning-icon\"></span>\n <p>Are you sure you want to remove <strong>{{ selectedKeys.length }}</strong> record{{ selectedKeys.length !== 1 ? 's' : '' }} from this list?</p>\n <p class=\"dialog-note\">This will not delete the records, only remove them from this list.</p>\n </div>\n }\n </div>\n <kendo-dialog-actions>\n <button kendoButton\n (click)=\"confirmRemoveFromList()\"\n [disabled]=\"isRemoving\"\n themeColor=\"error\">\n Remove\n </button>\n <button kendoButton\n (click)=\"closeRemoveDialog()\"\n [disabled]=\"isRemoving\"\n fillMode=\"outline\">\n Cancel\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n}\n\n<!-- Add Records Dialog -->\n@if (showAddRecordsDialog) {\n <kendo-dialog\n [title]=\"'Add ' + (listRecord?.Entity || 'Records') + ' to List'\"\n (close)=\"closeAddRecordsDialog()\"\n [minWidth]=\"500\"\n [width]=\"700\"\n [height]=\"650\">\n <div class=\"dialog-content add-records-dialog\">\n @if (addDialogSaving) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Adding records to list...\" size=\"small\"></mj-loading>\n @if (addTotal > 0) {\n <kendo-progressbar\n [min]=\"0\"\n [max]=\"addTotal\"\n [value]=\"addProgress\"\n [label]=\"false\"\n class=\"progress-bar\">\n </kendo-progressbar>\n }\n </div>\n } @else {\n <!-- Search Input -->\n <div class=\"search-section\">\n <kendo-textbox\n [placeholder]=\"'Search ' + (listRecord?.Entity || 'records') + '...'\"\n [clearButton]=\"true\"\n (valueChange)=\"onAddRecordsSearchChange($event)\"\n [value]=\"addRecordsSearchFilter\"\n class=\"search-input\">\n <ng-template kendoTextBoxPrefixTemplate>\n <span class=\"fa-solid fa-search search-icon\"></span>\n </ng-template>\n </kendo-textbox>\n <span class=\"search-hint\">Type at least 2 characters to search</span>\n </div>\n <!-- Records List -->\n <div class=\"records-list\">\n @if (addDialogLoading) {\n <div class=\"list-loading\">\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n </div>\n } @else if (addableRecords.length === 0 && addRecordsSearchFilter.length >= 2) {\n <div class=\"empty-results\">\n <span class=\"fa-solid fa-search empty-icon\"></span>\n <p>No records found matching \"{{ addRecordsSearchFilter }}\"</p>\n </div>\n } @else if (addableRecords.length === 0) {\n <div class=\"empty-results\">\n <span class=\"fa-solid fa-list empty-icon\"></span>\n <p>Search for records to add to this list</p>\n </div>\n } @else {\n <!-- Selection controls -->\n <div class=\"selection-controls\">\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"selectAllAddable()\">Select All</button>\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"deselectAllAddable()\">Deselect All</button>\n <span class=\"selection-info\">{{ selectedAddableRecords.length }} selected</span>\n </div>\n <!-- Records -->\n <div class=\"records-scroll\">\n @for (record of addableRecords; track record.ID) {\n <div class=\"record-item\"\n [class.in-list]=\"record.isInList\"\n [class.selected]=\"record.isSelected\"\n (click)=\"toggleRecordSelection(record)\">\n <div class=\"record-checkbox\">\n @if (record.isInList) {\n <span class=\"fa-solid fa-check in-list-icon\" title=\"Already in list\"></span>\n } @else {\n <input type=\"checkbox\"\n [checked]=\"record.isSelected\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRecordSelection(record)\">\n }\n </div>\n <div class=\"record-name\">{{ record.Name }}</div>\n @if (record.isInList) {\n <span class=\"in-list-badge\">In List</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n <kendo-dialog-actions>\n <button kendoButton\n (click)=\"confirmAddRecords()\"\n [disabled]=\"addDialogSaving || selectedAddableRecords.length === 0\"\n themeColor=\"info\">\n Add {{ selectedAddableRecords.length > 0 ? selectedAddableRecords.length : '' }} Record{{ selectedAddableRecords.length !== 1 ? 's' : '' }}\n </button>\n <button kendoButton\n (click)=\"closeAddRecordsDialog()\"\n [disabled]=\"addDialogSaving\"\n fillMode=\"outline\">\n Cancel\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n}\n\n<!-- Add From View Dialog -->\n@if (showAddFromViewDialog) {\n <kendo-dialog\n title=\"Add Records from Views\"\n (close)=\"closeAddFromViewDialog()\"\n [minWidth]=\"400\"\n [width]=\"600\"\n [height]=\"500\">\n <div class=\"dialog-content\">\n @if (showAddFromViewLoader && fetchingRecordsToSave) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Loading records from views...\" size=\"small\"></mj-loading>\n </div>\n } @else if (showAddFromViewLoader && addFromViewTotal > 0) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Adding records to list...\" size=\"small\"></mj-loading>\n <kendo-progressbar\n [min]=\"0\"\n [max]=\"addFromViewTotal\"\n [value]=\"addFromViewProgress\"\n [label]=\"false\"\n class=\"progress-bar\">\n </kendo-progressbar>\n </div>\n } @else if (showAddFromViewLoader) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Loading views...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <p class=\"dialog-instruction\">Select views to add their records to this list:</p>\n <div class=\"views-list\">\n @if (!userViews || userViews.length === 0) {\n <div class=\"empty-results\">\n <span class=\"fa-solid fa-folder-open empty-icon\"></span>\n <p>No saved views found for this entity</p>\n </div>\n } @else {\n @for (view of userViews; track view.ID) {\n <div class=\"view-item\"\n [class.selected]=\"isViewSelected(view)\"\n (click)=\"toggleViewSelection(view)\">\n <input type=\"checkbox\"\n [checked]=\"isViewSelected(view)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleViewSelection(view)\">\n <span class=\"fa-solid fa-table-list view-icon\"></span>\n <span class=\"view-name\">{{ view.Name }}</span>\n </div>\n }\n }\n </div>\n }\n </div>\n <kendo-dialog-actions>\n <button kendoButton\n (click)=\"confirmAddFromView()\"\n [disabled]=\"showAddFromViewLoader || userViewsToAdd.length === 0\"\n themeColor=\"info\">\n Add from {{ userViewsToAdd.length }} View{{ userViewsToAdd.length !== 1 ? 's' : '' }}\n </button>\n <button kendoButton\n (click)=\"closeAddFromViewDialog()\"\n [disabled]=\"showAddFromViewLoader\"\n fillMode=\"outline\">\n Cancel\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n}\n"]}
1
+ {"version":3,"file":"single-list-detail.component.js","sourceRoot":"","sources":["../../../src/lib/single-list-detail/single-list-detail.component.ts","../../../src/lib/single-list-detail/single-list-detail.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnInit, ViewChild, ChangeDetectorRef } from '@angular/core';\nimport { BaseEntity, CompositeKey, LogError, LogErrorEx, LogStatus, Metadata, RunView, RunViewResult } from '@memberjunction/core';\nimport { MJListDetailEntity, MJListDetailEntityExtended, MJListEntity, MJUserViewEntityExtended } from '@memberjunction/core-entities';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { ListDetailGridComponent, ListGridRowClickedEvent } from '@memberjunction/ng-list-detail-grid';\nimport { GridToolbarConfig } from '@memberjunction/ng-entity-viewer';\nimport { Subject, debounceTime } from 'rxjs';\nimport { NewItemOption } from '../../generic/Item.types';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\n\n/**\n * Represents a record that can be added to a list\n */\ninterface AddableRecord {\n ID: string;\n Name: string;\n isInList: boolean;\n isSelected: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-list-detail',\n templateUrl: './single-list-detail.component.html',\n styleUrls: ['./single-list-detail.component.css', '../../shared/first-tab-styles.css']\n})\nexport class SingleListDetailComponent implements OnInit {\n\n @Input() public ListID: string = \"\";\n\n @ViewChild('listDetailGrid') listDetailGrid: ListDetailGridComponent | undefined;\n\n // List record\n public listRecord: MJListEntity | null = null;\n public showLoader: boolean = false;\n\n // Grid state\n public selectedKeys: string[] = [];\n public rowCount: number = 0;\n\n // Toolbar config - hide EDG toolbar, we'll use our own\n public gridToolbarConfig: GridToolbarConfig = {\n showSearch: false,\n showRefresh: false,\n showAdd: false,\n showDelete: false,\n showExport: false,\n showRowCount: false,\n showSelectionCount: false\n };\n\n // Remove from list dialog\n public showRemoveDialog: boolean = false;\n public isRemoving: boolean = false;\n public removeProgress: number = 0;\n public removeTotal: number = 0;\n\n // Add records dialog\n public showAddRecordsDialog: boolean = false;\n public addDialogLoading: boolean = false;\n public addDialogSaving: boolean = false;\n public addableRecords: AddableRecord[] = [];\n public addRecordsSearchFilter: string = \"\";\n public existingListDetailIds: Set<string> = new Set();\n public addProgress: number = 0;\n public addTotal: number = 0;\n private searchSubject: Subject<string> = new Subject();\n\n // Add from view dialog (existing)\n public showAddFromViewDialog: boolean = false;\n public showAddFromViewLoader: boolean = false;\n public userViews: MJUserViewEntityExtended[] | null = null;\n public userViewsToAdd: MJUserViewEntityExtended[] = [];\n public addFromViewProgress: number = 0;\n public addFromViewTotal: number = 0;\n public fetchingRecordsToSave: boolean = false;\n\n // Dropdown menu options\n public addOptions: NewItemOption[] = [\n {\n Text: 'Add Records',\n Description: 'Search and add specific records to this list',\n Icon: 'search',\n Action: () => this.openAddRecordsDialog()\n },\n {\n Text: 'Add From View',\n Description: 'Add all records from a saved view',\n Icon: 'folder',\n Action: () => this.openAddFromViewDialog()\n }\n ];\n\n constructor(\n private sharedService: SharedService,\n private cdr: ChangeDetectorRef\n ) {\n // Debounce search input\n this.searchSubject\n .pipe(debounceTime(300))\n .subscribe((searchText) => this.searchRecords(searchText));\n }\n\n public async ngOnInit(): Promise<void> {\n if (this.ListID) {\n await this.loadListRecord();\n }\n }\n\n /**\n * Load the list entity record\n */\n private async loadListRecord(): Promise<void> {\n if (!this.ListID) return;\n\n this.showLoader = true;\n\n try {\n const md = new Metadata();\n this.listRecord = await md.GetEntityObject<MJListEntity>(\"MJ: Lists\");\n const loadResult = await this.listRecord.Load(this.ListID);\n\n if (!loadResult) {\n LogError(\"Error loading list with ID \" + this.ListID, undefined, this.listRecord.LatestResult);\n this.listRecord = null;\n }\n } catch (error) {\n LogError(\"Error loading list\", undefined, error);\n this.listRecord = null;\n } finally {\n this.showLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n // ==========================================\n // Grid Event Handlers\n // ==========================================\n\n onRowClicked(_event: ListGridRowClickedEvent): void {\n // Selection is handled by the grid\n }\n\n onRowDoubleClicked(_event: ListGridRowClickedEvent): void {\n // Navigation is handled by mj-list-detail-grid\n }\n\n onSelectionChange(keys: string[]): void {\n this.selectedKeys = keys;\n }\n\n onDataLoaded(event: { totalCount: number }): void {\n this.rowCount = event.totalCount;\n }\n\n refreshGrid(): void {\n if (this.listDetailGrid) {\n this.listDetailGrid.refresh();\n }\n }\n\n // ==========================================\n // Toolbar Actions\n // ==========================================\n\n onRefreshClick(): void {\n this.refreshGrid();\n }\n\n onExportClick(): void {\n // Trigger export on the underlying grid\n if (this.listDetailGrid) {\n this.listDetailGrid.export();\n }\n }\n\n onDropdownItemClick(item: NewItemOption): void {\n if (item.Action) {\n item.Action();\n }\n }\n\n // ==========================================\n // Remove from List Dialog\n // ==========================================\n\n openRemoveDialog(): void {\n if (this.selectedKeys.length === 0) {\n this.sharedService.CreateSimpleNotification(\"Please select records to remove\", 'warning', 2500);\n return;\n }\n this.showRemoveDialog = true;\n }\n\n closeRemoveDialog(): void {\n this.showRemoveDialog = false;\n this.isRemoving = false;\n this.removeProgress = 0;\n this.removeTotal = 0;\n }\n\n async confirmRemoveFromList(): Promise<void> {\n if (!this.listRecord || this.selectedKeys.length === 0) return;\n\n this.isRemoving = true;\n this.removeTotal = this.selectedKeys.length;\n this.removeProgress = 0;\n\n const md = new Metadata();\n const rv = new RunView();\n const entityInfo = md.EntityByID(this.listRecord.EntityID);\n\n // selectedKeys from grid are in concatenated format (ID|value)\n // For single PK entities, RecordID in DB is just the raw value\n // For composite PK entities, RecordID in DB is the concatenated format\n // Extract the appropriate format for the query\n const selectedRecordIds = this.selectedKeys.map(key => {\n if (entityInfo && entityInfo.PrimaryKeys.length === 1) {\n // Single PK: extract just the value from concatenated format\n const compositeKey = new CompositeKey();\n compositeKey.LoadFromConcatenatedString(key);\n return compositeKey.KeyValuePairs[0]?.Value || key;\n } else {\n // Composite PK: use full concatenated format as-is\n return key;\n }\n });\n\n const listDetailsFilter = `ListID = '${this.listRecord.ID}' AND RecordID IN (${selectedRecordIds.map(id => `'${id}'`).join(',')})`;\n\n const listDetailsResult = await rv.RunView<MJListDetailEntity>({\n EntityName: 'MJ: List Details',\n ExtraFilter: listDetailsFilter,\n ResultType: 'entity_object'\n }, md.CurrentUser);\n\n if (!listDetailsResult.Success) {\n LogError(\"Error loading list details for removal\", undefined, listDetailsResult.ErrorMessage);\n this.sharedService.CreateSimpleNotification(\"Failed to remove records\", 'error', 2500);\n this.isRemoving = false;\n return;\n }\n\n // Use transaction group for bulk delete\n const tg = await md.CreateTransactionGroup();\n const listDetails = listDetailsResult.Results;\n\n for (const listDetail of listDetails) {\n listDetail.TransactionGroup = tg;\n await listDetail.Delete();\n }\n\n const success = await tg.Submit();\n\n if (success) {\n this.removeProgress = this.removeTotal;\n this.sharedService.CreateSimpleNotification(\n `Removed ${listDetails.length} record${listDetails.length !== 1 ? 's' : ''} from list`,\n 'success',\n 2500\n );\n this.closeRemoveDialog();\n this.listDetailGrid?.clearSelection();\n this.refreshGrid();\n } else {\n LogError(\"Error removing records from list\");\n this.sharedService.CreateSimpleNotification(\"Failed to remove some records\", 'error', 2500);\n this.isRemoving = false;\n }\n }\n\n // ==========================================\n // Add Records Dialog\n // ==========================================\n\n async openAddRecordsDialog(): Promise<void> {\n this.showAddRecordsDialog = true;\n this.addableRecords = [];\n this.addRecordsSearchFilter = \"\";\n this.addDialogLoading = true;\n this.addDialogSaving = false;\n\n // Load existing list detail IDs to mark which records are already in the list\n await this.loadExistingListDetailIds();\n this.addDialogLoading = false;\n }\n\n closeAddRecordsDialog(): void {\n this.showAddRecordsDialog = false;\n this.addableRecords = [];\n this.addRecordsSearchFilter = \"\";\n this.existingListDetailIds.clear();\n this.addDialogSaving = false;\n this.addProgress = 0;\n this.addTotal = 0;\n }\n\n private async loadExistingListDetailIds(): Promise<void> {\n if (!this.listRecord) return;\n\n const md = new Metadata();\n const rv = new RunView();\n\n const result = await rv.RunView<{ RecordID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID = '${this.listRecord.ID}'`,\n Fields: ['RecordID'],\n ResultType: 'simple'\n }, md.CurrentUser);\n\n if (result.Success) {\n this.existingListDetailIds = new Set(result.Results.map(r => NormalizeUUID(r.RecordID)));\n }\n }\n\n onAddRecordsSearchChange(value: string): void {\n this.addRecordsSearchFilter = value;\n this.searchSubject.next(value);\n }\n\n private async searchRecords(searchText: string): Promise<void> {\n if (!this.listRecord || !searchText || searchText.length < 2) {\n this.addableRecords = [];\n return;\n }\n\n this.addDialogLoading = true;\n\n const md = new Metadata();\n const sourceEntityInfo = md.EntityByID(this.listRecord.EntityID);\n if (!sourceEntityInfo) {\n this.addDialogLoading = false;\n return;\n }\n\n const nameField = sourceEntityInfo.Fields.find(field => field.IsNameField);\n const pkField = sourceEntityInfo.FirstPrimaryKey?.Name || 'ID';\n\n let filter: string | undefined;\n if (nameField) {\n filter = `${nameField.Name} LIKE '%${searchText}%'`;\n }\n\n const rv = new RunView();\n const result: RunViewResult = await rv.RunView({\n EntityName: this.listRecord.Entity,\n ExtraFilter: filter,\n MaxRows: 100,\n ResultType: 'simple'\n });\n\n if (result.Success) {\n this.addableRecords = result.Results.map((record: Record<string, unknown>) => {\n const recordId = String(record[pkField]);\n return {\n ID: recordId,\n Name: nameField ? String(record[nameField.Name]) : recordId,\n isInList: this.existingListDetailIds.has(NormalizeUUID(recordId)),\n isSelected: false\n };\n });\n }\n\n this.addDialogLoading = false;\n this.cdr.detectChanges();\n }\n\n toggleRecordSelection(record: AddableRecord): void {\n if (record.isInList) return; // Can't select records already in list\n record.isSelected = !record.isSelected;\n }\n\n get selectedAddableRecords(): AddableRecord[] {\n return this.addableRecords.filter(r => r.isSelected);\n }\n\n selectAllAddable(): void {\n this.addableRecords.forEach(r => {\n if (!r.isInList) r.isSelected = true;\n });\n }\n\n deselectAllAddable(): void {\n this.addableRecords.forEach(r => r.isSelected = false);\n }\n\n async confirmAddRecords(): Promise<void> {\n const recordsToAdd = this.selectedAddableRecords;\n if (recordsToAdd.length === 0 || !this.listRecord) return;\n\n this.addDialogSaving = true;\n // Reserve 20% of progress for tg.Submit()\n this.addTotal = recordsToAdd.length;\n this.addProgress = 0;\n const progressPerRecord = 0.8 / recordsToAdd.length; // 80% for individual saves\n\n const md = new Metadata();\n\n // Use transaction group for bulk insert\n const tg = await md.CreateTransactionGroup();\n\n for (let i = 0; i < recordsToAdd.length; i++) {\n const record = recordsToAdd[i];\n const listDetail = await md.GetEntityObject<MJListDetailEntityExtended>(\"MJ: List Details\", md.CurrentUser);\n listDetail.ListID = this.listRecord.ID;\n listDetail.RecordID = record.ID;\n listDetail.TransactionGroup = tg;\n const result = await listDetail.Save();\n if (!result) {\n LogErrorEx({\n message: listDetail.LatestResult?.CompleteMessage\n });\n }\n // Update progress (0-80%)\n this.addProgress = Math.round((i + 1) * progressPerRecord * this.addTotal);\n }\n\n // Show 80% complete before submit\n this.addProgress = Math.round(this.addTotal * 0.8);\n\n const success = await tg.Submit();\n\n if (success) {\n this.addProgress = this.addTotal;\n this.sharedService.CreateSimpleNotification(\n `Added ${recordsToAdd.length} record${recordsToAdd.length !== 1 ? 's' : ''} to list`,\n 'success',\n 2500\n );\n this.closeAddRecordsDialog();\n this.refreshGrid();\n } else {\n LogError(\"Error adding records to list\");\n this.sharedService.CreateSimpleNotification(\"Failed to add some records\", 'error', 2500);\n this.addDialogSaving = false;\n }\n }\n\n // ==========================================\n // Add From View Dialog (existing functionality, cleaned up)\n // ==========================================\n\n async openAddFromViewDialog(): Promise<void> {\n this.showAddFromViewDialog = true;\n this.userViewsToAdd = [];\n\n if (!this.userViews) {\n await this.loadEntityViews();\n }\n }\n\n closeAddFromViewDialog(): void {\n this.showAddFromViewDialog = false;\n this.userViewsToAdd = [];\n this.showAddFromViewLoader = false;\n this.addFromViewProgress = 0;\n this.addFromViewTotal = 0;\n }\n\n private async loadEntityViews(): Promise<void> {\n if (!this.listRecord || !this.listRecord.Entity) return;\n\n this.showAddFromViewLoader = true;\n\n const rv = new RunView();\n const md = new Metadata();\n\n const runViewResult = await rv.RunView<MJUserViewEntityExtended>({\n EntityName: \"MJ: User Views\",\n ExtraFilter: `UserID = '${md.CurrentUser.ID}' AND EntityID = '${this.listRecord.EntityID}'`,\n ResultType: 'entity_object'\n }, md.CurrentUser);\n\n if (!runViewResult.Success) {\n LogError(`Error loading User Views for entity ${this.listRecord.Entity}`);\n } else {\n this.userViews = runViewResult.Results;\n }\n\n this.showAddFromViewLoader = false;\n this.cdr.detectChanges();\n }\n\n toggleViewSelection(view: MJUserViewEntityExtended): void {\n const index = this.userViewsToAdd.findIndex(v => UUIDsEqual(v.ID, view.ID));\n if (index >= 0) {\n this.userViewsToAdd.splice(index, 1);\n } else {\n this.userViewsToAdd.push(view);\n }\n }\n\n isViewSelected(view: MJUserViewEntityExtended): boolean {\n return this.userViewsToAdd.some(v => UUIDsEqual(v.ID, view.ID));\n }\n\n async confirmAddFromView(): Promise<void> {\n if (!this.listRecord || this.userViewsToAdd.length === 0) return;\n\n this.showAddFromViewLoader = true;\n this.fetchingRecordsToSave = true;\n this.cdr.detectChanges();\n\n const rv = new RunView();\n const md = new Metadata();\n\n // Collect all unique record IDs from selected views\n const recordIdSet = new Set<string>();\n\n for (const userView of this.userViewsToAdd) {\n const runViewResult = await rv.RunView({\n ViewID: userView.ID,\n ViewEntity: userView,\n Fields: [\"ID\"]\n }, md.CurrentUser);\n\n if (runViewResult.Success) {\n const records = runViewResult.Results as Array<Record<string, string>>;\n records.forEach(r => recordIdSet.add(NormalizeUUID(r.ID)));\n }\n }\n\n // Filter out records already in the list\n await this.loadExistingListDetailIds();\n const recordsToAdd = [...recordIdSet].filter(id => !this.existingListDetailIds.has(id));\n\n this.addFromViewTotal = recordsToAdd.length;\n this.addFromViewProgress = 0;\n this.fetchingRecordsToSave = false;\n this.cdr.detectChanges();\n const progressPerRecord = 0.8 / Math.max(recordsToAdd.length, 1); // 80% for individual saves\n\n if (recordsToAdd.length === 0) {\n this.sharedService.CreateSimpleNotification(\"All records already in list\", 'info', 2500);\n this.showAddFromViewLoader = false;\n this.cdr.detectChanges();\n return;\n }\n\n LogStatus(`Adding ${recordsToAdd.length} records to list`);\n\n // Use transaction group for bulk insert\n const tg = await md.CreateTransactionGroup();\n\n for (let i = 0; i < recordsToAdd.length; i++) {\n const recordID = recordsToAdd[i];\n const listDetail = await md.GetEntityObject<MJListDetailEntityExtended>(\"MJ: List Details\", md.CurrentUser);\n listDetail.ListID = this.listRecord.ID;\n listDetail.RecordID = recordID;\n listDetail.TransactionGroup = tg;\n const result = await listDetail.Save();\n if (!result) {\n LogErrorEx({\n message: listDetail.LatestResult?.CompleteMessage\n });\n }\n // Update progress (0-80%)\n this.addFromViewProgress = Math.round((i + 1) * progressPerRecord * this.addFromViewTotal);\n }\n\n // Show 80% complete before submit\n this.addFromViewProgress = Math.round(this.addFromViewTotal * 0.8);\n\n const success = await tg.Submit();\n\n if (success) {\n this.addFromViewProgress = this.addFromViewTotal;\n this.sharedService.CreateSimpleNotification(\n `Added ${recordsToAdd.length} record${recordsToAdd.length !== 1 ? 's' : ''} to list`,\n 'success',\n 2500\n );\n this.closeAddFromViewDialog();\n this.refreshGrid();\n } else {\n LogError(\"Error adding records from view to list\");\n this.sharedService.CreateSimpleNotification(\"Failed to add some records\", 'error', 2500);\n this.showAddFromViewLoader = false;\n }\n }\n}\n","<div class=\"list-detail-container\">\n <!-- Header with title and Add button -->\n <div class=\"list-header\">\n <h1>{{ listRecord ? listRecord.Name : \"List\" }}</h1>\n <kendo-dropdownbutton\n class=\"add-btn\"\n (itemClick)=\"onDropdownItemClick($event)\"\n [data]=\"addOptions\"\n textField=\"Text\"\n themeColor=\"info\">\n <span class=\"fa-solid fa-plus\"></span>\n Add to List\n </kendo-dropdownbutton>\n </div>\n\n <!-- Custom Toolbar -->\n @if (!showLoader && listRecord) {\n <div class=\"custom-toolbar\">\n <div class=\"toolbar-left\">\n <span class=\"row-count\">{{ rowCount }} row{{ rowCount !== 1 ? 's' : '' }}</span>\n @if (selectedKeys.length > 0) {\n <span class=\"selection-count\">({{ selectedKeys.length }} selected)</span>\n }\n </div>\n <div class=\"toolbar-right\">\n @if (selectedKeys.length > 0) {\n <button kendoButton\n (click)=\"openRemoveDialog()\"\n fillMode=\"flat\"\n themeColor=\"error\"\n class=\"toolbar-button remove-btn\">\n <span class=\"fa-solid fa-trash\"></span>\n Remove from List\n </button>\n }\n <button kendoButton\n (click)=\"onRefreshClick()\"\n fillMode=\"flat\"\n class=\"toolbar-button\">\n <span class=\"fa-solid fa-rotate\"></span>\n Refresh\n </button>\n <button kendoButton\n (click)=\"onExportClick()\"\n fillMode=\"flat\"\n class=\"toolbar-button\">\n <span class=\"fa-solid fa-file-export\"></span>\n Export\n </button>\n </div>\n </div>\n }\n\n <!-- Loading State -->\n @if (showLoader) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading list...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n <!-- Grid -->\n @if (!showLoader && listRecord) {\n <div class=\"grid-container\">\n <mj-list-detail-grid\n #listDetailGrid\n [listId]=\"ListID\"\n [listEntity]=\"listRecord\"\n [autoNavigate]=\"true\"\n [height]=\"'auto'\"\n [showToolbar]=\"false\"\n [toolbarConfig]=\"gridToolbarConfig\"\n [selectionMode]=\"'checkbox'\"\n (rowClicked)=\"onRowClicked($event)\"\n (rowDoubleClicked)=\"onRowDoubleClicked($event)\"\n (selectionChange)=\"onSelectionChange($event)\"\n (dataLoaded)=\"onDataLoaded($event)\">\n </mj-list-detail-grid>\n </div>\n }\n</div>\n\n<!-- Remove from List Confirmation Dialog -->\n@if (showRemoveDialog) {\n <kendo-dialog\n title=\"Remove from List\"\n (close)=\"closeRemoveDialog()\"\n [minWidth]=\"350\"\n [width]=\"450\">\n <div class=\"dialog-content\">\n @if (isRemoving) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Removing records...\" size=\"small\"></mj-loading>\n @if (removeTotal > 0) {\n <kendo-progressbar\n [min]=\"0\"\n [max]=\"removeTotal\"\n [value]=\"removeProgress\"\n [label]=\"false\"\n class=\"progress-bar\">\n </kendo-progressbar>\n }\n </div>\n } @else {\n <div class=\"dialog-message\">\n <span class=\"fa-solid fa-triangle-exclamation warning-icon\"></span>\n <p>Are you sure you want to remove <strong>{{ selectedKeys.length }}</strong> record{{ selectedKeys.length !== 1 ? 's' : '' }} from this list?</p>\n <p class=\"dialog-note\">This will not delete the records, only remove them from this list.</p>\n </div>\n }\n </div>\n <kendo-dialog-actions>\n <button kendoButton\n (click)=\"confirmRemoveFromList()\"\n [disabled]=\"isRemoving\"\n themeColor=\"error\">\n Remove\n </button>\n <button kendoButton\n (click)=\"closeRemoveDialog()\"\n [disabled]=\"isRemoving\"\n fillMode=\"outline\">\n Cancel\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n}\n\n<!-- Add Records Dialog -->\n@if (showAddRecordsDialog) {\n <kendo-dialog\n [title]=\"'Add ' + (listRecord?.Entity || 'Records') + ' to List'\"\n (close)=\"closeAddRecordsDialog()\"\n [minWidth]=\"500\"\n [width]=\"700\"\n [height]=\"650\">\n <div class=\"dialog-content add-records-dialog\">\n @if (addDialogSaving) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Adding records to list...\" size=\"small\"></mj-loading>\n @if (addTotal > 0) {\n <kendo-progressbar\n [min]=\"0\"\n [max]=\"addTotal\"\n [value]=\"addProgress\"\n [label]=\"false\"\n class=\"progress-bar\">\n </kendo-progressbar>\n }\n </div>\n } @else {\n <!-- Search Input -->\n <div class=\"search-section\">\n <kendo-textbox\n [placeholder]=\"'Search ' + (listRecord?.Entity || 'records') + '...'\"\n [clearButton]=\"true\"\n (valueChange)=\"onAddRecordsSearchChange($event)\"\n [value]=\"addRecordsSearchFilter\"\n class=\"search-input\">\n <ng-template kendoTextBoxPrefixTemplate>\n <span class=\"fa-solid fa-search search-icon\"></span>\n </ng-template>\n </kendo-textbox>\n <span class=\"search-hint\">Type at least 2 characters to search</span>\n </div>\n <!-- Records List -->\n <div class=\"records-list\">\n @if (addDialogLoading) {\n <div class=\"list-loading\">\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n </div>\n } @else if (addableRecords.length === 0 && addRecordsSearchFilter.length >= 2) {\n <div class=\"empty-results\">\n <span class=\"fa-solid fa-search empty-icon\"></span>\n <p>No records found matching \"{{ addRecordsSearchFilter }}\"</p>\n </div>\n } @else if (addableRecords.length === 0) {\n <div class=\"empty-results\">\n <span class=\"fa-solid fa-list empty-icon\"></span>\n <p>Search for records to add to this list</p>\n </div>\n } @else {\n <!-- Selection controls -->\n <div class=\"selection-controls\">\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"selectAllAddable()\">Select All</button>\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"deselectAllAddable()\">Deselect All</button>\n <span class=\"selection-info\">{{ selectedAddableRecords.length }} selected</span>\n </div>\n <!-- Records -->\n <div class=\"records-scroll\">\n @for (record of addableRecords; track record.ID) {\n <div class=\"record-item\"\n [class.in-list]=\"record.isInList\"\n [class.selected]=\"record.isSelected\"\n (click)=\"toggleRecordSelection(record)\">\n <div class=\"record-checkbox\">\n @if (record.isInList) {\n <span class=\"fa-solid fa-check in-list-icon\" title=\"Already in list\"></span>\n } @else {\n <input type=\"checkbox\"\n [checked]=\"record.isSelected\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRecordSelection(record)\">\n }\n </div>\n <div class=\"record-name\">{{ record.Name }}</div>\n @if (record.isInList) {\n <span class=\"in-list-badge\">In List</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n <kendo-dialog-actions>\n <button kendoButton\n (click)=\"confirmAddRecords()\"\n [disabled]=\"addDialogSaving || selectedAddableRecords.length === 0\"\n themeColor=\"info\">\n Add {{ selectedAddableRecords.length > 0 ? selectedAddableRecords.length : '' }} Record{{ selectedAddableRecords.length !== 1 ? 's' : '' }}\n </button>\n <button kendoButton\n (click)=\"closeAddRecordsDialog()\"\n [disabled]=\"addDialogSaving\"\n fillMode=\"outline\">\n Cancel\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n}\n\n<!-- Add From View Dialog -->\n@if (showAddFromViewDialog) {\n <kendo-dialog\n title=\"Add Records from Views\"\n (close)=\"closeAddFromViewDialog()\"\n [minWidth]=\"400\"\n [width]=\"600\"\n [height]=\"500\">\n <div class=\"dialog-content\">\n @if (showAddFromViewLoader && fetchingRecordsToSave) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Loading records from views...\" size=\"small\"></mj-loading>\n </div>\n } @else if (showAddFromViewLoader && addFromViewTotal > 0) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Adding records to list...\" size=\"small\"></mj-loading>\n <kendo-progressbar\n [min]=\"0\"\n [max]=\"addFromViewTotal\"\n [value]=\"addFromViewProgress\"\n [label]=\"false\"\n class=\"progress-bar\">\n </kendo-progressbar>\n </div>\n } @else if (showAddFromViewLoader) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Loading views...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <p class=\"dialog-instruction\">Select views to add their records to this list:</p>\n <div class=\"views-list\">\n @if (!userViews || userViews.length === 0) {\n <div class=\"empty-results\">\n <span class=\"fa-solid fa-folder-open empty-icon\"></span>\n <p>No saved views found for this entity</p>\n </div>\n } @else {\n @for (view of userViews; track view.ID) {\n <div class=\"view-item\"\n [class.selected]=\"isViewSelected(view)\"\n (click)=\"toggleViewSelection(view)\">\n <input type=\"checkbox\"\n [checked]=\"isViewSelected(view)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleViewSelection(view)\">\n <span class=\"fa-solid fa-table-list view-icon\"></span>\n <span class=\"view-name\">{{ view.Name }}</span>\n </div>\n }\n }\n </div>\n }\n </div>\n <kendo-dialog-actions>\n <button kendoButton\n (click)=\"confirmAddFromView()\"\n [disabled]=\"showAddFromViewLoader || userViewsToAdd.length === 0\"\n themeColor=\"info\">\n Add from {{ userViewsToAdd.length }} View{{ userViewsToAdd.length !== 1 ? 's' : '' }}\n </button>\n <button kendoButton\n (click)=\"closeAddFromViewDialog()\"\n [disabled]=\"showAddFromViewLoader\"\n fillMode=\"outline\">\n Cancel\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n}\n"]}
@@ -296,11 +296,11 @@ export class SingleSearchResultComponent {
296
296
  i0.ɵɵconditional(ctx.SearchState === "single-result" ? 12 : -1);
297
297
  i0.ɵɵadvance();
298
298
  i0.ɵɵconditional(ctx.SearchState === "viewer" && ctx.EntityInfo ? 13 : -1);
299
- } }, dependencies: [i2.LoadingComponent, i3.EntityViewerComponent, i4.DecimalPipe], styles: [".search-result-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n\n\n\n\n\n.content-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n background: white;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n gap: 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n}\n\n.header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n flex-wrap: wrap;\n}\n\n.entity-icon[_ngcontent-%COMP%] {\n font-size: 20px;\n color: #1976d2;\n}\n\n.entity-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #1a1a1a;\n}\n\n.record-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #666;\n font-weight: 500;\n}\n\n\n\n\n\n\n.header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n flex-shrink: 0;\n}\n\n\n\n.header-action-btn[_ngcontent-%COMP%] {\n position: relative;\n width: 36px;\n height: 36px;\n border: 1px solid #e0e0e0;\n background: white;\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n transition: all 0.15s ease;\n}\n.header-action-btn[_ngcontent-%COMP%]:hover {\n border-color: #1976d2;\n color: #1976d2;\n background: #f5f9ff;\n}\n.header-action-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n\n\n.view-mode-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: #f0f0f0;\n border-radius: 8px;\n padding: 3px;\n}\n\n.toggle-btn[_ngcontent-%COMP%] {\n width: 36px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n transition: all 0.15s ease;\n}\n.toggle-btn[_ngcontent-%COMP%]:hover {\n color: #333;\n}\n.toggle-btn.active[_ngcontent-%COMP%] {\n background: white;\n color: #1976d2;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n\n\n\n\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 48px 0;\n}\n\n\n\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 0;\n color: #666;\n}\n\n.empty-icon[_ngcontent-%COMP%] {\n font-size: 48px;\n color: #ccc;\n margin-bottom: 16px;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 4px 0;\n font-size: 15px;\n}\n\n.empty-hint[_ngcontent-%COMP%] {\n color: #999;\n font-size: 13px !important;\n}\n\n\n\n\n\n\n.single-result-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 0;\n color: #666;\n}\n\n.redirect-icon[_ngcontent-%COMP%] {\n font-size: 32px;\n color: #4a90d9;\n margin-bottom: 16px;\n}\n\n.single-result-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 15px;\n margin: 4px 0;\n}\n\n\n\n\n\n\n.viewer-container[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n}"] });
299
+ } }, dependencies: [i2.LoadingComponent, i3.EntityViewerComponent, i4.DecimalPipe], styles: [".search-result-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n\n\n\n\n\n.content-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n gap: 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n}\n\n.header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n flex-wrap: wrap;\n}\n\n.entity-icon[_ngcontent-%COMP%] {\n font-size: 20px;\n color: var(--mj-brand-primary);\n}\n\n.entity-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.record-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n\n\n\n\n\n.header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n flex-shrink: 0;\n}\n\n\n\n.header-action-btn[_ngcontent-%COMP%] {\n position: relative;\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n.header-action-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n.header-action-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n\n\n.view-mode-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 3px;\n}\n\n.toggle-btn[_ngcontent-%COMP%] {\n width: 36px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n.toggle-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n.toggle-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n\n\n\n\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 48px 0;\n}\n\n\n\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 0;\n color: var(--mj-text-secondary);\n}\n\n.empty-icon[_ngcontent-%COMP%] {\n font-size: 48px;\n color: var(--mj-border-strong);\n margin-bottom: 16px;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 4px 0;\n font-size: 15px;\n}\n\n.empty-hint[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 13px !important;\n}\n\n\n\n\n\n\n.single-result-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 0;\n color: var(--mj-text-secondary);\n}\n\n.redirect-icon[_ngcontent-%COMP%] {\n font-size: 32px;\n color: var(--mj-brand-primary);\n margin-bottom: 16px;\n}\n\n.single-result-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 15px;\n margin: 4px 0;\n}\n\n\n\n\n\n\n.viewer-container[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n}"] });
300
300
  }
301
301
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SingleSearchResultComponent, [{
302
302
  type: Component,
303
- args: [{ standalone: false, selector: 'mj-single-search-result', template: "<div class=\"search-result-container\">\n <!-- Content Header \u2014 matches Data Explorer layout -->\n <div class=\"content-header\">\n <div class=\"header-left\">\n <i [class]=\"EntityIcon\" class=\"entity-icon\"></i>\n <h2 class=\"entity-title\">{{ EntityInfo?.DisplayNameOrName || entity }}</h2>\n @if (SearchState === 'loading') {\n <span class=\"record-count\">Searching for \"{{ searchInput }}\"...</span>\n } @else if (SearchState === 'no-results') {\n <span class=\"record-count\">No results for \"{{ searchInput }}\"</span>\n } @else if (ResultCount > 0) {\n <span class=\"record-count\">{{ ResultCount | number }} {{ ResultCount === 1 ? 'result' : 'results' }} for \"{{ searchInput }}\"</span>\n }\n </div>\n\n @if (SearchState === 'viewer' && EntityInfo) {\n <div class=\"header-right\">\n <!-- New Record -->\n <button\n class=\"header-action-btn\"\n (click)=\"OnCreateNewRecord()\"\n title=\"New Record\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n\n <!-- View Mode Toggle -->\n <div class=\"view-mode-toggle\">\n <button\n class=\"toggle-btn\"\n [class.active]=\"CurrentViewMode === 'grid'\"\n (click)=\"SetViewMode('grid')\"\n title=\"Grid View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n <button\n class=\"toggle-btn\"\n [class.active]=\"CurrentViewMode === 'cards'\"\n (click)=\"SetViewMode('cards')\"\n title=\"Cards View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n @if (HasDateFields) {\n <button\n class=\"toggle-btn\"\n [class.active]=\"CurrentViewMode === 'timeline'\"\n (click)=\"SetViewMode('timeline')\"\n title=\"Timeline View\">\n <i class=\"fa-solid fa-timeline\"></i>\n </button>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Loading state -->\n @if (SearchState === 'loading') {\n <div class=\"loading-container\">\n <mj-loading text=\"Searching...\"></mj-loading>\n </div>\n }\n\n <!-- No results -->\n @if (SearchState === 'no-results') {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-magnifying-glass empty-icon\"></i>\n <p>No results found for \"<strong>{{ searchInput }}</strong>\" in {{ entity }}</p>\n <p class=\"empty-hint\">Try a different search term or entity</p>\n </div>\n }\n\n <!-- Single result \u2014 auto-navigating to entity form -->\n @if (SearchState === 'single-result') {\n <div class=\"single-result-state\">\n <i class=\"fa-solid fa-arrow-right redirect-icon\"></i>\n <p>Found 1 result &mdash; opening record...</p>\n </div>\n }\n\n <!-- Entity Viewer (2+ results) -->\n @if (SearchState === 'viewer' && EntityInfo) {\n <div class=\"viewer-container\">\n <mj-entity-viewer\n [entity]=\"EntityInfo\"\n [viewMode]=\"CurrentViewMode\"\n [filterText]=\"searchInput\"\n [config]=\"ViewerConfig\"\n [showGridToolbar]=\"true\"\n [gridToolbarConfig]=\"GridToolbarConfig\"\n (viewModeChange)=\"OnViewModeChanged($event)\"\n (dataLoaded)=\"OnDataLoaded($event)\"\n (recordOpened)=\"OnRecordOpened($event)\"\n (addRequested)=\"OnCreateNewRecord()\">\n </mj-entity-viewer>\n </div>\n }\n</div>\n", styles: [".search-result-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n/* ============================================\n CONTENT HEADER \u2014 matches Data Explorer layout\n ============================================ */\n\n.content-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n background: white;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n gap: 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n}\n\n.header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n flex-wrap: wrap;\n}\n\n.entity-icon {\n font-size: 20px;\n color: #1976d2;\n}\n\n.entity-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #1a1a1a;\n}\n\n.record-count {\n font-size: 13px;\n color: #666;\n font-weight: 500;\n}\n\n/* ============================================\n HEADER RIGHT \u2014 action buttons, view mode toggle\n ============================================ */\n\n.header-right {\n display: flex;\n align-items: center;\n gap: 16px;\n flex-shrink: 0;\n}\n\n/* Action Button (New Record, Export, etc.) */\n.header-action-btn {\n position: relative;\n width: 36px;\n height: 36px;\n border: 1px solid #e0e0e0;\n background: white;\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n transition: all 0.15s ease;\n}\n.header-action-btn:hover {\n border-color: #1976d2;\n color: #1976d2;\n background: #f5f9ff;\n}\n.header-action-btn i {\n font-size: 14px;\n}\n\n/* View Mode Toggle */\n.view-mode-toggle {\n display: flex;\n background: #f0f0f0;\n border-radius: 8px;\n padding: 3px;\n}\n\n.toggle-btn {\n width: 36px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n transition: all 0.15s ease;\n}\n.toggle-btn:hover {\n color: #333;\n}\n.toggle-btn.active {\n background: white;\n color: #1976d2;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* ============================================\n LOADING STATE\n ============================================ */\n\n.loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 48px 0;\n}\n\n/* ============================================\n EMPTY STATE\n ============================================ */\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 0;\n color: #666;\n}\n\n.empty-icon {\n font-size: 48px;\n color: #ccc;\n margin-bottom: 16px;\n}\n\n.empty-state p {\n margin: 4px 0;\n font-size: 15px;\n}\n\n.empty-hint {\n color: #999;\n font-size: 13px !important;\n}\n\n/* ============================================\n SINGLE RESULT \u2014 auto-nav state\n ============================================ */\n\n.single-result-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 0;\n color: #666;\n}\n\n.redirect-icon {\n font-size: 32px;\n color: #4a90d9;\n margin-bottom: 16px;\n}\n\n.single-result-state p {\n font-size: 15px;\n margin: 4px 0;\n}\n\n/* ============================================\n VIEWER CONTAINER\n ============================================ */\n\n.viewer-container {\n flex: 1;\n min-height: 0;\n}\n"] }]
303
+ args: [{ standalone: false, selector: 'mj-single-search-result', template: "<div class=\"search-result-container\">\n <!-- Content Header \u2014 matches Data Explorer layout -->\n <div class=\"content-header\">\n <div class=\"header-left\">\n <i [class]=\"EntityIcon\" class=\"entity-icon\"></i>\n <h2 class=\"entity-title\">{{ EntityInfo?.DisplayNameOrName || entity }}</h2>\n @if (SearchState === 'loading') {\n <span class=\"record-count\">Searching for \"{{ searchInput }}\"...</span>\n } @else if (SearchState === 'no-results') {\n <span class=\"record-count\">No results for \"{{ searchInput }}\"</span>\n } @else if (ResultCount > 0) {\n <span class=\"record-count\">{{ ResultCount | number }} {{ ResultCount === 1 ? 'result' : 'results' }} for \"{{ searchInput }}\"</span>\n }\n </div>\n\n @if (SearchState === 'viewer' && EntityInfo) {\n <div class=\"header-right\">\n <!-- New Record -->\n <button\n class=\"header-action-btn\"\n (click)=\"OnCreateNewRecord()\"\n title=\"New Record\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n\n <!-- View Mode Toggle -->\n <div class=\"view-mode-toggle\">\n <button\n class=\"toggle-btn\"\n [class.active]=\"CurrentViewMode === 'grid'\"\n (click)=\"SetViewMode('grid')\"\n title=\"Grid View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n <button\n class=\"toggle-btn\"\n [class.active]=\"CurrentViewMode === 'cards'\"\n (click)=\"SetViewMode('cards')\"\n title=\"Cards View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n @if (HasDateFields) {\n <button\n class=\"toggle-btn\"\n [class.active]=\"CurrentViewMode === 'timeline'\"\n (click)=\"SetViewMode('timeline')\"\n title=\"Timeline View\">\n <i class=\"fa-solid fa-timeline\"></i>\n </button>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Loading state -->\n @if (SearchState === 'loading') {\n <div class=\"loading-container\">\n <mj-loading text=\"Searching...\"></mj-loading>\n </div>\n }\n\n <!-- No results -->\n @if (SearchState === 'no-results') {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-magnifying-glass empty-icon\"></i>\n <p>No results found for \"<strong>{{ searchInput }}</strong>\" in {{ entity }}</p>\n <p class=\"empty-hint\">Try a different search term or entity</p>\n </div>\n }\n\n <!-- Single result \u2014 auto-navigating to entity form -->\n @if (SearchState === 'single-result') {\n <div class=\"single-result-state\">\n <i class=\"fa-solid fa-arrow-right redirect-icon\"></i>\n <p>Found 1 result &mdash; opening record...</p>\n </div>\n }\n\n <!-- Entity Viewer (2+ results) -->\n @if (SearchState === 'viewer' && EntityInfo) {\n <div class=\"viewer-container\">\n <mj-entity-viewer\n [entity]=\"EntityInfo\"\n [viewMode]=\"CurrentViewMode\"\n [filterText]=\"searchInput\"\n [config]=\"ViewerConfig\"\n [showGridToolbar]=\"true\"\n [gridToolbarConfig]=\"GridToolbarConfig\"\n (viewModeChange)=\"OnViewModeChanged($event)\"\n (dataLoaded)=\"OnDataLoaded($event)\"\n (recordOpened)=\"OnRecordOpened($event)\"\n (addRequested)=\"OnCreateNewRecord()\">\n </mj-entity-viewer>\n </div>\n }\n</div>\n", styles: [".search-result-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n/* ============================================\n CONTENT HEADER \u2014 matches Data Explorer layout\n ============================================ */\n\n.content-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n gap: 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n}\n\n.header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n flex-wrap: wrap;\n}\n\n.entity-icon {\n font-size: 20px;\n color: var(--mj-brand-primary);\n}\n\n.entity-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.record-count {\n font-size: 13px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n/* ============================================\n HEADER RIGHT \u2014 action buttons, view mode toggle\n ============================================ */\n\n.header-right {\n display: flex;\n align-items: center;\n gap: 16px;\n flex-shrink: 0;\n}\n\n/* Action Button (New Record, Export, etc.) */\n.header-action-btn {\n position: relative;\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n.header-action-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n.header-action-btn i {\n font-size: 14px;\n}\n\n/* View Mode Toggle */\n.view-mode-toggle {\n display: flex;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 3px;\n}\n\n.toggle-btn {\n width: 36px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n.toggle-btn:hover {\n color: var(--mj-text-primary);\n}\n.toggle-btn.active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* ============================================\n LOADING STATE\n ============================================ */\n\n.loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 48px 0;\n}\n\n/* ============================================\n EMPTY STATE\n ============================================ */\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 0;\n color: var(--mj-text-secondary);\n}\n\n.empty-icon {\n font-size: 48px;\n color: var(--mj-border-strong);\n margin-bottom: 16px;\n}\n\n.empty-state p {\n margin: 4px 0;\n font-size: 15px;\n}\n\n.empty-hint {\n color: var(--mj-text-disabled);\n font-size: 13px !important;\n}\n\n/* ============================================\n SINGLE RESULT \u2014 auto-nav state\n ============================================ */\n\n.single-result-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 0;\n color: var(--mj-text-secondary);\n}\n\n.redirect-icon {\n font-size: 32px;\n color: var(--mj-brand-primary);\n margin-bottom: 16px;\n}\n\n.single-result-state p {\n font-size: 15px;\n margin: 4px 0;\n}\n\n/* ============================================\n VIEWER CONTAINER\n ============================================ */\n\n.viewer-container {\n flex: 1;\n min-height: 0;\n}\n"] }]
304
304
  }], () => [{ type: i1.NavigationService }, { type: i0.ChangeDetectorRef }], { entity: [{
305
305
  type: Input
306
306
  }], searchInput: [{
@@ -120,7 +120,7 @@ export class SystemValidationBannerComponent {
120
120
  i0.ɵɵconditionalCreate(0, SystemValidationBannerComponent_Conditional_0_Template, 5, 1, "div", 0);
121
121
  } if (rf & 2) {
122
122
  i0.ɵɵconditional(ctx.issues.length > 0 ? 0 : -1);
123
- } }, dependencies: [CommonModule, i2.NgClass], styles: [".system-validation-wrapper[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 10000;\n pointer-events: none;\n }\n \n .system-validation-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 10001;\n pointer-events: auto;\n }\n \n .system-validation-container[_ngcontent-%COMP%] {\n position: fixed;\n top: 60px;\n left: 0;\n right: 0;\n z-index: 10002;\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 16px;\n max-height: 80vh;\n overflow-y: auto;\n pointer-events: auto;\n }\n\n .system-validation-banner[_ngcontent-%COMP%] {\n border-radius: 4px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n padding: 16px;\n animation: _ngcontent-%COMP%_slide-down 0.3s ease-out;\n }\n\n .system-validation-error[_ngcontent-%COMP%] {\n background-color: #ffebee;\n border-left: 4px solid #f44336;\n }\n\n .system-validation-warning[_ngcontent-%COMP%] {\n background-color: #fff8e1;\n border-left: 4px solid #ff9800;\n }\n\n .system-validation-info[_ngcontent-%COMP%] {\n background-color: #e3f2fd;\n border-left: 4px solid #2196f3;\n }\n\n .banner-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n }\n\n .banner-icon[_ngcontent-%COMP%] {\n margin-right: 16px;\n font-size: 24px;\n }\n\n .severity-icon[_ngcontent-%COMP%] {\n font-size: 18px;\n }\n\n .severity-error[_ngcontent-%COMP%] {\n color: #f44336;\n }\n\n .severity-warning[_ngcontent-%COMP%] {\n color: #ff9800;\n }\n\n .severity-info[_ngcontent-%COMP%] {\n color: #2196f3;\n }\n\n .banner-message[_ngcontent-%COMP%] {\n flex: 1;\n }\n\n .banner-message[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n }\n\n .banner-message[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 4px 0 0 0;\n font-size: 14px;\n }\n\n .help-text[_ngcontent-%COMP%] {\n font-style: italic;\n }\n\n .dismiss-button[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n cursor: pointer;\n font-size: 16px;\n color: #666;\n padding: 4px;\n }\n\n .dismiss-button[_ngcontent-%COMP%]:hover {\n color: #333;\n }\n\n @keyframes _ngcontent-%COMP%_slide-down {\n 0% {\n transform: translateY(-20px);\n opacity: 0;\n }\n 100% {\n transform: translateY(0);\n opacity: 1;\n }\n }"] });
123
+ } }, dependencies: [CommonModule, i2.NgClass], styles: [".system-validation-wrapper[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 10000;\n pointer-events: none;\n }\n \n .system-validation-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 10001;\n pointer-events: auto;\n }\n \n .system-validation-container[_ngcontent-%COMP%] {\n position: fixed;\n top: 60px;\n left: 0;\n right: 0;\n z-index: 10002;\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 16px;\n max-height: 80vh;\n overflow-y: auto;\n pointer-events: auto;\n }\n\n .system-validation-banner[_ngcontent-%COMP%] {\n border-radius: 4px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n padding: 16px;\n animation: _ngcontent-%COMP%_slide-down 0.3s ease-out;\n }\n\n .system-validation-error[_ngcontent-%COMP%] {\n background-color: #ffebee;\n border-left: 4px solid #f44336;\n }\n\n .system-validation-warning[_ngcontent-%COMP%] {\n background-color: #fff8e1;\n border-left: 4px solid #ff9800;\n }\n\n .system-validation-info[_ngcontent-%COMP%] {\n background-color: #e3f2fd;\n border-left: 4px solid #2196f3;\n }\n\n .banner-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n }\n\n .banner-icon[_ngcontent-%COMP%] {\n margin-right: 16px;\n font-size: 24px;\n }\n\n .severity-icon[_ngcontent-%COMP%] {\n font-size: 18px;\n }\n\n .severity-error[_ngcontent-%COMP%] {\n color: #f44336;\n }\n\n .severity-warning[_ngcontent-%COMP%] {\n color: #ff9800;\n }\n\n .severity-info[_ngcontent-%COMP%] {\n color: #2196f3;\n }\n\n .banner-message[_ngcontent-%COMP%] {\n flex: 1;\n }\n\n .banner-message[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n }\n\n .banner-message[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 4px 0 0 0;\n font-size: 14px;\n }\n\n .help-text[_ngcontent-%COMP%] {\n font-style: italic;\n }\n\n .dismiss-button[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n cursor: pointer;\n font-size: 16px;\n color: var(--mj-text-secondary);\n padding: 4px;\n }\n\n .dismiss-button[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n }\n\n @keyframes _ngcontent-%COMP%_slide-down {\n 0% {\n transform: translateY(-20px);\n opacity: 0;\n }\n 100% {\n transform: translateY(0);\n opacity: 1;\n }\n }"] });
124
124
  }
125
125
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SystemValidationBannerComponent, [{
126
126
  type: Component,
@@ -170,7 +170,7 @@ export class SystemValidationBannerComponent {
170
170
  </div>
171
171
  </div>
172
172
  }
173
- `, styles: ["\n .system-validation-wrapper {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 10000;\n pointer-events: none;\n }\n \n .system-validation-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 10001;\n pointer-events: auto;\n }\n \n .system-validation-container {\n position: fixed;\n top: 60px;\n left: 0;\n right: 0;\n z-index: 10002;\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 16px;\n max-height: 80vh;\n overflow-y: auto;\n pointer-events: auto;\n }\n\n .system-validation-banner {\n border-radius: 4px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n padding: 16px;\n animation: slide-down 0.3s ease-out;\n }\n\n .system-validation-error {\n background-color: #ffebee;\n border-left: 4px solid #f44336;\n }\n\n .system-validation-warning {\n background-color: #fff8e1;\n border-left: 4px solid #ff9800;\n }\n\n .system-validation-info {\n background-color: #e3f2fd;\n border-left: 4px solid #2196f3;\n }\n\n .banner-content {\n display: flex;\n align-items: flex-start;\n }\n\n .banner-icon {\n margin-right: 16px;\n font-size: 24px;\n }\n\n .severity-icon {\n font-size: 18px;\n }\n\n .severity-error {\n color: #f44336;\n }\n\n .severity-warning {\n color: #ff9800;\n }\n\n .severity-info {\n color: #2196f3;\n }\n\n .banner-message {\n flex: 1;\n }\n\n .banner-message h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n }\n\n .banner-message p {\n margin: 4px 0 0 0;\n font-size: 14px;\n }\n\n .help-text {\n font-style: italic;\n }\n\n .dismiss-button {\n background: transparent;\n border: none;\n cursor: pointer;\n font-size: 16px;\n color: #666;\n padding: 4px;\n }\n\n .dismiss-button:hover {\n color: #333;\n }\n\n @keyframes slide-down {\n 0% {\n transform: translateY(-20px);\n opacity: 0;\n }\n 100% {\n transform: translateY(0);\n opacity: 1;\n }\n }\n "] }]
173
+ `, styles: ["\n .system-validation-wrapper {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 10000;\n pointer-events: none;\n }\n \n .system-validation-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 10001;\n pointer-events: auto;\n }\n \n .system-validation-container {\n position: fixed;\n top: 60px;\n left: 0;\n right: 0;\n z-index: 10002;\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 16px;\n max-height: 80vh;\n overflow-y: auto;\n pointer-events: auto;\n }\n\n .system-validation-banner {\n border-radius: 4px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n padding: 16px;\n animation: slide-down 0.3s ease-out;\n }\n\n .system-validation-error {\n background-color: #ffebee;\n border-left: 4px solid #f44336;\n }\n\n .system-validation-warning {\n background-color: #fff8e1;\n border-left: 4px solid #ff9800;\n }\n\n .system-validation-info {\n background-color: #e3f2fd;\n border-left: 4px solid #2196f3;\n }\n\n .banner-content {\n display: flex;\n align-items: flex-start;\n }\n\n .banner-icon {\n margin-right: 16px;\n font-size: 24px;\n }\n\n .severity-icon {\n font-size: 18px;\n }\n\n .severity-error {\n color: #f44336;\n }\n\n .severity-warning {\n color: #ff9800;\n }\n\n .severity-info {\n color: #2196f3;\n }\n\n .banner-message {\n flex: 1;\n }\n\n .banner-message h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n }\n\n .banner-message p {\n margin: 4px 0 0 0;\n font-size: 14px;\n }\n\n .help-text {\n font-style: italic;\n }\n\n .dismiss-button {\n background: transparent;\n border: none;\n cursor: pointer;\n font-size: 16px;\n color: var(--mj-text-secondary);\n padding: 4px;\n }\n\n .dismiss-button:hover {\n color: var(--mj-text-primary);\n }\n\n @keyframes slide-down {\n 0% {\n transform: translateY(-20px);\n opacity: 0;\n }\n 100% {\n transform: translateY(0);\n opacity: 1;\n }\n }\n "] }]
174
174
  }], () => [{ type: i1.SystemValidationService }], null); })();
175
175
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SystemValidationBannerComponent, { className: "SystemValidationBannerComponent", filePath: "src/lib/system-validation/system-validation-banner.component.ts", lineNumber: 186 }); })();
176
176
  //# sourceMappingURL=system-validation-banner.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"system-validation-banner.component.js","sourceRoot":"","sources":["../../../src/lib/system-validation/system-validation-banner.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,eAAe,CAAC;AAG7D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;;;;;IAWrC,yBAA6C;;;IAUnC,+BAA2C;IAAA,sBAAC;IAAA,iBAAO;;;IAGnD,+BAA6C;IAAA,4BAAE;IAAA,iBAAO;;;IAGtD,+BAA0C;IAAA,4BAAE;IAAA,iBAAO;;;IAMnD,yBAAG;IAAA,YAAmB;IAAA,iBAAI;;;IAAvB,cAAmB;IAAnB,sCAAmB;;;IAGtB,6BAAqB;IAAA,YAAgB;IAAA,iBAAI;;;IAApB,cAAgB;IAAhB,mCAAgB;;;;IAKrC,kCAAqF;IAA7E,wQAAS,gCAAsB,KAAC;IACtC,wBACF;IAAA,iBAAS;;;IAxBb,AADF,AAHF,8BAEoD,aACtB,aACD;IACvB,sHAAkC;IAGlC,sHAAoC;IAGpC,sHAAiC;IAGnC,iBAAM;IAEJ,AADF,8BAA4B,SACtB;IAAA,YAAmB;IAAA,iBAAK;IAC5B,gHAAqB;IAGrB,sHAAkB;IAGpB,iBAAM;IACN,gCAA0B;IACxB,2HAAkC;IAOxC,AADE,AADE,iBAAM,EACF,EACF;;;IA9BJ,kEAAiD;IAG7C,eAEC;IAFD,wDAEC;IACD,cAEC;IAFD,0DAEC;IACD,cAEC;IAFD,uDAEC;IAGG,eAAmB;IAAnB,sCAAmB;IACvB,cAEC;IAFD,2CAEC;IACD,cAEC;IAFD,yCAEC;IAGD,eAIC;IAJD,yDAIC;;;IApCb,8BAAuC;IAErC,+GAAiB;IAGjB,8BAAyC;IACvC,mIAkCC;IAEL,AADE,iBAAM,EACF;;;IAxCJ,cAEC;IAFD,2CAEC;IAEC,eAkCC;IAlCD,4BAkCC;;AAsIX,MAAM,OAAO,+BAA+B;IAKtB;IAJpB,MAAM,GAA4B,EAAE,CAAC;IACrC,SAAS,GAAG,KAAK,CAAC;IACV,YAAY,CAA2B;IAE/C,YAAoB,iBAA0C;QAA1C,sBAAiB,GAAjB,iBAAiB,CAAyB;IAAI,CAAC;IAEnE,QAAQ;QACN,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;YAC9E,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YAErB,4CAA4C;YAC5C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;QAClC,CAAC;IACH,CAAC;IAED,YAAY,CAAC,EAAU;QACrB,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC;yHAxBU,+BAA+B;6DAA/B,+BAA+B;YA/KxC,iGAAyB;;YAAzB,gDA4CC;4BA9CO,YAAY;;iFAiLX,+BAA+B;cApL3C,SAAS;2BACE,6BAA6B,cAC3B,IAAI,WACP,CAAC,YAAY,CAAC,YACb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA8CP;;kFAkIQ,+BAA+B","sourcesContent":["import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { SystemValidationService, SystemValidationIssue } from '../services/system-validation.service';\nimport { Subscription } from 'rxjs';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'mj-system-validation-banner',\n standalone: true,\n imports: [CommonModule],\n template: `\n @if (issues.length > 0) {\n <div class=\"system-validation-wrapper\">\n <!-- Dark overlay for serious errors -->\n @if (hasErrors) {\n <div class=\"system-validation-overlay\"></div>\n }\n <div class=\"system-validation-container\">\n @for (issue of issues; track issue) {\n <div\n class=\"system-validation-banner\"\n [ngClass]=\"'system-validation-' + issue.severity\">\n <div class=\"banner-content\">\n <div class=\"banner-icon\">\n @if (issue.severity === 'error') {\n <span class=\"severity-icon severity-error\">❌</span>\n }\n @if (issue.severity === 'warning') {\n <span class=\"severity-icon severity-warning\">⚠️</span>\n }\n @if (issue.severity === 'info') {\n <span class=\"severity-icon severity-info\">ℹ️</span>\n }\n </div>\n <div class=\"banner-message\">\n <h3>{{ issue.message }}</h3>\n @if (issue.details) {\n <p>{{ issue.details }}</p>\n }\n @if (issue.help) {\n <p class=\"help-text\">{{ issue.help }}</p>\n }\n </div>\n <div class=\"banner-close\">\n @if (issue.severity !== 'error') {\n <button (click)=\"dismissIssue(issue.id)\" aria-label=\"Dismiss\" class=\"dismiss-button\">\n ✕\n </button>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n `,\n styles: [`\n .system-validation-wrapper {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 10000;\n pointer-events: none;\n }\n \n .system-validation-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 10001;\n pointer-events: auto;\n }\n \n .system-validation-container {\n position: fixed;\n top: 60px;\n left: 0;\n right: 0;\n z-index: 10002;\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 16px;\n max-height: 80vh;\n overflow-y: auto;\n pointer-events: auto;\n }\n\n .system-validation-banner {\n border-radius: 4px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n padding: 16px;\n animation: slide-down 0.3s ease-out;\n }\n\n .system-validation-error {\n background-color: #ffebee;\n border-left: 4px solid #f44336;\n }\n\n .system-validation-warning {\n background-color: #fff8e1;\n border-left: 4px solid #ff9800;\n }\n\n .system-validation-info {\n background-color: #e3f2fd;\n border-left: 4px solid #2196f3;\n }\n\n .banner-content {\n display: flex;\n align-items: flex-start;\n }\n\n .banner-icon {\n margin-right: 16px;\n font-size: 24px;\n }\n\n .severity-icon {\n font-size: 18px;\n }\n\n .severity-error {\n color: #f44336;\n }\n\n .severity-warning {\n color: #ff9800;\n }\n\n .severity-info {\n color: #2196f3;\n }\n\n .banner-message {\n flex: 1;\n }\n\n .banner-message h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n }\n\n .banner-message p {\n margin: 4px 0 0 0;\n font-size: 14px;\n }\n\n .help-text {\n font-style: italic;\n }\n\n .dismiss-button {\n background: transparent;\n border: none;\n cursor: pointer;\n font-size: 16px;\n color: #666;\n padding: 4px;\n }\n\n .dismiss-button:hover {\n color: #333;\n }\n\n @keyframes slide-down {\n 0% {\n transform: translateY(-20px);\n opacity: 0;\n }\n 100% {\n transform: translateY(0);\n opacity: 1;\n }\n }\n `]\n})\nexport class SystemValidationBannerComponent implements OnInit, OnDestroy {\n issues: SystemValidationIssue[] = [];\n hasErrors = false;\n private subscription: Subscription | undefined;\n\n constructor(private validationService: SystemValidationService) { }\n\n ngOnInit() {\n this.subscription = this.validationService.validationIssues$.subscribe(issues => {\n this.issues = issues;\n \n // Check if there are any error-level issues\n this.hasErrors = issues.some(issue => issue.severity === 'error');\n });\n }\n\n ngOnDestroy() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n\n dismissIssue(id: string) {\n this.validationService.removeIssue(id);\n }\n}"]}
1
+ {"version":3,"file":"system-validation-banner.component.js","sourceRoot":"","sources":["../../../src/lib/system-validation/system-validation-banner.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,eAAe,CAAC;AAG7D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;;;;;IAWrC,yBAA6C;;;IAUnC,+BAA2C;IAAA,sBAAC;IAAA,iBAAO;;;IAGnD,+BAA6C;IAAA,4BAAE;IAAA,iBAAO;;;IAGtD,+BAA0C;IAAA,4BAAE;IAAA,iBAAO;;;IAMnD,yBAAG;IAAA,YAAmB;IAAA,iBAAI;;;IAAvB,cAAmB;IAAnB,sCAAmB;;;IAGtB,6BAAqB;IAAA,YAAgB;IAAA,iBAAI;;;IAApB,cAAgB;IAAhB,mCAAgB;;;;IAKrC,kCAAqF;IAA7E,wQAAS,gCAAsB,KAAC;IACtC,wBACF;IAAA,iBAAS;;;IAxBb,AADF,AAHF,8BAEoD,aACtB,aACD;IACvB,sHAAkC;IAGlC,sHAAoC;IAGpC,sHAAiC;IAGnC,iBAAM;IAEJ,AADF,8BAA4B,SACtB;IAAA,YAAmB;IAAA,iBAAK;IAC5B,gHAAqB;IAGrB,sHAAkB;IAGpB,iBAAM;IACN,gCAA0B;IACxB,2HAAkC;IAOxC,AADE,AADE,iBAAM,EACF,EACF;;;IA9BJ,kEAAiD;IAG7C,eAEC;IAFD,wDAEC;IACD,cAEC;IAFD,0DAEC;IACD,cAEC;IAFD,uDAEC;IAGG,eAAmB;IAAnB,sCAAmB;IACvB,cAEC;IAFD,2CAEC;IACD,cAEC;IAFD,yCAEC;IAGD,eAIC;IAJD,yDAIC;;;IApCb,8BAAuC;IAErC,+GAAiB;IAGjB,8BAAyC;IACvC,mIAkCC;IAEL,AADE,iBAAM,EACF;;;IAxCJ,cAEC;IAFD,2CAEC;IAEC,eAkCC;IAlCD,4BAkCC;;AAsIX,MAAM,OAAO,+BAA+B;IAKtB;IAJpB,MAAM,GAA4B,EAAE,CAAC;IACrC,SAAS,GAAG,KAAK,CAAC;IACV,YAAY,CAA2B;IAE/C,YAAoB,iBAA0C;QAA1C,sBAAiB,GAAjB,iBAAiB,CAAyB;IAAI,CAAC;IAEnE,QAAQ;QACN,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;YAC9E,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YAErB,4CAA4C;YAC5C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;QAClC,CAAC;IACH,CAAC;IAED,YAAY,CAAC,EAAU;QACrB,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC;yHAxBU,+BAA+B;6DAA/B,+BAA+B;YA/KxC,iGAAyB;;YAAzB,gDA4CC;4BA9CO,YAAY;;iFAiLX,+BAA+B;cApL3C,SAAS;2BACE,6BAA6B,cAC3B,IAAI,WACP,CAAC,YAAY,CAAC,YACb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA8CP;;kFAkIQ,+BAA+B","sourcesContent":["import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { SystemValidationService, SystemValidationIssue } from '../services/system-validation.service';\nimport { Subscription } from 'rxjs';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'mj-system-validation-banner',\n standalone: true,\n imports: [CommonModule],\n template: `\n @if (issues.length > 0) {\n <div class=\"system-validation-wrapper\">\n <!-- Dark overlay for serious errors -->\n @if (hasErrors) {\n <div class=\"system-validation-overlay\"></div>\n }\n <div class=\"system-validation-container\">\n @for (issue of issues; track issue) {\n <div\n class=\"system-validation-banner\"\n [ngClass]=\"'system-validation-' + issue.severity\">\n <div class=\"banner-content\">\n <div class=\"banner-icon\">\n @if (issue.severity === 'error') {\n <span class=\"severity-icon severity-error\">❌</span>\n }\n @if (issue.severity === 'warning') {\n <span class=\"severity-icon severity-warning\">⚠️</span>\n }\n @if (issue.severity === 'info') {\n <span class=\"severity-icon severity-info\">ℹ️</span>\n }\n </div>\n <div class=\"banner-message\">\n <h3>{{ issue.message }}</h3>\n @if (issue.details) {\n <p>{{ issue.details }}</p>\n }\n @if (issue.help) {\n <p class=\"help-text\">{{ issue.help }}</p>\n }\n </div>\n <div class=\"banner-close\">\n @if (issue.severity !== 'error') {\n <button (click)=\"dismissIssue(issue.id)\" aria-label=\"Dismiss\" class=\"dismiss-button\">\n ✕\n </button>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n `,\n styles: [`\n .system-validation-wrapper {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 10000;\n pointer-events: none;\n }\n \n .system-validation-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 10001;\n pointer-events: auto;\n }\n \n .system-validation-container {\n position: fixed;\n top: 60px;\n left: 0;\n right: 0;\n z-index: 10002;\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 16px;\n max-height: 80vh;\n overflow-y: auto;\n pointer-events: auto;\n }\n\n .system-validation-banner {\n border-radius: 4px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n padding: 16px;\n animation: slide-down 0.3s ease-out;\n }\n\n .system-validation-error {\n background-color: #ffebee;\n border-left: 4px solid #f44336;\n }\n\n .system-validation-warning {\n background-color: #fff8e1;\n border-left: 4px solid #ff9800;\n }\n\n .system-validation-info {\n background-color: #e3f2fd;\n border-left: 4px solid #2196f3;\n }\n\n .banner-content {\n display: flex;\n align-items: flex-start;\n }\n\n .banner-icon {\n margin-right: 16px;\n font-size: 24px;\n }\n\n .severity-icon {\n font-size: 18px;\n }\n\n .severity-error {\n color: #f44336;\n }\n\n .severity-warning {\n color: #ff9800;\n }\n\n .severity-info {\n color: #2196f3;\n }\n\n .banner-message {\n flex: 1;\n }\n\n .banner-message h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n }\n\n .banner-message p {\n margin: 4px 0 0 0;\n font-size: 14px;\n }\n\n .help-text {\n font-style: italic;\n }\n\n .dismiss-button {\n background: transparent;\n border: none;\n cursor: pointer;\n font-size: 16px;\n color: var(--mj-text-secondary);\n padding: 4px;\n }\n\n .dismiss-button:hover {\n color: var(--mj-text-primary);\n }\n\n @keyframes slide-down {\n 0% {\n transform: translateY(-20px);\n opacity: 0;\n }\n 100% {\n transform: translateY(0);\n opacity: 1;\n }\n }\n `]\n})\nexport class SystemValidationBannerComponent implements OnInit, OnDestroy {\n issues: SystemValidationIssue[] = [];\n hasErrors = false;\n private subscription: Subscription | undefined;\n\n constructor(private validationService: SystemValidationService) { }\n\n ngOnInit() {\n this.subscription = this.validationService.validationIssues$.subscribe(issues => {\n this.issues = issues;\n \n // Check if there are any error-level issues\n this.hasErrors = issues.some(issue => issue.severity === 'error');\n });\n }\n\n ngOnDestroy() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n\n dismissIssue(id: string) {\n this.validationService.removeIssue(id);\n }\n}"]}
@@ -1,8 +1,9 @@
1
1
  import { ElementRef, AfterViewInit, OnInit } from '@angular/core';
2
- import { SharedService } from '@memberjunction/ng-shared';
2
+ import { SharedService, NavigationService } from '@memberjunction/ng-shared';
3
3
  import { MJUserNotificationEntity, MJUserNotificationTypeEntity } from '@memberjunction/core-entities';
4
4
  import { TransactionGroupBase } from '@memberjunction/core';
5
5
  import { Router } from '@angular/router';
6
+ import { ApplicationManager } from '@memberjunction/ng-base-application';
6
7
  import * as i0 from "@angular/core";
7
8
  /**
8
9
  * Radio button filter options for notification read status
@@ -18,6 +19,8 @@ interface NotificationUrlInfo {
18
19
  export declare class UserNotificationsComponent implements OnInit, AfterViewInit {
19
20
  sharedService: SharedService;
20
21
  private router;
22
+ private navigationService;
23
+ private appManager;
21
24
  allRadio: ElementRef<HTMLInputElement>;
22
25
  unreadRadio: ElementRef<HTMLInputElement>;
23
26
  readRadio: ElementRef<HTMLInputElement>;
@@ -26,7 +29,7 @@ export declare class UserNotificationsComponent implements OnInit, AfterViewInit
26
29
  notificationTypes: MJUserNotificationTypeEntity[];
27
30
  selectedTypeFilter: string | null;
28
31
  loadingTypes: boolean;
29
- constructor(sharedService: SharedService, router: Router);
32
+ constructor(sharedService: SharedService, router: Router, navigationService: NavigationService, appManager: ApplicationManager);
30
33
  ngOnInit(): Promise<void>;
31
34
  ngAfterViewInit(): void;
32
35
  private loadNotificationTypes;
@@ -47,6 +50,16 @@ export declare class UserNotificationsComponent implements OnInit, AfterViewInit
47
50
  markAllAsUnread(): Promise<void>;
48
51
  markAll(bRead: boolean): Promise<void>;
49
52
  notificationClicked(notification: MJUserNotificationEntity): void;
53
+ /**
54
+ * Handle navigation to an agent request via NavigationService.
55
+ * Returns true if the notification was an agent-request type and navigation was attempted.
56
+ */
57
+ private navigateToAgentRequest;
58
+ /**
59
+ * Handle navigation to a conversation via NavigationService.
60
+ * Returns true if the notification was a conversation type and navigation was attempted.
61
+ */
62
+ private navigateToConversation;
50
63
  getNotificationType(typeId: string | null): MJUserNotificationTypeEntity | null;
51
64
  getTypeIcon(notification: MJUserNotificationEntity): string;
52
65
  getTypeColor(notification: MJUserNotificationEntity): string;
@@ -1 +1 @@
1
- {"version":3,"file":"user-notifications.component.d.ts","sourceRoot":"","sources":["../../../src/lib/user-notifications/user-notifications.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAoD,wBAAwB,EAAE,4BAA4B,EAAkB,MAAM,+BAA+B,CAAC;AACzK,OAAO,EAAY,oBAAoB,EAAuB,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;;AAIzC;;GAEG;AACH,KAAK,gBAAgB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAqBlD;;GAEG;AACH,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAMa,0BAA2B,YAAW,MAAM,EAAE,aAAa;IAWlD,aAAa,EAAE,aAAa;IAAE,OAAO,CAAC,MAAM;IAVzC,QAAQ,EAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IACrC,WAAW,EAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC7C,SAAS,EAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAE1D,aAAa,EAAE,gBAAgB,CAAS;IACxC,aAAa,EAAE,MAAM,CAAM;IAC3B,iBAAiB,EAAE,4BAA4B,EAAE,CAAM;IACvD,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACzC,YAAY,EAAE,OAAO,CAAQ;gBAEhB,aAAa,EAAE,aAAa,EAAU,MAAM,EAAE,MAAM;IAElE,QAAQ;IAId,eAAe,IAAI,IAAI;IAIvB,OAAO,CAAC,qBAAqB;IAc7B,IAAW,mBAAmB,IAAI,wBAAwB,EAAE,CA4B3D;IAEM,uBAAuB,CAAC,YAAY,EAAE,wBAAwB,GAAG,OAAO;IAKxE,eAAe,CAAC,YAAY,EAAE,wBAAwB,GAAG,mBAAmB;IAkDnF,IAAW,gBAAgB,IAAI,wBAAwB,EAAE,CAExD;IAED,IAAW,mBAAmB,IAAI,wBAAwB,EAAE,CAE3D;IAED,IAAW,iBAAiB,IAAI,wBAAwB,EAAE,CAEzD;IAED,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAgBhD,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAMtC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIpC,iBAAiB,CAAC,YAAY,EAAE,wBAAwB,GAAG,MAAM;IAOjE,mBAAmB,CAAC,YAAY,EAAE,wBAAwB,GAAG,MAAM;IAY7D,UAAU,CAAC,YAAY,EAAE,wBAAwB,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,oBAAoB,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAoCtH,aAAa;IAOb,6BAA6B;IAkC7B,eAAe;IAIf,OAAO,CAAC,KAAK,EAAE,OAAO;IAoBnC,mBAAmB,CAAC,YAAY,EAAE,wBAAwB,GAAG,IAAI;IAgB1D,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,4BAA4B,GAAG,IAAI;IAK/E,WAAW,CAAC,YAAY,EAAE,wBAAwB,GAAG,MAAM;IAK3D,YAAY,CAAC,YAAY,EAAE,wBAAwB,GAAG,MAAM;IAK5D,WAAW,CAAC,YAAY,EAAE,wBAAwB,GAAG,MAAM;IAK3D,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;yCA1T3C,0BAA0B;2CAA1B,0BAA0B;CA6TtC"}
1
+ {"version":3,"file":"user-notifications.component.d.ts","sourceRoot":"","sources":["../../../src/lib/user-notifications/user-notifications.component.ts"],"names":[],"mappings":"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"}