@memberjunction/ng-explorer-core 6.1.4 → 6.2.0-edge.1

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 (184) hide show
  1. package/dist/app-routing.module.d.ts +23 -1
  2. package/dist/app-routing.module.d.ts.map +1 -1
  3. package/dist/app-routing.module.js +73 -17
  4. package/dist/app-routing.module.js.map +1 -1
  5. package/dist/generated/lazy-feature-config.d.ts +1 -1
  6. package/dist/generated/lazy-feature-config.d.ts.map +1 -1
  7. package/dist/generated/lazy-feature-config.js +1 -8
  8. package/dist/generated/lazy-feature-config.js.map +1 -1
  9. package/dist/lib/command-palette/command-palette.component.d.ts +7 -1
  10. package/dist/lib/command-palette/command-palette.component.d.ts.map +1 -1
  11. package/dist/lib/command-palette/command-palette.component.js +28 -14
  12. package/dist/lib/command-palette/command-palette.component.js.map +1 -1
  13. package/dist/lib/conversation-feedback/conversation-feedback.d.ts +103 -13
  14. package/dist/lib/conversation-feedback/conversation-feedback.d.ts.map +1 -1
  15. package/dist/lib/conversation-feedback/conversation-feedback.js +219 -67
  16. package/dist/lib/conversation-feedback/conversation-feedback.js.map +1 -1
  17. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.d.ts +64 -10
  18. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.d.ts.map +1 -1
  19. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js +172 -66
  20. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js.map +1 -1
  21. package/dist/lib/generic/resource-container-component.d.ts +19 -5
  22. package/dist/lib/generic/resource-container-component.d.ts.map +1 -1
  23. package/dist/lib/generic/resource-container-component.js +43 -13
  24. package/dist/lib/generic/resource-container-component.js.map +1 -1
  25. package/dist/lib/guards/entities.guard.d.ts +4 -0
  26. package/dist/lib/guards/entities.guard.d.ts.map +1 -1
  27. package/dist/lib/guards/entities.guard.js +10 -2
  28. package/dist/lib/guards/entities.guard.js.map +1 -1
  29. package/dist/lib/identity-claims/claim-redeem.component.d.ts +4 -0
  30. package/dist/lib/identity-claims/claim-redeem.component.d.ts.map +1 -1
  31. package/dist/lib/identity-claims/claim-redeem.component.js +10 -2
  32. package/dist/lib/identity-claims/claim-redeem.component.js.map +1 -1
  33. package/dist/lib/oauth/oauth-callback.component.d.ts +4 -0
  34. package/dist/lib/oauth/oauth-callback.component.d.ts.map +1 -1
  35. package/dist/lib/oauth/oauth-callback.component.js +10 -2
  36. package/dist/lib/oauth/oauth-callback.component.js.map +1 -1
  37. package/dist/lib/profile/profile-dialog.component.d.ts.map +1 -1
  38. package/dist/lib/profile/profile-dialog.component.js +194 -191
  39. package/dist/lib/profile/profile-dialog.component.js.map +1 -1
  40. package/dist/lib/resource-wrappers/artifact-resource.component.d.ts +20 -2
  41. package/dist/lib/resource-wrappers/artifact-resource.component.d.ts.map +1 -1
  42. package/dist/lib/resource-wrappers/artifact-resource.component.js +33 -9
  43. package/dist/lib/resource-wrappers/artifact-resource.component.js.map +1 -1
  44. package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts +80 -10
  45. package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts.map +1 -1
  46. package/dist/lib/resource-wrappers/chat-collections-resource.component.js +168 -56
  47. package/dist/lib/resource-wrappers/chat-collections-resource.component.js.map +1 -1
  48. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts +186 -23
  49. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts.map +1 -1
  50. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +500 -177
  51. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
  52. package/dist/lib/resource-wrappers/chat-deeplink-params.d.ts +2 -0
  53. package/dist/lib/resource-wrappers/chat-deeplink-params.d.ts.map +1 -1
  54. package/dist/lib/resource-wrappers/chat-deeplink-params.js +5 -1
  55. package/dist/lib/resource-wrappers/chat-deeplink-params.js.map +1 -1
  56. package/dist/lib/resource-wrappers/chat-search-routing.d.ts +25 -0
  57. package/dist/lib/resource-wrappers/chat-search-routing.d.ts.map +1 -0
  58. package/dist/lib/resource-wrappers/chat-search-routing.js +24 -0
  59. package/dist/lib/resource-wrappers/chat-search-routing.js.map +1 -0
  60. package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts +14 -2
  61. package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts.map +1 -1
  62. package/dist/lib/resource-wrappers/chat-tasks-resource.component.js +32 -8
  63. package/dist/lib/resource-wrappers/chat-tasks-resource.component.js.map +1 -1
  64. package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts +54 -8
  65. package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts.map +1 -1
  66. package/dist/lib/resource-wrappers/dashboard-resource.component.js +138 -46
  67. package/dist/lib/resource-wrappers/dashboard-resource.component.js.map +1 -1
  68. package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts +223 -30
  69. package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts.map +1 -1
  70. package/dist/lib/resource-wrappers/livekit-room-resource.component.js +438 -118
  71. package/dist/lib/resource-wrappers/livekit-room-resource.component.js.map +1 -1
  72. package/dist/lib/resource-wrappers/search-results-resource.component.d.ts +7 -3
  73. package/dist/lib/resource-wrappers/search-results-resource.component.d.ts.map +1 -1
  74. package/dist/lib/resource-wrappers/search-results-resource.component.js +23 -15
  75. package/dist/lib/resource-wrappers/search-results-resource.component.js.map +1 -1
  76. package/dist/lib/resource-wrappers/view-resource.component.d.ts +68 -10
  77. package/dist/lib/resource-wrappers/view-resource.component.d.ts.map +1 -1
  78. package/dist/lib/resource-wrappers/view-resource.component.js +178 -62
  79. package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
  80. package/dist/lib/services/startup-validation.service.d.ts +4 -0
  81. package/dist/lib/services/startup-validation.service.d.ts.map +1 -1
  82. package/dist/lib/services/startup-validation.service.js +10 -2
  83. package/dist/lib/services/startup-validation.service.js.map +1 -1
  84. package/dist/lib/services/system-validation.service.d.ts +13 -1
  85. package/dist/lib/services/system-validation.service.d.ts.map +1 -1
  86. package/dist/lib/services/system-validation.service.js +29 -5
  87. package/dist/lib/services/system-validation.service.js.map +1 -1
  88. package/dist/lib/shell/components/dialogs/app-access-dialog.component.d.ts +54 -4
  89. package/dist/lib/shell/components/dialogs/app-access-dialog.component.d.ts.map +1 -1
  90. package/dist/lib/shell/components/dialogs/app-access-dialog.component.js +130 -40
  91. package/dist/lib/shell/components/dialogs/app-access-dialog.component.js.map +1 -1
  92. package/dist/lib/shell/components/header/app-nav.component.d.ts +29 -1
  93. package/dist/lib/shell/components/header/app-nav.component.d.ts.map +1 -1
  94. package/dist/lib/shell/components/header/app-nav.component.js +56 -12
  95. package/dist/lib/shell/components/header/app-nav.component.js.map +1 -1
  96. package/dist/lib/shell/components/header/app-switcher.component.d.ts +33 -5
  97. package/dist/lib/shell/components/header/app-switcher.component.d.ts.map +1 -1
  98. package/dist/lib/shell/components/header/app-switcher.component.js +85 -29
  99. package/dist/lib/shell/components/header/app-switcher.component.js.map +1 -1
  100. package/dist/lib/shell/components/record-open/record-origin-crumb.component.d.ts +7 -1
  101. package/dist/lib/shell/components/record-open/record-origin-crumb.component.d.ts.map +1 -1
  102. package/dist/lib/shell/components/record-open/record-origin-crumb.component.js +63 -9
  103. package/dist/lib/shell/components/record-open/record-origin-crumb.component.js.map +1 -1
  104. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts +30 -1
  105. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts.map +1 -1
  106. package/dist/lib/shell/components/tabs/component-cache-manager.js +63 -15
  107. package/dist/lib/shell/components/tabs/component-cache-manager.js.map +1 -1
  108. package/dist/lib/shell/components/tabs/tab-container.component.d.ts +99 -9
  109. package/dist/lib/shell/components/tabs/tab-container.component.d.ts.map +1 -1
  110. package/dist/lib/shell/components/tabs/tab-container.component.js +310 -110
  111. package/dist/lib/shell/components/tabs/tab-container.component.js.map +1 -1
  112. package/dist/lib/shell/loading-themes.d.ts +16 -12
  113. package/dist/lib/shell/loading-themes.d.ts.map +1 -1
  114. package/dist/lib/shell/loading-themes.js +145 -137
  115. package/dist/lib/shell/loading-themes.js.map +1 -1
  116. package/dist/lib/shell/readiness-beacon.d.ts +24 -0
  117. package/dist/lib/shell/readiness-beacon.d.ts.map +1 -0
  118. package/dist/lib/shell/readiness-beacon.js +40 -0
  119. package/dist/lib/shell/readiness-beacon.js.map +1 -0
  120. package/dist/lib/shell/services/about-dialog.service.d.ts +6 -0
  121. package/dist/lib/shell/services/about-dialog.service.d.ts.map +1 -1
  122. package/dist/lib/shell/services/about-dialog.service.js +16 -4
  123. package/dist/lib/shell/services/about-dialog.service.js.map +1 -1
  124. package/dist/lib/shell/services/profile-dialog.service.d.ts +6 -0
  125. package/dist/lib/shell/services/profile-dialog.service.d.ts.map +1 -1
  126. package/dist/lib/shell/services/profile-dialog.service.js +16 -4
  127. package/dist/lib/shell/services/profile-dialog.service.js.map +1 -1
  128. package/dist/lib/shell/services/user-sharing-center-dialog.service.d.ts +6 -0
  129. package/dist/lib/shell/services/user-sharing-center-dialog.service.d.ts.map +1 -1
  130. package/dist/lib/shell/services/user-sharing-center-dialog.service.js +15 -3
  131. package/dist/lib/shell/services/user-sharing-center-dialog.service.js.map +1 -1
  132. package/dist/lib/shell/shell.component.d.ts +275 -40
  133. package/dist/lib/shell/shell.component.d.ts.map +1 -1
  134. package/dist/lib/shell/shell.component.js +704 -290
  135. package/dist/lib/shell/shell.component.js.map +1 -1
  136. package/dist/lib/single-dashboard/Components/add-item/add-item.component.d.ts +64 -8
  137. package/dist/lib/single-dashboard/Components/add-item/add-item.component.d.ts.map +1 -1
  138. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js +129 -37
  139. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js.map +1 -1
  140. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.d.ts +26 -2
  141. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.d.ts.map +1 -1
  142. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js +48 -10
  143. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js.map +1 -1
  144. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.d.ts +84 -6
  145. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.d.ts.map +1 -1
  146. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js +133 -29
  147. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js.map +1 -1
  148. package/dist/lib/single-dashboard/single-dashboard.component.d.ts +173 -23
  149. package/dist/lib/single-dashboard/single-dashboard.component.d.ts.map +1 -1
  150. package/dist/lib/single-dashboard/single-dashboard.component.js +383 -109
  151. package/dist/lib/single-dashboard/single-dashboard.component.js.map +1 -1
  152. package/dist/lib/single-list-detail/single-list-detail.component.d.ts +383 -55
  153. package/dist/lib/single-list-detail/single-list-detail.component.d.ts.map +1 -1
  154. package/dist/lib/single-list-detail/single-list-detail.component.js +962 -326
  155. package/dist/lib/single-list-detail/single-list-detail.component.js.map +1 -1
  156. package/dist/lib/single-query/single-query.component.d.ts +22 -2
  157. package/dist/lib/single-query/single-query.component.d.ts.map +1 -1
  158. package/dist/lib/single-query/single-query.component.js +40 -10
  159. package/dist/lib/single-query/single-query.component.js.map +1 -1
  160. package/dist/lib/single-record/single-record.component.d.ts +41 -3
  161. package/dist/lib/single-record/single-record.component.d.ts.map +1 -1
  162. package/dist/lib/single-record/single-record.component.js +71 -11
  163. package/dist/lib/single-record/single-record.component.js.map +1 -1
  164. package/dist/lib/single-search-result/single-search-result.component.d.ts +23 -3
  165. package/dist/lib/single-search-result/single-search-result.component.d.ts.map +1 -1
  166. package/dist/lib/single-search-result/single-search-result.component.js +42 -12
  167. package/dist/lib/single-search-result/single-search-result.component.js.map +1 -1
  168. package/dist/lib/system-validation/system-validation-banner.component.d.ts +12 -2
  169. package/dist/lib/system-validation/system-validation-banner.component.d.ts.map +1 -1
  170. package/dist/lib/system-validation/system-validation-banner.component.js +25 -5
  171. package/dist/lib/system-validation/system-validation-banner.component.js.map +1 -1
  172. package/dist/lib/user-menu/user-menu.types.d.ts +4 -0
  173. package/dist/lib/user-menu/user-menu.types.d.ts.map +1 -1
  174. package/dist/lib/user-menu/user-menu.types.js +10 -2
  175. package/dist/lib/user-menu/user-menu.types.js.map +1 -1
  176. package/dist/lib/user-notifications/user-notifications.component.d.ts +59 -7
  177. package/dist/lib/user-notifications/user-notifications.component.d.ts.map +1 -1
  178. package/dist/lib/user-notifications/user-notifications.component.js +151 -47
  179. package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
  180. package/dist/lib/user-profile/user-profile.component.d.ts +3 -2
  181. package/dist/lib/user-profile/user-profile.component.d.ts.map +1 -1
  182. package/dist/lib/user-profile/user-profile.component.js +5 -4
  183. package/dist/lib/user-profile/user-profile.component.js.map +1 -1
  184. package/package.json +52 -52
@@ -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, OnDestroy, ViewChild, ChangeDetectorRef, HostListener, ElementRef } from '@angular/core';\nimport { BaseEntity, CompositeKey, EntityInfo, 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 { GraphQLDataProvider, GraphQLListsClient } from '@memberjunction/graphql-dataprovider';\nimport { CapabilitiesForLevel, type ListCapabilities, type ListDelta, type ListRefreshMode, type SharePermissionLevel } from '@memberjunction/lists-base';\nimport { ListSharingService, GetRecordDisplayField, IsTextSearchableField, FormatRecordDisplayValue } from '@memberjunction/ng-list-management';\nimport { ExportService } from '@memberjunction/ng-export-service';\nimport { Subject, debounceTime, takeUntil } from 'rxjs';\nimport { NewItemOption } from '../../generic/Item.types';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n/**\n * Represents a record that can be added to a list\n */\ninterface AddableRecord {\n ID: string;\n Name: string;\n isInList: boolean;\n isSelected: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-list-detail',\n templateUrl: './single-list-detail.component.html',\n styleUrls: ['./single-list-detail.component.css', '../../shared/first-tab-styles.css']\n})\nexport class SingleListDetailComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n\n @Input() public ListID: string = \"\";\n\n /**\n * Bumped on every list-membership mutation so the Usage stats sidebar\n * re-queries member count / growth / last-activity. Without this nudge,\n * those numbers drift from reality until a full page reload because the\n * stats component otherwise only loads on init.\n */\n public statsRefreshTrigger = 0;\n private bumpStatsRefresh(): void { this.statsRefreshTrigger++; }\n\n @ViewChild('listDetailGrid') listDetailGrid: ListDetailGridComponent | undefined;\n\n // List record\n public listRecord: MJListEntity | null = null;\n public showLoader: boolean = false;\n\n // Permission-level gating (Phase 2.8). Resolved lazily after the list\n // loads. Capabilities is exposed to the template for `@if` gating; the\n // server-side enforcement remains the source of truth — these flags\n // are a UX convenience so users don't see buttons they'll be rejected on.\n public capabilities: ListCapabilities = CapabilitiesForLevel(null);\n public currentLevel: SharePermissionLevel | null = null;\n\n // Lineage / refresh-from-source state. `sourceViewName` is loaded after\n // listRecord so the lineage badge can show a friendly view name; the\n // refresh-mode default falls back to the list's RefreshMode field but\n // can be overridden per-user via localStorage (see `loadLastUsedMode`).\n public sourceViewName: string | null = null;\n\n // Bulk-edit (Phase 5.2). Status, Move, Copy, Remove. Move flows through\n // the delta-confirm dialog because it produces drops on the source list.\n public bulkStatus: 'Active' | 'Complete' | 'Disabled' | 'Pending' | 'Rejected' | '' = '';\n public isApplyingBulkStatus = false;\n\n // Move / Copy state (mockups 23, 24). The picker dialog lists candidate\n // target lists scoped to the same entity. We load it lazily on first\n // open and cache for the session — opening the picker twice in a row\n // doesn't re-fetch unless the user explicitly hits \"Refresh\".\n public showMoveCopyDialog = false;\n public moveCopyMode: 'move' | 'copy' = 'move';\n public moveCopyTargetSearch = '';\n public moveCopyTargetCandidates: MJListEntity[] = [];\n public moveCopyTargetCandidatesLoading = false;\n public moveCopySelectedTarget: MJListEntity | null = null;\n public isApplyingMoveCopy = false;\n public moveCopyProgress = 0;\n public moveCopyTotal = 0;\n\n // Move delta-confirm. Built locally from the in-hand RecordIDs — no\n // server round-trip needed since we already know exactly what will be\n // added to the target and removed from the source. The drop-guard is\n // enforced at confirm time (mode='move' + ack checkbox).\n public moveDeltaConfirmVisible = false;\n public moveDelta: ListDelta | null = null;\n\n // Export picker (Phase 5.1, mockup 26). Opens before any export; lets\n // the user pick format + which entity fields to include. Fields are\n // resolved from EntityInfo on the loaded provider — no separate fetch.\n public showExportDialog = false;\n public exportFormat: 'excel' | 'csv' | 'json' = 'excel';\n public exportFields: Array<{ Name: string; DisplayName: string; Selected: boolean }> = [];\n public exportRecordCount = 0;\n public isExporting = false;\n public refreshMode: ListRefreshMode = 'Additive';\n public isPreviewingRefresh = false;\n public isApplyingRefresh = false;\n public refreshDelta: ListDelta | null = null;\n public refreshConfirmVisible = 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\n /** Empty-state title shown when an add-records search returns no matches. */\n public get AddRecordsNoMatchTitle(): string {\n return `No records found matching \"${this.addRecordsSearchFilter}\"`;\n }\n\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 private destroy$ = new Subject<void>();\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 /**\n * Normalized-UUID set of the IDs in {@link userViewsToAdd}, kept in sync with that\n * array. Lets {@link isViewSelected} (bound per-row in the dialog's @for, ~2x/row)\n * do an O(1) lookup instead of scanning the array with UUIDsEqual on every check.\n */\n private userViewsToAddIds: Set<string> = new Set<string>();\n public addFromViewProgress: number = 0;\n public addFromViewTotal: number = 0;\n /**\n * Stored percent (0–100) for the progress bar. Backed instead of computed\n * via getter because the original getter recomputed on every Angular CD\n * read and the async save loop mutated addFromViewProgress between the\n * initial check and dev-mode re-check — producing NG0100\n * ExpressionChangedAfterItHasBeenCheckedError floods in the console.\n * Updated via setAddFromViewProgress(...) at controlled points.\n */\n public addFromViewProgressPercent: number = 0;\n public fetchingRecordsToSave: boolean = false;\n\n // Dropdown button toggle state\n public showAddDropdown: boolean = false;\n\n // Dropdown menu options\n public addOptions: NewItemOption[] = [\n {\n Text: 'Add Records',\n Description: 'Search and add specific records to this list',\n Icon: 'search',\n Action: () => this.openAddRecordsDialog()\n },\n {\n Text: 'Add From View',\n Description: 'Add all records from a saved view',\n Icon: 'folder',\n Action: () => this.openAddFromViewDialog()\n }\n ];\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (this.showAddDropdown) {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.querySelector('.add-dropdown-wrapper')?.contains(target)) {\n this.showAddDropdown = false;\n }\n }\n }\n\n constructor(\n private sharedService: SharedService,\n private cdr: ChangeDetectorRef,\n private elementRef: ElementRef,\n private exportService: ExportService,\n private listSharingService: ListSharingService,\n ) {\n super();\n // Debounce search input\n this.searchSubject\n .pipe(debounceTime(300), takeUntil(this.destroy$))\n .subscribe((searchText) => this.searchRecords(searchText));\n }\n\n public ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n public ngOnInit(): void {\n if (this.ListID) {\n // Defer the load to a macrotask so the initial assignment of\n // `listRecord` cannot land during Angular's dev-mode verify pass\n // (NG0100). The first CD cycle renders with listRecord=null\n // (\"List\"); the macrotask then loads, assigns, and fires its own\n // detectChanges in a fresh cycle.\n setTimeout(() => { void this.loadListRecord(); }, 0);\n }\n }\n\n /**\n * Load the list entity record\n */\n private async loadListRecord(): Promise<void> {\n if (!this.ListID) return;\n\n this.showLoader = true;\n\n try {\n const md = this.ProviderToUse;\n // Build + load against a LOCAL handle. Only assign to\n // this.listRecord after Load() succeeds — otherwise Angular's\n // change detector sees a transiently-populated half-loaded\n // entity (Name=null) before Load fills it in, and the title\n // binding throws ExpressionChangedAfterItHasBeenCheckedError.\n const list = await md.GetEntityObject<MJListEntity>(\"MJ: Lists\");\n const loadResult = await list.Load(this.ListID);\n\n if (!loadResult) {\n LogError(\"Error loading list with ID \" + this.ListID, undefined, list.LatestResult);\n this.listRecord = null;\n } else {\n this.listRecord = list;\n await this.loadLineageContext();\n await this.loadCapabilities();\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 * Load lineage context for the refresh-from-source UI:\n * - Resolve the source view's display name for the lineage badge.\n * - Initialize the refresh-mode dropdown from per-user last-used\n * preference, falling back to the list's RefreshMode field.\n * Silent on failure — the badge / refresh button just won't render\n * rather than blocking the rest of the detail view.\n */\n private async loadLineageContext(): Promise<void> {\n if (!this.listRecord?.SourceViewID) {\n this.sourceViewName = null;\n return;\n }\n this.refreshMode = this.loadLastUsedMode() ?? this.listRecord.RefreshMode;\n try {\n const view = await this.ProviderToUse.GetEntityObject<MJUserViewEntityExtended>('MJ: User Views');\n const loaded = await view.Load(this.listRecord.SourceViewID);\n this.sourceViewName = loaded ? view.Name : null;\n } catch (e) {\n LogError(`Failed to load source view name for list ${this.ListID}: ${e}`);\n this.sourceViewName = null;\n }\n }\n\n /**\n * Resolve the caller's permission level for this list (Owner / Edit /\n * View / null) and derive UI capability flags. Best-effort — if the\n * resolve fails we conservatively default to no-mutation (Viewer-like)\n * so we don't accidentally surface buttons the server will reject.\n */\n private async loadCapabilities(): Promise<void> {\n if (!this.listRecord) {\n this.capabilities = CapabilitiesForLevel(null);\n this.currentLevel = null;\n return;\n }\n try {\n const currentUserId = this.ProviderToUse.CurrentUser?.ID;\n if (!currentUserId) {\n this.capabilities = CapabilitiesForLevel('View');\n this.currentLevel = 'View';\n return;\n }\n // Fast path: the list's UserID is its owner. Owners always have full\n // capabilities and don't carry a Resource Permission row (ownership\n // is implicit), so the permission-row lookup below would return null\n // and incorrectly hide all edit/share/delete buttons. Mirrors the\n // owner short-circuit in the server-side ListSharing.ResolveEffectivePermission.\n if (UUIDsEqual(this.listRecord.UserID, currentUserId)) {\n this.currentLevel = 'Owner';\n this.capabilities = CapabilitiesForLevel('Owner');\n return;\n }\n // Non-owner: resolve via ListSharingService (GraphQL). Never instantiate\n // the server-side `ListSharing` class from a browser bundle.\n const level = (await this.listSharingService.getUserPermissionLevel(this.listRecord.ID, currentUserId)) as SharePermissionLevel | null;\n this.currentLevel = level;\n this.capabilities = CapabilitiesForLevel(level);\n } catch (e) {\n LogError(`loadCapabilities failed: ${e instanceof Error ? e.message : String(e)}`);\n this.capabilities = CapabilitiesForLevel('View');\n this.currentLevel = 'View';\n }\n }\n\n public get hasLineage(): boolean {\n return !!this.listRecord?.SourceViewID;\n }\n\n private loadLastUsedMode(): ListRefreshMode | null {\n try {\n const stored = localStorage.getItem(`mj.lists.refreshMode.${this.ListID}`);\n if (stored === 'Additive' || stored === 'Sync') return stored;\n } catch {\n // localStorage may not be available (SSR, private mode) — fall through.\n }\n return null;\n }\n\n private saveLastUsedMode(mode: ListRefreshMode): void {\n try {\n localStorage.setItem(`mj.lists.refreshMode.${this.ListID}`, mode);\n } catch {\n // ignore\n }\n }\n\n /**\n * Kick off a refresh-from-source preview. Builds the delta server-side\n * and opens the confirm dialog when it returns. The dialog enforces the\n * acknowledgement UX; the server enforces the actual drop guard.\n */\n public async onRefreshFromSource(): Promise<void> {\n if (!this.hasLineage || this.isPreviewingRefresh) return;\n this.isPreviewingRefresh = true;\n this.refreshDelta = null;\n this.cdr.detectChanges();\n try {\n const provider = this.ProviderToUse as unknown as GraphQLDataProvider;\n const client = new GraphQLListsClient(provider);\n const delta = await client.PreviewListDelta({\n Target: this.ListID,\n Source: { kind: 'view', viewId: this.listRecord!.SourceViewID! },\n Mode: this.refreshMode,\n });\n this.refreshDelta = delta;\n this.refreshConfirmVisible = true;\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.sharedService.CreateSimpleNotification(`Refresh preview failed: ${message}`, 'error', 5000);\n } finally {\n this.isPreviewingRefresh = false;\n this.cdr.detectChanges();\n }\n }\n\n public onRefreshConfirmCancel(): void {\n this.refreshConfirmVisible = false;\n this.refreshDelta = null;\n this.cdr.detectChanges();\n }\n\n public async onRefreshConfirmCommit(deltaToken: string): Promise<void> {\n if (!this.refreshDelta) return;\n this.isApplyingRefresh = true;\n this.cdr.detectChanges();\n try {\n const provider = this.ProviderToUse as unknown as GraphQLDataProvider;\n const client = new GraphQLListsClient(provider);\n const result = await client.ApplyListDelta({\n Delta: { ...this.refreshDelta, DeltaToken: deltaToken },\n ConfirmDrops: (this.refreshDelta.Counts.Remove ?? 0) > 0,\n });\n if (result.Success) {\n this.saveLastUsedMode(this.refreshMode);\n this.refreshConfirmVisible = false;\n this.refreshDelta = null;\n this.sharedService.CreateSimpleNotification(\n `Refresh applied: +${result.Counts?.Added ?? 0} / -${result.Counts?.Removed ?? 0}`,\n 'success',\n 3000,\n );\n // Reload list (for LastRefreshedAt) + grid in parallel.\n await this.loadListRecord();\n this.refreshGrid();\n this.bumpStatsRefresh();\n } else {\n this.sharedService.CreateSimpleNotification(`Refresh failed: ${result.Message}`, 'error', 5000);\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.sharedService.CreateSimpleNotification(`Refresh failed: ${message}`, 'error', 5000);\n } finally {\n this.isApplyingRefresh = false;\n this.cdr.detectChanges();\n }\n }\n\n public onRefreshModeChange(mode: ListRefreshMode): void {\n this.refreshMode = mode;\n }\n\n // ==========================================\n // Grid Event Handlers\n // ==========================================\n\n onRowClicked(_event: ListGridRowClickedEvent): void {\n // Selection is handled by the grid\n }\n\n onRowDoubleClicked(_event: ListGridRowClickedEvent): void {\n // Navigation is handled by mj-list-detail-grid\n }\n\n onSelectionChange(keys: string[]): void {\n this.selectedKeys = keys;\n }\n\n onDataLoaded(event: { totalCount: number }): void {\n this.rowCount = event.totalCount;\n }\n\n refreshGrid(): void {\n if (this.listDetailGrid) {\n this.listDetailGrid.refresh();\n }\n }\n\n // ==========================================\n // Toolbar Actions\n // ==========================================\n\n // ==========================================\n // Progress Percentage Getters\n // ==========================================\n\n get removeProgressPercent(): number {\n return this.removeTotal > 0 ? Math.round((this.removeProgress / this.removeTotal) * 100) : 0;\n }\n\n get addProgressPercent(): number {\n return this.addTotal > 0 ? Math.round((this.addProgress / this.addTotal) * 100) : 0;\n }\n\n /** Update progress + recompute the stored percent atomically. Call this\n * from inside the save loop so the bound value is set in lockstep with\n * the underlying counter (avoids NG0100). */\n private setAddFromViewProgress(progress: number): void {\n this.addFromViewProgress = progress;\n this.addFromViewProgressPercent = this.addFromViewTotal > 0\n ? Math.round((progress / this.addFromViewTotal) * 100)\n : 0;\n }\n\n onRefreshClick(): void {\n this.refreshGrid();\n }\n\n onExportClick(): void {\n this.openExportDialog();\n }\n\n /**\n * Open the format + column picker (mockup 26). Resolves the candidate\n * field list from EntityInfo on the loaded provider — no extra\n * RunView. Default selection is every non-virtual entity field, which\n * matches what the underlying grid's \"export all\" path produced.\n */\n public openExportDialog(): void {\n if (!this.listRecord) {\n this.sharedService.CreateSimpleNotification('Load a list first before exporting.', 'info', 3000);\n return;\n }\n const md = this.ProviderToUse;\n const entityInfo = md.EntityByID(this.listRecord.EntityID);\n if (!entityInfo) {\n this.sharedService.CreateSimpleNotification(\n `Entity for this list not found in metadata.`,\n 'error', 4000,\n );\n return;\n }\n if (entityInfo.PrimaryKeys.length !== 1) {\n this.sharedService.CreateSimpleNotification(\n `Composite-PK entities ('${entityInfo.Name}') aren't yet supported for List export.`,\n 'warning', 5000,\n );\n return;\n }\n this.exportFields = entityInfo.Fields\n .filter((f) => f.IsVirtual !== true)\n .map((f) => ({\n Name: f.Name,\n DisplayName: f.DisplayName || f.Name,\n Selected: true,\n }));\n this.exportRecordCount = this.rowCount;\n this.exportFormat = 'excel';\n this.showExportDialog = true;\n this.cdr.detectChanges();\n }\n\n public closeExportDialog(): void {\n this.showExportDialog = false;\n this.cdr.detectChanges();\n }\n\n public selectAllExportFields(): void {\n for (const f of this.exportFields) f.Selected = true;\n }\n public selectNoneExportFields(): void {\n for (const f of this.exportFields) f.Selected = false;\n }\n public get selectedExportFieldCount(): number {\n return this.exportFields.filter((f) => f.Selected).length;\n }\n\n /**\n * Run the export with the user's chosen format + columns. Resolves\n * the list's member RecordIDs from the in-memory grid when possible\n * (avoids an extra RunView), then bulk-loads the underlying entity\n * rows restricted to the chosen Fields. Output is projected to\n * exactly the user's selected columns + ordering.\n */\n public async executeExport(): Promise<void> {\n if (!this.listRecord) return;\n const selectedFields = this.exportFields.filter((f) => f.Selected).map((f) => f.Name);\n if (selectedFields.length === 0) return;\n\n this.isExporting = true;\n this.cdr.detectChanges();\n try {\n const md = this.ProviderToUse;\n const entityInfo = md.EntityByID(this.listRecord.EntityID)!;\n\n // Cheap emptiness check before doing any row work\n const rv = RunView.FromMetadataProvider(md);\n const countResult = await rv.RunView({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID='${this.listRecord.ID}'`,\n ResultType: 'count_only',\n });\n if (countResult.Success && countResult.TotalRowCount === 0) {\n this.sharedService.CreateSimpleNotification(\n 'List is empty — nothing to export.', 'info', 3000,\n );\n this.showExportDialog = false;\n return;\n }\n\n // Pull underlying entity rows restricted to the chosen fields, with\n // membership filtered by buildListMemberFilter (server-side subquery\n // for a single-column key). Always include the key column(s) so the\n // projection round-trips cleanly.\n const fieldsForQuery = Array.from(new Set([...entityInfo.PrimaryKeys.map((pk) => pk.Name), ...selectedFields]));\n const rowResult = await rv.RunView<Record<string, unknown>>({\n EntityName: entityInfo.Name,\n ExtraFilter: await this.buildListMemberFilter(entityInfo, this.listRecord.ID, rv),\n Fields: fieldsForQuery,\n ResultType: 'simple',\n });\n if (!rowResult.Success) {\n this.sharedService.CreateSimpleNotification(\n `Export failed loading rows: ${rowResult.ErrorMessage}`, 'error', 5000,\n );\n return;\n }\n // Project rows to exactly the columns + ordering the user picked.\n const rows = (rowResult.Results ?? []).map((row) => {\n const projected: Record<string, unknown> = {};\n for (const f of selectedFields) projected[f] = row[f];\n return projected;\n });\n\n const dateStamp = new Date().toISOString().slice(0, 10);\n const safeName = (this.listRecord.Name || 'list').replace(/[^a-z0-9_-]+/gi, '_');\n const ext = this.exportFormat === 'excel' ? 'xlsx' : this.exportFormat;\n const fileName = `${safeName}-${dateStamp}.${ext}`;\n const exportResult = this.exportFormat === 'excel'\n ? await this.exportService.toExcel(rows, { fileName, includeHeaders: true })\n : this.exportFormat === 'csv'\n ? await this.exportService.toCSV(rows, { fileName, includeHeaders: true })\n : await this.exportService.toJSON(rows, { fileName });\n\n if (exportResult.success) {\n this.exportService.downloadResult(exportResult);\n this.sharedService.CreateSimpleNotification(\n `Exported ${rows.length} record(s)`, 'success', 3000,\n );\n this.showExportDialog = false;\n } else {\n this.sharedService.CreateSimpleNotification('Export failed', 'error', 5000);\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.sharedService.CreateSimpleNotification(`Export error: ${message}`, 'error', 5000);\n } finally {\n this.isExporting = false;\n this.cdr.detectChanges();\n }\n }\n\n toggleAddDropdown(): void {\n this.showAddDropdown = !this.showAddDropdown;\n }\n\n onDropdownItemClick(item: NewItemOption): void {\n this.showAddDropdown = false;\n if (item.Action) {\n item.Action();\n }\n }\n\n // ==========================================\n /**\n * Predicate selecting the underlying entity rows that are members of a list. For a\n * single-column key membership is filtered SERVER-SIDE via a subquery on the List Details\n * view (RecordID holds the raw key value), so no member id round-trips to the client and no\n * IN(...) clause breaks on a large list. A composite key stores RecordID as \"F1|v1||F2|v2\",\n * which no single column can be compared to, so the member ids are fetched and each expanded\n * to its full key predicate.\n */\n private async buildListMemberFilter(entityInfo: EntityInfo, listId: string, rv: RunView): Promise<string> {\n if (entityInfo.PrimaryKeys.length === 1) {\n const listDetailInfo = this.ProviderToUse.EntityByName('MJ: List Details');\n const listDetailsView = `${listDetailInfo?.SchemaName ?? '__mj'}.${listDetailInfo?.BaseView ?? 'vwListDetails'}`;\n return `${entityInfo.FirstPrimaryKey.Name} IN (SELECT RecordID FROM ${listDetailsView} WHERE ListID='${listId}')`; // first-pk-ok: guarded by PrimaryKeys.length === 1 above\n }\n const members = await rv.RunView<{ RecordID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID='${listId}'`,\n Fields: ['RecordID'],\n ResultType: 'simple',\n });\n const clauses = (members.Results ?? []).map((m) => `(${CompositeKey.FromURLSegment(entityInfo, m.RecordID).ToWhereClause()})`);\n return clauses.length > 0 ? clauses.join(' OR ') : '1=0';\n }\n\n /**\n * Apply the chosen status to all selected list-detail rows. Re-uses\n * the existing extract-record-id-from-composite-key logic to map\n * `selectedKeys` to the actual `MJ: List Detail.RecordID` values.\n */\n public async applyBulkStatus(): Promise<void> {\n if (!this.listRecord || this.selectedKeys.length === 0 || !this.bulkStatus) return;\n this.isApplyingBulkStatus = true;\n this.cdr.detectChanges();\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(md);\n const entityInfo = md.EntityByID(this.listRecord.EntityID);\n const recordIds = this.selectedKeys.map((key) => {\n if (entityInfo && entityInfo.PrimaryKeys.length === 1) {\n const ck = new CompositeKey();\n ck.LoadFromConcatenatedString(key);\n return ck.KeyValuePairs[0]?.Value || key;\n }\n return key;\n });\n const filter = `ListID='${this.listRecord.ID}' AND RecordID IN (${recordIds.map((id) => `'${String(id).replace(/'/g, \"''\")}'`).join(',')})`;\n // Two-step: fetch just the IDs via a 'simple' RunView, then load each\n // entity through GetEntityObject(..., CurrentUser) so the entity is\n // born with the user context that Save() requires. RunView with\n // 'entity_object' returns entities WITHOUT a CurrentUser bound — fine\n // for read-only use, broken for Save (`ContextCurrentUser cannot be\n // null`).\n const idResult = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: filter,\n Fields: ['ID'],\n ResultType: 'simple',\n });\n if (!idResult.Success) {\n this.sharedService.CreateSimpleNotification(`Failed to load list details: ${idResult.ErrorMessage}`, 'error', 4000);\n return;\n }\n let updated = 0;\n let failed = 0;\n const failureMessages: string[] = [];\n for (const row of idResult.Results ?? []) {\n const detail = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details', md.CurrentUser);\n const loaded = await detail.Load(row.ID);\n if (!loaded) {\n failed++;\n const reason = detail.LatestResult?.CompleteMessage ?? 'load failed';\n if (failureMessages.length < 3) failureMessages.push(reason);\n continue;\n }\n detail.Status = this.bulkStatus as never;\n const ok = await detail.Save();\n if (ok) {\n updated++;\n } else {\n failed++;\n const reason = detail.LatestResult?.CompleteMessage ?? 'unknown error';\n if (failureMessages.length < 3) failureMessages.push(reason);\n LogError(`Bulk status update failed for List Detail ${row.ID}: ${reason}`);\n }\n }\n this.sharedService.CreateSimpleNotification(\n failed === 0\n ? `Updated ${updated} item(s) to '${this.bulkStatus}'`\n : `Updated ${updated}, ${failed} failed: ${failureMessages.join(' | ')}`,\n failed === 0 ? 'success' : 'warning',\n failed === 0 ? 3000 : 8000,\n );\n this.bulkStatus = '';\n // Defer the grid refresh to the next microtask — see comment in\n // confirmRemoveFromList for why running it synchronously here\n // triggers NG0100 and silently breaks the UI refresh.\n await Promise.resolve();\n this.refreshGrid();\n this.bumpStatsRefresh();\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.sharedService.CreateSimpleNotification(`Bulk update failed: ${message}`, 'error', 5000);\n } finally {\n this.isApplyingBulkStatus = false;\n this.cdr.detectChanges();\n }\n }\n\n // ==========================================\n // Bulk Move / Copy (mockups 23, 24)\n //\n // Move = insert into target + delete from source (drops on source).\n // Copy = insert into target only (additive — no drops).\n //\n // The drop-guard for Move is enforced by routing through the local\n // delta-confirm dialog: the user must ack the removal before the\n // mutation runs. We build a synthetic ListDelta locally because we\n // already know the exact ToAdd / ToRemove sets — no server round-trip\n // needed for the preview. Apply step uses direct entity Save/Delete\n // inside a single TransactionGroup (same pattern as Remove).\n // ==========================================\n\n public openMoveDialog(): void { this.openMoveCopyDialog('move'); }\n public openCopyDialog(): void { this.openMoveCopyDialog('copy'); }\n\n private openMoveCopyDialog(mode: 'move' | 'copy'): void {\n if (!this.listRecord || this.selectedKeys.length === 0) {\n this.sharedService.CreateSimpleNotification('Please select records first', 'warning', 2500);\n return;\n }\n this.moveCopyMode = mode;\n this.moveCopySelectedTarget = null;\n this.moveCopyTargetSearch = '';\n this.showMoveCopyDialog = true;\n // Load candidates once per dialog open. We don't keep them in\n // permanent component state because the user could create/delete\n // lists between opens, and the target picker isn't visible often\n // enough to justify long-lived caching.\n void this.loadMoveCopyTargets();\n this.cdr.detectChanges();\n }\n\n public closeMoveCopyDialog(): void {\n this.showMoveCopyDialog = false;\n this.moveCopyTargetCandidates = [];\n this.moveCopySelectedTarget = null;\n this.cdr.detectChanges();\n }\n\n public selectMoveCopyTarget(target: MJListEntity): void {\n this.moveCopySelectedTarget = target;\n }\n\n public get filteredMoveCopyTargets(): MJListEntity[] {\n const term = this.moveCopyTargetSearch.trim().toLowerCase();\n if (!term) return this.moveCopyTargetCandidates;\n return this.moveCopyTargetCandidates.filter((l) =>\n l.Name.toLowerCase().includes(term) ||\n (l.Description?.toLowerCase().includes(term) ?? false)\n );\n }\n\n public get moveCopyProgressPercent(): number {\n return this.moveCopyTotal > 0 ? Math.round((this.moveCopyProgress / this.moveCopyTotal) * 100) : 0;\n }\n\n /** Load candidate target lists — same Entity, owned by or shared with\n * the current user, excluding the list we're standing on. One RunView\n * on open; results stay in memory until the dialog closes. */\n private async loadMoveCopyTargets(): Promise<void> {\n if (!this.listRecord) return;\n this.moveCopyTargetCandidatesLoading = true;\n this.cdr.detectChanges();\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n // Filter to same EntityID + exclude the current list. UserID filter\n // would over-restrict (Shared-With-Me lists should be valid targets\n // when the user has Edit there); the server enforces the real\n // permission on the per-row Save, so listing extra entries is fine.\n const filter = `EntityID='${this.listRecord.EntityID}' AND ID<>'${this.listRecord.ID}'`;\n const result = await rv.RunView<MJListEntity>({\n EntityName: 'MJ: Lists',\n ExtraFilter: filter,\n OrderBy: 'Name',\n ResultType: 'simple',\n MaxRows: 500,\n });\n if (result.Success) {\n this.moveCopyTargetCandidates = (result.Results ?? []) as MJListEntity[];\n } else {\n this.moveCopyTargetCandidates = [];\n this.sharedService.CreateSimpleNotification(`Failed to load target lists: ${result.ErrorMessage}`, 'error', 4000);\n }\n } catch (e) {\n this.moveCopyTargetCandidates = [];\n const message = e instanceof Error ? e.message : String(e);\n this.sharedService.CreateSimpleNotification(`Failed to load target lists: ${message}`, 'error', 4000);\n } finally {\n this.moveCopyTargetCandidatesLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * \"Continue\" / \"Copy\" click in the target picker. For Copy we apply\n * immediately. For Move we build a local Delta and show the confirm\n * dialog — the actual mutation fires from onMoveConfirmCommit().\n */\n public async confirmMoveCopy(): Promise<void> {\n if (!this.listRecord || !this.moveCopySelectedTarget || this.selectedKeys.length === 0) return;\n if (this.moveCopyMode === 'copy') {\n await this.applyMoveCopy(false);\n return;\n }\n // Move: show delta-confirm so the user explicitly acks the source-side drop.\n const recordIds = this.extractSelectedRecordIds();\n this.moveDelta = this.buildMoveDelta(recordIds);\n this.showMoveCopyDialog = false;\n this.moveDeltaConfirmVisible = true;\n this.cdr.detectChanges();\n }\n\n public onMoveConfirmCancel(): void {\n this.moveDeltaConfirmVisible = false;\n this.moveDelta = null;\n // Re-open the target picker so the user can change their mind without\n // losing their selection.\n this.showMoveCopyDialog = true;\n this.cdr.detectChanges();\n }\n\n public async onMoveConfirmCommit(_deltaToken: string): Promise<void> {\n this.moveDeltaConfirmVisible = false;\n this.cdr.detectChanges();\n await this.applyMoveCopy(true);\n }\n\n /**\n * Pull RecordIDs out of selectedKeys. selectedKeys arrive from the\n * grid in concatenated-key format (\"ID|<value>\"). For single-PK entities\n * MJ: List Details stores the raw value; for composite-PK entities it\n * stores the full concatenated string. We normalize based on entity\n * metadata — same logic as confirmRemoveFromList.\n */\n private extractSelectedRecordIds(): string[] {\n const md = this.ProviderToUse;\n const entityInfo = this.listRecord ? md.EntityByID(this.listRecord.EntityID) : null;\n return this.selectedKeys.map((key) => {\n if (entityInfo && entityInfo.PrimaryKeys.length === 1) {\n const ck = new CompositeKey();\n ck.LoadFromConcatenatedString(key);\n return String(ck.KeyValuePairs[0]?.Value ?? key);\n }\n return key;\n });\n }\n\n /**\n * Build a synthetic ListDelta for the Move-confirm dialog. Token is\n * a sentinel — we never call server-side ApplyDelta for this flow,\n * the mutations run client-side inside a transaction group. The\n * delta-confirm component only reads counts + ToAdd/ToRemove + Warnings;\n * the token round-trips through the (Confirm) emit but is unused.\n */\n private buildMoveDelta(recordIds: string[]): ListDelta {\n const removeCount = recordIds.length;\n return {\n TargetListId: this.listRecord!.ID,\n EntityName: this.listRecord!.Entity ?? '',\n ToAdd: [],\n ToRemove: recordIds,\n Unchanged: [],\n Counts: {\n Add: 0,\n Remove: removeCount,\n Unchanged: 0,\n SourceTotal: 0,\n TargetTotal: this.rowCount,\n },\n Warnings: [{\n Code: 'WILL_REMOVE_RECORDS',\n Message: `${removeCount} record(s) will be removed from \"${this.listRecord!.Name}\" as part of the move`,\n Details: { Count: removeCount },\n }],\n // Sentinel — client-side flow doesn't round-trip this.\n DeltaToken: 'client-move-delta',\n };\n }\n\n /**\n * Execute the move/copy. Insert all records into the target, and for\n * Move also delete the matching MJ: List Details from the source. All\n * mutations run in a single TransactionGroup so partial failures don't\n * leave records duplicated in both lists.\n */\n private async applyMoveCopy(isMove: boolean): Promise<void> {\n if (!this.listRecord || !this.moveCopySelectedTarget) return;\n const source = this.listRecord;\n const target = this.moveCopySelectedTarget;\n const recordIds = this.extractSelectedRecordIds();\n if (recordIds.length === 0) return;\n\n this.isApplyingMoveCopy = true;\n this.moveCopyTotal = recordIds.length;\n this.moveCopyProgress = 0;\n this.cdr.detectChanges();\n\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(md);\n\n try {\n // Dedupe against the target: skip records already present so a\n // partially-completed previous run can be re-tried cleanly.\n const filterIds = recordIds.map((id) => `'${String(id).replace(/'/g, \"''\")}'`).join(',');\n const existingTarget = await rv.RunView<{ RecordID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID='${target.ID}' AND RecordID IN (${filterIds})`,\n Fields: ['RecordID'],\n ResultType: 'simple',\n });\n const alreadyInTarget = new Set(\n (existingTarget.Results ?? []).map((r) => String((r as { RecordID: string }).RecordID))\n );\n const toAdd = recordIds.filter((id) => !alreadyInTarget.has(id));\n\n // For Move, look up the source-side ListDetail rows to delete.\n let sourceRows: MJListDetailEntity[] = [];\n if (isMove) {\n const lookup = await rv.RunView<MJListDetailEntity>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID='${source.ID}' AND RecordID IN (${filterIds})`,\n ResultType: 'entity_object',\n });\n if (!lookup.Success) {\n throw new Error(`Failed to load source rows: ${lookup.ErrorMessage}`);\n }\n sourceRows = lookup.Results ?? [];\n }\n\n const tg = await md.CreateTransactionGroup();\n\n // Queue inserts into target.\n for (const recordId of toAdd) {\n const newDetail = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details', md.CurrentUser);\n newDetail.NewRecord();\n newDetail.ListID = target.ID;\n newDetail.RecordID = recordId;\n newDetail.Sequence = 0;\n newDetail.TransactionGroup = tg;\n await newDetail.Save();\n }\n\n // Queue source-side deletes for Move only.\n if (isMove) {\n for (const row of sourceRows) {\n row.TransactionGroup = tg;\n await row.Delete();\n }\n }\n\n const ok = await tg.Submit();\n this.moveCopyProgress = this.moveCopyTotal;\n\n if (!ok) {\n this.sharedService.CreateSimpleNotification(\n `${isMove ? 'Move' : 'Copy'} partially failed — some changes may not have applied`,\n 'error',\n 5000,\n );\n return;\n }\n\n const skippedNote = alreadyInTarget.size > 0\n ? ` (${alreadyInTarget.size} already in target — skipped)`\n : '';\n this.sharedService.CreateSimpleNotification(\n `${isMove ? 'Moved' : 'Copied'} ${toAdd.length} record(s) to \"${target.Name}\"${skippedNote}`,\n 'success',\n 3000,\n );\n\n // Same NG0100 pattern as confirmRemoveFromList — defer cleanup +\n // refresh by a microtask so the dialog/visibility flips happen in\n // a fresh change-detection cycle.\n await Promise.resolve();\n this.closeMoveCopyDialog();\n this.moveDelta = null;\n if (isMove) {\n this.listDetailGrid?.clearSelection();\n this.refreshGrid();\n this.bumpStatsRefresh();\n }\n this.cdr.detectChanges();\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n LogError(`Move/Copy failed: ${message}`);\n this.sharedService.CreateSimpleNotification(`${isMove ? 'Move' : 'Copy'} failed: ${message}`, 'error', 5000);\n } finally {\n this.isApplyingMoveCopy = false;\n this.cdr.detectChanges();\n }\n }\n\n // ==========================================\n // Remove from List Dialog\n // ==========================================\n\n openRemoveDialog(): void {\n if (this.selectedKeys.length === 0) {\n this.sharedService.CreateSimpleNotification(\"Please select records to remove\", 'warning', 2500);\n return;\n }\n this.showRemoveDialog = true;\n }\n\n closeRemoveDialog(): void {\n this.showRemoveDialog = false;\n this.isRemoving = false;\n this.removeProgress = 0;\n this.removeTotal = 0;\n }\n\n async confirmRemoveFromList(): Promise<void> {\n if (!this.listRecord || this.selectedKeys.length === 0) return;\n\n this.isRemoving = true;\n this.removeTotal = this.selectedKeys.length;\n this.removeProgress = 0;\n\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const entityInfo = md.EntityByID(this.listRecord.EntityID);\n\n // selectedKeys from grid are in concatenated format (ID|value)\n // For single PK entities, RecordID in DB is just the raw value\n // For composite PK entities, RecordID in DB is the concatenated format\n // Extract the appropriate format for the query\n const selectedRecordIds = this.selectedKeys.map(key => {\n if (entityInfo && entityInfo.PrimaryKeys.length === 1) {\n // Single PK: extract just the value from concatenated format\n const compositeKey = new CompositeKey();\n compositeKey.LoadFromConcatenatedString(key);\n return compositeKey.KeyValuePairs[0]?.Value || key;\n } else {\n // Composite PK: use full concatenated format as-is\n return key;\n }\n });\n\n const listDetailsFilter = `ListID = '${this.listRecord.ID}' AND RecordID IN (${selectedRecordIds.map(id => `'${id}'`).join(',')})`;\n\n const listDetailsResult = await rv.RunView<MJListDetailEntity>({\n EntityName: 'MJ: List Details',\n ExtraFilter: listDetailsFilter,\n ResultType: 'entity_object'\n }, md.CurrentUser);\n\n if (!listDetailsResult.Success) {\n LogError(\"Error loading list details for removal\", undefined, listDetailsResult.ErrorMessage);\n this.sharedService.CreateSimpleNotification(\"Failed to remove records\", 'error', 2500);\n this.isRemoving = false;\n return;\n }\n\n // Use transaction group for bulk delete\n const tg = await md.CreateTransactionGroup();\n const listDetails = listDetailsResult.Results;\n\n for (const listDetail of listDetails) {\n listDetail.TransactionGroup = tg;\n await listDetail.Delete();\n }\n\n const success = await tg.Submit();\n\n if (success) {\n this.removeProgress = this.removeTotal;\n this.sharedService.CreateSimpleNotification(\n `Removed ${listDetails.length} record${listDetails.length !== 1 ? 's' : ''} from list`,\n 'success',\n 2500\n );\n // Defer cleanup + refresh to the next microtask. Running these\n // synchronously inside the current change-detection cycle\n // triggers NG0100 (`@if (showRemoveDialog)` flips false while\n // children are still being checked), which leaves the grid in a\n // stale state — the deletion succeeds server-side but the UI\n // doesn't re-fetch until the user navigates away and back.\n await Promise.resolve();\n this.closeRemoveDialog();\n this.listDetailGrid?.clearSelection();\n this.refreshGrid();\n this.bumpStatsRefresh();\n this.cdr.detectChanges();\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 // Explicit CD: the GraphQL promise resolution doesn't reliably produce an\n // Angular tick, so without this the spinner stays up until the next user\n // event (click/keystroke) forces a change-detection cycle.\n this.cdr.detectChanges();\n }\n\n closeAddRecordsDialog(): void {\n this.showAddRecordsDialog = false;\n this.addableRecords = [];\n this.addRecordsSearchFilter = \"\";\n this.existingListDetailIds.clear();\n this.addDialogSaving = false;\n this.addProgress = 0;\n this.addTotal = 0;\n }\n\n private async loadExistingListDetailIds(): Promise<void> {\n if (!this.listRecord) return;\n\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n const result = await rv.RunView<{ RecordID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID = '${this.listRecord.ID}'`,\n Fields: ['RecordID'],\n ResultType: 'simple'\n }, md.CurrentUser);\n\n if (result.Success) {\n this.existingListDetailIds = new Set(result.Results.map(r => NormalizeUUID(r.RecordID)));\n }\n }\n\n onAddRecordsSearchInputEvent(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.onAddRecordsSearchChange(value);\n }\n\n onAddRecordsSearchChange(value: string): void {\n this.addRecordsSearchFilter = value;\n this.searchSubject.next(value);\n }\n\n private async searchRecords(searchText: string): Promise<void> {\n if (!this.listRecord || !searchText || searchText.length < 2) {\n this.addableRecords = [];\n this.cdr.detectChanges();\n return;\n }\n\n this.addDialogLoading = true;\n this.cdr.detectChanges();\n\n const md = this.ProviderToUse;\n const sourceEntityInfo = md.EntityByID(this.listRecord.EntityID);\n if (!sourceEntityInfo) {\n this.addDialogLoading = false;\n this.cdr.detectChanges();\n return;\n }\n\n // NameField when present; otherwise the fallback display field\n // (first non-PK/non-FK/non-system field). Text-typed fields also\n // drive the LIKE search so name-less entities remain searchable.\n const displayField = GetRecordDisplayField(sourceEntityInfo);\n\n let filter: string | undefined;\n if (displayField.Field && IsTextSearchableField(displayField.Field)) {\n filter = `${displayField.Field.Name} LIKE '%${searchText.replace(/'/g, \"''\")}%'`;\n }\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result: RunViewResult = await rv.RunView({\n EntityName: this.listRecord.Entity,\n ExtraFilter: filter,\n MaxRows: 100,\n ResultType: 'simple'\n });\n\n if (result.Success) {\n this.addableRecords = result.Results.map((record: Record<string, unknown>) => {\n // Compact key segment (raw value, or \"F1|v1||F2|v2\" for a composite key) — the form ListDetail.RecordID stores\n const recordId = CompositeKey.FromEntityRecord(sourceEntityInfo, record).ToCompactURLSegment();\n return {\n ID: recordId,\n Name: displayField.Field\n ? FormatRecordDisplayValue(recordId, record[displayField.Field.Name], displayField)\n : recordId,\n isInList: this.existingListDetailIds.has(NormalizeUUID(recordId)),\n isSelected: false\n };\n });\n }\n\n this.addDialogLoading = false;\n this.cdr.detectChanges();\n }\n\n toggleRecordSelection(record: AddableRecord): void {\n if (record.isInList) return; // Can't select records already in list\n record.isSelected = !record.isSelected;\n }\n\n get selectedAddableRecords(): AddableRecord[] {\n return this.addableRecords.filter(r => r.isSelected);\n }\n\n selectAllAddable(): void {\n this.addableRecords.forEach(r => {\n if (!r.isInList) r.isSelected = true;\n });\n }\n\n deselectAllAddable(): void {\n this.addableRecords.forEach(r => r.isSelected = false);\n }\n\n async confirmAddRecords(): Promise<void> {\n const recordsToAdd = this.selectedAddableRecords;\n if (recordsToAdd.length === 0 || !this.listRecord) return;\n\n this.addDialogSaving = true;\n // Reserve 20% of progress for tg.Submit()\n this.addTotal = recordsToAdd.length;\n this.addProgress = 0;\n const progressPerRecord = 0.8 / recordsToAdd.length; // 80% for individual saves\n\n const md = this.ProviderToUse;\n\n // Use transaction group for bulk insert\n const tg = await md.CreateTransactionGroup();\n\n for (let i = 0; i < recordsToAdd.length; i++) {\n const record = recordsToAdd[i];\n const listDetail = await md.GetEntityObject<MJListDetailEntityExtended>(\"MJ: List Details\", md.CurrentUser);\n listDetail.ListID = this.listRecord.ID;\n listDetail.RecordID = record.ID;\n listDetail.TransactionGroup = tg;\n const result = await listDetail.Save();\n if (!result) {\n LogErrorEx({\n message: listDetail.LatestResult?.CompleteMessage\n });\n }\n // Update progress (0-80%)\n this.addProgress = Math.round((i + 1) * progressPerRecord * this.addTotal);\n }\n\n // Show 80% complete before submit\n this.addProgress = Math.round(this.addTotal * 0.8);\n\n const success = await tg.Submit();\n\n if (success) {\n this.addProgress = this.addTotal;\n this.sharedService.CreateSimpleNotification(\n `Added ${recordsToAdd.length} record${recordsToAdd.length !== 1 ? 's' : ''} to list`,\n 'success',\n 2500\n );\n // Defer dialog close + grid refresh to the next microtask. See\n // confirmRemoveFromList for the NG0100 background.\n await Promise.resolve();\n this.closeAddRecordsDialog();\n this.refreshGrid();\n this.bumpStatsRefresh();\n this.cdr.detectChanges();\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 this.userViewsToAddIds.clear();\n\n if (!this.userViews) {\n await this.loadEntityViews();\n }\n }\n\n closeAddFromViewDialog(): void {\n this.showAddFromViewDialog = false;\n this.userViewsToAdd = [];\n this.userViewsToAddIds.clear();\n this.showAddFromViewLoader = false;\n this.addFromViewTotal = 0;\n this.setAddFromViewProgress(0);\n }\n\n private async loadEntityViews(): Promise<void> {\n if (!this.listRecord || !this.listRecord.Entity) return;\n\n this.showAddFromViewLoader = true;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const md = this.ProviderToUse;\n\n const runViewResult = await rv.RunView<MJUserViewEntityExtended>({\n EntityName: \"MJ: User Views\",\n ExtraFilter: `UserID = '${md.CurrentUser.ID}' AND EntityID = '${this.listRecord.EntityID}'`,\n ResultType: 'entity_object'\n }, md.CurrentUser);\n\n if (!runViewResult.Success) {\n LogError(`Error loading User Views for entity ${this.listRecord.Entity}`);\n } else {\n this.userViews = runViewResult.Results;\n }\n\n this.showAddFromViewLoader = false;\n this.cdr.detectChanges();\n }\n\n toggleViewSelection(view: MJUserViewEntityExtended): void {\n const index = this.userViewsToAdd.findIndex(v => UUIDsEqual(v.ID, view.ID));\n if (index >= 0) {\n this.userViewsToAdd.splice(index, 1);\n this.userViewsToAddIds.delete(NormalizeUUID(view.ID));\n } else {\n this.userViewsToAdd.push(view);\n this.userViewsToAddIds.add(NormalizeUUID(view.ID));\n }\n }\n\n isViewSelected(view: MJUserViewEntityExtended): boolean {\n return this.userViewsToAddIds.has(NormalizeUUID(view.ID));\n }\n\n async confirmAddFromView(): Promise<void> {\n if (!this.listRecord || this.userViewsToAdd.length === 0) return;\n\n this.showAddFromViewLoader = true;\n this.fetchingRecordsToSave = true;\n this.cdr.detectChanges();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const md = this.ProviderToUse;\n\n // Collect all unique record IDs from selected views.\n // Batch every selected view into a single RunViews call rather than issuing a\n // sequential RunView per view (N round-trips → 1). Each view has a distinct ViewID,\n // so this can't collapse to one query, but RunViews parallelizes the round trips.\n const recordIdSet = new Set<string>();\n\n const viewResults = await rv.RunViews(\n this.userViewsToAdd.map(userView => ({\n ViewID: userView.ID,\n ViewEntity: userView,\n Fields: [\"ID\"]\n })),\n md.CurrentUser\n );\n\n for (const runViewResult of viewResults) {\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.setAddFromViewProgress(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%) via the helper so both the counter and the\n // bound percent move in lockstep, then detectChanges() to close the\n // CD cycle on this iteration. Without detectChanges() the next await\n // can yield in the middle of a cycle and Angular's dev-mode re-check\n // catches the percent changing → NG0100 flood.\n this.setAddFromViewProgress(Math.round((i + 1) * progressPerRecord * this.addFromViewTotal));\n this.cdr.detectChanges();\n }\n\n // Show 80% complete before submit\n this.setAddFromViewProgress(Math.round(this.addFromViewTotal * 0.8));\n this.cdr.detectChanges();\n\n const success = await tg.Submit();\n\n if (success) {\n this.setAddFromViewProgress(this.addFromViewTotal);\n this.sharedService.CreateSimpleNotification(\n `Added ${recordsToAdd.length} record${recordsToAdd.length !== 1 ? 's' : ''} to list`,\n 'success',\n 2500\n );\n // Defer dialog close + grid refresh to the next microtask. See\n // confirmRemoveFromList for the NG0100 background.\n await Promise.resolve();\n this.closeAddFromViewDialog();\n this.refreshGrid();\n this.bumpStatsRefresh();\n this.cdr.detectChanges();\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 <div class=\"list-header__titleblock\">\n @if (listRecord) {\n <h1>{{ listRecord.Name }}</h1>\n } @else {\n <h1>List</h1>\n }\n @if (hasLineage) {\n <div class=\"lineage-badge\" [title]=\"'Source view: ' + (sourceViewName ?? 'unknown')\">\n <i class=\"fa-solid fa-link\"></i>\n <span>\n @if (listRecord?.UseSnapshot) {\n Snapshot of: <strong>{{ sourceViewName ?? '(unknown view)' }}</strong>\n } @else {\n Live view: <strong>{{ sourceViewName ?? '(unknown view)' }}</strong>\n }\n </span>\n @if (listRecord?.LastRefreshedAt) {\n <span class=\"lineage-badge__refreshed\">\n · last refreshed {{ listRecord!.LastRefreshedAt | date:'medium' }}\n </span>\n }\n </div>\n }\n @if (listRecord) {\n <!-- Tags section (Phase 4.2). Editable on the detail view. -->\n <div class=\"list-detail__tags\">\n <mj-tag-chips\n [Provider]=\"Provider\"\n EntityName=\"MJ: Lists\"\n [RecordID]=\"listRecord.ID\"\n [Editable]=\"capabilities.CanEdit\"\n [MaxDisplay]=\"20\">\n </mj-tag-chips>\n </div>\n }\n </div>\n @if (capabilities.CanEdit) {\n <div class=\"add-dropdown-wrapper\">\n <button mjButton variant=\"primary\" class=\"add-btn\" (click)=\"toggleAddDropdown()\">\n <span class=\"fa-solid fa-plus\"></span>\n Add to List\n <span class=\"fa-solid fa-chevron-down add-dropdown-arrow\"></span>\n </button>\n @if (showAddDropdown) {\n <div class=\"add-dropdown-panel\">\n @for (option of addOptions; track option.Text) {\n <div class=\"add-dropdown-item\" (click)=\"onDropdownItemClick(option)\">\n <span class=\"add-dropdown-item-text\">{{ option.Text }}</span>\n @if (option.Description) {\n <span class=\"add-dropdown-item-desc\">{{ option.Description }}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n } @else if (currentLevel) {\n <!-- Viewer-perspective badge so users understand why mutation\n controls are absent. Mirrors mockup 19. -->\n <span class=\"permission-badge permission-badge--viewer\">\n <i class=\"fa-solid fa-eye\"></i>\n Viewer access\n </span>\n }\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 && capabilities.CanEdit) {\n <!-- Bulk-edit toolbar (Phase 5.2, mockups 23/24).\n Move/Copy open the target-list picker. Move then routes\n through the delta-confirm dialog because the source side\n drops; Copy is additive and applies directly. -->\n <button mjButton\n (click)=\"openMoveDialog()\"\n variant=\"flat\"\n class=\"toolbar-button\"\n title=\"Move selected records to another list\">\n <span class=\"fa-solid fa-arrow-right-arrow-left\"></span>\n Move…\n </button>\n <button mjButton\n (click)=\"openCopyDialog()\"\n variant=\"flat\"\n class=\"toolbar-button\"\n title=\"Copy selected records to another list (keeps them here too)\">\n <span class=\"fa-solid fa-copy\"></span>\n Copy…\n </button>\n <select\n class=\"mj-input mj-select bulk-status-select\"\n [(ngModel)]=\"bulkStatus\"\n [disabled]=\"isApplyingBulkStatus\"\n title=\"Set status on selected items\">\n <option value=\"\">Set status…</option>\n <option value=\"Active\">Active</option>\n <option value=\"Complete\">Complete</option>\n <option value=\"Pending\">Pending</option>\n <option value=\"Disabled\">Disabled</option>\n <option value=\"Rejected\">Rejected</option>\n </select>\n <button mjButton\n (click)=\"applyBulkStatus()\"\n [disabled]=\"!bulkStatus || isApplyingBulkStatus\"\n variant=\"flat\"\n class=\"toolbar-button\">\n @if (isApplyingBulkStatus) {\n <span class=\"fa-solid fa-spinner fa-spin\"></span>\n Applying…\n } @else {\n <span class=\"fa-solid fa-pen-to-square\"></span>\n Apply Status\n }\n </button>\n <button mjButton\n (click)=\"openRemoveDialog()\"\n variant=\"flat\"\n class=\"toolbar-button remove-btn\">\n <span class=\"fa-solid fa-trash\"></span>\n Remove from List\n </button>\n }\n @if (hasLineage && capabilities.CanRefresh) {\n <select\n class=\"mj-input mj-select refresh-mode-select\"\n [ngModel]=\"refreshMode\"\n (ngModelChange)=\"onRefreshModeChange($event)\"\n [disabled]=\"isPreviewingRefresh || isApplyingRefresh\"\n title=\"Refresh mode\">\n <option value=\"Additive\">Additive</option>\n <option value=\"Sync\">Sync</option>\n </select>\n <button mjButton\n (click)=\"onRefreshFromSource()\"\n [disabled]=\"isPreviewingRefresh || isApplyingRefresh\"\n variant=\"flat\"\n class=\"toolbar-button\">\n @if (isPreviewingRefresh) {\n <span class=\"fa-solid fa-spinner fa-spin\"></span>\n Previewing...\n } @else {\n <span class=\"fa-solid fa-cloud-arrow-down\"></span>\n Refresh from Source\n }\n </button>\n }\n <button mjButton\n (click)=\"onRefreshClick()\"\n variant=\"flat\"\n class=\"toolbar-button\">\n <span class=\"fa-solid fa-rotate\"></span>\n Refresh\n </button>\n <button mjButton\n (click)=\"onExportClick()\"\n variant=\"flat\"\n class=\"toolbar-button\">\n <span class=\"fa-solid fa-file-export\"></span>\n Export\n </button>\n </div>\n </div>\n }\n\n <!-- Loading State -->\n @if (showLoader) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading list...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n <!-- Grid + side stats panel (Phase 5.4). -->\n @if (!showLoader && listRecord) {\n <div class=\"grid-with-stats\">\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 <aside class=\"list-detail__stats\">\n <mj-list-stats [Provider]=\"Provider\" [ListID]=\"listRecord.ID\" [RefreshTrigger]=\"statsRefreshTrigger\"></mj-list-stats>\n </aside>\n </div>\n }\n\n <!-- Refresh-from-source delta-confirm dialog -->\n <mj-list-delta-confirm\n [Visible]=\"refreshConfirmVisible && !!refreshDelta\"\n [Delta]=\"refreshDelta\"\n [TargetListName]=\"listRecord?.Name ?? null\"\n [SourceLabel]=\"sourceViewName\"\n (Confirm)=\"onRefreshConfirmCommit($event)\"\n (Cancel)=\"onRefreshConfirmCancel()\">\n </mj-list-delta-confirm>\n\n <!-- Move delta-confirm dialog (mockup 24). Shown only for Move,\n never for Copy. Drops on the source side require the user to\n acknowledge before Confirm enables. -->\n <mj-list-delta-confirm\n [Visible]=\"moveDeltaConfirmVisible && !!moveDelta\"\n [Delta]=\"moveDelta\"\n [TargetListName]=\"listRecord?.Name ?? null\"\n [SourceLabel]=\"'Move to ' + (moveCopySelectedTarget?.Name ?? 'target list')\"\n (Confirm)=\"onMoveConfirmCommit($event)\"\n (Cancel)=\"onMoveConfirmCancel()\">\n </mj-list-delta-confirm>\n</div>\n\n<!-- Move/Copy target picker (mockup 23). Lists every list owned by /\n shared with the current user that targets the same entity. -->\n@if (showMoveCopyDialog) {\n <mj-dialog\n [Visible]=\"true\"\n [Title]=\"(moveCopyMode === 'move' ? 'Move ' : 'Copy ') + selectedKeys.length + ' record' + (selectedKeys.length === 1 ? '' : 's') + ' to…'\"\n (Close)=\"closeMoveCopyDialog()\"\n [MinWidth]=\"480\"\n [Width]=\"640\"\n [Height]=\"560\">\n <div class=\"dialog-content move-copy-dialog\">\n @if (isApplyingMoveCopy) {\n <div class=\"dialog-loading\">\n <mj-loading [text]=\"(moveCopyMode === 'move' ? 'Moving' : 'Copying') + ' records...'\" size=\"small\"></mj-loading>\n @if (moveCopyTotal > 0) {\n <mj-progress-bar\n [Value]=\"moveCopyProgressPercent\"\n class=\"progress-bar\">\n </mj-progress-bar>\n }\n </div>\n } @else {\n <p class=\"dialog-instruction\">\n Choose the target list. Both lists must hold the same entity ({{ listRecord?.Entity ?? 'records' }}).\n </p>\n <div class=\"search-section\">\n <div class=\"search-input-wrapper\">\n <span class=\"fa-solid fa-search search-icon\"></span>\n <input\n class=\"mj-input search-input\"\n type=\"text\"\n placeholder=\"Filter lists by name…\"\n [(ngModel)]=\"moveCopyTargetSearch\" />\n </div>\n </div>\n @if (moveCopyTargetCandidatesLoading) {\n <div class=\"list-loading\">\n <mj-loading text=\"Loading lists...\" size=\"small\"></mj-loading>\n </div>\n } @else if (filteredMoveCopyTargets.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-list\"\n Title=\"No other lists found for this entity.\">\n <p class=\"dialog-note\">Create a new list first if you need a new target.</p>\n </mj-empty-state>\n } @else {\n <div class=\"records-scroll move-copy-targets\">\n @for (target of filteredMoveCopyTargets; track target.ID) {\n <div class=\"record-item\"\n [class.selected]=\"moveCopySelectedTarget?.ID === target.ID\"\n (click)=\"selectMoveCopyTarget(target)\">\n <div class=\"record-checkbox\">\n <input type=\"radio\"\n name=\"moveCopyTarget\"\n [checked]=\"moveCopySelectedTarget?.ID === target.ID\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"selectMoveCopyTarget(target)\">\n </div>\n <div class=\"record-name\">\n <strong>{{ target.Name }}</strong>\n @if (target.Description) {\n <span class=\"target-desc\"> — {{ target.Description }}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n <mj-dialog-actions>\n <button mjButton\n (click)=\"confirmMoveCopy()\"\n [disabled]=\"!moveCopySelectedTarget || isApplyingMoveCopy\"\n variant=\"primary\">\n @if (moveCopyMode === 'move') {\n <span class=\"fa-solid fa-arrow-right-arrow-left\"></span>\n Continue\n } @else {\n <span class=\"fa-solid fa-copy\"></span>\n Copy {{ selectedKeys.length }}\n }\n </button>\n <button mjButton\n (click)=\"closeMoveCopyDialog()\"\n [disabled]=\"isApplyingMoveCopy\"\n variant=\"outline\">\n Cancel\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n\n<!-- Remove from List Confirmation Dialog -->\n@if (showRemoveDialog) {\n <mj-dialog\n [Visible]=\"true\"\n Title=\"Remove from List\"\n (Close)=\"closeRemoveDialog()\"\n [MinWidth]=\"350\"\n [Width]=\"450\">\n <div class=\"dialog-content\">\n @if (isRemoving) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Removing records...\" size=\"small\"></mj-loading>\n @if (removeTotal > 0) {\n <mj-progress-bar\n [Value]=\"removeProgressPercent\"\n class=\"progress-bar\">\n </mj-progress-bar>\n }\n </div>\n } @else {\n <div class=\"dialog-message\">\n <span class=\"fa-solid fa-triangle-exclamation warning-icon\"></span>\n <p>Are you sure you want to remove <strong>{{ selectedKeys.length }}</strong> record{{ selectedKeys.length !== 1 ? 's' : '' }} from this list?</p>\n <p class=\"dialog-note\">This will not delete the records, only remove them from this list.</p>\n </div>\n }\n </div>\n <mj-dialog-actions>\n <button mjButton\n (click)=\"confirmRemoveFromList()\"\n [disabled]=\"isRemoving\"\n variant=\"danger\">\n Remove\n </button>\n <button mjButton\n (click)=\"closeRemoveDialog()\"\n [disabled]=\"isRemoving\"\n variant=\"outline\">\n Cancel\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n\n<!-- Add Records Dialog -->\n@if (showAddRecordsDialog) {\n <mj-dialog\n [Visible]=\"true\"\n [Title]=\"'Add ' + (listRecord?.Entity || 'Records') + ' to List'\"\n (Close)=\"closeAddRecordsDialog()\"\n [MinWidth]=\"500\"\n [Width]=\"700\"\n [Height]=\"650\">\n <div class=\"dialog-content add-records-dialog\">\n @if (addDialogSaving) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Adding records to list...\" size=\"small\"></mj-loading>\n @if (addTotal > 0) {\n <mj-progress-bar\n [Value]=\"addProgressPercent\"\n class=\"progress-bar\">\n </mj-progress-bar>\n }\n </div>\n } @else {\n <!-- Search Input -->\n <div class=\"search-section\">\n <div class=\"search-input-wrapper\">\n <span class=\"fa-solid fa-search search-icon\"></span>\n <input\n class=\"mj-input search-input\"\n type=\"text\"\n [placeholder]=\"'Search ' + (listRecord?.Entity || 'records') + '...'\"\n [value]=\"addRecordsSearchFilter\"\n (input)=\"onAddRecordsSearchInputEvent($event)\" />\n </div>\n <span class=\"search-hint\">Type at least 2 characters to search</span>\n </div>\n <!-- Records List -->\n <div class=\"records-list\">\n @if (addDialogLoading) {\n <div class=\"list-loading\">\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n </div>\n } @else if (addableRecords.length === 0 && addRecordsSearchFilter.length >= 2) {\n <mj-empty-state\n Variant=\"no-results\"\n Size=\"compact\"\n Icon=\"fa-solid fa-magnifying-glass\"\n [Title]=\"AddRecordsNoMatchTitle\" />\n } @else if (addableRecords.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-list\"\n Title=\"Search for records to add to this list\" />\n } @else {\n <!-- Selection controls -->\n <div class=\"selection-controls\">\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"selectAllAddable()\">Select All</button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"deselectAllAddable()\">Deselect All</button>\n <span class=\"selection-info\">{{ selectedAddableRecords.length }} selected</span>\n </div>\n <!-- Records -->\n <div class=\"records-scroll\">\n @for (record of addableRecords; track record.ID) {\n <div class=\"record-item\"\n [class.in-list]=\"record.isInList\"\n [class.selected]=\"record.isSelected\"\n (click)=\"toggleRecordSelection(record)\">\n <div class=\"record-checkbox\">\n @if (record.isInList) {\n <span class=\"fa-solid fa-check in-list-icon\" title=\"Already in list\"></span>\n } @else {\n <input type=\"checkbox\"\n [checked]=\"record.isSelected\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRecordSelection(record)\">\n }\n </div>\n <div class=\"record-name\">{{ record.Name }}</div>\n @if (record.isInList) {\n <span class=\"in-list-badge\">In List</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n <mj-dialog-actions>\n <button mjButton\n (click)=\"confirmAddRecords()\"\n [disabled]=\"addDialogSaving || selectedAddableRecords.length === 0\"\n variant=\"primary\">\n Add {{ selectedAddableRecords.length > 0 ? selectedAddableRecords.length : '' }} Record{{ selectedAddableRecords.length !== 1 ? 's' : '' }}\n </button>\n <button mjButton\n (click)=\"closeAddRecordsDialog()\"\n [disabled]=\"addDialogSaving\"\n variant=\"outline\">\n Cancel\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n\n<!-- Export Dialog (mockup 26) — format + column picker -->\n@if (showExportDialog && listRecord) {\n <mj-dialog\n [Visible]=\"true\"\n [Title]=\"'Export ' + exportRecordCount + ' Record' + (exportRecordCount === 1 ? '' : 's')\"\n (Close)=\"closeExportDialog()\"\n [MinWidth]=\"520\"\n [Width]=\"640\"\n [Height]=\"640\">\n <div class=\"dialog-content export-dialog\">\n <label class=\"export-section-label\">Format</label>\n <div class=\"export-format-row\">\n <label class=\"export-format-option\"\n [class.export-format-option--selected]=\"exportFormat === 'excel'\"\n (click)=\"exportFormat = 'excel'\">\n <input type=\"radio\" name=\"exportFormat\" value=\"excel\" [(ngModel)]=\"exportFormat\">\n <i class=\"fa-solid fa-file-excel\" style=\"color: var(--mj-status-success);\"></i>\n <span>Excel (.xlsx)</span>\n </label>\n <label class=\"export-format-option\"\n [class.export-format-option--selected]=\"exportFormat === 'csv'\"\n (click)=\"exportFormat = 'csv'\">\n <input type=\"radio\" name=\"exportFormat\" value=\"csv\" [(ngModel)]=\"exportFormat\">\n <i class=\"fa-solid fa-file-csv\" style=\"color: var(--mj-text-secondary);\"></i>\n <span>CSV</span>\n </label>\n <label class=\"export-format-option\"\n [class.export-format-option--selected]=\"exportFormat === 'json'\"\n (click)=\"exportFormat = 'json'\">\n <input type=\"radio\" name=\"exportFormat\" value=\"json\" [(ngModel)]=\"exportFormat\">\n <i class=\"fa-solid fa-file-code\" style=\"color: var(--mj-brand-primary);\"></i>\n <span>JSON</span>\n </label>\n </div>\n\n <div class=\"export-section-divider\"></div>\n\n <label class=\"export-section-label\">Columns to include</label>\n <div class=\"export-fields-list\">\n @for (f of exportFields; track f.Name) {\n <label class=\"export-field-row\">\n <input type=\"checkbox\" [(ngModel)]=\"f.Selected\">\n <span>{{ f.DisplayName }}</span>\n </label>\n }\n </div>\n <div class=\"export-field-actions\">\n <a href=\"#\" (click)=\"selectAllExportFields(); $event.preventDefault()\">Select All</a>\n <a href=\"#\" (click)=\"selectNoneExportFields(); $event.preventDefault()\">Select None</a>\n <span class=\"muted\">{{ selectedExportFieldCount }} of {{ exportFields.length }} selected</span>\n </div>\n </div>\n <mj-dialog-actions>\n <button mjButton variant=\"primary\"\n [disabled]=\"selectedExportFieldCount === 0 || isExporting\"\n (click)=\"executeExport()\">\n @if (isExporting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Exporting…\n } @else {\n <i class=\"fa-solid fa-download\"></i>\n Export {{ exportRecordCount }} Record{{ exportRecordCount === 1 ? '' : 's' }}\n }\n </button>\n <button mjButton variant=\"outline\" [disabled]=\"isExporting\" (click)=\"closeExportDialog()\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n\n<!-- Add From View Dialog -->\n@if (showAddFromViewDialog) {\n <mj-dialog\n [Visible]=\"true\"\n Title=\"Add Records from Views\"\n (Close)=\"closeAddFromViewDialog()\"\n [MinWidth]=\"400\"\n [Width]=\"600\"\n [Height]=\"500\">\n <div class=\"dialog-content\">\n @if (showAddFromViewLoader && fetchingRecordsToSave) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Loading records from views...\" size=\"small\"></mj-loading>\n </div>\n } @else if (showAddFromViewLoader && addFromViewTotal > 0) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Adding records to list...\" size=\"small\"></mj-loading>\n <mj-progress-bar\n [Value]=\"addFromViewProgressPercent\"\n class=\"progress-bar\">\n </mj-progress-bar>\n </div>\n } @else if (showAddFromViewLoader) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Loading views...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <p class=\"dialog-instruction\">Select views to add their records to this list:</p>\n <div class=\"views-list\">\n @if (!userViews || userViews.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-folder-open\"\n Title=\"No saved views found for this entity\" />\n } @else {\n @for (view of userViews; track view.ID) {\n <div class=\"view-item\"\n [class.selected]=\"isViewSelected(view)\"\n (click)=\"toggleViewSelection(view)\">\n <input type=\"checkbox\"\n [checked]=\"isViewSelected(view)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleViewSelection(view)\">\n <span class=\"fa-solid fa-table-list view-icon\"></span>\n <span class=\"view-name\">{{ view.Name }}</span>\n </div>\n }\n }\n </div>\n }\n </div>\n <mj-dialog-actions>\n <button mjButton\n (click)=\"confirmAddFromView()\"\n [disabled]=\"showAddFromViewLoader || userViewsToAdd.length === 0\"\n variant=\"primary\">\n Add from {{ userViewsToAdd.length }} View{{ userViewsToAdd.length !== 1 ? 's' : '' }}\n </button>\n <button mjButton\n (click)=\"closeAddFromViewDialog()\"\n [disabled]=\"showAddFromViewLoader\"\n variant=\"outline\">\n Cancel\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n"]}
1
+ {"version":3,"file":"single-list-detail.component.js","sourceRoot":"","sources":["../../../src/lib/single-list-detail/single-list-detail.component.ts","../../../src/lib/single-list-detail/single-list-detail.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnInit, OnDestroy, ViewChild, ChangeDetectorRef, HostListener, ElementRef } from '@angular/core';\nimport { BaseEntity, CompositeKey, EntityInfo, 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 { GraphQLDataProvider, GraphQLListsClient } from '@memberjunction/graphql-dataprovider';\nimport { CapabilitiesForLevel, type ListCapabilities, type ListDelta, type ListRefreshMode, type SharePermissionLevel } from '@memberjunction/lists-base';\nimport { ListSharingService, GetRecordDisplayField, IsTextSearchableField, FormatRecordDisplayValue } from '@memberjunction/ng-list-management';\nimport { ExportService } from '@memberjunction/ng-export-service';\nimport { Subject, debounceTime, takeUntil } from 'rxjs';\nimport { NewItemOption } from '../../generic/Item.types';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n/**\n * Represents a record that can be added to a list\n */\ninterface AddableRecord {\n ID: string;\n Name: string;\n isInList: boolean;\n isSelected: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-list-detail',\n templateUrl: './single-list-detail.component.html',\n styleUrls: ['./single-list-detail.component.css', '../../shared/first-tab-styles.css']\n})\nexport class SingleListDetailComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n\n @Input() public ListID: string = \"\";\n\n /**\n * Bumped on every list-membership mutation so the Usage stats sidebar\n * re-queries member count / growth / last-activity. Without this nudge,\n * those numbers drift from reality until a full page reload because the\n * stats component otherwise only loads on init.\n */\n public StatsRefreshTrigger = 0;\n\n /** @deprecated Use {@link StatsRefreshTrigger}. */\n public get statsRefreshTrigger() {\n return this.StatsRefreshTrigger;\n }\n /** @deprecated Use {@link StatsRefreshTrigger}. */\n public set statsRefreshTrigger(value) {\n this.StatsRefreshTrigger = value;\n }\n private bumpStatsRefresh(): void { this.StatsRefreshTrigger++; }\n\n @ViewChild('listDetailGrid') ListDetailGrid: ListDetailGridComponent | undefined;\n\n /** @deprecated Use {@link ListDetailGrid}. */\n get listDetailGrid(): ListDetailGridComponent | undefined {\n return this.ListDetailGrid;\n }\n /** @deprecated Use {@link ListDetailGrid}. */\n set listDetailGrid(value: ListDetailGridComponent | undefined) {\n this.ListDetailGrid = value;\n }\n\n // List record\n public ListRecord: MJListEntity | null = null;\n\n /** @deprecated Use {@link ListRecord}. */\n public get listRecord(): MJListEntity | null {\n return this.ListRecord;\n }\n /** @deprecated Use {@link ListRecord}. */\n public set listRecord(value: MJListEntity | null) {\n this.ListRecord = value;\n }\n public ShowLoader: boolean = false;\n\n /** @deprecated Use {@link ShowLoader}. */\n public get showLoader(): boolean {\n return this.ShowLoader;\n }\n /** @deprecated Use {@link ShowLoader}. */\n public set showLoader(value: boolean) {\n this.ShowLoader = value;\n }\n\n // Permission-level gating (Phase 2.8). Resolved lazily after the list\n // loads. Capabilities is exposed to the template for `@if` gating; the\n // server-side enforcement remains the source of truth — these flags\n // are a UX convenience so users don't see buttons they'll be rejected on.\n public Capabilities: ListCapabilities = CapabilitiesForLevel(null);\n\n /** @deprecated Use {@link Capabilities}. */\n public get capabilities(): ListCapabilities {\n return this.Capabilities;\n }\n /** @deprecated Use {@link Capabilities}. */\n public set capabilities(value: ListCapabilities) {\n this.Capabilities = value;\n }\n public CurrentLevel: SharePermissionLevel | null = null;\n\n /** @deprecated Use {@link CurrentLevel}. */\n public get currentLevel(): SharePermissionLevel | null {\n return this.CurrentLevel;\n }\n /** @deprecated Use {@link CurrentLevel}. */\n public set currentLevel(value: SharePermissionLevel | null) {\n this.CurrentLevel = value;\n }\n\n // Lineage / refresh-from-source state. `sourceViewName` is loaded after\n // listRecord so the lineage badge can show a friendly view name; the\n // refresh-mode default falls back to the list's RefreshMode field but\n // can be overridden per-user via localStorage (see `loadLastUsedMode`).\n public SourceViewName: string | null = null;\n\n /** @deprecated Use {@link SourceViewName}. */\n public get sourceViewName(): string | null {\n return this.SourceViewName;\n }\n /** @deprecated Use {@link SourceViewName}. */\n public set sourceViewName(value: string | null) {\n this.SourceViewName = value;\n }\n\n // Bulk-edit (Phase 5.2). Status, Move, Copy, Remove. Move flows through\n // the delta-confirm dialog because it produces drops on the source list.\n public BulkStatus: 'Active' | 'Complete' | 'Disabled' | 'Pending' | 'Rejected' | '' = '';\n\n /** @deprecated Use {@link BulkStatus}. */\n public get bulkStatus(): 'Active' | 'Complete' | 'Disabled' | 'Pending' | 'Rejected' | '' {\n return this.BulkStatus;\n }\n /** @deprecated Use {@link BulkStatus}. */\n public set bulkStatus(value: 'Active' | 'Complete' | 'Disabled' | 'Pending' | 'Rejected' | '') {\n this.BulkStatus = value;\n }\n public IsApplyingBulkStatus = false;\n\n /** @deprecated Use {@link IsApplyingBulkStatus}. */\n public get isApplyingBulkStatus() {\n return this.IsApplyingBulkStatus;\n }\n /** @deprecated Use {@link IsApplyingBulkStatus}. */\n public set isApplyingBulkStatus(value) {\n this.IsApplyingBulkStatus = value;\n }\n\n // Move / Copy state (mockups 23, 24). The picker dialog lists candidate\n // target lists scoped to the same entity. We load it lazily on first\n // open and cache for the session — opening the picker twice in a row\n // doesn't re-fetch unless the user explicitly hits \"Refresh\".\n public ShowMoveCopyDialog = false;\n\n /** @deprecated Use {@link ShowMoveCopyDialog}. */\n public get showMoveCopyDialog() {\n return this.ShowMoveCopyDialog;\n }\n /** @deprecated Use {@link ShowMoveCopyDialog}. */\n public set showMoveCopyDialog(value) {\n this.ShowMoveCopyDialog = value;\n }\n public MoveCopyMode: 'move' | 'copy' = 'move';\n\n /** @deprecated Use {@link MoveCopyMode}. */\n public get moveCopyMode(): 'move' | 'copy' {\n return this.MoveCopyMode;\n }\n /** @deprecated Use {@link MoveCopyMode}. */\n public set moveCopyMode(value: 'move' | 'copy') {\n this.MoveCopyMode = value;\n }\n public MoveCopyTargetSearch = '';\n\n /** @deprecated Use {@link MoveCopyTargetSearch}. */\n public get moveCopyTargetSearch() {\n return this.MoveCopyTargetSearch;\n }\n /** @deprecated Use {@link MoveCopyTargetSearch}. */\n public set moveCopyTargetSearch(value) {\n this.MoveCopyTargetSearch = value;\n }\n public MoveCopyTargetCandidates: MJListEntity[] = [];\n\n /** @deprecated Use {@link MoveCopyTargetCandidates}. */\n public get moveCopyTargetCandidates(): MJListEntity[] {\n return this.MoveCopyTargetCandidates;\n }\n /** @deprecated Use {@link MoveCopyTargetCandidates}. */\n public set moveCopyTargetCandidates(value: MJListEntity[]) {\n this.MoveCopyTargetCandidates = value;\n }\n public MoveCopyTargetCandidatesLoading = false;\n\n /** @deprecated Use {@link MoveCopyTargetCandidatesLoading}. */\n public get moveCopyTargetCandidatesLoading() {\n return this.MoveCopyTargetCandidatesLoading;\n }\n /** @deprecated Use {@link MoveCopyTargetCandidatesLoading}. */\n public set moveCopyTargetCandidatesLoading(value) {\n this.MoveCopyTargetCandidatesLoading = value;\n }\n public MoveCopySelectedTarget: MJListEntity | null = null;\n\n /** @deprecated Use {@link MoveCopySelectedTarget}. */\n public get moveCopySelectedTarget(): MJListEntity | null {\n return this.MoveCopySelectedTarget;\n }\n /** @deprecated Use {@link MoveCopySelectedTarget}. */\n public set moveCopySelectedTarget(value: MJListEntity | null) {\n this.MoveCopySelectedTarget = value;\n }\n public IsApplyingMoveCopy = false;\n\n /** @deprecated Use {@link IsApplyingMoveCopy}. */\n public get isApplyingMoveCopy() {\n return this.IsApplyingMoveCopy;\n }\n /** @deprecated Use {@link IsApplyingMoveCopy}. */\n public set isApplyingMoveCopy(value) {\n this.IsApplyingMoveCopy = value;\n }\n public MoveCopyProgress = 0;\n\n /** @deprecated Use {@link MoveCopyProgress}. */\n public get moveCopyProgress() {\n return this.MoveCopyProgress;\n }\n /** @deprecated Use {@link MoveCopyProgress}. */\n public set moveCopyProgress(value) {\n this.MoveCopyProgress = value;\n }\n public MoveCopyTotal = 0;\n\n /** @deprecated Use {@link MoveCopyTotal}. */\n public get moveCopyTotal() {\n return this.MoveCopyTotal;\n }\n /** @deprecated Use {@link MoveCopyTotal}. */\n public set moveCopyTotal(value) {\n this.MoveCopyTotal = value;\n }\n\n // Move delta-confirm. Built locally from the in-hand RecordIDs — no\n // server round-trip needed since we already know exactly what will be\n // added to the target and removed from the source. The drop-guard is\n // enforced at confirm time (mode='move' + ack checkbox).\n public MoveDeltaConfirmVisible = false;\n\n /** @deprecated Use {@link MoveDeltaConfirmVisible}. */\n public get moveDeltaConfirmVisible() {\n return this.MoveDeltaConfirmVisible;\n }\n /** @deprecated Use {@link MoveDeltaConfirmVisible}. */\n public set moveDeltaConfirmVisible(value) {\n this.MoveDeltaConfirmVisible = value;\n }\n public MoveDelta: ListDelta | null = null;\n\n /** @deprecated Use {@link MoveDelta}. */\n public get moveDelta(): ListDelta | null {\n return this.MoveDelta;\n }\n /** @deprecated Use {@link MoveDelta}. */\n public set moveDelta(value: ListDelta | null) {\n this.MoveDelta = value;\n }\n\n // Export picker (Phase 5.1, mockup 26). Opens before any export; lets\n // the user pick format + which entity fields to include. Fields are\n // resolved from EntityInfo on the loaded provider — no separate fetch.\n public ShowExportDialog = false;\n\n /** @deprecated Use {@link ShowExportDialog}. */\n public get showExportDialog() {\n return this.ShowExportDialog;\n }\n /** @deprecated Use {@link ShowExportDialog}. */\n public set showExportDialog(value) {\n this.ShowExportDialog = value;\n }\n public ExportFormat: 'excel' | 'csv' | 'json' = 'excel';\n\n /** @deprecated Use {@link ExportFormat}. */\n public get exportFormat(): 'excel' | 'csv' | 'json' {\n return this.ExportFormat;\n }\n /** @deprecated Use {@link ExportFormat}. */\n public set exportFormat(value: 'excel' | 'csv' | 'json') {\n this.ExportFormat = value;\n }\n public ExportFields: Array<{ Name: string; DisplayName: string; Selected: boolean }> = [];\n\n /** @deprecated Use {@link ExportFields}. */\n public get exportFields(): Array<{ Name: string; DisplayName: string; Selected: boolean }> {\n return this.ExportFields;\n }\n /** @deprecated Use {@link ExportFields}. */\n public set exportFields(value: Array<{ Name: string; DisplayName: string; Selected: boolean }>) {\n this.ExportFields = value;\n }\n public ExportRecordCount = 0;\n\n /** @deprecated Use {@link ExportRecordCount}. */\n public get exportRecordCount() {\n return this.ExportRecordCount;\n }\n /** @deprecated Use {@link ExportRecordCount}. */\n public set exportRecordCount(value) {\n this.ExportRecordCount = value;\n }\n public IsExporting = false;\n\n /** @deprecated Use {@link IsExporting}. */\n public get isExporting() {\n return this.IsExporting;\n }\n /** @deprecated Use {@link IsExporting}. */\n public set isExporting(value) {\n this.IsExporting = value;\n }\n public RefreshMode: ListRefreshMode = 'Additive';\n\n /** @deprecated Use {@link RefreshMode}. */\n public get refreshMode(): ListRefreshMode {\n return this.RefreshMode;\n }\n /** @deprecated Use {@link RefreshMode}. */\n public set refreshMode(value: ListRefreshMode) {\n this.RefreshMode = value;\n }\n public IsPreviewingRefresh = false;\n\n /** @deprecated Use {@link IsPreviewingRefresh}. */\n public get isPreviewingRefresh() {\n return this.IsPreviewingRefresh;\n }\n /** @deprecated Use {@link IsPreviewingRefresh}. */\n public set isPreviewingRefresh(value) {\n this.IsPreviewingRefresh = value;\n }\n public IsApplyingRefresh = false;\n\n /** @deprecated Use {@link IsApplyingRefresh}. */\n public get isApplyingRefresh() {\n return this.IsApplyingRefresh;\n }\n /** @deprecated Use {@link IsApplyingRefresh}. */\n public set isApplyingRefresh(value) {\n this.IsApplyingRefresh = value;\n }\n public RefreshDelta: ListDelta | null = null;\n\n /** @deprecated Use {@link RefreshDelta}. */\n public get refreshDelta(): ListDelta | null {\n return this.RefreshDelta;\n }\n /** @deprecated Use {@link RefreshDelta}. */\n public set refreshDelta(value: ListDelta | null) {\n this.RefreshDelta = value;\n }\n public RefreshConfirmVisible = false;\n\n /** @deprecated Use {@link RefreshConfirmVisible}. */\n public get refreshConfirmVisible() {\n return this.RefreshConfirmVisible;\n }\n /** @deprecated Use {@link RefreshConfirmVisible}. */\n public set refreshConfirmVisible(value) {\n this.RefreshConfirmVisible = value;\n }\n\n // Grid state\n public SelectedKeys: string[] = [];\n\n /** @deprecated Use {@link SelectedKeys}. */\n public get selectedKeys(): string[] {\n return this.SelectedKeys;\n }\n /** @deprecated Use {@link SelectedKeys}. */\n public set selectedKeys(value: string[]) {\n this.SelectedKeys = value;\n }\n public RowCount: number = 0;\n\n /** @deprecated Use {@link RowCount}. */\n public get rowCount(): number {\n return this.RowCount;\n }\n /** @deprecated Use {@link RowCount}. */\n public set rowCount(value: number) {\n this.RowCount = value;\n }\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 /** @deprecated Use {@link GridToolbarConfig}. */\n public get gridToolbarConfig(): GridToolbarConfig {\n return this.GridToolbarConfig;\n }\n /** @deprecated Use {@link GridToolbarConfig}. */\n public set gridToolbarConfig(value: GridToolbarConfig) {\n this.GridToolbarConfig = value;\n }\n\n // Remove from list dialog\n public ShowRemoveDialog: boolean = false;\n\n /** @deprecated Use {@link ShowRemoveDialog}. */\n public get showRemoveDialog(): boolean {\n return this.ShowRemoveDialog;\n }\n /** @deprecated Use {@link ShowRemoveDialog}. */\n public set showRemoveDialog(value: boolean) {\n this.ShowRemoveDialog = value;\n }\n public IsRemoving: boolean = false;\n\n /** @deprecated Use {@link IsRemoving}. */\n public get isRemoving(): boolean {\n return this.IsRemoving;\n }\n /** @deprecated Use {@link IsRemoving}. */\n public set isRemoving(value: boolean) {\n this.IsRemoving = value;\n }\n public RemoveProgress: number = 0;\n\n /** @deprecated Use {@link RemoveProgress}. */\n public get removeProgress(): number {\n return this.RemoveProgress;\n }\n /** @deprecated Use {@link RemoveProgress}. */\n public set removeProgress(value: number) {\n this.RemoveProgress = value;\n }\n public RemoveTotal: number = 0;\n\n /** @deprecated Use {@link RemoveTotal}. */\n public get removeTotal(): number {\n return this.RemoveTotal;\n }\n /** @deprecated Use {@link RemoveTotal}. */\n public set removeTotal(value: number) {\n this.RemoveTotal = value;\n }\n\n // Add records dialog\n public ShowAddRecordsDialog: boolean = false;\n\n /** @deprecated Use {@link ShowAddRecordsDialog}. */\n public get showAddRecordsDialog(): boolean {\n return this.ShowAddRecordsDialog;\n }\n /** @deprecated Use {@link ShowAddRecordsDialog}. */\n public set showAddRecordsDialog(value: boolean) {\n this.ShowAddRecordsDialog = value;\n }\n public AddDialogLoading: boolean = false;\n\n /** @deprecated Use {@link AddDialogLoading}. */\n public get addDialogLoading(): boolean {\n return this.AddDialogLoading;\n }\n /** @deprecated Use {@link AddDialogLoading}. */\n public set addDialogLoading(value: boolean) {\n this.AddDialogLoading = value;\n }\n public AddDialogSaving: boolean = false;\n\n /** @deprecated Use {@link AddDialogSaving}. */\n public get addDialogSaving(): boolean {\n return this.AddDialogSaving;\n }\n /** @deprecated Use {@link AddDialogSaving}. */\n public set addDialogSaving(value: boolean) {\n this.AddDialogSaving = value;\n }\n public AddableRecords: AddableRecord[] = [];\n\n /** @deprecated Use {@link AddableRecords}. */\n public get addableRecords(): AddableRecord[] {\n return this.AddableRecords;\n }\n /** @deprecated Use {@link AddableRecords}. */\n public set addableRecords(value: AddableRecord[]) {\n this.AddableRecords = value;\n }\n public AddRecordsSearchFilter: string = \"\";\n\n /** @deprecated Use {@link AddRecordsSearchFilter}. */\n public get addRecordsSearchFilter(): string {\n return this.AddRecordsSearchFilter;\n }\n /** @deprecated Use {@link AddRecordsSearchFilter}. */\n public set addRecordsSearchFilter(value: string) {\n this.AddRecordsSearchFilter = value;\n }\n\n /** Empty-state title shown when an add-records search returns no matches. */\n public get AddRecordsNoMatchTitle(): string {\n return `No records found matching \"${this.AddRecordsSearchFilter}\"`;\n }\n\n public ExistingListDetailIds: Set<string> = new Set();\n\n /** @deprecated Use {@link ExistingListDetailIds}. */\n public get existingListDetailIds(): Set<string> {\n return this.ExistingListDetailIds;\n }\n /** @deprecated Use {@link ExistingListDetailIds}. */\n public set existingListDetailIds(value: Set<string>) {\n this.ExistingListDetailIds = value;\n }\n public AddProgress: number = 0;\n\n /** @deprecated Use {@link AddProgress}. */\n public get addProgress(): number {\n return this.AddProgress;\n }\n /** @deprecated Use {@link AddProgress}. */\n public set addProgress(value: number) {\n this.AddProgress = value;\n }\n public AddTotal: number = 0;\n\n /** @deprecated Use {@link AddTotal}. */\n public get addTotal(): number {\n return this.AddTotal;\n }\n /** @deprecated Use {@link AddTotal}. */\n public set addTotal(value: number) {\n this.AddTotal = value;\n }\n private searchSubject: Subject<string> = new Subject();\n private destroy$ = new Subject<void>();\n\n // Add from view dialog (existing)\n public ShowAddFromViewDialog: boolean = false;\n\n /** @deprecated Use {@link ShowAddFromViewDialog}. */\n public get showAddFromViewDialog(): boolean {\n return this.ShowAddFromViewDialog;\n }\n /** @deprecated Use {@link ShowAddFromViewDialog}. */\n public set showAddFromViewDialog(value: boolean) {\n this.ShowAddFromViewDialog = value;\n }\n public ShowAddFromViewLoader: boolean = false;\n\n /** @deprecated Use {@link ShowAddFromViewLoader}. */\n public get showAddFromViewLoader(): boolean {\n return this.ShowAddFromViewLoader;\n }\n /** @deprecated Use {@link ShowAddFromViewLoader}. */\n public set showAddFromViewLoader(value: boolean) {\n this.ShowAddFromViewLoader = value;\n }\n public UserViews: MJUserViewEntityExtended[] | null = null;\n\n /** @deprecated Use {@link UserViews}. */\n public get userViews(): MJUserViewEntityExtended[] | null {\n return this.UserViews;\n }\n /** @deprecated Use {@link UserViews}. */\n public set userViews(value: MJUserViewEntityExtended[] | null) {\n this.UserViews = value;\n }\n public UserViewsToAdd: MJUserViewEntityExtended[] = [];\n\n /** @deprecated Use {@link UserViewsToAdd}. */\n public get userViewsToAdd(): MJUserViewEntityExtended[] {\n return this.UserViewsToAdd;\n }\n /** @deprecated Use {@link UserViewsToAdd}. */\n public set userViewsToAdd(value: MJUserViewEntityExtended[]) {\n this.UserViewsToAdd = value;\n }\n /**\n * Normalized-UUID set of the IDs in {@link userViewsToAdd}, kept in sync with that\n * array. Lets {@link isViewSelected} (bound per-row in the dialog's @for, ~2x/row)\n * do an O(1) lookup instead of scanning the array with UUIDsEqual on every check.\n */\n private userViewsToAddIds: Set<string> = new Set<string>();\n public AddFromViewProgress: number = 0;\n\n /** @deprecated Use {@link AddFromViewProgress}. */\n public get addFromViewProgress(): number {\n return this.AddFromViewProgress;\n }\n /** @deprecated Use {@link AddFromViewProgress}. */\n public set addFromViewProgress(value: number) {\n this.AddFromViewProgress = value;\n }\n public AddFromViewTotal: number = 0;\n\n /** @deprecated Use {@link AddFromViewTotal}. */\n public get addFromViewTotal(): number {\n return this.AddFromViewTotal;\n }\n /** @deprecated Use {@link AddFromViewTotal}. */\n public set addFromViewTotal(value: number) {\n this.AddFromViewTotal = value;\n }\n /**\n * Stored percent (0–100) for the progress bar. Backed instead of computed\n * via getter because the original getter recomputed on every Angular CD\n * read and the async save loop mutated addFromViewProgress between the\n * initial check and dev-mode re-check — producing NG0100\n * ExpressionChangedAfterItHasBeenCheckedError floods in the console.\n * Updated via setAddFromViewProgress(...) at controlled points.\n */\n public AddFromViewProgressPercent: number = 0;\n\n /** @deprecated Use {@link AddFromViewProgressPercent}. */\n public get addFromViewProgressPercent(): number {\n return this.AddFromViewProgressPercent;\n }\n /** @deprecated Use {@link AddFromViewProgressPercent}. */\n public set addFromViewProgressPercent(value: number) {\n this.AddFromViewProgressPercent = value;\n }\n public FetchingRecordsToSave: boolean = false;\n\n /** @deprecated Use {@link FetchingRecordsToSave}. */\n public get fetchingRecordsToSave(): boolean {\n return this.FetchingRecordsToSave;\n }\n /** @deprecated Use {@link FetchingRecordsToSave}. */\n public set fetchingRecordsToSave(value: boolean) {\n this.FetchingRecordsToSave = value;\n }\n\n // Dropdown button toggle state\n public ShowAddDropdown: boolean = false;\n\n /** @deprecated Use {@link ShowAddDropdown}. */\n public get showAddDropdown(): boolean {\n return this.ShowAddDropdown;\n }\n /** @deprecated Use {@link ShowAddDropdown}. */\n public set showAddDropdown(value: boolean) {\n this.ShowAddDropdown = value;\n }\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 /** @deprecated Use {@link AddOptions}. */\n public get addOptions(): NewItemOption[] {\n return this.AddOptions;\n }\n /** @deprecated Use {@link AddOptions}. */\n public set addOptions(value: NewItemOption[]) {\n this.AddOptions = value;\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (this.ShowAddDropdown) {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.querySelector('.add-dropdown-wrapper')?.contains(target)) {\n this.ShowAddDropdown = false;\n }\n }\n }\n\n constructor(\n private sharedService: SharedService,\n private cdr: ChangeDetectorRef,\n private elementRef: ElementRef,\n private exportService: ExportService,\n private listSharingService: ListSharingService,\n ) {\n super();\n // Debounce search input\n this.searchSubject\n .pipe(debounceTime(300), takeUntil(this.destroy$))\n .subscribe((searchText) => this.searchRecords(searchText));\n }\n\n public ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n public ngOnInit(): void {\n if (this.ListID) {\n // Defer the load to a macrotask so the initial assignment of\n // `listRecord` cannot land during Angular's dev-mode verify pass\n // (NG0100). The first CD cycle renders with listRecord=null\n // (\"List\"); the macrotask then loads, assigns, and fires its own\n // detectChanges in a fresh cycle.\n setTimeout(() => { void this.loadListRecord(); }, 0);\n }\n }\n\n /**\n * Load the list entity record\n */\n private async loadListRecord(): Promise<void> {\n if (!this.ListID) return;\n\n this.ShowLoader = true;\n\n try {\n const md = this.ProviderToUse;\n // Build + load against a LOCAL handle. Only assign to\n // this.listRecord after Load() succeeds — otherwise Angular's\n // change detector sees a transiently-populated half-loaded\n // entity (Name=null) before Load fills it in, and the title\n // binding throws ExpressionChangedAfterItHasBeenCheckedError.\n const list = await md.GetEntityObject<MJListEntity>(\"MJ: Lists\");\n const loadResult = await list.Load(this.ListID);\n\n if (!loadResult) {\n LogError(\"Error loading list with ID \" + this.ListID, undefined, list.LatestResult);\n this.ListRecord = null;\n } else {\n this.ListRecord = list;\n await this.loadLineageContext();\n await this.loadCapabilities();\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 * Load lineage context for the refresh-from-source UI:\n * - Resolve the source view's display name for the lineage badge.\n * - Initialize the refresh-mode dropdown from per-user last-used\n * preference, falling back to the list's RefreshMode field.\n * Silent on failure — the badge / refresh button just won't render\n * rather than blocking the rest of the detail view.\n */\n private async loadLineageContext(): Promise<void> {\n if (!this.ListRecord?.SourceViewID) {\n this.SourceViewName = null;\n return;\n }\n this.RefreshMode = this.loadLastUsedMode() ?? this.ListRecord.RefreshMode;\n try {\n const view = await this.ProviderToUse.GetEntityObject<MJUserViewEntityExtended>('MJ: User Views');\n const loaded = await view.Load(this.ListRecord.SourceViewID);\n this.SourceViewName = loaded ? view.Name : null;\n } catch (e) {\n LogError(`Failed to load source view name for list ${this.ListID}: ${e}`);\n this.SourceViewName = null;\n }\n }\n\n /**\n * Resolve the caller's permission level for this list (Owner / Edit /\n * View / null) and derive UI capability flags. Best-effort — if the\n * resolve fails we conservatively default to no-mutation (Viewer-like)\n * so we don't accidentally surface buttons the server will reject.\n */\n private async loadCapabilities(): Promise<void> {\n if (!this.ListRecord) {\n this.Capabilities = CapabilitiesForLevel(null);\n this.CurrentLevel = null;\n return;\n }\n try {\n const currentUserId = this.ProviderToUse.CurrentUser?.ID;\n if (!currentUserId) {\n this.Capabilities = CapabilitiesForLevel('View');\n this.CurrentLevel = 'View';\n return;\n }\n // Fast path: the list's UserID is its owner. Owners always have full\n // capabilities and don't carry a Resource Permission row (ownership\n // is implicit), so the permission-row lookup below would return null\n // and incorrectly hide all edit/share/delete buttons. Mirrors the\n // owner short-circuit in the server-side ListSharing.ResolveEffectivePermission.\n if (UUIDsEqual(this.ListRecord.UserID, currentUserId)) {\n this.CurrentLevel = 'Owner';\n this.Capabilities = CapabilitiesForLevel('Owner');\n return;\n }\n // Non-owner: resolve via ListSharingService (GraphQL). Never instantiate\n // the server-side `ListSharing` class from a browser bundle.\n const level = (await this.listSharingService.getUserPermissionLevel(this.ListRecord.ID, currentUserId)) as SharePermissionLevel | null;\n this.CurrentLevel = level;\n this.Capabilities = CapabilitiesForLevel(level);\n } catch (e) {\n LogError(`loadCapabilities failed: ${e instanceof Error ? e.message : String(e)}`);\n this.Capabilities = CapabilitiesForLevel('View');\n this.CurrentLevel = 'View';\n }\n }\n\n public get HasLineage(): boolean {\n return !!this.ListRecord?.SourceViewID;\n }\n\n /** @deprecated Use {@link HasLineage}. */\n public get hasLineage(): boolean {\n return this.HasLineage;\n }\n\n private loadLastUsedMode(): ListRefreshMode | null {\n try {\n const stored = localStorage.getItem(`mj.lists.refreshMode.${this.ListID}`);\n if (stored === 'Additive' || stored === 'Sync') return stored;\n } catch {\n // localStorage may not be available (SSR, private mode) — fall through.\n }\n return null;\n }\n\n private saveLastUsedMode(mode: ListRefreshMode): void {\n try {\n localStorage.setItem(`mj.lists.refreshMode.${this.ListID}`, mode);\n } catch {\n // ignore\n }\n }\n\n /**\n * Kick off a refresh-from-source preview. Builds the delta server-side\n * and opens the confirm dialog when it returns. The dialog enforces the\n * acknowledgement UX; the server enforces the actual drop guard.\n */\n public async OnRefreshFromSource(): Promise<void> {\n if (!this.HasLineage || this.IsPreviewingRefresh) return;\n this.IsPreviewingRefresh = true;\n this.RefreshDelta = null;\n this.cdr.detectChanges();\n try {\n const provider = this.ProviderToUse as unknown as GraphQLDataProvider;\n const client = new GraphQLListsClient(provider);\n const delta = await client.PreviewListDelta({\n Target: this.ListID,\n Source: { kind: 'view', viewId: this.ListRecord!.SourceViewID! },\n Mode: this.RefreshMode,\n });\n this.RefreshDelta = delta;\n this.RefreshConfirmVisible = true;\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.sharedService.CreateSimpleNotification(`Refresh preview failed: ${message}`, 'error', 5000);\n } finally {\n this.IsPreviewingRefresh = false;\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link OnRefreshFromSource}. */\n public async onRefreshFromSource(): Promise<void> {\n return this.OnRefreshFromSource();\n }\n\n public OnRefreshConfirmCancel(): void {\n this.RefreshConfirmVisible = false;\n this.RefreshDelta = null;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnRefreshConfirmCancel}. */\n public onRefreshConfirmCancel(): void {\n return this.OnRefreshConfirmCancel();\n }\n\n public async OnRefreshConfirmCommit(deltaToken: string): Promise<void> {\n if (!this.RefreshDelta) return;\n this.IsApplyingRefresh = true;\n this.cdr.detectChanges();\n try {\n const provider = this.ProviderToUse as unknown as GraphQLDataProvider;\n const client = new GraphQLListsClient(provider);\n const result = await client.ApplyListDelta({\n Delta: { ...this.RefreshDelta, DeltaToken: deltaToken },\n ConfirmDrops: (this.RefreshDelta.Counts.Remove ?? 0) > 0,\n });\n if (result.Success) {\n this.saveLastUsedMode(this.RefreshMode);\n this.RefreshConfirmVisible = false;\n this.RefreshDelta = null;\n this.sharedService.CreateSimpleNotification(\n `Refresh applied: +${result.Counts?.Added ?? 0} / -${result.Counts?.Removed ?? 0}`,\n 'success',\n 3000,\n );\n // Reload list (for LastRefreshedAt) + grid in parallel.\n await this.loadListRecord();\n this.RefreshGrid();\n this.bumpStatsRefresh();\n } else {\n this.sharedService.CreateSimpleNotification(`Refresh failed: ${result.Message}`, 'error', 5000);\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.sharedService.CreateSimpleNotification(`Refresh failed: ${message}`, 'error', 5000);\n } finally {\n this.IsApplyingRefresh = false;\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link OnRefreshConfirmCommit}. */\n public async onRefreshConfirmCommit(deltaToken: string): Promise<void> {\n return this.OnRefreshConfirmCommit(deltaToken);\n }\n\n public OnRefreshModeChange(mode: ListRefreshMode): void {\n this.RefreshMode = mode;\n }\n\n /** @deprecated Use {@link OnRefreshModeChange}. */\n public onRefreshModeChange(mode: ListRefreshMode): void {\n return this.OnRefreshModeChange(mode);\n }\n\n // ==========================================\n // Grid Event Handlers\n // ==========================================\n\n OnRowClicked(_event: ListGridRowClickedEvent): void {\n // Selection is handled by the grid\n }\n\n /** @deprecated Use {@link OnRowClicked}. */\n onRowClicked(_event: ListGridRowClickedEvent): void {\n return this.OnRowClicked(_event);\n }\n\n OnRowDoubleClicked(_event: ListGridRowClickedEvent): void {\n // Navigation is handled by mj-list-detail-grid\n }\n\n /** @deprecated Use {@link OnRowDoubleClicked}. */\n onRowDoubleClicked(_event: ListGridRowClickedEvent): void {\n return this.OnRowDoubleClicked(_event);\n }\n\n OnSelectionChange(keys: string[]): void {\n this.SelectedKeys = keys;\n }\n\n /** @deprecated Use {@link OnSelectionChange}. */\n onSelectionChange(keys: string[]): void {\n return this.OnSelectionChange(keys);\n }\n\n OnDataLoaded(event: { totalCount: number }): void {\n this.RowCount = event.totalCount;\n }\n\n /** @deprecated Use {@link OnDataLoaded}. */\n onDataLoaded(event: { totalCount: number }): void {\n return this.OnDataLoaded(event);\n }\n\n RefreshGrid(): void {\n if (this.ListDetailGrid) {\n this.ListDetailGrid.refresh();\n }\n }\n\n /** @deprecated Use {@link RefreshGrid}. */\n refreshGrid(): void {\n return this.RefreshGrid();\n }\n\n // ==========================================\n // Toolbar Actions\n // ==========================================\n\n // ==========================================\n // Progress Percentage Getters\n // ==========================================\n\n get RemoveProgressPercent(): number {\n return this.RemoveTotal > 0 ? Math.round((this.RemoveProgress / this.RemoveTotal) * 100) : 0;\n }\n\n /** @deprecated Use {@link RemoveProgressPercent}. */\n get removeProgressPercent(): number {\n return this.RemoveProgressPercent;\n }\n\n get AddProgressPercent(): number {\n return this.AddTotal > 0 ? Math.round((this.AddProgress / this.AddTotal) * 100) : 0;\n }\n\n /** @deprecated Use {@link AddProgressPercent}. */\n get addProgressPercent(): number {\n return this.AddProgressPercent;\n }\n\n /** Update progress + recompute the stored percent atomically. Call this\n * from inside the save loop so the bound value is set in lockstep with\n * the underlying counter (avoids NG0100). */\n private setAddFromViewProgress(progress: number): void {\n this.AddFromViewProgress = progress;\n this.AddFromViewProgressPercent = this.AddFromViewTotal > 0\n ? Math.round((progress / this.AddFromViewTotal) * 100)\n : 0;\n }\n\n OnRefreshClick(): void {\n this.RefreshGrid();\n }\n\n /** @deprecated Use {@link OnRefreshClick}. */\n onRefreshClick(): void {\n return this.OnRefreshClick();\n }\n\n OnExportClick(): void {\n this.OpenExportDialog();\n }\n\n /** @deprecated Use {@link OnExportClick}. */\n onExportClick(): void {\n return this.OnExportClick();\n }\n\n /**\n * Open the format + column picker (mockup 26). Resolves the candidate\n * field list from EntityInfo on the loaded provider — no extra\n * RunView. Default selection is every non-virtual entity field, which\n * matches what the underlying grid's \"export all\" path produced.\n */\n public OpenExportDialog(): void {\n if (!this.ListRecord) {\n this.sharedService.CreateSimpleNotification('Load a list first before exporting.', 'info', 3000);\n return;\n }\n const md = this.ProviderToUse;\n const entityInfo = md.EntityByID(this.ListRecord.EntityID);\n if (!entityInfo) {\n this.sharedService.CreateSimpleNotification(\n `Entity for this list not found in metadata.`,\n 'error', 4000,\n );\n return;\n }\n if (entityInfo.PrimaryKeys.length !== 1) {\n this.sharedService.CreateSimpleNotification(\n `Composite-PK entities ('${entityInfo.Name}') aren't yet supported for List export.`,\n 'warning', 5000,\n );\n return;\n }\n this.ExportFields = entityInfo.Fields\n .filter((f) => f.IsVirtual !== true)\n .map((f) => ({\n Name: f.Name,\n DisplayName: f.DisplayName || f.Name,\n Selected: true,\n }));\n this.ExportRecordCount = this.RowCount;\n this.ExportFormat = 'excel';\n this.ShowExportDialog = true;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OpenExportDialog}. */\n public openExportDialog(): void {\n return this.OpenExportDialog();\n }\n\n public CloseExportDialog(): void {\n this.ShowExportDialog = false;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link CloseExportDialog}. */\n public closeExportDialog(): void {\n return this.CloseExportDialog();\n }\n\n public SelectAllExportFields(): void {\n for (const f of this.ExportFields) f.Selected = true;\n }\n\n /** @deprecated Use {@link SelectAllExportFields}. */\n public selectAllExportFields(): void {\n return this.SelectAllExportFields();\n }\n public SelectNoneExportFields(): void {\n for (const f of this.ExportFields) f.Selected = false;\n }\n\n /** @deprecated Use {@link SelectNoneExportFields}. */\n public selectNoneExportFields(): void {\n return this.SelectNoneExportFields();\n }\n public get SelectedExportFieldCount(): number {\n return this.ExportFields.filter((f) => f.Selected).length;\n }\n\n /** @deprecated Use {@link SelectedExportFieldCount}. */\n public get selectedExportFieldCount(): number {\n return this.SelectedExportFieldCount;\n }\n\n /**\n * Run the export with the user's chosen format + columns. Resolves\n * the list's member RecordIDs from the in-memory grid when possible\n * (avoids an extra RunView), then bulk-loads the underlying entity\n * rows restricted to the chosen Fields. Output is projected to\n * exactly the user's selected columns + ordering.\n */\n public async ExecuteExport(): Promise<void> {\n if (!this.ListRecord) return;\n const selectedFields = this.ExportFields.filter((f) => f.Selected).map((f) => f.Name);\n if (selectedFields.length === 0) return;\n\n this.IsExporting = true;\n this.cdr.detectChanges();\n try {\n const md = this.ProviderToUse;\n const entityInfo = md.EntityByID(this.ListRecord.EntityID)!;\n\n // Cheap emptiness check before doing any row work\n const rv = RunView.FromMetadataProvider(md);\n const countResult = await rv.RunView({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID='${this.ListRecord.ID}'`,\n ResultType: 'count_only',\n });\n if (countResult.Success && countResult.TotalRowCount === 0) {\n this.sharedService.CreateSimpleNotification(\n 'List is empty — nothing to export.', 'info', 3000,\n );\n this.ShowExportDialog = false;\n return;\n }\n\n // Pull underlying entity rows restricted to the chosen fields, with\n // membership filtered by buildListMemberFilter (server-side subquery\n // for a single-column key). Always include the key column(s) so the\n // projection round-trips cleanly.\n const fieldsForQuery = Array.from(new Set([...entityInfo.PrimaryKeys.map((pk) => pk.Name), ...selectedFields]));\n const rowResult = await rv.RunView<Record<string, unknown>>({\n EntityName: entityInfo.Name,\n ExtraFilter: await this.buildListMemberFilter(entityInfo, this.ListRecord.ID, rv),\n Fields: fieldsForQuery,\n ResultType: 'simple',\n });\n if (!rowResult.Success) {\n this.sharedService.CreateSimpleNotification(\n `Export failed loading rows: ${rowResult.ErrorMessage}`, 'error', 5000,\n );\n return;\n }\n // Project rows to exactly the columns + ordering the user picked.\n const rows = (rowResult.Results ?? []).map((row) => {\n const projected: Record<string, unknown> = {};\n for (const f of selectedFields) projected[f] = row[f];\n return projected;\n });\n\n const dateStamp = new Date().toISOString().slice(0, 10);\n const safeName = (this.ListRecord.Name || 'list').replace(/[^a-z0-9_-]+/gi, '_');\n const ext = this.ExportFormat === 'excel' ? 'xlsx' : this.ExportFormat;\n const fileName = `${safeName}-${dateStamp}.${ext}`;\n const exportResult = this.ExportFormat === 'excel'\n ? await this.exportService.toExcel(rows, { fileName, includeHeaders: true })\n : this.ExportFormat === 'csv'\n ? await this.exportService.toCSV(rows, { fileName, includeHeaders: true })\n : await this.exportService.toJSON(rows, { fileName });\n\n if (exportResult.success) {\n this.exportService.downloadResult(exportResult);\n this.sharedService.CreateSimpleNotification(\n `Exported ${rows.length} record(s)`, 'success', 3000,\n );\n this.ShowExportDialog = false;\n } else {\n this.sharedService.CreateSimpleNotification('Export failed', 'error', 5000);\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.sharedService.CreateSimpleNotification(`Export error: ${message}`, 'error', 5000);\n } finally {\n this.IsExporting = false;\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link ExecuteExport}. */\n public async executeExport(): Promise<void> {\n return this.ExecuteExport();\n }\n\n ToggleAddDropdown(): void {\n this.ShowAddDropdown = !this.ShowAddDropdown;\n }\n\n /** @deprecated Use {@link ToggleAddDropdown}. */\n toggleAddDropdown(): void {\n return this.ToggleAddDropdown();\n }\n\n OnDropdownItemClick(item: NewItemOption): void {\n this.ShowAddDropdown = false;\n if (item.Action) {\n item.Action();\n }\n }\n\n /** @deprecated Use {@link OnDropdownItemClick}. */\n onDropdownItemClick(item: NewItemOption): void {\n return this.OnDropdownItemClick(item);\n }\n\n // ==========================================\n /**\n * Predicate selecting the underlying entity rows that are members of a list. For a\n * single-column key membership is filtered SERVER-SIDE via a subquery on the List Details\n * view (RecordID holds the raw key value), so no member id round-trips to the client and no\n * IN(...) clause breaks on a large list. A composite key stores RecordID as \"F1|v1||F2|v2\",\n * which no single column can be compared to, so the member ids are fetched and each expanded\n * to its full key predicate.\n */\n private async buildListMemberFilter(entityInfo: EntityInfo, listId: string, rv: RunView): Promise<string> {\n if (entityInfo.PrimaryKeys.length === 1) {\n const listDetailInfo = this.ProviderToUse.EntityByName('MJ: List Details');\n const listDetailsView = `${listDetailInfo?.SchemaName ?? '__mj'}.${listDetailInfo?.BaseView ?? 'vwListDetails'}`;\n return `${entityInfo.FirstPrimaryKey.Name} IN (SELECT RecordID FROM ${listDetailsView} WHERE ListID='${listId}')`; // first-pk-ok: guarded by PrimaryKeys.length === 1 above\n }\n const members = await rv.RunView<{ RecordID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID='${listId}'`,\n Fields: ['RecordID'],\n ResultType: 'simple',\n });\n const clauses = (members.Results ?? []).map((m) => `(${CompositeKey.FromURLSegment(entityInfo, m.RecordID).ToWhereClause()})`);\n return clauses.length > 0 ? clauses.join(' OR ') : '1=0';\n }\n\n /**\n * Apply the chosen status to all selected list-detail rows. Re-uses\n * the existing extract-record-id-from-composite-key logic to map\n * `selectedKeys` to the actual `MJ: List Detail.RecordID` values.\n */\n public async ApplyBulkStatus(): Promise<void> {\n if (!this.ListRecord || this.SelectedKeys.length === 0 || !this.BulkStatus) return;\n this.IsApplyingBulkStatus = true;\n this.cdr.detectChanges();\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(md);\n const entityInfo = md.EntityByID(this.ListRecord.EntityID);\n const recordIds = this.SelectedKeys.map((key) => {\n if (entityInfo && entityInfo.PrimaryKeys.length === 1) {\n const ck = new CompositeKey();\n ck.LoadFromConcatenatedString(key);\n return ck.KeyValuePairs[0]?.Value || key;\n }\n return key;\n });\n const filter = `ListID='${this.ListRecord.ID}' AND RecordID IN (${recordIds.map((id) => `'${String(id).replace(/'/g, \"''\")}'`).join(',')})`;\n // Two-step: fetch just the IDs via a 'simple' RunView, then load each\n // entity through GetEntityObject(..., CurrentUser) so the entity is\n // born with the user context that Save() requires. RunView with\n // 'entity_object' returns entities WITHOUT a CurrentUser bound — fine\n // for read-only use, broken for Save (`ContextCurrentUser cannot be\n // null`).\n const idResult = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: filter,\n Fields: ['ID'],\n ResultType: 'simple',\n });\n if (!idResult.Success) {\n this.sharedService.CreateSimpleNotification(`Failed to load list details: ${idResult.ErrorMessage}`, 'error', 4000);\n return;\n }\n let updated = 0;\n let failed = 0;\n const failureMessages: string[] = [];\n for (const row of idResult.Results ?? []) {\n const detail = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details', md.CurrentUser);\n const loaded = await detail.Load(row.ID);\n if (!loaded) {\n failed++;\n const reason = detail.LatestResult?.CompleteMessage ?? 'load failed';\n if (failureMessages.length < 3) failureMessages.push(reason);\n continue;\n }\n detail.Status = this.BulkStatus as never;\n const ok = await detail.Save();\n if (ok) {\n updated++;\n } else {\n failed++;\n const reason = detail.LatestResult?.CompleteMessage ?? 'unknown error';\n if (failureMessages.length < 3) failureMessages.push(reason);\n LogError(`Bulk status update failed for List Detail ${row.ID}: ${reason}`);\n }\n }\n this.sharedService.CreateSimpleNotification(\n failed === 0\n ? `Updated ${updated} item(s) to '${this.BulkStatus}'`\n : `Updated ${updated}, ${failed} failed: ${failureMessages.join(' | ')}`,\n failed === 0 ? 'success' : 'warning',\n failed === 0 ? 3000 : 8000,\n );\n this.BulkStatus = '';\n // Defer the grid refresh to the next microtask — see comment in\n // confirmRemoveFromList for why running it synchronously here\n // triggers NG0100 and silently breaks the UI refresh.\n await Promise.resolve();\n this.RefreshGrid();\n this.bumpStatsRefresh();\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.sharedService.CreateSimpleNotification(`Bulk update failed: ${message}`, 'error', 5000);\n } finally {\n this.IsApplyingBulkStatus = false;\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link ApplyBulkStatus}. */\n public async applyBulkStatus(): Promise<void> {\n return this.ApplyBulkStatus();\n }\n\n // ==========================================\n // Bulk Move / Copy (mockups 23, 24)\n //\n // Move = insert into target + delete from source (drops on source).\n // Copy = insert into target only (additive — no drops).\n //\n // The drop-guard for Move is enforced by routing through the local\n // delta-confirm dialog: the user must ack the removal before the\n // mutation runs. We build a synthetic ListDelta locally because we\n // already know the exact ToAdd / ToRemove sets — no server round-trip\n // needed for the preview. Apply step uses direct entity Save/Delete\n // inside a single TransactionGroup (same pattern as Remove).\n // ==========================================\n\n public OpenMoveDialog(): void { this.openMoveCopyDialog('move'); }\n\n /** @deprecated Use {@link OpenMoveDialog}. */\n public openMoveDialog(): void {\n return this.OpenMoveDialog();\n }\n public OpenCopyDialog(): void { this.openMoveCopyDialog('copy'); }\n\n /** @deprecated Use {@link OpenCopyDialog}. */\n public openCopyDialog(): void {\n return this.OpenCopyDialog();\n }\n\n private openMoveCopyDialog(mode: 'move' | 'copy'): void {\n if (!this.ListRecord || this.SelectedKeys.length === 0) {\n this.sharedService.CreateSimpleNotification('Please select records first', 'warning', 2500);\n return;\n }\n this.MoveCopyMode = mode;\n this.MoveCopySelectedTarget = null;\n this.MoveCopyTargetSearch = '';\n this.ShowMoveCopyDialog = true;\n // Load candidates once per dialog open. We don't keep them in\n // permanent component state because the user could create/delete\n // lists between opens, and the target picker isn't visible often\n // enough to justify long-lived caching.\n void this.loadMoveCopyTargets();\n this.cdr.detectChanges();\n }\n\n public CloseMoveCopyDialog(): void {\n this.ShowMoveCopyDialog = false;\n this.MoveCopyTargetCandidates = [];\n this.MoveCopySelectedTarget = null;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link CloseMoveCopyDialog}. */\n public closeMoveCopyDialog(): void {\n return this.CloseMoveCopyDialog();\n }\n\n public SelectMoveCopyTarget(target: MJListEntity): void {\n this.MoveCopySelectedTarget = target;\n }\n\n /** @deprecated Use {@link SelectMoveCopyTarget}. */\n public selectMoveCopyTarget(target: MJListEntity): void {\n return this.SelectMoveCopyTarget(target);\n }\n\n public get FilteredMoveCopyTargets(): MJListEntity[] {\n const term = this.MoveCopyTargetSearch.trim().toLowerCase();\n if (!term) return this.MoveCopyTargetCandidates;\n return this.MoveCopyTargetCandidates.filter((l) =>\n l.Name.toLowerCase().includes(term) ||\n (l.Description?.toLowerCase().includes(term) ?? false)\n );\n }\n\n /** @deprecated Use {@link FilteredMoveCopyTargets}. */\n public get filteredMoveCopyTargets(): MJListEntity[] {\n return this.FilteredMoveCopyTargets;\n }\n\n public get MoveCopyProgressPercent(): number {\n return this.MoveCopyTotal > 0 ? Math.round((this.MoveCopyProgress / this.MoveCopyTotal) * 100) : 0;\n }\n\n /** @deprecated Use {@link MoveCopyProgressPercent}. */\n public get moveCopyProgressPercent(): number {\n return this.MoveCopyProgressPercent;\n }\n\n /** Load candidate target lists — same Entity, owned by or shared with\n * the current user, excluding the list we're standing on. One RunView\n * on open; results stay in memory until the dialog closes. */\n private async loadMoveCopyTargets(): Promise<void> {\n if (!this.ListRecord) return;\n this.MoveCopyTargetCandidatesLoading = true;\n this.cdr.detectChanges();\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n // Filter to same EntityID + exclude the current list. UserID filter\n // would over-restrict (Shared-With-Me lists should be valid targets\n // when the user has Edit there); the server enforces the real\n // permission on the per-row Save, so listing extra entries is fine.\n const filter = `EntityID='${this.ListRecord.EntityID}' AND ID<>'${this.ListRecord.ID}'`;\n const result = await rv.RunView<MJListEntity>({\n EntityName: 'MJ: Lists',\n ExtraFilter: filter,\n OrderBy: 'Name',\n ResultType: 'simple',\n MaxRows: 500,\n });\n if (result.Success) {\n this.MoveCopyTargetCandidates = (result.Results ?? []) as MJListEntity[];\n } else {\n this.MoveCopyTargetCandidates = [];\n this.sharedService.CreateSimpleNotification(`Failed to load target lists: ${result.ErrorMessage}`, 'error', 4000);\n }\n } catch (e) {\n this.MoveCopyTargetCandidates = [];\n const message = e instanceof Error ? e.message : String(e);\n this.sharedService.CreateSimpleNotification(`Failed to load target lists: ${message}`, 'error', 4000);\n } finally {\n this.MoveCopyTargetCandidatesLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * \"Continue\" / \"Copy\" click in the target picker. For Copy we apply\n * immediately. For Move we build a local Delta and show the confirm\n * dialog — the actual mutation fires from onMoveConfirmCommit().\n */\n public async ConfirmMoveCopy(): Promise<void> {\n if (!this.ListRecord || !this.MoveCopySelectedTarget || this.SelectedKeys.length === 0) return;\n if (this.MoveCopyMode === 'copy') {\n await this.applyMoveCopy(false);\n return;\n }\n // Move: show delta-confirm so the user explicitly acks the source-side drop.\n const recordIds = this.extractSelectedRecordIds();\n this.MoveDelta = this.buildMoveDelta(recordIds);\n this.ShowMoveCopyDialog = false;\n this.MoveDeltaConfirmVisible = true;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link ConfirmMoveCopy}. */\n public async confirmMoveCopy(): Promise<void> {\n return this.ConfirmMoveCopy();\n }\n\n public OnMoveConfirmCancel(): void {\n this.MoveDeltaConfirmVisible = false;\n this.MoveDelta = null;\n // Re-open the target picker so the user can change their mind without\n // losing their selection.\n this.ShowMoveCopyDialog = true;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnMoveConfirmCancel}. */\n public onMoveConfirmCancel(): void {\n return this.OnMoveConfirmCancel();\n }\n\n public async OnMoveConfirmCommit(_deltaToken: string): Promise<void> {\n this.MoveDeltaConfirmVisible = false;\n this.cdr.detectChanges();\n await this.applyMoveCopy(true);\n }\n\n /** @deprecated Use {@link OnMoveConfirmCommit}. */\n public async onMoveConfirmCommit(_deltaToken: string): Promise<void> {\n return this.OnMoveConfirmCommit(_deltaToken);\n }\n\n /**\n * Pull RecordIDs out of selectedKeys. selectedKeys arrive from the\n * grid in concatenated-key format (\"ID|<value>\"). For single-PK entities\n * MJ: List Details stores the raw value; for composite-PK entities it\n * stores the full concatenated string. We normalize based on entity\n * metadata — same logic as confirmRemoveFromList.\n */\n private extractSelectedRecordIds(): string[] {\n const md = this.ProviderToUse;\n const entityInfo = this.ListRecord ? md.EntityByID(this.ListRecord.EntityID) : null;\n return this.SelectedKeys.map((key) => {\n if (entityInfo && entityInfo.PrimaryKeys.length === 1) {\n const ck = new CompositeKey();\n ck.LoadFromConcatenatedString(key);\n return String(ck.KeyValuePairs[0]?.Value ?? key);\n }\n return key;\n });\n }\n\n /**\n * Build a synthetic ListDelta for the Move-confirm dialog. Token is\n * a sentinel — we never call server-side ApplyDelta for this flow,\n * the mutations run client-side inside a transaction group. The\n * delta-confirm component only reads counts + ToAdd/ToRemove + Warnings;\n * the token round-trips through the (Confirm) emit but is unused.\n */\n private buildMoveDelta(recordIds: string[]): ListDelta {\n const removeCount = recordIds.length;\n return {\n TargetListId: this.ListRecord!.ID,\n EntityName: this.ListRecord!.Entity ?? '',\n ToAdd: [],\n ToRemove: recordIds,\n Unchanged: [],\n Counts: {\n Add: 0,\n Remove: removeCount,\n Unchanged: 0,\n SourceTotal: 0,\n TargetTotal: this.RowCount,\n },\n Warnings: [{\n Code: 'WILL_REMOVE_RECORDS',\n Message: `${removeCount} record(s) will be removed from \"${this.ListRecord!.Name}\" as part of the move`,\n Details: { Count: removeCount },\n }],\n // Sentinel — client-side flow doesn't round-trip this.\n DeltaToken: 'client-move-delta',\n };\n }\n\n /**\n * Execute the move/copy. Insert all records into the target, and for\n * Move also delete the matching MJ: List Details from the source. All\n * mutations run in a single TransactionGroup so partial failures don't\n * leave records duplicated in both lists.\n */\n private async applyMoveCopy(isMove: boolean): Promise<void> {\n if (!this.ListRecord || !this.MoveCopySelectedTarget) return;\n const source = this.ListRecord;\n const target = this.MoveCopySelectedTarget;\n const recordIds = this.extractSelectedRecordIds();\n if (recordIds.length === 0) return;\n\n this.IsApplyingMoveCopy = true;\n this.MoveCopyTotal = recordIds.length;\n this.MoveCopyProgress = 0;\n this.cdr.detectChanges();\n\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(md);\n\n try {\n // Dedupe against the target: skip records already present so a\n // partially-completed previous run can be re-tried cleanly.\n const filterIds = recordIds.map((id) => `'${String(id).replace(/'/g, \"''\")}'`).join(',');\n const existingTarget = await rv.RunView<{ RecordID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID='${target.ID}' AND RecordID IN (${filterIds})`,\n Fields: ['RecordID'],\n ResultType: 'simple',\n });\n const alreadyInTarget = new Set(\n (existingTarget.Results ?? []).map((r) => String((r as { RecordID: string }).RecordID))\n );\n const toAdd = recordIds.filter((id) => !alreadyInTarget.has(id));\n\n // For Move, look up the source-side ListDetail rows to delete.\n let sourceRows: MJListDetailEntity[] = [];\n if (isMove) {\n const lookup = await rv.RunView<MJListDetailEntity>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID='${source.ID}' AND RecordID IN (${filterIds})`,\n ResultType: 'entity_object',\n });\n if (!lookup.Success) {\n throw new Error(`Failed to load source rows: ${lookup.ErrorMessage}`);\n }\n sourceRows = lookup.Results ?? [];\n }\n\n const tg = await md.CreateTransactionGroup();\n\n // Queue inserts into target.\n for (const recordId of toAdd) {\n const newDetail = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details', md.CurrentUser);\n newDetail.NewRecord();\n newDetail.ListID = target.ID;\n newDetail.RecordID = recordId;\n newDetail.Sequence = 0;\n newDetail.TransactionGroup = tg;\n await newDetail.Save();\n }\n\n // Queue source-side deletes for Move only.\n if (isMove) {\n for (const row of sourceRows) {\n row.TransactionGroup = tg;\n await row.Delete();\n }\n }\n\n const ok = await tg.Submit();\n this.MoveCopyProgress = this.MoveCopyTotal;\n\n if (!ok) {\n this.sharedService.CreateSimpleNotification(\n `${isMove ? 'Move' : 'Copy'} partially failed — some changes may not have applied`,\n 'error',\n 5000,\n );\n return;\n }\n\n const skippedNote = alreadyInTarget.size > 0\n ? ` (${alreadyInTarget.size} already in target — skipped)`\n : '';\n this.sharedService.CreateSimpleNotification(\n `${isMove ? 'Moved' : 'Copied'} ${toAdd.length} record(s) to \"${target.Name}\"${skippedNote}`,\n 'success',\n 3000,\n );\n\n // Same NG0100 pattern as confirmRemoveFromList — defer cleanup +\n // refresh by a microtask so the dialog/visibility flips happen in\n // a fresh change-detection cycle.\n await Promise.resolve();\n this.CloseMoveCopyDialog();\n this.MoveDelta = null;\n if (isMove) {\n this.ListDetailGrid?.clearSelection();\n this.RefreshGrid();\n this.bumpStatsRefresh();\n }\n this.cdr.detectChanges();\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n LogError(`Move/Copy failed: ${message}`);\n this.sharedService.CreateSimpleNotification(`${isMove ? 'Move' : 'Copy'} failed: ${message}`, 'error', 5000);\n } finally {\n this.IsApplyingMoveCopy = false;\n this.cdr.detectChanges();\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 /** @deprecated Use {@link OpenRemoveDialog}. */\n openRemoveDialog(): void {\n return this.OpenRemoveDialog();\n }\n\n CloseRemoveDialog(): void {\n this.ShowRemoveDialog = false;\n this.IsRemoving = false;\n this.RemoveProgress = 0;\n this.RemoveTotal = 0;\n }\n\n /** @deprecated Use {@link CloseRemoveDialog}. */\n closeRemoveDialog(): void {\n return this.CloseRemoveDialog();\n }\n\n async ConfirmRemoveFromList(): Promise<void> {\n if (!this.ListRecord || this.SelectedKeys.length === 0) return;\n\n this.IsRemoving = true;\n this.RemoveTotal = this.SelectedKeys.length;\n this.RemoveProgress = 0;\n\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const entityInfo = md.EntityByID(this.ListRecord.EntityID);\n\n // selectedKeys from grid are in concatenated format (ID|value)\n // For single PK entities, RecordID in DB is just the raw value\n // For composite PK entities, RecordID in DB is the concatenated format\n // Extract the appropriate format for the query\n const selectedRecordIds = this.SelectedKeys.map(key => {\n if (entityInfo && entityInfo.PrimaryKeys.length === 1) {\n // Single PK: extract just the value from concatenated format\n const compositeKey = new CompositeKey();\n compositeKey.LoadFromConcatenatedString(key);\n return compositeKey.KeyValuePairs[0]?.Value || key;\n } else {\n // Composite PK: use full concatenated format as-is\n return key;\n }\n });\n\n const listDetailsFilter = `ListID = '${this.ListRecord.ID}' AND RecordID IN (${selectedRecordIds.map(id => `'${id}'`).join(',')})`;\n\n const listDetailsResult = await rv.RunView<MJListDetailEntity>({\n EntityName: 'MJ: List Details',\n ExtraFilter: listDetailsFilter,\n ResultType: 'entity_object'\n }, md.CurrentUser);\n\n if (!listDetailsResult.Success) {\n LogError(\"Error loading list details for removal\", undefined, listDetailsResult.ErrorMessage);\n this.sharedService.CreateSimpleNotification(\"Failed to remove records\", 'error', 2500);\n this.IsRemoving = false;\n return;\n }\n\n // Use transaction group for bulk delete\n const tg = await md.CreateTransactionGroup();\n const listDetails = listDetailsResult.Results;\n\n for (const listDetail of listDetails) {\n listDetail.TransactionGroup = tg;\n await listDetail.Delete();\n }\n\n const success = await tg.Submit();\n\n if (success) {\n this.RemoveProgress = this.RemoveTotal;\n this.sharedService.CreateSimpleNotification(\n `Removed ${listDetails.length} record${listDetails.length !== 1 ? 's' : ''} from list`,\n 'success',\n 2500\n );\n // Defer cleanup + refresh to the next microtask. Running these\n // synchronously inside the current change-detection cycle\n // triggers NG0100 (`@if (showRemoveDialog)` flips false while\n // children are still being checked), which leaves the grid in a\n // stale state — the deletion succeeds server-side but the UI\n // doesn't re-fetch until the user navigates away and back.\n await Promise.resolve();\n this.CloseRemoveDialog();\n this.ListDetailGrid?.clearSelection();\n this.RefreshGrid();\n this.bumpStatsRefresh();\n this.cdr.detectChanges();\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 /** @deprecated Use {@link ConfirmRemoveFromList}. */\n async confirmRemoveFromList(): Promise<void> {\n return this.ConfirmRemoveFromList();\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 // Explicit CD: the GraphQL promise resolution doesn't reliably produce an\n // Angular tick, so without this the spinner stays up until the next user\n // event (click/keystroke) forces a change-detection cycle.\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OpenAddRecordsDialog}. */\n async openAddRecordsDialog(): Promise<void> {\n return this.OpenAddRecordsDialog();\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 /** @deprecated Use {@link CloseAddRecordsDialog}. */\n closeAddRecordsDialog(): void {\n return this.CloseAddRecordsDialog();\n }\n\n private async loadExistingListDetailIds(): Promise<void> {\n if (!this.ListRecord) return;\n\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n const result = await rv.RunView<{ RecordID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID = '${this.ListRecord.ID}'`,\n Fields: ['RecordID'],\n ResultType: 'simple'\n }, md.CurrentUser);\n\n if (result.Success) {\n this.ExistingListDetailIds = new Set(result.Results.map(r => NormalizeUUID(r.RecordID)));\n }\n }\n\n OnAddRecordsSearchInputEvent(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.OnAddRecordsSearchChange(value);\n }\n\n /** @deprecated Use {@link OnAddRecordsSearchInputEvent}. */\n onAddRecordsSearchInputEvent(event: Event): void {\n return this.OnAddRecordsSearchInputEvent(event);\n }\n\n OnAddRecordsSearchChange(value: string): void {\n this.AddRecordsSearchFilter = value;\n this.searchSubject.next(value);\n }\n\n /** @deprecated Use {@link OnAddRecordsSearchChange}. */\n onAddRecordsSearchChange(value: string): void {\n return this.OnAddRecordsSearchChange(value);\n }\n\n private async searchRecords(searchText: string): Promise<void> {\n if (!this.ListRecord || !searchText || searchText.length < 2) {\n this.AddableRecords = [];\n this.cdr.detectChanges();\n return;\n }\n\n this.AddDialogLoading = true;\n this.cdr.detectChanges();\n\n const md = this.ProviderToUse;\n const sourceEntityInfo = md.EntityByID(this.ListRecord.EntityID);\n if (!sourceEntityInfo) {\n this.AddDialogLoading = false;\n this.cdr.detectChanges();\n return;\n }\n\n // NameField when present; otherwise the fallback display field\n // (first non-PK/non-FK/non-system field). Text-typed fields also\n // drive the LIKE search so name-less entities remain searchable.\n const displayField = GetRecordDisplayField(sourceEntityInfo);\n\n let filter: string | undefined;\n if (displayField.Field && IsTextSearchableField(displayField.Field)) {\n filter = `${displayField.Field.Name} LIKE '%${searchText.replace(/'/g, \"''\")}%'`;\n }\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result: RunViewResult = await rv.RunView({\n EntityName: this.ListRecord.Entity,\n ExtraFilter: filter,\n MaxRows: 100,\n ResultType: 'simple'\n });\n\n if (result.Success) {\n this.AddableRecords = result.Results.map((record: Record<string, unknown>) => {\n // Compact key segment (raw value, or \"F1|v1||F2|v2\" for a composite key) — the form ListDetail.RecordID stores\n const recordId = CompositeKey.FromEntityRecord(sourceEntityInfo, record).ToCompactURLSegment();\n return {\n ID: recordId,\n Name: displayField.Field\n ? FormatRecordDisplayValue(recordId, record[displayField.Field.Name], displayField)\n : 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 /** @deprecated Use {@link ToggleRecordSelection}. */\n toggleRecordSelection(record: AddableRecord): void {\n return this.ToggleRecordSelection(record);\n }\n\n get SelectedAddableRecords(): AddableRecord[] {\n return this.AddableRecords.filter(r => r.isSelected);\n }\n\n /** @deprecated Use {@link SelectedAddableRecords}. */\n get selectedAddableRecords(): AddableRecord[] {\n return this.SelectedAddableRecords;\n }\n\n SelectAllAddable(): void {\n this.AddableRecords.forEach(r => {\n if (!r.isInList) r.isSelected = true;\n });\n }\n\n /** @deprecated Use {@link SelectAllAddable}. */\n selectAllAddable(): void {\n return this.SelectAllAddable();\n }\n\n DeselectAllAddable(): void {\n this.AddableRecords.forEach(r => r.isSelected = false);\n }\n\n /** @deprecated Use {@link DeselectAllAddable}. */\n deselectAllAddable(): void {\n return this.DeselectAllAddable();\n }\n\n async ConfirmAddRecords(): Promise<void> {\n const recordsToAdd = this.SelectedAddableRecords;\n if (recordsToAdd.length === 0 || !this.ListRecord) return;\n\n this.AddDialogSaving = true;\n // Reserve 20% of progress for tg.Submit()\n this.AddTotal = recordsToAdd.length;\n this.AddProgress = 0;\n const progressPerRecord = 0.8 / recordsToAdd.length; // 80% for individual saves\n\n const md = this.ProviderToUse;\n\n // Use transaction group for bulk insert\n const tg = await md.CreateTransactionGroup();\n\n for (let i = 0; i < recordsToAdd.length; i++) {\n const record = recordsToAdd[i];\n const listDetail = await md.GetEntityObject<MJListDetailEntityExtended>(\"MJ: List Details\", md.CurrentUser);\n listDetail.ListID = this.ListRecord.ID;\n listDetail.RecordID = record.ID;\n listDetail.TransactionGroup = tg;\n const result = await listDetail.Save();\n if (!result) {\n LogErrorEx({\n message: listDetail.LatestResult?.CompleteMessage\n });\n }\n // Update progress (0-80%)\n this.AddProgress = Math.round((i + 1) * progressPerRecord * this.AddTotal);\n }\n\n // Show 80% complete before submit\n this.AddProgress = Math.round(this.AddTotal * 0.8);\n\n const success = await tg.Submit();\n\n if (success) {\n this.AddProgress = this.AddTotal;\n this.sharedService.CreateSimpleNotification(\n `Added ${recordsToAdd.length} record${recordsToAdd.length !== 1 ? 's' : ''} to list`,\n 'success',\n 2500\n );\n // Defer dialog close + grid refresh to the next microtask. See\n // confirmRemoveFromList for the NG0100 background.\n await Promise.resolve();\n this.CloseAddRecordsDialog();\n this.RefreshGrid();\n this.bumpStatsRefresh();\n this.cdr.detectChanges();\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 /** @deprecated Use {@link ConfirmAddRecords}. */\n async confirmAddRecords(): Promise<void> {\n return this.ConfirmAddRecords();\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 this.userViewsToAddIds.clear();\n\n if (!this.UserViews) {\n await this.loadEntityViews();\n }\n }\n\n /** @deprecated Use {@link OpenAddFromViewDialog}. */\n async openAddFromViewDialog(): Promise<void> {\n return this.OpenAddFromViewDialog();\n }\n\n CloseAddFromViewDialog(): void {\n this.ShowAddFromViewDialog = false;\n this.UserViewsToAdd = [];\n this.userViewsToAddIds.clear();\n this.ShowAddFromViewLoader = false;\n this.AddFromViewTotal = 0;\n this.setAddFromViewProgress(0);\n }\n\n /** @deprecated Use {@link CloseAddFromViewDialog}. */\n closeAddFromViewDialog(): void {\n return this.CloseAddFromViewDialog();\n }\n\n private async loadEntityViews(): Promise<void> {\n if (!this.ListRecord || !this.ListRecord.Entity) return;\n\n this.ShowAddFromViewLoader = true;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const md = this.ProviderToUse;\n\n const runViewResult = await rv.RunView<MJUserViewEntityExtended>({\n EntityName: \"MJ: User Views\",\n ExtraFilter: `UserID = '${md.CurrentUser.ID}' AND EntityID = '${this.ListRecord.EntityID}'`,\n ResultType: 'entity_object'\n }, md.CurrentUser);\n\n if (!runViewResult.Success) {\n LogError(`Error loading User Views for entity ${this.ListRecord.Entity}`);\n } else {\n this.UserViews = runViewResult.Results;\n }\n\n this.ShowAddFromViewLoader = false;\n this.cdr.detectChanges();\n }\n\n ToggleViewSelection(view: MJUserViewEntityExtended): void {\n const index = this.UserViewsToAdd.findIndex(v => UUIDsEqual(v.ID, view.ID));\n if (index >= 0) {\n this.UserViewsToAdd.splice(index, 1);\n this.userViewsToAddIds.delete(NormalizeUUID(view.ID));\n } else {\n this.UserViewsToAdd.push(view);\n this.userViewsToAddIds.add(NormalizeUUID(view.ID));\n }\n }\n\n /** @deprecated Use {@link ToggleViewSelection}. */\n toggleViewSelection(view: MJUserViewEntityExtended): void {\n return this.ToggleViewSelection(view);\n }\n\n IsViewSelected(view: MJUserViewEntityExtended): boolean {\n return this.userViewsToAddIds.has(NormalizeUUID(view.ID));\n }\n\n /** @deprecated Use {@link IsViewSelected}. */\n isViewSelected(view: MJUserViewEntityExtended): boolean {\n return this.IsViewSelected(view);\n }\n\n async ConfirmAddFromView(): Promise<void> {\n if (!this.ListRecord || this.UserViewsToAdd.length === 0) return;\n\n this.ShowAddFromViewLoader = true;\n this.FetchingRecordsToSave = true;\n this.cdr.detectChanges();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const md = this.ProviderToUse;\n\n // Collect all unique record IDs from selected views.\n // Batch every selected view into a single RunViews call rather than issuing a\n // sequential RunView per view (N round-trips → 1). Each view has a distinct ViewID,\n // so this can't collapse to one query, but RunViews parallelizes the round trips.\n const recordIdSet = new Set<string>();\n\n const viewResults = await rv.RunViews(\n this.UserViewsToAdd.map(userView => ({\n ViewID: userView.ID,\n ViewEntity: userView,\n Fields: [\"ID\"]\n })),\n md.CurrentUser\n );\n\n for (const runViewResult of viewResults) {\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.setAddFromViewProgress(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%) via the helper so both the counter and the\n // bound percent move in lockstep, then detectChanges() to close the\n // CD cycle on this iteration. Without detectChanges() the next await\n // can yield in the middle of a cycle and Angular's dev-mode re-check\n // catches the percent changing → NG0100 flood.\n this.setAddFromViewProgress(Math.round((i + 1) * progressPerRecord * this.AddFromViewTotal));\n this.cdr.detectChanges();\n }\n\n // Show 80% complete before submit\n this.setAddFromViewProgress(Math.round(this.AddFromViewTotal * 0.8));\n this.cdr.detectChanges();\n\n const success = await tg.Submit();\n\n if (success) {\n this.setAddFromViewProgress(this.AddFromViewTotal);\n this.sharedService.CreateSimpleNotification(\n `Added ${recordsToAdd.length} record${recordsToAdd.length !== 1 ? 's' : ''} to list`,\n 'success',\n 2500\n );\n // Defer dialog close + grid refresh to the next microtask. See\n // confirmRemoveFromList for the NG0100 background.\n await Promise.resolve();\n this.CloseAddFromViewDialog();\n this.RefreshGrid();\n this.bumpStatsRefresh();\n this.cdr.detectChanges();\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 /** @deprecated Use {@link ConfirmAddFromView}. */\n async confirmAddFromView(): Promise<void> {\n return this.ConfirmAddFromView();\n }\n}\n","<div class=\"list-detail-container\">\n <!-- Header with title and Add button -->\n <div class=\"list-header\">\n <div class=\"list-header__titleblock\">\n @if (listRecord) {\n <h1>{{ listRecord.Name }}</h1>\n } @else {\n <h1>List</h1>\n }\n @if (hasLineage) {\n <div class=\"lineage-badge\" [title]=\"'Source view: ' + (sourceViewName ?? 'unknown')\">\n <i class=\"fa-solid fa-link\"></i>\n <span>\n @if (listRecord?.UseSnapshot) {\n Snapshot of: <strong>{{ sourceViewName ?? '(unknown view)' }}</strong>\n } @else {\n Live view: <strong>{{ sourceViewName ?? '(unknown view)' }}</strong>\n }\n </span>\n @if (listRecord?.LastRefreshedAt) {\n <span class=\"lineage-badge__refreshed\">\n · last refreshed {{ listRecord!.LastRefreshedAt | date:'medium' }}\n </span>\n }\n </div>\n }\n @if (listRecord) {\n <!-- Tags section (Phase 4.2). Editable on the detail view. -->\n <div class=\"list-detail__tags\">\n <mj-tag-chips\n [Provider]=\"Provider\"\n EntityName=\"MJ: Lists\"\n [RecordID]=\"listRecord.ID\"\n [Editable]=\"capabilities.CanEdit\"\n [MaxDisplay]=\"20\">\n </mj-tag-chips>\n </div>\n }\n </div>\n @if (capabilities.CanEdit) {\n <div class=\"add-dropdown-wrapper\">\n <button mjButton variant=\"primary\" class=\"add-btn\" (click)=\"toggleAddDropdown()\">\n <span class=\"fa-solid fa-plus\"></span>\n Add to List\n <span class=\"fa-solid fa-chevron-down add-dropdown-arrow\"></span>\n </button>\n @if (showAddDropdown) {\n <div class=\"add-dropdown-panel\">\n @for (option of addOptions; track option.Text) {\n <div class=\"add-dropdown-item\" (click)=\"onDropdownItemClick(option)\">\n <span class=\"add-dropdown-item-text\">{{ option.Text }}</span>\n @if (option.Description) {\n <span class=\"add-dropdown-item-desc\">{{ option.Description }}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n } @else if (currentLevel) {\n <!-- Viewer-perspective badge so users understand why mutation\n controls are absent. Mirrors mockup 19. -->\n <span class=\"permission-badge permission-badge--viewer\">\n <i class=\"fa-solid fa-eye\"></i>\n Viewer access\n </span>\n }\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 && capabilities.CanEdit) {\n <!-- Bulk-edit toolbar (Phase 5.2, mockups 23/24).\n Move/Copy open the target-list picker. Move then routes\n through the delta-confirm dialog because the source side\n drops; Copy is additive and applies directly. -->\n <button mjButton\n (click)=\"openMoveDialog()\"\n variant=\"flat\"\n class=\"toolbar-button\"\n title=\"Move selected records to another list\">\n <span class=\"fa-solid fa-arrow-right-arrow-left\"></span>\n Move…\n </button>\n <button mjButton\n (click)=\"openCopyDialog()\"\n variant=\"flat\"\n class=\"toolbar-button\"\n title=\"Copy selected records to another list (keeps them here too)\">\n <span class=\"fa-solid fa-copy\"></span>\n Copy…\n </button>\n <select\n class=\"mj-input mj-select bulk-status-select\"\n [(ngModel)]=\"bulkStatus\"\n [disabled]=\"isApplyingBulkStatus\"\n title=\"Set status on selected items\">\n <option value=\"\">Set status…</option>\n <option value=\"Active\">Active</option>\n <option value=\"Complete\">Complete</option>\n <option value=\"Pending\">Pending</option>\n <option value=\"Disabled\">Disabled</option>\n <option value=\"Rejected\">Rejected</option>\n </select>\n <button mjButton\n (click)=\"applyBulkStatus()\"\n [disabled]=\"!bulkStatus || isApplyingBulkStatus\"\n variant=\"flat\"\n class=\"toolbar-button\">\n @if (isApplyingBulkStatus) {\n <span class=\"fa-solid fa-spinner fa-spin\"></span>\n Applying…\n } @else {\n <span class=\"fa-solid fa-pen-to-square\"></span>\n Apply Status\n }\n </button>\n <button mjButton\n (click)=\"openRemoveDialog()\"\n variant=\"flat\"\n class=\"toolbar-button remove-btn\">\n <span class=\"fa-solid fa-trash\"></span>\n Remove from List\n </button>\n }\n @if (hasLineage && capabilities.CanRefresh) {\n <select\n class=\"mj-input mj-select refresh-mode-select\"\n [ngModel]=\"refreshMode\"\n (ngModelChange)=\"onRefreshModeChange($event)\"\n [disabled]=\"isPreviewingRefresh || isApplyingRefresh\"\n title=\"Refresh mode\">\n <option value=\"Additive\">Additive</option>\n <option value=\"Sync\">Sync</option>\n </select>\n <button mjButton\n (click)=\"onRefreshFromSource()\"\n [disabled]=\"isPreviewingRefresh || isApplyingRefresh\"\n variant=\"flat\"\n class=\"toolbar-button\">\n @if (isPreviewingRefresh) {\n <span class=\"fa-solid fa-spinner fa-spin\"></span>\n Previewing...\n } @else {\n <span class=\"fa-solid fa-cloud-arrow-down\"></span>\n Refresh from Source\n }\n </button>\n }\n <button mjButton\n (click)=\"onRefreshClick()\"\n variant=\"flat\"\n class=\"toolbar-button\">\n <span class=\"fa-solid fa-rotate\"></span>\n Refresh\n </button>\n <button mjButton\n (click)=\"onExportClick()\"\n variant=\"flat\"\n class=\"toolbar-button\">\n <span class=\"fa-solid fa-file-export\"></span>\n Export\n </button>\n </div>\n </div>\n }\n\n <!-- Loading State -->\n @if (showLoader) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading list...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n <!-- Grid + side stats panel (Phase 5.4). -->\n @if (!showLoader && listRecord) {\n <div class=\"grid-with-stats\">\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 <aside class=\"list-detail__stats\">\n <mj-list-stats [Provider]=\"Provider\" [ListID]=\"listRecord.ID\" [RefreshTrigger]=\"statsRefreshTrigger\"></mj-list-stats>\n </aside>\n </div>\n }\n\n <!-- Refresh-from-source delta-confirm dialog -->\n <mj-list-delta-confirm\n [Visible]=\"refreshConfirmVisible && !!refreshDelta\"\n [Delta]=\"refreshDelta\"\n [TargetListName]=\"listRecord?.Name ?? null\"\n [SourceLabel]=\"sourceViewName\"\n (Confirm)=\"onRefreshConfirmCommit($event)\"\n (Cancel)=\"onRefreshConfirmCancel()\">\n </mj-list-delta-confirm>\n\n <!-- Move delta-confirm dialog (mockup 24). Shown only for Move,\n never for Copy. Drops on the source side require the user to\n acknowledge before Confirm enables. -->\n <mj-list-delta-confirm\n [Visible]=\"moveDeltaConfirmVisible && !!moveDelta\"\n [Delta]=\"moveDelta\"\n [TargetListName]=\"listRecord?.Name ?? null\"\n [SourceLabel]=\"'Move to ' + (moveCopySelectedTarget?.Name ?? 'target list')\"\n (Confirm)=\"onMoveConfirmCommit($event)\"\n (Cancel)=\"onMoveConfirmCancel()\">\n </mj-list-delta-confirm>\n</div>\n\n<!-- Move/Copy target picker (mockup 23). Lists every list owned by /\n shared with the current user that targets the same entity. -->\n@if (showMoveCopyDialog) {\n <mj-dialog\n [Visible]=\"true\"\n [Title]=\"(moveCopyMode === 'move' ? 'Move ' : 'Copy ') + selectedKeys.length + ' record' + (selectedKeys.length === 1 ? '' : 's') + ' to…'\"\n (Close)=\"closeMoveCopyDialog()\"\n [MinWidth]=\"480\"\n [Width]=\"640\"\n [Height]=\"560\">\n <div class=\"dialog-content move-copy-dialog\">\n @if (isApplyingMoveCopy) {\n <div class=\"dialog-loading\">\n <mj-loading [text]=\"(moveCopyMode === 'move' ? 'Moving' : 'Copying') + ' records...'\" size=\"small\"></mj-loading>\n @if (moveCopyTotal > 0) {\n <mj-progress-bar\n [Value]=\"moveCopyProgressPercent\"\n class=\"progress-bar\">\n </mj-progress-bar>\n }\n </div>\n } @else {\n <p class=\"dialog-instruction\">\n Choose the target list. Both lists must hold the same entity ({{ listRecord?.Entity ?? 'records' }}).\n </p>\n <div class=\"search-section\">\n <div class=\"search-input-wrapper\">\n <span class=\"fa-solid fa-search search-icon\"></span>\n <input\n class=\"mj-input search-input\"\n type=\"text\"\n placeholder=\"Filter lists by name…\"\n [(ngModel)]=\"moveCopyTargetSearch\" />\n </div>\n </div>\n @if (moveCopyTargetCandidatesLoading) {\n <div class=\"list-loading\">\n <mj-loading text=\"Loading lists...\" size=\"small\"></mj-loading>\n </div>\n } @else if (filteredMoveCopyTargets.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-list\"\n Title=\"No other lists found for this entity.\">\n <p class=\"dialog-note\">Create a new list first if you need a new target.</p>\n </mj-empty-state>\n } @else {\n <div class=\"records-scroll move-copy-targets\">\n @for (target of filteredMoveCopyTargets; track target.ID) {\n <div class=\"record-item\"\n [class.selected]=\"moveCopySelectedTarget?.ID === target.ID\"\n (click)=\"selectMoveCopyTarget(target)\">\n <div class=\"record-checkbox\">\n <input type=\"radio\"\n name=\"moveCopyTarget\"\n [checked]=\"moveCopySelectedTarget?.ID === target.ID\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"selectMoveCopyTarget(target)\">\n </div>\n <div class=\"record-name\">\n <strong>{{ target.Name }}</strong>\n @if (target.Description) {\n <span class=\"target-desc\"> — {{ target.Description }}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n <mj-dialog-actions>\n <button mjButton\n (click)=\"confirmMoveCopy()\"\n [disabled]=\"!moveCopySelectedTarget || isApplyingMoveCopy\"\n variant=\"primary\">\n @if (moveCopyMode === 'move') {\n <span class=\"fa-solid fa-arrow-right-arrow-left\"></span>\n Continue\n } @else {\n <span class=\"fa-solid fa-copy\"></span>\n Copy {{ selectedKeys.length }}\n }\n </button>\n <button mjButton\n (click)=\"closeMoveCopyDialog()\"\n [disabled]=\"isApplyingMoveCopy\"\n variant=\"outline\">\n Cancel\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n\n<!-- Remove from List Confirmation Dialog -->\n@if (showRemoveDialog) {\n <mj-dialog\n [Visible]=\"true\"\n Title=\"Remove from List\"\n (Close)=\"closeRemoveDialog()\"\n [MinWidth]=\"350\"\n [Width]=\"450\">\n <div class=\"dialog-content\">\n @if (isRemoving) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Removing records...\" size=\"small\"></mj-loading>\n @if (removeTotal > 0) {\n <mj-progress-bar\n [Value]=\"removeProgressPercent\"\n class=\"progress-bar\">\n </mj-progress-bar>\n }\n </div>\n } @else {\n <div class=\"dialog-message\">\n <span class=\"fa-solid fa-triangle-exclamation warning-icon\"></span>\n <p>Are you sure you want to remove <strong>{{ selectedKeys.length }}</strong> record{{ selectedKeys.length !== 1 ? 's' : '' }} from this list?</p>\n <p class=\"dialog-note\">This will not delete the records, only remove them from this list.</p>\n </div>\n }\n </div>\n <mj-dialog-actions>\n <button mjButton\n (click)=\"confirmRemoveFromList()\"\n [disabled]=\"isRemoving\"\n variant=\"danger\">\n Remove\n </button>\n <button mjButton\n (click)=\"closeRemoveDialog()\"\n [disabled]=\"isRemoving\"\n variant=\"outline\">\n Cancel\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n\n<!-- Add Records Dialog -->\n@if (showAddRecordsDialog) {\n <mj-dialog\n [Visible]=\"true\"\n [Title]=\"'Add ' + (listRecord?.Entity || 'Records') + ' to List'\"\n (Close)=\"closeAddRecordsDialog()\"\n [MinWidth]=\"500\"\n [Width]=\"700\"\n [Height]=\"650\">\n <div class=\"dialog-content add-records-dialog\">\n @if (addDialogSaving) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Adding records to list...\" size=\"small\"></mj-loading>\n @if (addTotal > 0) {\n <mj-progress-bar\n [Value]=\"addProgressPercent\"\n class=\"progress-bar\">\n </mj-progress-bar>\n }\n </div>\n } @else {\n <!-- Search Input -->\n <div class=\"search-section\">\n <div class=\"search-input-wrapper\">\n <span class=\"fa-solid fa-search search-icon\"></span>\n <input\n class=\"mj-input search-input\"\n type=\"text\"\n [placeholder]=\"'Search ' + (listRecord?.Entity || 'records') + '...'\"\n [value]=\"addRecordsSearchFilter\"\n (input)=\"onAddRecordsSearchInputEvent($event)\" />\n </div>\n <span class=\"search-hint\">Type at least 2 characters to search</span>\n </div>\n <!-- Records List -->\n <div class=\"records-list\">\n @if (addDialogLoading) {\n <div class=\"list-loading\">\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n </div>\n } @else if (addableRecords.length === 0 && addRecordsSearchFilter.length >= 2) {\n <mj-empty-state\n Variant=\"no-results\"\n Size=\"compact\"\n Icon=\"fa-solid fa-magnifying-glass\"\n [Title]=\"AddRecordsNoMatchTitle\" />\n } @else if (addableRecords.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-list\"\n Title=\"Search for records to add to this list\" />\n } @else {\n <!-- Selection controls -->\n <div class=\"selection-controls\">\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"selectAllAddable()\">Select All</button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"deselectAllAddable()\">Deselect All</button>\n <span class=\"selection-info\">{{ selectedAddableRecords.length }} selected</span>\n </div>\n <!-- Records -->\n <div class=\"records-scroll\">\n @for (record of addableRecords; track record.ID) {\n <div class=\"record-item\"\n [class.in-list]=\"record.isInList\"\n [class.selected]=\"record.isSelected\"\n (click)=\"toggleRecordSelection(record)\">\n <div class=\"record-checkbox\">\n @if (record.isInList) {\n <span class=\"fa-solid fa-check in-list-icon\" title=\"Already in list\"></span>\n } @else {\n <input type=\"checkbox\"\n [checked]=\"record.isSelected\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRecordSelection(record)\">\n }\n </div>\n <div class=\"record-name\">{{ record.Name }}</div>\n @if (record.isInList) {\n <span class=\"in-list-badge\">In List</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n <mj-dialog-actions>\n <button mjButton\n (click)=\"confirmAddRecords()\"\n [disabled]=\"addDialogSaving || selectedAddableRecords.length === 0\"\n variant=\"primary\">\n Add {{ selectedAddableRecords.length > 0 ? selectedAddableRecords.length : '' }} Record{{ selectedAddableRecords.length !== 1 ? 's' : '' }}\n </button>\n <button mjButton\n (click)=\"closeAddRecordsDialog()\"\n [disabled]=\"addDialogSaving\"\n variant=\"outline\">\n Cancel\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n\n<!-- Export Dialog (mockup 26) — format + column picker -->\n@if (showExportDialog && listRecord) {\n <mj-dialog\n [Visible]=\"true\"\n [Title]=\"'Export ' + exportRecordCount + ' Record' + (exportRecordCount === 1 ? '' : 's')\"\n (Close)=\"closeExportDialog()\"\n [MinWidth]=\"520\"\n [Width]=\"640\"\n [Height]=\"640\">\n <div class=\"dialog-content export-dialog\">\n <label class=\"export-section-label\">Format</label>\n <div class=\"export-format-row\">\n <label class=\"export-format-option\"\n [class.export-format-option--selected]=\"exportFormat === 'excel'\"\n (click)=\"exportFormat = 'excel'\">\n <input type=\"radio\" name=\"exportFormat\" value=\"excel\" [(ngModel)]=\"exportFormat\">\n <i class=\"fa-solid fa-file-excel\" style=\"color: var(--mj-status-success);\"></i>\n <span>Excel (.xlsx)</span>\n </label>\n <label class=\"export-format-option\"\n [class.export-format-option--selected]=\"exportFormat === 'csv'\"\n (click)=\"exportFormat = 'csv'\">\n <input type=\"radio\" name=\"exportFormat\" value=\"csv\" [(ngModel)]=\"exportFormat\">\n <i class=\"fa-solid fa-file-csv\" style=\"color: var(--mj-text-secondary);\"></i>\n <span>CSV</span>\n </label>\n <label class=\"export-format-option\"\n [class.export-format-option--selected]=\"exportFormat === 'json'\"\n (click)=\"exportFormat = 'json'\">\n <input type=\"radio\" name=\"exportFormat\" value=\"json\" [(ngModel)]=\"exportFormat\">\n <i class=\"fa-solid fa-file-code\" style=\"color: var(--mj-brand-primary);\"></i>\n <span>JSON</span>\n </label>\n </div>\n\n <div class=\"export-section-divider\"></div>\n\n <label class=\"export-section-label\">Columns to include</label>\n <div class=\"export-fields-list\">\n @for (f of exportFields; track f.Name) {\n <label class=\"export-field-row\">\n <input type=\"checkbox\" [(ngModel)]=\"f.Selected\">\n <span>{{ f.DisplayName }}</span>\n </label>\n }\n </div>\n <div class=\"export-field-actions\">\n <a href=\"#\" (click)=\"selectAllExportFields(); $event.preventDefault()\">Select All</a>\n <a href=\"#\" (click)=\"selectNoneExportFields(); $event.preventDefault()\">Select None</a>\n <span class=\"muted\">{{ selectedExportFieldCount }} of {{ exportFields.length }} selected</span>\n </div>\n </div>\n <mj-dialog-actions>\n <button mjButton variant=\"primary\"\n [disabled]=\"selectedExportFieldCount === 0 || isExporting\"\n (click)=\"executeExport()\">\n @if (isExporting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Exporting…\n } @else {\n <i class=\"fa-solid fa-download\"></i>\n Export {{ exportRecordCount }} Record{{ exportRecordCount === 1 ? '' : 's' }}\n }\n </button>\n <button mjButton variant=\"outline\" [disabled]=\"isExporting\" (click)=\"closeExportDialog()\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n\n<!-- Add From View Dialog -->\n@if (showAddFromViewDialog) {\n <mj-dialog\n [Visible]=\"true\"\n Title=\"Add Records from Views\"\n (Close)=\"closeAddFromViewDialog()\"\n [MinWidth]=\"400\"\n [Width]=\"600\"\n [Height]=\"500\">\n <div class=\"dialog-content\">\n @if (showAddFromViewLoader && fetchingRecordsToSave) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Loading records from views...\" size=\"small\"></mj-loading>\n </div>\n } @else if (showAddFromViewLoader && addFromViewTotal > 0) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Adding records to list...\" size=\"small\"></mj-loading>\n <mj-progress-bar\n [Value]=\"addFromViewProgressPercent\"\n class=\"progress-bar\">\n </mj-progress-bar>\n </div>\n } @else if (showAddFromViewLoader) {\n <div class=\"dialog-loading\">\n <mj-loading text=\"Loading views...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <p class=\"dialog-instruction\">Select views to add their records to this list:</p>\n <div class=\"views-list\">\n @if (!userViews || userViews.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-folder-open\"\n Title=\"No saved views found for this entity\" />\n } @else {\n @for (view of userViews; track view.ID) {\n <div class=\"view-item\"\n [class.selected]=\"isViewSelected(view)\"\n (click)=\"toggleViewSelection(view)\">\n <input type=\"checkbox\"\n [checked]=\"isViewSelected(view)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleViewSelection(view)\">\n <span class=\"fa-solid fa-table-list view-icon\"></span>\n <span class=\"view-name\">{{ view.Name }}</span>\n </div>\n }\n }\n </div>\n }\n </div>\n <mj-dialog-actions>\n <button mjButton\n (click)=\"confirmAddFromView()\"\n [disabled]=\"showAddFromViewLoader || userViewsToAdd.length === 0\"\n variant=\"primary\">\n Add from {{ userViewsToAdd.length }} View{{ userViewsToAdd.length !== 1 ? 's' : '' }}\n </button>\n <button mjButton\n (click)=\"closeAddFromViewDialog()\"\n [disabled]=\"showAddFromViewLoader\"\n variant=\"outline\">\n Cancel\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n"]}