@memberjunction/ng-explorer-settings 6.2.0-edge.0 → 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 (77) hide show
  1. package/dist/lib/account-info/account-info.component.d.ts +1 -1
  2. package/dist/lib/account-info/account-info.component.js +2 -2
  3. package/dist/lib/account-info/account-info.component.js.map +1 -1
  4. package/dist/lib/application-management/application-dialog/application-dialog.component.d.ts +92 -10
  5. package/dist/lib/application-management/application-dialog/application-dialog.component.d.ts.map +1 -1
  6. package/dist/lib/application-management/application-dialog/application-dialog.component.js +222 -76
  7. package/dist/lib/application-management/application-dialog/application-dialog.component.js.map +1 -1
  8. package/dist/lib/application-management/application-management.component.d.ts +92 -10
  9. package/dist/lib/application-management/application-management.component.d.ts.map +1 -1
  10. package/dist/lib/application-management/application-management.component.js +229 -65
  11. package/dist/lib/application-management/application-management.component.js.map +1 -1
  12. package/dist/lib/application-settings/application-settings.component.d.ts +4 -4
  13. package/dist/lib/application-settings/application-settings.component.js +10 -10
  14. package/dist/lib/application-settings/application-settings.component.js.map +1 -1
  15. package/dist/lib/entity-permissions/entity-permissions.component.d.ts +88 -10
  16. package/dist/lib/entity-permissions/entity-permissions.component.d.ts.map +1 -1
  17. package/dist/lib/entity-permissions/entity-permissions.component.js +219 -63
  18. package/dist/lib/entity-permissions/entity-permissions.component.js.map +1 -1
  19. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.d.ts +44 -6
  20. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.d.ts.map +1 -1
  21. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js +117 -43
  22. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js.map +1 -1
  23. package/dist/lib/notification-preferences/notification-preferences.component.d.ts +25 -3
  24. package/dist/lib/notification-preferences/notification-preferences.component.d.ts.map +1 -1
  25. package/dist/lib/notification-preferences/notification-preferences.component.js +62 -18
  26. package/dist/lib/notification-preferences/notification-preferences.component.js.map +1 -1
  27. package/dist/lib/role-management/role-dialog/role-dialog.component.d.ts +32 -4
  28. package/dist/lib/role-management/role-dialog/role-dialog.component.d.ts.map +1 -1
  29. package/dist/lib/role-management/role-dialog/role-dialog.component.js +84 -30
  30. package/dist/lib/role-management/role-dialog/role-dialog.component.js.map +1 -1
  31. package/dist/lib/role-management/role-management-agent-context.d.ts +12 -4
  32. package/dist/lib/role-management/role-management-agent-context.d.ts.map +1 -1
  33. package/dist/lib/role-management/role-management-agent-context.js +26 -10
  34. package/dist/lib/role-management/role-management-agent-context.js.map +1 -1
  35. package/dist/lib/role-management/role-management.component.d.ts +95 -11
  36. package/dist/lib/role-management/role-management.component.d.ts.map +1 -1
  37. package/dist/lib/role-management/role-management.component.js +259 -91
  38. package/dist/lib/role-management/role-management.component.js.map +1 -1
  39. package/dist/lib/settings/settings.component.d.ts +87 -11
  40. package/dist/lib/settings/settings.component.d.ts.map +1 -1
  41. package/dist/lib/settings/settings.component.js +211 -65
  42. package/dist/lib/settings/settings.component.js.map +1 -1
  43. package/dist/lib/shared/settings-card.component.d.ts +24 -4
  44. package/dist/lib/shared/settings-card.component.d.ts.map +1 -1
  45. package/dist/lib/shared/settings-card.component.js +46 -6
  46. package/dist/lib/shared/settings-card.component.js.map +1 -1
  47. package/dist/lib/sql-logging/sql-logging.component.d.ts +172 -18
  48. package/dist/lib/sql-logging/sql-logging.component.d.ts.map +1 -1
  49. package/dist/lib/sql-logging/sql-logging.component.js +320 -108
  50. package/dist/lib/sql-logging/sql-logging.component.js.map +1 -1
  51. package/dist/lib/user-app-config/user-app-config-content.component.js +3 -3
  52. package/dist/lib/user-app-config/user-app-config-content.component.js.map +1 -1
  53. package/dist/lib/user-app-config/user-app-config-reorder.d.ts +4 -0
  54. package/dist/lib/user-app-config/user-app-config-reorder.d.ts.map +1 -1
  55. package/dist/lib/user-app-config/user-app-config-reorder.js +11 -3
  56. package/dist/lib/user-app-config/user-app-config-reorder.js.map +1 -1
  57. package/dist/lib/user-management/transaction-group-refusals.d.ts +4 -2
  58. package/dist/lib/user-management/transaction-group-refusals.d.ts.map +1 -1
  59. package/dist/lib/user-management/transaction-group-refusals.js +7 -3
  60. package/dist/lib/user-management/transaction-group-refusals.js.map +1 -1
  61. package/dist/lib/user-management/user-dialog/user-dialog.component.d.ts +44 -6
  62. package/dist/lib/user-management/user-dialog/user-dialog.component.d.ts.map +1 -1
  63. package/dist/lib/user-management/user-dialog/user-dialog.component.js +121 -47
  64. package/dist/lib/user-management/user-dialog/user-dialog.component.js.map +1 -1
  65. package/dist/lib/user-management/user-management-agent-context.d.ts +10 -0
  66. package/dist/lib/user-management/user-management-agent-context.d.ts.map +1 -1
  67. package/dist/lib/user-management/user-management-agent-context.js +26 -6
  68. package/dist/lib/user-management/user-management-agent-context.js.map +1 -1
  69. package/dist/lib/user-management/user-management.component.d.ts +174 -16
  70. package/dist/lib/user-management/user-management.component.d.ts.map +1 -1
  71. package/dist/lib/user-management/user-management.component.js +480 -171
  72. package/dist/lib/user-management/user-management.component.js.map +1 -1
  73. package/dist/lib/user-profile-settings/user-profile-settings.component.d.ts +97 -15
  74. package/dist/lib/user-profile-settings/user-profile-settings.component.d.ts.map +1 -1
  75. package/dist/lib/user-profile-settings/user-profile-settings.component.js +280 -116
  76. package/dist/lib/user-profile-settings/user-profile-settings.component.js.map +1 -1
  77. package/package.json +20 -20
@@ -1 +1 @@
1
- {"version":3,"file":"user-app-config-content.component.js","sourceRoot":"","sources":["../../../src/lib/user-app-config/user-app-config-content.component.ts","../../../src/lib/user-app-config/user-app-config-content.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Output, EventEmitter, OnInit, ChangeDetectorRef, NgZone, ElementRef, inject } from '@angular/core';\nimport { LogError, LogStatus, IMetadataProvider, LogStatusEx } from '@memberjunction/core';\nimport { MJUserApplicationEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { ApplicationManager, BaseApplication } from '@memberjunction/ng-base-application';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { UUIDsEqual } from '@memberjunction/global';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { moveAndResequence, resequenceItems } from './user-app-config-reorder';\n\n/**\n * Represents an app item in the configuration UI\n */\ninterface AppConfigItem {\n app: BaseApplication;\n userAppId: string | null;\n sequence: number;\n isActive: boolean;\n isDirty: boolean;\n}\n\n/**\n * Chrome-free app-configuration content: select which applications appear in\n * the app switcher and arrange their order. Owns all list/reorder/persistence\n * logic (including its own Reset / Save / Cancel footer) but NO overlay —\n * hosts embed it wherever it should live:\n * - `UserAppConfigComponent` wraps it in the full-screen modal (Home dashboard)\n * - the shell's app launcher embeds it as an in-panel view swap\n *\n * Loads on init (hosts create it fresh under an `@if`), saves in a batch on\n * the Save button, and signals the host via `Saved` / `Cancelled` — the host\n * decides what \"done\" means (close the dialog, swap the view back, etc.).\n */\n@Component({\n standalone: false,\n selector: 'mj-user-app-config-content',\n templateUrl: './user-app-config-content.component.html',\n styleUrls: ['./user-app-config-content.component.css']\n})\nexport class UserAppConfigContentComponent extends BaseAngularComponent implements OnInit {\n private appManager = inject(ApplicationManager);\n private sharedService = inject(SharedService);\n private cdr = inject(ChangeDetectorRef);\n private ngZone = inject(NgZone);\n private el = inject(ElementRef);\n\n /** Emitted once after a successful batch save */\n @Output() Saved = new EventEmitter<void>();\n /** Emitted when the user cancels (or saves with nothing to save) */\n @Output() Cancelled = new EventEmitter<void>();\n\n /** Every system app the user is authorized for, joined with their per-user config */\n AllApps: AppConfigItem[] = [];\n /** Apps the user has enabled, in their configured Sequence order */\n ActiveApps: AppConfigItem[] = [];\n /** Apps not yet enabled, alphabetical */\n AvailableApps: AppConfigItem[] = [];\n\n /** True while the initial configuration load is in flight */\n IsLoading = false;\n /** True while the batch save is in flight (disables the footer buttons) */\n IsSaving = false;\n /** User-facing load/save failure message; empty when healthy */\n ErrorMessage = '';\n\n /** Collapse state for the Available-apps panel (mobile accordion) */\n AvailablePanelCollapsed = false;\n /** Collapse state for the Selected-apps panel (mobile accordion) */\n SelectedPanelCollapsed = false;\n\n /** Item currently being dragged for reorder, null when idle */\n DraggedItem: AppConfigItem | null = null;\n /** Source index of the in-flight drag within ActiveApps */\n DraggedIndex = -1;\n /** Index the drag is currently hovering (drop indicator position) */\n DropTargetIndex = -1;\n\n async ngOnInit(): Promise<void> {\n await this.loadConfiguration();\n }\n\n /**\n * Adds an app to the user's active list\n */\n AddApp(item: AppConfigItem): void {\n item.isActive = true;\n item.sequence = this.ActiveApps.length;\n item.isDirty = true;\n this.refreshAppLists();\n }\n\n /**\n * Removes an app from the user's active list\n */\n RemoveApp(item: AppConfigItem): void {\n item.isActive = false;\n item.sequence = 999;\n item.isDirty = true;\n this.refreshAppLists();\n\n this.resequenceActiveApps();\n }\n\n /**\n * Toggles an app between active and inactive\n */\n ToggleApp(item: AppConfigItem): void {\n if (item.isActive) {\n this.RemoveApp(item);\n } else {\n this.AddApp(item);\n }\n }\n\n /**\n * Moves an app up in the order. Positional (splice + renumber), NOT a sequence-value\n * swap: rows can carry duplicate Sequence values (issue #3027 — e.g. a re-enabled app\n * kept a stale value), and swapping two equal values is a silent no-op. Reordering by\n * position then renumbering 0..n-1 always works and heals duplicates as a side effect.\n */\n MoveUp(item: AppConfigItem): void {\n const index = this.ActiveApps.indexOf(item);\n if (index > 0) {\n this.moveActiveApp(index, index - 1);\n }\n }\n\n /**\n * Moves an app down in the order. Positional — see {@link MoveUp} for why.\n */\n MoveDown(item: AppConfigItem): void {\n const index = this.ActiveApps.indexOf(item);\n if (index >= 0 && index < this.ActiveApps.length - 1) {\n this.moveActiveApp(index, index + 1);\n }\n }\n\n private moveActiveApp(fromIndex: number, toIndex: number): void {\n this.ActiveApps = moveAndResequence(this.ActiveApps, fromIndex, toIndex);\n }\n\n /**\n * Checks if there are any unsaved changes\n */\n HasChanges(): boolean {\n return this.AllApps.some(item => item.isDirty);\n }\n\n /** Cancel button — host decides what dismissal means */\n Cancel(): void {\n this.Cancelled.emit();\n }\n\n /**\n * Saves the user's app configuration\n */\n async Save(): Promise<void> {\n if (!this.HasChanges()) {\n this.Cancelled.emit();\n return;\n }\n\n this.IsSaving = true;\n this.ErrorMessage = '';\n\n try {\n // Self-heal: renumber active apps 0..n-1 before persisting. Existing rows can\n // carry duplicate Sequence values from older data (issue #3027); renumbering in\n // display order marks any corrected rows dirty so this save fixes them for good.\n this.resequenceActiveApps();\n\n const md = this.ProviderToUse;\n\n for (const item of this.AllApps) {\n if (!item.isDirty) continue;\n\n if (item.userAppId) {\n await this.updateUserApplication(md, item);\n } else if (item.isActive) {\n await this.createUserApplication(md, item);\n }\n }\n\n // Each userApp.Save() above fires a BaseEntity 'save' event, which UserInfoEngine\n // catches via HandleIndividualBaseEntityEvent → debounced refresh → NotifyDataChange.\n // ApplicationManager.subscribeToEngineChanges then propagates to the shell app\n // switcher. No explicit reload needed here — and avoiding it sidesteps NG0100\n // from observable emissions interleaving with this method's save loop.\n LogStatusEx({\n message: 'User app configuration saved',\n verboseOnly: true\n });\n\n this.sharedService.CreateSimpleNotification('App configuration saved successfully!', 'success', 3000);\n this.Saved.emit();\n // Backstop for a dropped/coalesced debounced engine event: force a reconcile from the source\n // of truth so the app switcher can't be left \"one save behind\". DEFERRED past the current CD\n // cycle — a synchronous reload here previously triggered NG0100 (commits e2059e6114 /\n // 7bf8be7dc6). No-op cost when the event chain already delivered. (Ported from bug F1's fix\n // to the pre-split monolith, PR #3289.)\n Promise.resolve().then(() => this.appManager.ReloadUserApplications());\n\n } catch (error) {\n this.ErrorMessage = 'Failed to save configuration. Please try again.';\n LogError('Error saving app configuration:', undefined, error instanceof Error ? error.message : String(error));\n // A partial-save failure can leave in-memory state half-committed (some items saved+clean,\n // others still dirty) and divergent from the DB. Reconcile from the source of truth so\n // recovery doesn't require a browser refresh — deferred, for the same NG0100 reason.\n Promise.resolve().then(() => this.appManager.ReloadUserApplications());\n } finally {\n this.ngZone.run(() => {\n this.IsSaving = false;\n this.cdr.detectChanges();\n });\n }\n }\n\n /**\n * Resets all changes and reloads the configuration\n */\n async Reset(): Promise<void> {\n await this.loadConfiguration();\n }\n\n // ---------------------------------------------------------------------------\n // Drag-and-drop handlers (desktop only)\n // ---------------------------------------------------------------------------\n\n /** Begin an HTML5 drag of an active-app row */\n OnDragStart(event: DragEvent, item: AppConfigItem, index: number): void {\n this.DraggedItem = item;\n this.DraggedIndex = index;\n\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', index.toString());\n }\n }\n\n /** Allow dropping while a row drag passes over the list */\n OnDragOver(event: DragEvent): void {\n event.preventDefault();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move';\n }\n }\n\n /** Track the row index the drag is hovering (drop indicator) */\n OnDragEnter(event: DragEvent, index: number): void {\n event.preventDefault();\n this.DropTargetIndex = index;\n }\n\n /** Clear all drag state (fires on drop or drag cancel) */\n OnDragEnd(): void {\n this.DraggedItem = null;\n this.DraggedIndex = -1;\n this.DropTargetIndex = -1;\n }\n\n /** Reorder ActiveApps to the hovered position and renumber sequences */\n OnDrop(event: DragEvent): void {\n event.preventDefault();\n\n if (this.DraggedIndex >= 0 && this.DropTargetIndex >= 0 && this.DraggedIndex !== this.DropTargetIndex) {\n const [movedItem] = this.ActiveApps.splice(this.DraggedIndex, 1);\n this.ActiveApps.splice(this.DropTargetIndex, 0, movedItem);\n this.resequenceActiveApps();\n this.cdr.detectChanges();\n }\n\n this.OnDragEnd();\n }\n\n // ---------------------------------------------------------------------------\n // Touch drag-and-drop handlers (mobile)\n // ---------------------------------------------------------------------------\n\n /** Source index of the in-flight touch drag (-1 when idle) */\n TouchDragIndex = -1;\n /** Row index the touch drag would drop at */\n TouchDropIndex = -1;\n /** True while a touch drag is in progress */\n TouchDragActive = false;\n\n private touchStartY = 0;\n private touchCurrentY = 0;\n private touchRowHeight = 0;\n private touchDragElement: HTMLElement | null = null;\n private touchScrollContainer: HTMLElement | null = null;\n\n /** Begin a touch drag of a mobile app row (long-press handle) */\n OnTouchDragStart(event: TouchEvent, index: number): void {\n const touch = event.touches[0];\n const row = (event.target as HTMLElement).closest('.mobile-app-row') as HTMLElement | null;\n if (!row) return;\n\n event.preventDefault();\n this.TouchDragIndex = index;\n this.TouchDropIndex = index;\n this.TouchDragActive = true;\n this.touchStartY = touch.clientY;\n this.touchCurrentY = touch.clientY;\n this.touchDragElement = row;\n this.touchRowHeight = row.offsetHeight;\n this.touchScrollContainer = this.el.nativeElement.querySelector('.mobile-list');\n\n row.classList.add('touch-dragging');\n }\n\n /** Follow the finger: translate the row, track drop target, auto-scroll near edges */\n OnTouchDragMove(event: TouchEvent): void {\n if (!this.TouchDragActive || !this.touchDragElement) return;\n\n event.preventDefault();\n const touch = event.touches[0];\n this.touchCurrentY = touch.clientY;\n const deltaY = this.touchCurrentY - this.touchStartY;\n\n this.touchDragElement.style.transform = `translateY(${deltaY}px)`;\n this.touchDragElement.style.zIndex = '100';\n\n this.updateTouchDropTarget(deltaY);\n this.autoScrollIfNeeded();\n }\n\n /** Commit the touch reorder (if moved) and reset touch-drag state */\n OnTouchDragEnd(): void {\n if (!this.TouchDragActive) return;\n\n if (this.touchDragElement) {\n this.touchDragElement.style.transform = '';\n this.touchDragElement.style.zIndex = '';\n this.touchDragElement.classList.remove('touch-dragging');\n }\n\n if (this.TouchDragIndex >= 0 && this.TouchDropIndex >= 0 && this.TouchDragIndex !== this.TouchDropIndex) {\n const [movedItem] = this.ActiveApps.splice(this.TouchDragIndex, 1);\n this.ActiveApps.splice(this.TouchDropIndex, 0, movedItem);\n this.resequenceActiveApps();\n }\n\n this.resetTouchDragState();\n this.cdr.detectChanges();\n }\n\n private updateTouchDropTarget(deltaY: number): void {\n const rowsToMove = Math.round(deltaY / this.touchRowHeight);\n const newIndex = Math.max(0, Math.min(this.ActiveApps.length - 1, this.TouchDragIndex + rowsToMove));\n this.TouchDropIndex = newIndex;\n }\n\n private autoScrollIfNeeded(): void {\n if (!this.touchScrollContainer) return;\n\n const rect = this.touchScrollContainer.getBoundingClientRect();\n const edgeZone = 40;\n\n if (this.touchCurrentY < rect.top + edgeZone) {\n this.touchScrollContainer.scrollTop -= 8;\n } else if (this.touchCurrentY > rect.bottom - edgeZone) {\n this.touchScrollContainer.scrollTop += 8;\n }\n }\n\n private resetTouchDragState(): void {\n this.TouchDragIndex = -1;\n this.TouchDropIndex = -1;\n this.TouchDragActive = false;\n this.touchDragElement = null;\n this.touchScrollContainer = null;\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private async loadConfiguration(): Promise<void> {\n this.IsLoading = true;\n this.ErrorMessage = '';\n\n try {\n // Read directly from UserInfoEngine's cache. The engine already loaded\n // and maintains MJ: User Applications via its event-driven refresh — no\n // need to re-query the DB on every open. EnsureLoaded is idempotent\n // and instant when the engine is already loaded (the typical case here,\n // since UserInfoEngine fires at startup).\n const provider = this.ProviderToUse;\n const engine = provider\n ? UserInfoEngine.GetProviderInstance<UserInfoEngine>(provider, UserInfoEngine) as UserInfoEngine\n : UserInfoEngine.Instance;\n await engine.EnsureLoaded();\n const systemApps = this.appManager.GetAuthorizedSystemApps();\n const userApps = engine.UserApplications;\n this.AllApps = this.buildAppConfigItems(systemApps, userApps);\n this.refreshAppLists();\n\n } catch (error) {\n this.ErrorMessage = 'Failed to load app configuration. Please try again.';\n LogError('Error loading app configuration:', undefined, error instanceof Error ? error.message : String(error));\n } finally {\n this.ngZone.run(() => {\n this.IsLoading = false;\n this.cdr.detectChanges();\n });\n }\n }\n\n private buildAppConfigItems(systemApps: BaseApplication[], userApps: MJUserApplicationEntity[]): AppConfigItem[] {\n return systemApps.map(app => {\n const userApp = userApps.find(ua => UUIDsEqual(ua.ApplicationID, app.ID));\n return {\n app,\n userAppId: userApp?.ID ?? null,\n sequence: userApp?.Sequence ?? 999,\n isActive: userApp?.IsActive ?? false,\n isDirty: false\n };\n });\n }\n\n private refreshAppLists(): void {\n this.ActiveApps = this.AllApps\n .filter(item => item.isActive)\n .sort((a, b) => a.sequence - b.sequence);\n\n this.AvailableApps = this.AllApps\n .filter(item => !item.isActive)\n .sort((a, b) => a.app.Name.localeCompare(b.app.Name));\n }\n\n private resequenceActiveApps(): void {\n resequenceItems(this.ActiveApps);\n }\n\n\n private async updateUserApplication(md: IMetadataProvider, item: AppConfigItem): Promise<void> {\n const userApp = await md.GetEntityObject<MJUserApplicationEntity>('MJ: User Applications', md.CurrentUser);\n await userApp.Load(item.userAppId!);\n\n userApp.Sequence = item.sequence;\n userApp.IsActive = item.isActive;\n\n const saved = await userApp.Save();\n if (!saved) {\n throw new Error(`Failed to update UserApplication for ${item.app.Name}: ${userApp.LatestResult?.CompleteMessage ?? 'unknown error'}`);\n }\n\n item.isDirty = false;\n LogStatus(`Updated UserApplication for ${item.app.Name}: sequence=${item.sequence}, isActive=${item.isActive}`);\n }\n\n private async createUserApplication(md: IMetadataProvider, item: AppConfigItem): Promise<void> {\n const userApp = await md.GetEntityObject<MJUserApplicationEntity>('MJ: User Applications', md.CurrentUser);\n userApp.NewRecord();\n\n userApp.UserID = md.CurrentUser.ID;\n userApp.ApplicationID = item.app.ID;\n userApp.Sequence = item.sequence;\n userApp.IsActive = item.isActive;\n\n const saved = await userApp.Save();\n if (!saved) {\n throw new Error(`Failed to create UserApplication for ${item.app.Name}: ${userApp.LatestResult?.CompleteMessage ?? 'unknown error'}`);\n }\n\n item.userAppId = userApp.ID;\n item.isDirty = false;\n LogStatus(`Created UserApplication for ${item.app.Name}: sequence=${item.sequence}`);\n }\n}\n","<div class=\"app-config-container\">\n <!-- Loading State -->\n @if (IsLoading) {\n <div class=\"loading-container\" role=\"status\" aria-live=\"polite\">\n <mj-loading text=\"Loading your app configuration...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n <!-- Error Message -->\n @if (ErrorMessage) {\n <mj-alert Variant=\"error\">{{ ErrorMessage }}</mj-alert>\n }\n\n <!-- Main Content -->\n @if (!IsLoading) {\n <div class=\"config-content\">\n <p class=\"config-description\">\n Select which applications appear in your app switcher and arrange them in your preferred order.\n Double-click to quickly add or remove. Drag and drop to reorder, or use the arrow buttons.\n </p>\n\n <!-- Desktop: two-panel layout with drag-and-drop -->\n <div class=\"panels-container desktop-only\">\n <!-- Available Apps Panel -->\n <div class=\"panel available-apps-panel\" [class.collapsed]=\"AvailablePanelCollapsed\">\n <div class=\"panel-header\" (click)=\"AvailablePanelCollapsed = !AvailablePanelCollapsed\">\n <i class=\"fa-solid fa-layer-group\" aria-hidden=\"true\"></i>\n <h3>Available Applications</h3>\n <span class=\"badge\">{{ AvailableApps.length }}</span>\n <i\n class=\"collapse-toggle fa-solid\"\n [class.fa-chevron-down]=\"AvailablePanelCollapsed\"\n [class.fa-chevron-up]=\"!AvailablePanelCollapsed\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"panel-content\">\n @if (AvailableApps.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-check-double\"\n Title=\"All applications added!\" />\n }\n\n @for (item of AvailableApps; track item.app.ID) {\n <div class=\"available-app-item\" (dblclick)=\"AddApp(item)\">\n <div class=\"app-icon\" [style.--app-color]=\"item.app.GetColor()\">\n <i [class]=\"item.app.Icon || 'fa-solid fa-cube'\" aria-hidden=\"true\"></i>\n </div>\n\n <div class=\"app-info\">\n <span class=\"app-name\">{{ item.app.Name }}</span>\n @if (item.app.Description) {\n <span class=\"app-description\">{{ item.app.Description }}</span>\n }\n </div>\n\n <button\n mjButton variant=\"outline\" size=\"sm\"\n (click)=\"AddApp(item)\"\n title=\"Add to your apps\"\n [attr.aria-label]=\"'Add ' + item.app.Name\"\n >\n <i class=\"fa-solid fa-plus\" aria-hidden=\"true\"></i>\n Add\n </button>\n </div>\n }\n </div>\n </div>\n\n <!-- Selected Apps Panel -->\n <div class=\"panel selected-apps-panel\" [class.collapsed]=\"SelectedPanelCollapsed\">\n <div class=\"panel-header\" (click)=\"SelectedPanelCollapsed = !SelectedPanelCollapsed\">\n <i class=\"fa-solid fa-check-circle\" aria-hidden=\"true\"></i>\n <h3>Your Applications</h3>\n <span class=\"badge\">{{ ActiveApps.length }}</span>\n <i\n class=\"collapse-toggle fa-solid\"\n [class.fa-chevron-down]=\"SelectedPanelCollapsed\"\n [class.fa-chevron-up]=\"!SelectedPanelCollapsed\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"panel-content\">\n @if (ActiveApps.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-inbox\"\n Title=\"No applications selected\"\n Message=\"Add apps from the available list\" />\n }\n\n @if (ActiveApps.length > 0) {\n <div\n class=\"sortable-list\"\n (dragover)=\"OnDragOver($event)\"\n (drop)=\"OnDrop($event)\"\n >\n @for (item of ActiveApps; track item.app.ID; let i = $index) {\n <div\n class=\"app-item\"\n [class.dragging]=\"DraggedItem === item\"\n draggable=\"true\"\n (dragstart)=\"OnDragStart($event, item, i)\"\n (dragend)=\"OnDragEnd()\"\n (dragenter)=\"OnDragEnter($event, i)\"\n (dblclick)=\"RemoveApp(item); $event.stopPropagation()\"\n >\n <div class=\"app-item-content\">\n <div class=\"drag-handle\">\n <i class=\"fa-solid fa-grip-vertical\" aria-hidden=\"true\"></i>\n </div>\n\n <div class=\"app-icon\" [style.--app-color]=\"item.app.GetColor()\">\n <i [class]=\"item.app.Icon || 'fa-solid fa-cube'\" aria-hidden=\"true\"></i>\n </div>\n\n <div class=\"app-info\">\n <span class=\"app-name\">{{ item.app.Name }}</span>\n @if (item.app.Description) {\n <span class=\"app-description\">{{ item.app.Description }}</span>\n }\n </div>\n\n <div class=\"app-actions\">\n <button\n mjButton variant=\"flat\" size=\"sm\"\n [disabled]=\"i === 0\"\n (click)=\"MoveUp(item); $event.stopPropagation()\"\n title=\"Move up\"\n [attr.aria-label]=\"'Move ' + item.app.Name + ' up'\"\n >\n <i class=\"fa-solid fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <button\n mjButton variant=\"flat\" size=\"sm\"\n [disabled]=\"i === ActiveApps.length - 1\"\n (click)=\"MoveDown(item); $event.stopPropagation()\"\n title=\"Move down\"\n [attr.aria-label]=\"'Move ' + item.app.Name + ' down'\"\n >\n <i class=\"fa-solid fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n <button\n mjButton variant=\"flat\" size=\"sm\"\n class=\"remove-btn\"\n (click)=\"RemoveApp(item); $event.stopPropagation()\"\n title=\"Remove from your apps\"\n [attr.aria-label]=\"'Remove ' + item.app.Name\"\n >\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n\n <!-- Mobile: single list with toggles + touch drag reorder -->\n <div\n class=\"mobile-view\"\n (touchmove)=\"OnTouchDragMove($event)\"\n (touchend)=\"OnTouchDragEnd()\"\n (touchcancel)=\"OnTouchDragEnd()\"\n >\n <div class=\"mobile-list\">\n @if (ActiveApps.length > 0) {\n <div class=\"mobile-section-label\">Your Apps</div>\n @for (item of ActiveApps; track item.app.ID; let i = $index) {\n @if (TouchDragActive && TouchDropIndex === i && TouchDragIndex > i) {\n <div class=\"mobile-drop-indicator\"></div>\n }\n <div\n class=\"mobile-app-row\"\n [class.touch-ghost]=\"TouchDragActive && TouchDragIndex === i\"\n >\n <div\n class=\"mobile-drag-handle\"\n (touchstart)=\"OnTouchDragStart($event, i)\"\n aria-label=\"Drag to reorder\"\n >\n <i class=\"fa-solid fa-grip-vertical\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"app-icon\" [style.--app-color]=\"item.app.GetColor()\">\n <i [class]=\"item.app.Icon || 'fa-solid fa-cube'\" aria-hidden=\"true\"></i>\n </div>\n <span class=\"mobile-app-name\">{{ item.app.Name }}</span>\n <button\n class=\"mobile-toggle on\"\n (click)=\"ToggleApp(item)\"\n aria-label=\"Remove {{ item.app.Name }}\"\n >\n <i class=\"fa-solid fa-toggle-on\" aria-hidden=\"true\"></i>\n </button>\n </div>\n @if (TouchDragActive && TouchDropIndex === i && TouchDragIndex < i) {\n <div class=\"mobile-drop-indicator\"></div>\n }\n }\n @if (TouchDragActive && TouchDropIndex === ActiveApps.length - 1 && TouchDragIndex < TouchDropIndex) {\n <div class=\"mobile-drop-indicator\"></div>\n }\n }\n\n @if (AvailableApps.length > 0) {\n <div class=\"mobile-section-label\">Available</div>\n @for (item of AvailableApps; track item.app.ID) {\n <div class=\"mobile-app-row inactive\">\n <div class=\"app-icon\" [style.--app-color]=\"item.app.GetColor()\">\n <i [class]=\"item.app.Icon || 'fa-solid fa-cube'\" aria-hidden=\"true\"></i>\n </div>\n <span class=\"mobile-app-name\">{{ item.app.Name }}</span>\n <button\n class=\"mobile-toggle off\"\n (click)=\"ToggleApp(item)\"\n aria-label=\"Add {{ item.app.Name }}\"\n >\n <i class=\"fa-solid fa-toggle-off\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Footer Actions -->\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n @if (HasChanges()) {\n <button\n mjButton\n (click)=\"Reset()\"\n [disabled]=\"IsLoading || IsSaving\"\n >\n <i class=\"fa-solid fa-rotate-left\" aria-hidden=\"true\"></i>\n Reset Changes\n </button>\n }\n </div>\n <div class=\"footer-right\">\n <button\n mjButton variant=\"primary\"\n (click)=\"Save()\"\n [disabled]=\"IsLoading || IsSaving || !HasChanges()\"\n >\n @if (IsSaving) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n <span>Saving...</span>\n } @else {\n <i class=\"fa-solid fa-check\" aria-hidden=\"true\"></i>\n <span>Save Changes</span>\n }\n </button>\n <button\n mjButton\n (click)=\"Cancel()\"\n [disabled]=\"IsSaving\"\n >\n Cancel\n </button>\n </div>\n </div>\n</div>\n"]}
1
+ {"version":3,"file":"user-app-config-content.component.js","sourceRoot":"","sources":["../../../src/lib/user-app-config/user-app-config-content.component.ts","../../../src/lib/user-app-config/user-app-config-content.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAU,iBAAiB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAqB,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAA2B,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACxF,OAAO,EAAE,kBAAkB,EAAmB,MAAM,qCAAqC,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;;;;;;ICL3E,8BAAgE;IAC9D,iCAAgF;IAClF,iBAAM;;;IAKN,mCAA0B;IAAA,YAAkB;IAAA,iBAAW;;;IAA7B,cAAkB;IAAlB,yCAAkB;;;IA6BlC,qCAGoC;;;IAY9B,gCAA8B;IAAA,YAA0B;IAAA,iBAAO;;;IAAjC,cAA0B;IAA1B,6CAA0B;;;;IAR9D,+BAA0D;IAA1B,sOAAY,sBAAY,KAAC;IACvD,+BAAgE;IAC9D,wBAAwE;IAC1E,iBAAM;IAGJ,AADF,+BAAsB,eACG;IAAA,YAAmB;IAAA,iBAAO;IACjD,sHAA4B;IAG9B,iBAAM;IAEN,kCAKC;IAHC,mOAAS,sBAAY,KAAC;IAItB,wBAAmD;IACnD,qBACF;IACF,AADE,iBAAS,EACL;;;IApBkB,cAAyC;IAAzC,qDAAyC;IAC1D,cAA6C;IAA7C,qDAA6C;IAIzB,eAAmB;IAAnB,sCAAmB;IAC1C,cAEC;IAFD,kDAEC;IAOD,cAA0C;;;;IA0B9C,qCAI+C;;;IA+BnC,gCAA8B;IAAA,YAA0B;IAAA,iBAAO;;;IAAjC,cAA0B;IAA1B,6CAA0B;;;;IArBhE,+BAQC;IADC,AADA,AADA,AADA,wTAAa,kDAA4B,KAAC,2MAC/B,kBAAW,KAAC,kPACV,yCAAsB,KAAC,uNACxB,yBAAe,wBAAE,wBAAwB,KAAC;IAGpD,AADF,+BAA8B,cACH;IACvB,wBAA4D;IAC9D,iBAAM;IAEN,+BAAgE;IAC9D,wBAAwE;IAC1E,iBAAM;IAGJ,AADF,+BAAsB,eACG;IAAA,YAAmB;IAAA,iBAAO;IACjD,oIAA4B;IAG9B,iBAAM;IAGJ,AADF,gCAAyB,kBAOtB;IAHC,kOAAS,sBAAY,wBAAE,wBAAwB,KAAC;IAIhD,yBAAyD;IAC3D,iBAAS;IACT,mCAMC;IAHC,kOAAS,wBAAc,wBAAE,wBAAwB,KAAC;IAIlD,yBAA2D;IAC7D,iBAAS;IACT,mCAMC;IAHC,kOAAS,yBAAe,wBAAE,wBAAwB,KAAC;IAInD,yBAAoD;IAI5D,AADE,AADE,AADE,iBAAS,EACL,EACF,EACF;;;;;IArDJ,0DAAuC;IAYf,eAAyC;IAAzC,qDAAyC;IAC1D,cAA6C;IAA7C,qDAA6C;IAIzB,eAAmB;IAAnB,sCAAmB;IAC1C,cAEC;IAFD,kDAEC;IAMC,eAAoB;IAApB,8CAAoB;;IASpB,eAAwC;IAAxC,yEAAwC;;IAYxC,eAA6C;;;;;IAvDzD,+BAIC;IADC,AADA,0NAAY,yBAAkB,KAAC,qMACvB,qBAAc,KAAC;IAEvB,gIAyDC;IACH,iBAAM;;;IA1DJ,cAyDC;IAzDD,gCAyDC;;;IAmBD,0BAAyC;;;IA0BzC,0BAAyC;;;;IA3B3C,mIAAqE;IAOnE,AAJF,+BAGC,cAKE;IAFC,oQAAc,gDAA2B,KAAC;IAG1C,wBAA4D;IAC9D,iBAAM;IACN,+BAAgE;IAC9D,wBAAwE;IAC1E,iBAAM;IACN,gCAA8B;IAAA,YAAmB;IAAA,iBAAO;IACxD,kCAIC;IAFC,mPAAS,0BAAe,KAAC;IAGzB,wBAAwD;IAE5D,AADE,iBAAS,EACL;IACN,qIAAqE;;;;;IA1BrE,yIAEC;IAGC,cAA6D;IAA7D,kGAA6D;IASvC,eAAyC;IAAzC,sDAAyC;IAC1D,cAA6C;IAA7C,sDAA6C;IAEpB,eAAmB;IAAnB,uCAAmB;IAI/C,cAAuC;IAAvC,gCAAA,+CAAuC,CAAA;IAK3C,eAEC;IAFD,0IAEC;;;IAGD,0BAAyC;;;IAjC3C,+BAAkC;IAAA,yBAAS;IAAA,iBAAM;IACjD,iIA8BC;IACD,6HAAsG;;;IA/BtG,eA8BC;IA9BD,gCA8BC;IACD,eAEC;IAFD,4JAEC;;;;IAOG,AADF,+BAAqC,cAC6B;IAC9D,wBAAwE;IAC1E,iBAAM;IACN,gCAA8B;IAAA,YAAmB;IAAA,iBAAO;IACxD,kCAIC;IAFC,mPAAS,0BAAe,KAAC;IAGzB,wBAAyD;IAE7D,AADE,iBAAS,EACL;;;IAXkB,cAAyC;IAAzC,sDAAyC;IAC1D,cAA6C;IAA7C,sDAA6C;IAEpB,eAAmB;IAAnB,uCAAmB;IAI/C,cAAoC;IAApC,gCAAA,4CAAoC,CAAA;;;IAV1C,+BAAkC;IAAA,yBAAS;IAAA,iBAAM;IACjD,8HAcC;;;IAdD,eAcC;IAdD,mCAcC;;;;IAnNP,AADF,8BAA4B,YACI;IAC5B,4MAEF;IAAA,iBAAI;IAMA,AADF,AAFF,+BAA2C,cAE2C,cACK;IAA7D,mQAA4D;IACpF,wBAA0D;IAC1D,0BAAI;IAAA,sCAAsB;IAAA,iBAAK;IAC/B,gCAAoB;IAAA,aAA0B;IAAA,iBAAO;IACrD,yBAKK;IACP,iBAAM;IAEN,gCAA2B;IACzB,2HAAkC;IAOlC,kHAuBC;IAEL,AADE,iBAAM,EACF;IAIJ,AADF,gCAAkF,eACK;IAA3D,kQAA0D;IAClF,yBAA2D;IAC3D,2BAAI;IAAA,kCAAiB;IAAA,iBAAK;IAC1B,iCAAoB;IAAA,aAAuB;IAAA,iBAAO;IAClD,yBAKK;IACP,iBAAM;IAEN,gCAA2B;IACzB,2HAA+B;IAQ/B,gHAA6B;IAoEnC,AADE,AADE,iBAAM,EACF,EACF;IAGN,gCAKC;IADC,AADA,AADA,6MAAa,8BAAuB,KAAC,wLACzB,uBAAgB,KAAC,8LACd,uBAAgB,KAAC;IAEhC,gCAAyB;IACvB,qGAA6B;IAsC7B,qGAAgC;IAoBtC,AADE,AADE,iBAAM,EACF,EACF;;;IA/MsC,eAA2C;IAA3C,2DAA2C;IAI3D,eAA0B;IAA1B,iDAA0B;IAG5C,cAAiD;IACjD,AADA,iEAAiD,kDACD;IAMlD,eAKC;IALD,6DAKC;IAED,cAuBC;IAvBD,mCAuBC;IAKkC,eAA0C;IAA1C,0DAA0C;IAIzD,eAAuB;IAAvB,8CAAuB;IAGzC,cAAgD;IAChD,AADA,gEAAgD,iDACD;IAMjD,eAMC;IAND,0DAMC;IAED,cAiEC;IAjED,wDAiEC;IAaH,eAoCC;IApCD,wDAoCC;IAED,cAiBC;IAjBD,2DAiBC;;;;IAUH,iCAIC;IAFC,kMAAS,cAAO,KAAC;IAGjB,wBAA0D;IAC1D,+BACF;IAAA,iBAAS;;;IAJP,8DAAkC;;;IAclC,iCAAyD;IACzD,4BAAM;IAAA,yBAAS;IAAA,iBAAO;;IADV,gCAAkB;;;IAG9B,wBAAoD;IACpD,4BAAM;IAAA,4BAAY;IAAA,iBAAO;;AD9OnC;;;;;;;;;;;GAWG;AAOH,MAAM,OAAO,6BAA8B,SAAQ,oBAAoB;IAC7D,UAAU,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACxC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IACtC,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAChC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACxB,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAEhC,iDAAiD;IACvC,KAAK,GAAG,IAAI,YAAY,EAAQ,CAAC;IAC3C,oEAAoE;IAC1D,SAAS,GAAG,IAAI,YAAY,EAAQ,CAAC;IAE/C,qFAAqF;IACrF,OAAO,GAAoB,EAAE,CAAC;IAC9B,oEAAoE;IACpE,UAAU,GAAoB,EAAE,CAAC;IACjC,yCAAyC;IACzC,aAAa,GAAoB,EAAE,CAAC;IAEpC,6DAA6D;IAC7D,SAAS,GAAG,KAAK,CAAC;IAClB,2EAA2E;IAC3E,QAAQ,GAAG,KAAK,CAAC;IACjB,gEAAgE;IAChE,YAAY,GAAG,EAAE,CAAC;IAElB,qEAAqE;IACrE,uBAAuB,GAAG,KAAK,CAAC;IAChC,oEAAoE;IACpE,sBAAsB,GAAG,KAAK,CAAC;IAE/B,+DAA+D;IAC/D,WAAW,GAAyB,IAAI,CAAC;IACzC,2DAA2D;IAC3D,YAAY,GAAG,CAAC,CAAC,CAAC;IAClB,qEAAqE;IACrE,eAAe,GAAG,CAAC,CAAC,CAAC;IAErB,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,IAAmB;QACxB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,IAAmB;QAC3B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACpB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,IAAmB;QAC3B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,IAAmB;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,IAAmB;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,SAAiB,EAAE,OAAe;QACtD,IAAI,CAAC,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC3E,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,wDAAwD;IACxD,MAAM;QACJ,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAEvB,IAAI,CAAC;YACH,8EAA8E;YAC9E,gFAAgF;YAChF,iFAAiF;YACjF,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAE5B,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;YAE9B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAChC,IAAI,CAAC,IAAI,CAAC,OAAO;oBAAE,SAAS;gBAE5B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACnB,MAAM,IAAI,CAAC,qBAAqB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;gBAC7C,CAAC;qBAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACzB,MAAM,IAAI,CAAC,qBAAqB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;YAED,kFAAkF;YAClF,sFAAsF;YACtF,+EAA+E;YAC/E,8EAA8E;YAC9E,uEAAuE;YACvE,WAAW,CAAC;gBACV,OAAO,EAAE,8BAA8B;gBACvC,WAAW,EAAE,IAAI;aAClB,CAAC,CAAC;YAEH,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,uCAAuC,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YACtG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAClB,6FAA6F;YAC7F,6FAA6F;YAC7F,sFAAsF;YACtF,4FAA4F;YAC5F,wCAAwC;YACxC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,sBAAsB,EAAE,CAAC,CAAC;QAEzE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,YAAY,GAAG,iDAAiD,CAAC;YACtE,QAAQ,CAAC,iCAAiC,EAAE,SAAS,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/G,2FAA2F;YAC3F,uFAAuF;YACvF,qFAAqF;YACrF,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,sBAAsB,EAAE,CAAC,CAAC;QACzE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;gBACnB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAC3B,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACjC,CAAC;IAED,8EAA8E;IAC9E,yCAAyC;IACzC,8EAA8E;IAE9E,+CAA+C;IAC/C,WAAW,CAAC,KAAgB,EAAE,IAAmB,EAAE,KAAa;QAC9D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAE1B,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACvB,KAAK,CAAC,YAAY,CAAC,aAAa,GAAG,MAAM,CAAC;YAC1C,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,UAAU,CAAC,KAAgB;QACzB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACvB,KAAK,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM,CAAC;QACzC,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,WAAW,CAAC,KAAgB,EAAE,KAAa;QACzC,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,0DAA0D;IAC1D,SAAS;QACP,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QACvB,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,wEAAwE;IACxE,MAAM,CAAC,KAAgB;QACrB,KAAK,CAAC,cAAc,EAAE,CAAC;QAEvB,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;YACtG,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;YACjE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;YAC3D,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,8EAA8E;IAC9E,yCAAyC;IACzC,8EAA8E;IAE9E,8DAA8D;IAC9D,cAAc,GAAG,CAAC,CAAC,CAAC;IACpB,6CAA6C;IAC7C,cAAc,GAAG,CAAC,CAAC,CAAC;IACpB,6CAA6C;IAC7C,eAAe,GAAG,KAAK,CAAC;IAEhB,WAAW,GAAG,CAAC,CAAC;IAChB,aAAa,GAAG,CAAC,CAAC;IAClB,cAAc,GAAG,CAAC,CAAC;IACnB,gBAAgB,GAAuB,IAAI,CAAC;IAC5C,oBAAoB,GAAuB,IAAI,CAAC;IAExD,iEAAiE;IACjE,gBAAgB,CAAC,KAAiB,EAAE,KAAa;QAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,GAAG,GAAI,KAAK,CAAC,MAAsB,CAAC,OAAO,CAAC,iBAAiB,CAAuB,CAAC;QAC3F,IAAI,CAAC,GAAG;YAAE,OAAO;QAEjB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC;QACjC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC;QACnC,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;QAEhF,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACtC,CAAC;IAED,sFAAsF;IACtF,eAAe,CAAC,KAAiB;QAC/B,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE,OAAO;QAE5D,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC;QAErD,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,GAAG,cAAc,MAAM,KAAK,CAAC;QAClE,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;QAE3C,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED,qEAAqE;IACrE,cAAc;QACZ,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO;QAElC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;YAC3C,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;YACxC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;YACxG,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YACnE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;YAC1D,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAEO,qBAAqB,CAAC,MAAc;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC;QACrG,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;IACjC,CAAC;IAEO,kBAAkB;QACxB,IAAI,CAAC,IAAI,CAAC,oBAAoB;YAAE,OAAO;QAEvC,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,qBAAqB,EAAE,CAAC;QAC/D,MAAM,QAAQ,GAAG,EAAE,CAAC;QAEpB,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,GAAG,QAAQ,EAAE,CAAC;YAC7C,IAAI,CAAC,oBAAoB,CAAC,SAAS,IAAI,CAAC,CAAC;QAC3C,CAAC;aAAM,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YACvD,IAAI,CAAC,oBAAoB,CAAC,SAAS,IAAI,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAEO,mBAAmB;QACzB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;IACnC,CAAC;IAED,8EAA8E;IAC9E,mBAAmB;IACnB,8EAA8E;IAEtE,KAAK,CAAC,iBAAiB;QAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAEvB,IAAI,CAAC;YACH,uEAAuE;YACvE,wEAAwE;YACxE,oEAAoE;YACpE,wEAAwE;YACxE,0CAA0C;YAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;YACpC,MAAM,MAAM,GAAG,QAAQ;gBACrB,CAAC,CAAC,cAAc,CAAC,mBAAmB,CAAiB,QAAQ,EAAE,cAAc,CAAmB;gBAChG,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC;YAC5B,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,uBAAuB,EAAE,CAAC;YAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC;YACzC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC9D,IAAI,CAAC,eAAe,EAAE,CAAC;QAEzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,YAAY,GAAG,qDAAqD,CAAC;YAC1E,QAAQ,CAAC,kCAAkC,EAAE,SAAS,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;gBACnB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAC3B,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,UAA6B,EAAE,QAAmC;QAC5F,OAAO,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YAC1B,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1E,OAAO;gBACL,GAAG;gBACH,SAAS,EAAE,OAAO,EAAE,EAAE,IAAI,IAAI;gBAC9B,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,GAAG;gBAClC,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,KAAK;gBACpC,OAAO,EAAE,KAAK;aACf,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO;aAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;aAC7B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAE3C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO;aAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;aAC9B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEO,oBAAoB;QAC1B,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;IAGO,KAAK,CAAC,qBAAqB,CAAC,EAAqB,EAAE,IAAmB;QAC5E,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,eAAe,CAA0B,uBAAuB,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;QAC3G,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC;QAEpC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QACjC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAEjC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,YAAY,EAAE,eAAe,IAAI,eAAe,EAAE,CAAC,CAAC;QACxI,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,SAAS,CAAC,+BAA+B,IAAI,CAAC,GAAG,CAAC,IAAI,cAAc,IAAI,CAAC,QAAQ,cAAc,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClH,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,EAAqB,EAAE,IAAmB;QAC5E,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,eAAe,CAA0B,uBAAuB,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;QAC3G,OAAO,CAAC,SAAS,EAAE,CAAC;QAEpB,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QACjC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAEjC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,YAAY,EAAE,eAAe,IAAI,eAAe,EAAE,CAAC,CAAC;QACxI,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,SAAS,CAAC,+BAA+B,IAAI,CAAC,GAAG,CAAC,IAAI,cAAc,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvF,CAAC;iSA9aU,6BAA6B,yBAA7B,6BAA6B;6DAA7B,6BAA6B;YCvC1C,8BAAkC;YAEhC,+FAAiB;YAOjB,oGAAoB;YAKpB,iGAAkB;YA8NhB,AADF,8BAA2B,aACA;YACvB,kGAAoB;YAUtB,iBAAM;YAEJ,AADF,8BAA0B,gBAKvB;YAFC,0GAAS,UAAM,IAAC;YAMd,AAHF,qFAAgB,iEAGP;YAIX,iBAAS;YACT,kCAIC;YAFC,2GAAS,YAAQ,IAAC;YAGlB,yBACF;YAGN,AADE,AADE,AADE,iBAAS,EACL,EACF,EACF;;YA7QJ,cAIC;YAJD,wCAIC;YAGD,cAEC;YAFD,2CAEC;YAGD,cA0NC;YA1ND,yCA0NC;YAKG,eASC;YATD,2CASC;YAMC,eAAmD;YAAnD,6EAAmD;YAEnD,cAMC;YAND,uCAMC;YAKD,eAAqB;YAArB,uCAAqB;;;iFDlOhB,6BAA6B;cANzC,SAAS;6BACI,KAAK,YACP,4BAA4B;;kBAYrC,MAAM;;kBAEN,MAAM;;kFAVI,6BAA6B","sourcesContent":["import { Component, Output, EventEmitter, OnInit, ChangeDetectorRef, NgZone, ElementRef, inject } from '@angular/core';\nimport { LogError, LogStatus, IMetadataProvider, LogStatusEx } from '@memberjunction/core';\nimport { MJUserApplicationEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { ApplicationManager, BaseApplication } from '@memberjunction/ng-base-application';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { UUIDsEqual } from '@memberjunction/global';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MoveAndResequence, ResequenceItems } from './user-app-config-reorder';\n\n/**\n * Represents an app item in the configuration UI\n */\ninterface AppConfigItem {\n app: BaseApplication;\n userAppId: string | null;\n sequence: number;\n isActive: boolean;\n isDirty: boolean;\n}\n\n/**\n * Chrome-free app-configuration content: select which applications appear in\n * the app switcher and arrange their order. Owns all list/reorder/persistence\n * logic (including its own Reset / Save / Cancel footer) but NO overlay —\n * hosts embed it wherever it should live:\n * - `UserAppConfigComponent` wraps it in the full-screen modal (Home dashboard)\n * - the shell's app launcher embeds it as an in-panel view swap\n *\n * Loads on init (hosts create it fresh under an `@if`), saves in a batch on\n * the Save button, and signals the host via `Saved` / `Cancelled` — the host\n * decides what \"done\" means (close the dialog, swap the view back, etc.).\n */\n@Component({\n standalone: false,\n selector: 'mj-user-app-config-content',\n templateUrl: './user-app-config-content.component.html',\n styleUrls: ['./user-app-config-content.component.css']\n})\nexport class UserAppConfigContentComponent extends BaseAngularComponent implements OnInit {\n private appManager = inject(ApplicationManager);\n private sharedService = inject(SharedService);\n private cdr = inject(ChangeDetectorRef);\n private ngZone = inject(NgZone);\n private el = inject(ElementRef);\n\n /** Emitted once after a successful batch save */\n @Output() Saved = new EventEmitter<void>();\n /** Emitted when the user cancels (or saves with nothing to save) */\n @Output() Cancelled = new EventEmitter<void>();\n\n /** Every system app the user is authorized for, joined with their per-user config */\n AllApps: AppConfigItem[] = [];\n /** Apps the user has enabled, in their configured Sequence order */\n ActiveApps: AppConfigItem[] = [];\n /** Apps not yet enabled, alphabetical */\n AvailableApps: AppConfigItem[] = [];\n\n /** True while the initial configuration load is in flight */\n IsLoading = false;\n /** True while the batch save is in flight (disables the footer buttons) */\n IsSaving = false;\n /** User-facing load/save failure message; empty when healthy */\n ErrorMessage = '';\n\n /** Collapse state for the Available-apps panel (mobile accordion) */\n AvailablePanelCollapsed = false;\n /** Collapse state for the Selected-apps panel (mobile accordion) */\n SelectedPanelCollapsed = false;\n\n /** Item currently being dragged for reorder, null when idle */\n DraggedItem: AppConfigItem | null = null;\n /** Source index of the in-flight drag within ActiveApps */\n DraggedIndex = -1;\n /** Index the drag is currently hovering (drop indicator position) */\n DropTargetIndex = -1;\n\n async ngOnInit(): Promise<void> {\n await this.loadConfiguration();\n }\n\n /**\n * Adds an app to the user's active list\n */\n AddApp(item: AppConfigItem): void {\n item.isActive = true;\n item.sequence = this.ActiveApps.length;\n item.isDirty = true;\n this.refreshAppLists();\n }\n\n /**\n * Removes an app from the user's active list\n */\n RemoveApp(item: AppConfigItem): void {\n item.isActive = false;\n item.sequence = 999;\n item.isDirty = true;\n this.refreshAppLists();\n\n this.resequenceActiveApps();\n }\n\n /**\n * Toggles an app between active and inactive\n */\n ToggleApp(item: AppConfigItem): void {\n if (item.isActive) {\n this.RemoveApp(item);\n } else {\n this.AddApp(item);\n }\n }\n\n /**\n * Moves an app up in the order. Positional (splice + renumber), NOT a sequence-value\n * swap: rows can carry duplicate Sequence values (issue #3027 — e.g. a re-enabled app\n * kept a stale value), and swapping two equal values is a silent no-op. Reordering by\n * position then renumbering 0..n-1 always works and heals duplicates as a side effect.\n */\n MoveUp(item: AppConfigItem): void {\n const index = this.ActiveApps.indexOf(item);\n if (index > 0) {\n this.moveActiveApp(index, index - 1);\n }\n }\n\n /**\n * Moves an app down in the order. Positional — see {@link MoveUp} for why.\n */\n MoveDown(item: AppConfigItem): void {\n const index = this.ActiveApps.indexOf(item);\n if (index >= 0 && index < this.ActiveApps.length - 1) {\n this.moveActiveApp(index, index + 1);\n }\n }\n\n private moveActiveApp(fromIndex: number, toIndex: number): void {\n this.ActiveApps = MoveAndResequence(this.ActiveApps, fromIndex, toIndex);\n }\n\n /**\n * Checks if there are any unsaved changes\n */\n HasChanges(): boolean {\n return this.AllApps.some(item => item.isDirty);\n }\n\n /** Cancel button — host decides what dismissal means */\n Cancel(): void {\n this.Cancelled.emit();\n }\n\n /**\n * Saves the user's app configuration\n */\n async Save(): Promise<void> {\n if (!this.HasChanges()) {\n this.Cancelled.emit();\n return;\n }\n\n this.IsSaving = true;\n this.ErrorMessage = '';\n\n try {\n // Self-heal: renumber active apps 0..n-1 before persisting. Existing rows can\n // carry duplicate Sequence values from older data (issue #3027); renumbering in\n // display order marks any corrected rows dirty so this save fixes them for good.\n this.resequenceActiveApps();\n\n const md = this.ProviderToUse;\n\n for (const item of this.AllApps) {\n if (!item.isDirty) continue;\n\n if (item.userAppId) {\n await this.updateUserApplication(md, item);\n } else if (item.isActive) {\n await this.createUserApplication(md, item);\n }\n }\n\n // Each userApp.Save() above fires a BaseEntity 'save' event, which UserInfoEngine\n // catches via HandleIndividualBaseEntityEvent → debounced refresh → NotifyDataChange.\n // ApplicationManager.subscribeToEngineChanges then propagates to the shell app\n // switcher. No explicit reload needed here — and avoiding it sidesteps NG0100\n // from observable emissions interleaving with this method's save loop.\n LogStatusEx({\n message: 'User app configuration saved',\n verboseOnly: true\n });\n\n this.sharedService.CreateSimpleNotification('App configuration saved successfully!', 'success', 3000);\n this.Saved.emit();\n // Backstop for a dropped/coalesced debounced engine event: force a reconcile from the source\n // of truth so the app switcher can't be left \"one save behind\". DEFERRED past the current CD\n // cycle — a synchronous reload here previously triggered NG0100 (commits e2059e6114 /\n // 7bf8be7dc6). No-op cost when the event chain already delivered. (Ported from bug F1's fix\n // to the pre-split monolith, PR #3289.)\n Promise.resolve().then(() => this.appManager.ReloadUserApplications());\n\n } catch (error) {\n this.ErrorMessage = 'Failed to save configuration. Please try again.';\n LogError('Error saving app configuration:', undefined, error instanceof Error ? error.message : String(error));\n // A partial-save failure can leave in-memory state half-committed (some items saved+clean,\n // others still dirty) and divergent from the DB. Reconcile from the source of truth so\n // recovery doesn't require a browser refresh — deferred, for the same NG0100 reason.\n Promise.resolve().then(() => this.appManager.ReloadUserApplications());\n } finally {\n this.ngZone.run(() => {\n this.IsSaving = false;\n this.cdr.detectChanges();\n });\n }\n }\n\n /**\n * Resets all changes and reloads the configuration\n */\n async Reset(): Promise<void> {\n await this.loadConfiguration();\n }\n\n // ---------------------------------------------------------------------------\n // Drag-and-drop handlers (desktop only)\n // ---------------------------------------------------------------------------\n\n /** Begin an HTML5 drag of an active-app row */\n OnDragStart(event: DragEvent, item: AppConfigItem, index: number): void {\n this.DraggedItem = item;\n this.DraggedIndex = index;\n\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', index.toString());\n }\n }\n\n /** Allow dropping while a row drag passes over the list */\n OnDragOver(event: DragEvent): void {\n event.preventDefault();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move';\n }\n }\n\n /** Track the row index the drag is hovering (drop indicator) */\n OnDragEnter(event: DragEvent, index: number): void {\n event.preventDefault();\n this.DropTargetIndex = index;\n }\n\n /** Clear all drag state (fires on drop or drag cancel) */\n OnDragEnd(): void {\n this.DraggedItem = null;\n this.DraggedIndex = -1;\n this.DropTargetIndex = -1;\n }\n\n /** Reorder ActiveApps to the hovered position and renumber sequences */\n OnDrop(event: DragEvent): void {\n event.preventDefault();\n\n if (this.DraggedIndex >= 0 && this.DropTargetIndex >= 0 && this.DraggedIndex !== this.DropTargetIndex) {\n const [movedItem] = this.ActiveApps.splice(this.DraggedIndex, 1);\n this.ActiveApps.splice(this.DropTargetIndex, 0, movedItem);\n this.resequenceActiveApps();\n this.cdr.detectChanges();\n }\n\n this.OnDragEnd();\n }\n\n // ---------------------------------------------------------------------------\n // Touch drag-and-drop handlers (mobile)\n // ---------------------------------------------------------------------------\n\n /** Source index of the in-flight touch drag (-1 when idle) */\n TouchDragIndex = -1;\n /** Row index the touch drag would drop at */\n TouchDropIndex = -1;\n /** True while a touch drag is in progress */\n TouchDragActive = false;\n\n private touchStartY = 0;\n private touchCurrentY = 0;\n private touchRowHeight = 0;\n private touchDragElement: HTMLElement | null = null;\n private touchScrollContainer: HTMLElement | null = null;\n\n /** Begin a touch drag of a mobile app row (long-press handle) */\n OnTouchDragStart(event: TouchEvent, index: number): void {\n const touch = event.touches[0];\n const row = (event.target as HTMLElement).closest('.mobile-app-row') as HTMLElement | null;\n if (!row) return;\n\n event.preventDefault();\n this.TouchDragIndex = index;\n this.TouchDropIndex = index;\n this.TouchDragActive = true;\n this.touchStartY = touch.clientY;\n this.touchCurrentY = touch.clientY;\n this.touchDragElement = row;\n this.touchRowHeight = row.offsetHeight;\n this.touchScrollContainer = this.el.nativeElement.querySelector('.mobile-list');\n\n row.classList.add('touch-dragging');\n }\n\n /** Follow the finger: translate the row, track drop target, auto-scroll near edges */\n OnTouchDragMove(event: TouchEvent): void {\n if (!this.TouchDragActive || !this.touchDragElement) return;\n\n event.preventDefault();\n const touch = event.touches[0];\n this.touchCurrentY = touch.clientY;\n const deltaY = this.touchCurrentY - this.touchStartY;\n\n this.touchDragElement.style.transform = `translateY(${deltaY}px)`;\n this.touchDragElement.style.zIndex = '100';\n\n this.updateTouchDropTarget(deltaY);\n this.autoScrollIfNeeded();\n }\n\n /** Commit the touch reorder (if moved) and reset touch-drag state */\n OnTouchDragEnd(): void {\n if (!this.TouchDragActive) return;\n\n if (this.touchDragElement) {\n this.touchDragElement.style.transform = '';\n this.touchDragElement.style.zIndex = '';\n this.touchDragElement.classList.remove('touch-dragging');\n }\n\n if (this.TouchDragIndex >= 0 && this.TouchDropIndex >= 0 && this.TouchDragIndex !== this.TouchDropIndex) {\n const [movedItem] = this.ActiveApps.splice(this.TouchDragIndex, 1);\n this.ActiveApps.splice(this.TouchDropIndex, 0, movedItem);\n this.resequenceActiveApps();\n }\n\n this.resetTouchDragState();\n this.cdr.detectChanges();\n }\n\n private updateTouchDropTarget(deltaY: number): void {\n const rowsToMove = Math.round(deltaY / this.touchRowHeight);\n const newIndex = Math.max(0, Math.min(this.ActiveApps.length - 1, this.TouchDragIndex + rowsToMove));\n this.TouchDropIndex = newIndex;\n }\n\n private autoScrollIfNeeded(): void {\n if (!this.touchScrollContainer) return;\n\n const rect = this.touchScrollContainer.getBoundingClientRect();\n const edgeZone = 40;\n\n if (this.touchCurrentY < rect.top + edgeZone) {\n this.touchScrollContainer.scrollTop -= 8;\n } else if (this.touchCurrentY > rect.bottom - edgeZone) {\n this.touchScrollContainer.scrollTop += 8;\n }\n }\n\n private resetTouchDragState(): void {\n this.TouchDragIndex = -1;\n this.TouchDropIndex = -1;\n this.TouchDragActive = false;\n this.touchDragElement = null;\n this.touchScrollContainer = null;\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private async loadConfiguration(): Promise<void> {\n this.IsLoading = true;\n this.ErrorMessage = '';\n\n try {\n // Read directly from UserInfoEngine's cache. The engine already loaded\n // and maintains MJ: User Applications via its event-driven refresh — no\n // need to re-query the DB on every open. EnsureLoaded is idempotent\n // and instant when the engine is already loaded (the typical case here,\n // since UserInfoEngine fires at startup).\n const provider = this.ProviderToUse;\n const engine = provider\n ? UserInfoEngine.GetProviderInstance<UserInfoEngine>(provider, UserInfoEngine) as UserInfoEngine\n : UserInfoEngine.Instance;\n await engine.EnsureLoaded();\n const systemApps = this.appManager.GetAuthorizedSystemApps();\n const userApps = engine.UserApplications;\n this.AllApps = this.buildAppConfigItems(systemApps, userApps);\n this.refreshAppLists();\n\n } catch (error) {\n this.ErrorMessage = 'Failed to load app configuration. Please try again.';\n LogError('Error loading app configuration:', undefined, error instanceof Error ? error.message : String(error));\n } finally {\n this.ngZone.run(() => {\n this.IsLoading = false;\n this.cdr.detectChanges();\n });\n }\n }\n\n private buildAppConfigItems(systemApps: BaseApplication[], userApps: MJUserApplicationEntity[]): AppConfigItem[] {\n return systemApps.map(app => {\n const userApp = userApps.find(ua => UUIDsEqual(ua.ApplicationID, app.ID));\n return {\n app,\n userAppId: userApp?.ID ?? null,\n sequence: userApp?.Sequence ?? 999,\n isActive: userApp?.IsActive ?? false,\n isDirty: false\n };\n });\n }\n\n private refreshAppLists(): void {\n this.ActiveApps = this.AllApps\n .filter(item => item.isActive)\n .sort((a, b) => a.sequence - b.sequence);\n\n this.AvailableApps = this.AllApps\n .filter(item => !item.isActive)\n .sort((a, b) => a.app.Name.localeCompare(b.app.Name));\n }\n\n private resequenceActiveApps(): void {\n ResequenceItems(this.ActiveApps);\n }\n\n\n private async updateUserApplication(md: IMetadataProvider, item: AppConfigItem): Promise<void> {\n const userApp = await md.GetEntityObject<MJUserApplicationEntity>('MJ: User Applications', md.CurrentUser);\n await userApp.Load(item.userAppId!);\n\n userApp.Sequence = item.sequence;\n userApp.IsActive = item.isActive;\n\n const saved = await userApp.Save();\n if (!saved) {\n throw new Error(`Failed to update UserApplication for ${item.app.Name}: ${userApp.LatestResult?.CompleteMessage ?? 'unknown error'}`);\n }\n\n item.isDirty = false;\n LogStatus(`Updated UserApplication for ${item.app.Name}: sequence=${item.sequence}, isActive=${item.isActive}`);\n }\n\n private async createUserApplication(md: IMetadataProvider, item: AppConfigItem): Promise<void> {\n const userApp = await md.GetEntityObject<MJUserApplicationEntity>('MJ: User Applications', md.CurrentUser);\n userApp.NewRecord();\n\n userApp.UserID = md.CurrentUser.ID;\n userApp.ApplicationID = item.app.ID;\n userApp.Sequence = item.sequence;\n userApp.IsActive = item.isActive;\n\n const saved = await userApp.Save();\n if (!saved) {\n throw new Error(`Failed to create UserApplication for ${item.app.Name}: ${userApp.LatestResult?.CompleteMessage ?? 'unknown error'}`);\n }\n\n item.userAppId = userApp.ID;\n item.isDirty = false;\n LogStatus(`Created UserApplication for ${item.app.Name}: sequence=${item.sequence}`);\n }\n}\n","<div class=\"app-config-container\">\n <!-- Loading State -->\n @if (IsLoading) {\n <div class=\"loading-container\" role=\"status\" aria-live=\"polite\">\n <mj-loading text=\"Loading your app configuration...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n <!-- Error Message -->\n @if (ErrorMessage) {\n <mj-alert Variant=\"error\">{{ ErrorMessage }}</mj-alert>\n }\n\n <!-- Main Content -->\n @if (!IsLoading) {\n <div class=\"config-content\">\n <p class=\"config-description\">\n Select which applications appear in your app switcher and arrange them in your preferred order.\n Double-click to quickly add or remove. Drag and drop to reorder, or use the arrow buttons.\n </p>\n\n <!-- Desktop: two-panel layout with drag-and-drop -->\n <div class=\"panels-container desktop-only\">\n <!-- Available Apps Panel -->\n <div class=\"panel available-apps-panel\" [class.collapsed]=\"AvailablePanelCollapsed\">\n <div class=\"panel-header\" (click)=\"AvailablePanelCollapsed = !AvailablePanelCollapsed\">\n <i class=\"fa-solid fa-layer-group\" aria-hidden=\"true\"></i>\n <h3>Available Applications</h3>\n <span class=\"badge\">{{ AvailableApps.length }}</span>\n <i\n class=\"collapse-toggle fa-solid\"\n [class.fa-chevron-down]=\"AvailablePanelCollapsed\"\n [class.fa-chevron-up]=\"!AvailablePanelCollapsed\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"panel-content\">\n @if (AvailableApps.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-check-double\"\n Title=\"All applications added!\" />\n }\n\n @for (item of AvailableApps; track item.app.ID) {\n <div class=\"available-app-item\" (dblclick)=\"AddApp(item)\">\n <div class=\"app-icon\" [style.--app-color]=\"item.app.GetColor()\">\n <i [class]=\"item.app.Icon || 'fa-solid fa-cube'\" aria-hidden=\"true\"></i>\n </div>\n\n <div class=\"app-info\">\n <span class=\"app-name\">{{ item.app.Name }}</span>\n @if (item.app.Description) {\n <span class=\"app-description\">{{ item.app.Description }}</span>\n }\n </div>\n\n <button\n mjButton variant=\"outline\" size=\"sm\"\n (click)=\"AddApp(item)\"\n title=\"Add to your apps\"\n [attr.aria-label]=\"'Add ' + item.app.Name\"\n >\n <i class=\"fa-solid fa-plus\" aria-hidden=\"true\"></i>\n Add\n </button>\n </div>\n }\n </div>\n </div>\n\n <!-- Selected Apps Panel -->\n <div class=\"panel selected-apps-panel\" [class.collapsed]=\"SelectedPanelCollapsed\">\n <div class=\"panel-header\" (click)=\"SelectedPanelCollapsed = !SelectedPanelCollapsed\">\n <i class=\"fa-solid fa-check-circle\" aria-hidden=\"true\"></i>\n <h3>Your Applications</h3>\n <span class=\"badge\">{{ ActiveApps.length }}</span>\n <i\n class=\"collapse-toggle fa-solid\"\n [class.fa-chevron-down]=\"SelectedPanelCollapsed\"\n [class.fa-chevron-up]=\"!SelectedPanelCollapsed\"\n aria-hidden=\"true\"\n ></i>\n </div>\n\n <div class=\"panel-content\">\n @if (ActiveApps.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-inbox\"\n Title=\"No applications selected\"\n Message=\"Add apps from the available list\" />\n }\n\n @if (ActiveApps.length > 0) {\n <div\n class=\"sortable-list\"\n (dragover)=\"OnDragOver($event)\"\n (drop)=\"OnDrop($event)\"\n >\n @for (item of ActiveApps; track item.app.ID; let i = $index) {\n <div\n class=\"app-item\"\n [class.dragging]=\"DraggedItem === item\"\n draggable=\"true\"\n (dragstart)=\"OnDragStart($event, item, i)\"\n (dragend)=\"OnDragEnd()\"\n (dragenter)=\"OnDragEnter($event, i)\"\n (dblclick)=\"RemoveApp(item); $event.stopPropagation()\"\n >\n <div class=\"app-item-content\">\n <div class=\"drag-handle\">\n <i class=\"fa-solid fa-grip-vertical\" aria-hidden=\"true\"></i>\n </div>\n\n <div class=\"app-icon\" [style.--app-color]=\"item.app.GetColor()\">\n <i [class]=\"item.app.Icon || 'fa-solid fa-cube'\" aria-hidden=\"true\"></i>\n </div>\n\n <div class=\"app-info\">\n <span class=\"app-name\">{{ item.app.Name }}</span>\n @if (item.app.Description) {\n <span class=\"app-description\">{{ item.app.Description }}</span>\n }\n </div>\n\n <div class=\"app-actions\">\n <button\n mjButton variant=\"flat\" size=\"sm\"\n [disabled]=\"i === 0\"\n (click)=\"MoveUp(item); $event.stopPropagation()\"\n title=\"Move up\"\n [attr.aria-label]=\"'Move ' + item.app.Name + ' up'\"\n >\n <i class=\"fa-solid fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <button\n mjButton variant=\"flat\" size=\"sm\"\n [disabled]=\"i === ActiveApps.length - 1\"\n (click)=\"MoveDown(item); $event.stopPropagation()\"\n title=\"Move down\"\n [attr.aria-label]=\"'Move ' + item.app.Name + ' down'\"\n >\n <i class=\"fa-solid fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n <button\n mjButton variant=\"flat\" size=\"sm\"\n class=\"remove-btn\"\n (click)=\"RemoveApp(item); $event.stopPropagation()\"\n title=\"Remove from your apps\"\n [attr.aria-label]=\"'Remove ' + item.app.Name\"\n >\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n\n <!-- Mobile: single list with toggles + touch drag reorder -->\n <div\n class=\"mobile-view\"\n (touchmove)=\"OnTouchDragMove($event)\"\n (touchend)=\"OnTouchDragEnd()\"\n (touchcancel)=\"OnTouchDragEnd()\"\n >\n <div class=\"mobile-list\">\n @if (ActiveApps.length > 0) {\n <div class=\"mobile-section-label\">Your Apps</div>\n @for (item of ActiveApps; track item.app.ID; let i = $index) {\n @if (TouchDragActive && TouchDropIndex === i && TouchDragIndex > i) {\n <div class=\"mobile-drop-indicator\"></div>\n }\n <div\n class=\"mobile-app-row\"\n [class.touch-ghost]=\"TouchDragActive && TouchDragIndex === i\"\n >\n <div\n class=\"mobile-drag-handle\"\n (touchstart)=\"OnTouchDragStart($event, i)\"\n aria-label=\"Drag to reorder\"\n >\n <i class=\"fa-solid fa-grip-vertical\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"app-icon\" [style.--app-color]=\"item.app.GetColor()\">\n <i [class]=\"item.app.Icon || 'fa-solid fa-cube'\" aria-hidden=\"true\"></i>\n </div>\n <span class=\"mobile-app-name\">{{ item.app.Name }}</span>\n <button\n class=\"mobile-toggle on\"\n (click)=\"ToggleApp(item)\"\n aria-label=\"Remove {{ item.app.Name }}\"\n >\n <i class=\"fa-solid fa-toggle-on\" aria-hidden=\"true\"></i>\n </button>\n </div>\n @if (TouchDragActive && TouchDropIndex === i && TouchDragIndex < i) {\n <div class=\"mobile-drop-indicator\"></div>\n }\n }\n @if (TouchDragActive && TouchDropIndex === ActiveApps.length - 1 && TouchDragIndex < TouchDropIndex) {\n <div class=\"mobile-drop-indicator\"></div>\n }\n }\n\n @if (AvailableApps.length > 0) {\n <div class=\"mobile-section-label\">Available</div>\n @for (item of AvailableApps; track item.app.ID) {\n <div class=\"mobile-app-row inactive\">\n <div class=\"app-icon\" [style.--app-color]=\"item.app.GetColor()\">\n <i [class]=\"item.app.Icon || 'fa-solid fa-cube'\" aria-hidden=\"true\"></i>\n </div>\n <span class=\"mobile-app-name\">{{ item.app.Name }}</span>\n <button\n class=\"mobile-toggle off\"\n (click)=\"ToggleApp(item)\"\n aria-label=\"Add {{ item.app.Name }}\"\n >\n <i class=\"fa-solid fa-toggle-off\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Footer Actions -->\n <div class=\"dialog-footer\">\n <div class=\"footer-left\">\n @if (HasChanges()) {\n <button\n mjButton\n (click)=\"Reset()\"\n [disabled]=\"IsLoading || IsSaving\"\n >\n <i class=\"fa-solid fa-rotate-left\" aria-hidden=\"true\"></i>\n Reset Changes\n </button>\n }\n </div>\n <div class=\"footer-right\">\n <button\n mjButton variant=\"primary\"\n (click)=\"Save()\"\n [disabled]=\"IsLoading || IsSaving || !HasChanges()\"\n >\n @if (IsSaving) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n <span>Saving...</span>\n } @else {\n <i class=\"fa-solid fa-check\" aria-hidden=\"true\"></i>\n <span>Save Changes</span>\n }\n </button>\n <button\n mjButton\n (click)=\"Cancel()\"\n [disabled]=\"IsSaving\"\n >\n Cancel\n </button>\n </div>\n </div>\n</div>\n"]}
@@ -19,11 +19,15 @@ export interface ReorderableAppItem {
19
19
  * 0..n-1 in the new display order. Out-of-range indexes return the input array
20
20
  * unchanged (and un-renumbered) so callers can bind arrow buttons without guards.
21
21
  */
22
+ export declare function MoveAndResequence<T extends ReorderableAppItem>(items: T[], fromIndex: number, toIndex: number): T[];
23
+ /** @deprecated Use {@link MoveAndResequence}. */
22
24
  export declare function moveAndResequence<T extends ReorderableAppItem>(items: T[], fromIndex: number, toIndex: number): T[];
23
25
  /**
24
26
  * Renumbers items to their display index (0..n-1), marking every corrected item
25
27
  * dirty so the next save persists the fix — this is what self-heals duplicate
26
28
  * Sequence values already in the database.
27
29
  */
30
+ export declare function ResequenceItems<T extends ReorderableAppItem>(items: T[]): void;
31
+ /** @deprecated Use {@link ResequenceItems}. */
28
32
  export declare function resequenceItems<T extends ReorderableAppItem>(items: T[]): void;
29
33
  //# sourceMappingURL=user-app-config-reorder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"user-app-config-reorder.d.ts","sourceRoot":"","sources":["../../../src/lib/user-app-config/user-app-config-reorder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,EAAE,CAanH;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,CAO9E"}
1
+ {"version":3,"file":"user-app-config-reorder.d.ts","sourceRoot":"","sources":["../../../src/lib/user-app-config/user-app-config-reorder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,EAAE,CAanH;AAED,iDAAiD;AACjD,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,EAAE,CAEnH;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,CAO9E;AAED,+CAA+C;AAC/C,wBAAgB,eAAe,CAAC,CAAC,SAAS,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,CAE9E"}
@@ -15,7 +15,7 @@
15
15
  * 0..n-1 in the new display order. Out-of-range indexes return the input array
16
16
  * unchanged (and un-renumbered) so callers can bind arrow buttons without guards.
17
17
  */
18
- export function moveAndResequence(items, fromIndex, toIndex) {
18
+ export function MoveAndResequence(items, fromIndex, toIndex) {
19
19
  if (fromIndex < 0 || fromIndex >= items.length ||
20
20
  toIndex < 0 || toIndex >= items.length ||
21
21
  fromIndex === toIndex) {
@@ -24,15 +24,19 @@ export function moveAndResequence(items, fromIndex, toIndex) {
24
24
  const reordered = [...items];
25
25
  const [moved] = reordered.splice(fromIndex, 1);
26
26
  reordered.splice(toIndex, 0, moved);
27
- resequenceItems(reordered);
27
+ ResequenceItems(reordered);
28
28
  return reordered;
29
29
  }
30
+ /** @deprecated Use {@link MoveAndResequence}. */
31
+ export function moveAndResequence(items, fromIndex, toIndex) {
32
+ return MoveAndResequence(items, fromIndex, toIndex);
33
+ }
30
34
  /**
31
35
  * Renumbers items to their display index (0..n-1), marking every corrected item
32
36
  * dirty so the next save persists the fix — this is what self-heals duplicate
33
37
  * Sequence values already in the database.
34
38
  */
35
- export function resequenceItems(items) {
39
+ export function ResequenceItems(items) {
36
40
  items.forEach((item, index) => {
37
41
  if (item.sequence !== index) {
38
42
  item.sequence = index;
@@ -40,4 +44,8 @@ export function resequenceItems(items) {
40
44
  }
41
45
  });
42
46
  }
47
+ /** @deprecated Use {@link ResequenceItems}. */
48
+ export function resequenceItems(items) {
49
+ return ResequenceItems(items);
50
+ }
43
51
  //# sourceMappingURL=user-app-config-reorder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"user-app-config-reorder.js","sourceRoot":"","sources":["../../../src/lib/user-app-config/user-app-config-reorder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAA+B,KAAU,EAAE,SAAiB,EAAE,OAAe;IAC5G,IACE,SAAS,GAAG,CAAC,IAAI,SAAS,IAAI,KAAK,CAAC,MAAM;QAC1C,OAAO,GAAG,CAAC,IAAI,OAAO,IAAI,KAAK,CAAC,MAAM;QACtC,SAAS,KAAK,OAAO,EACrB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAC7B,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC/C,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IACpC,eAAe,CAAC,SAAS,CAAC,CAAC;IAC3B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAA+B,KAAU;IACtE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["/**\n * Pure reorder/resequence helpers for the user app-config dialog.\n *\n * Reordering is POSITIONAL (splice + renumber 0..n-1), never a sequence-value swap:\n * persisted rows can carry duplicate Sequence values (issue #3027 — e.g. a re-enabled\n * app kept a stale value like the dialog's 999 park value), and swapping two equal\n * values marks rows dirty without changing the sort order — the user clicks the\n * arrows, saves, and nothing happens. Positional moves always work, and the renumber\n * heals any duplicates as a side effect.\n *\n * Kept pure (no Angular imports) so vitest covers them without a TestBed.\n */\n\nexport interface ReorderableAppItem {\n sequence: number;\n isDirty: boolean;\n}\n\n/**\n * Returns a new array with the item at `fromIndex` moved to `toIndex`, renumbered\n * 0..n-1 in the new display order. Out-of-range indexes return the input array\n * unchanged (and un-renumbered) so callers can bind arrow buttons without guards.\n */\nexport function moveAndResequence<T extends ReorderableAppItem>(items: T[], fromIndex: number, toIndex: number): T[] {\n if (\n fromIndex < 0 || fromIndex >= items.length ||\n toIndex < 0 || toIndex >= items.length ||\n fromIndex === toIndex\n ) {\n return items;\n }\n const reordered = [...items];\n const [moved] = reordered.splice(fromIndex, 1);\n reordered.splice(toIndex, 0, moved);\n resequenceItems(reordered);\n return reordered;\n}\n\n/**\n * Renumbers items to their display index (0..n-1), marking every corrected item\n * dirty so the next save persists the fix — this is what self-heals duplicate\n * Sequence values already in the database.\n */\nexport function resequenceItems<T extends ReorderableAppItem>(items: T[]): void {\n items.forEach((item, index) => {\n if (item.sequence !== index) {\n item.sequence = index;\n item.isDirty = true;\n }\n });\n}\n"]}
1
+ {"version":3,"file":"user-app-config-reorder.js","sourceRoot":"","sources":["../../../src/lib/user-app-config/user-app-config-reorder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAA+B,KAAU,EAAE,SAAiB,EAAE,OAAe;IAC5G,IACE,SAAS,GAAG,CAAC,IAAI,SAAS,IAAI,KAAK,CAAC,MAAM;QAC1C,OAAO,GAAG,CAAC,IAAI,OAAO,IAAI,KAAK,CAAC,MAAM;QACtC,SAAS,KAAK,OAAO,EACrB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAC7B,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC/C,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IACpC,eAAe,CAAC,SAAS,CAAC,CAAC;IAC3B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,iBAAiB,CAA+B,KAAU,EAAE,SAAiB,EAAE,OAAe;IAC5G,OAAO,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AACtD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAA+B,KAAU;IACtE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,eAAe,CAA+B,KAAU;IACtE,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC","sourcesContent":["/**\n * Pure reorder/resequence helpers for the user app-config dialog.\n *\n * Reordering is POSITIONAL (splice + renumber 0..n-1), never a sequence-value swap:\n * persisted rows can carry duplicate Sequence values (issue #3027 — e.g. a re-enabled\n * app kept a stale value like the dialog's 999 park value), and swapping two equal\n * values marks rows dirty without changing the sort order — the user clicks the\n * arrows, saves, and nothing happens. Positional moves always work, and the renumber\n * heals any duplicates as a side effect.\n *\n * Kept pure (no Angular imports) so vitest covers them without a TestBed.\n */\n\nexport interface ReorderableAppItem {\n sequence: number; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n isDirty: boolean; // case-violation-ok-legacy-back-compat: renaming it broke a use the checker could not see from the declaration — the compile proved it\n}\n\n/**\n * Returns a new array with the item at `fromIndex` moved to `toIndex`, renumbered\n * 0..n-1 in the new display order. Out-of-range indexes return the input array\n * unchanged (and un-renumbered) so callers can bind arrow buttons without guards.\n */\nexport function MoveAndResequence<T extends ReorderableAppItem>(items: T[], fromIndex: number, toIndex: number): T[] {\n if (\n fromIndex < 0 || fromIndex >= items.length ||\n toIndex < 0 || toIndex >= items.length ||\n fromIndex === toIndex\n ) {\n return items;\n }\n const reordered = [...items];\n const [moved] = reordered.splice(fromIndex, 1);\n reordered.splice(toIndex, 0, moved);\n ResequenceItems(reordered);\n return reordered;\n}\n\n/** @deprecated Use {@link MoveAndResequence}. */\nexport function moveAndResequence<T extends ReorderableAppItem>(items: T[], fromIndex: number, toIndex: number): T[] {\n return MoveAndResequence(items, fromIndex, toIndex);\n}\n\n/**\n * Renumbers items to their display index (0..n-1), marking every corrected item\n * dirty so the next save persists the fix — this is what self-heals duplicate\n * Sequence values already in the database.\n */\nexport function ResequenceItems<T extends ReorderableAppItem>(items: T[]): void {\n items.forEach((item, index) => {\n if (item.sequence !== index) {\n item.sequence = index;\n item.isDirty = true;\n }\n });\n}\n\n/** @deprecated Use {@link ResequenceItems}. */\nexport function resequenceItems<T extends ReorderableAppItem>(items: T[]): void {\n return ResequenceItems(items);\n}\n"]}
@@ -5,8 +5,8 @@ import { BaseEntity } from '@memberjunction/core';
5
5
  * knows what the row means on its screen.
6
6
  */
7
7
  export interface EnrolledRow {
8
- label: string;
9
- entity: BaseEntity;
8
+ Label: string;
9
+ Entity: BaseEntity;
10
10
  }
11
11
  /**
12
12
  * The placeholder messages `GraphQLDataProvider` stamps onto EVERY item of a failed transaction
@@ -39,5 +39,7 @@ export declare const PROVIDER_PLACEHOLDER_MESSAGES: ReadonlySet<string>;
39
39
  * function: a transport error or a rollback the server could not attribute to one item leaves
40
40
  * nothing worth showing, and the caller should keep its generic message rather than invent detail.
41
41
  */
42
+ export declare function ServerRefusalReasons(rows: EnrolledRow[]): string[];
43
+ /** @deprecated Use {@link ServerRefusalReasons}. */
42
44
  export declare function serverRefusalReasons(rows: EnrolledRow[]): string[];
43
45
  //# sourceMappingURL=transaction-group-refusals.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transaction-group-refusals.d.ts","sourceRoot":"","sources":["../../../src/lib/user-management/transaction-group-refusals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD;;;;GAIG;AACH,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,6BAA6B,EAAE,WAAW,CAAC,MAAM,CAG5D,CAAC;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,CASlE"}
1
+ {"version":3,"file":"transaction-group-refusals.d.ts","sourceRoot":"","sources":["../../../src/lib/user-management/transaction-group-refusals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD;;;;GAIG;AACH,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,6BAA6B,EAAE,WAAW,CAAC,MAAM,CAG5D,CAAC;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,CASlE;AAED,oDAAoD;AACpD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,CAElE"}
@@ -32,14 +32,18 @@ export const PROVIDER_PLACEHOLDER_MESSAGES = new Set([
32
32
  * function: a transport error or a rollback the server could not attribute to one item leaves
33
33
  * nothing worth showing, and the caller should keep its generic message rather than invent detail.
34
34
  */
35
- export function serverRefusalReasons(rows) {
35
+ export function ServerRefusalReasons(rows) {
36
36
  const lines = [];
37
37
  for (const row of rows) {
38
- const reason = row.entity.LatestResult?.CompleteMessage?.trim();
38
+ const reason = row.Entity.LatestResult?.CompleteMessage?.trim();
39
39
  if (reason && !PROVIDER_PLACEHOLDER_MESSAGES.has(reason)) {
40
- lines.push(`${row.label}: ${reason}`);
40
+ lines.push(`${row.Label}: ${reason}`);
41
41
  }
42
42
  }
43
43
  return lines;
44
44
  }
45
+ /** @deprecated Use {@link ServerRefusalReasons}. */
46
+ export function serverRefusalReasons(rows) {
47
+ return ServerRefusalReasons(rows);
48
+ }
45
49
  //# sourceMappingURL=transaction-group-refusals.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transaction-group-refusals.js","sourceRoot":"","sources":["../../../src/lib/user-management/transaction-group-refusals.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAwB,IAAI,GAAG,CAAC;IACtE,oBAAoB;IACpB,8BAA8B;CACjC,CAAC,CAAC;AAEH;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAmB;IACpD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;QAChE,IAAI,MAAM,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC,CAAC;QAC1C,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC","sourcesContent":["import { BaseEntity } from '@memberjunction/core';\n\n/**\n * One row enrolled in a transaction group, paired with the label a user-facing message should use\n * for it — a user's email, \"Add Integration\". The caller owns the label because only the caller\n * knows what the row means on its screen.\n */\nexport interface EnrolledRow {\n label: string;\n entity: BaseEntity;\n}\n\n/**\n * The placeholder messages `GraphQLDataProvider` stamps onto EVERY item of a failed transaction\n * group, refused or not.\n *\n * It registers a `BaseEntityResult` on each entity *before* enrolling the row, and when the group\n * fails its transaction callback writes one of these onto that result — `'Transaction failed'` for\n * a Save, `'Transaction failed to commit'` for a Delete. So a row carrying one of these is a row\n * the server did **not** single out: it was accepted and then abandoned when a sibling was\n * refused. Only a row whose message says something else has a reason worth showing an operator.\n *\n * This is a deliberate coupling to two constants in a sibling package, and it is documented rather\n * than removed because there is no other signal that separates them. Both outcomes end up as\n * `Success: false` on `LatestResult`; `recordServerFailure` appends the server's reason only when\n * the server sent one, and appends nothing otherwise, which leaves the provider's placeholder as\n * the latest result. Keeping the knowledge in one place, pinned by a test, is the containment:\n * if the provider's wording changes, one test fails and one constant moves.\n */\nexport const PROVIDER_PLACEHOLDER_MESSAGES: ReadonlySet<string> = new Set([\n 'Transaction failed',\n 'Transaction failed to commit',\n]);\n\n/**\n * The reasons the SERVER gave for the rows it refused, one line per row that carries one.\n *\n * Issue #4309 fixed the server half of this: `ExecuteTransactionGroup` now reports which rows it\n * refused, and `GraphQLTransactionGroup.recordServerFailure` copies each reason onto that item's\n * `BaseEntity.LatestResult`. This is the last hop — without it the reason reaches the entity and\n * stops there, and every caller falls back to its own generic \"rolled back\" sentence, which is\n * what #4309's \"Verify by\" rules out.\n *\n * Returns empty when the server named no row. That is a real outcome, not a failure of this\n * function: a transport error or a rollback the server could not attribute to one item leaves\n * nothing worth showing, and the caller should keep its generic message rather than invent detail.\n */\nexport function serverRefusalReasons(rows: EnrolledRow[]): string[] {\n const lines: string[] = [];\n for (const row of rows) {\n const reason = row.entity.LatestResult?.CompleteMessage?.trim();\n if (reason && !PROVIDER_PLACEHOLDER_MESSAGES.has(reason)) {\n lines.push(`${row.label}: ${reason}`);\n }\n }\n return lines;\n}\n"]}
1
+ {"version":3,"file":"transaction-group-refusals.js","sourceRoot":"","sources":["../../../src/lib/user-management/transaction-group-refusals.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAwB,IAAI,GAAG,CAAC;IACtE,oBAAoB;IACpB,8BAA8B;CACjC,CAAC,CAAC;AAEH;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAmB;IACpD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;QAChE,IAAI,MAAM,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC,CAAC;QAC1C,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,oBAAoB,CAAC,IAAmB;IACpD,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC","sourcesContent":["import { BaseEntity } from '@memberjunction/core';\n\n/**\n * One row enrolled in a transaction group, paired with the label a user-facing message should use\n * for it — a user's email, \"Add Integration\". The caller owns the label because only the caller\n * knows what the row means on its screen.\n */\nexport interface EnrolledRow {\n Label: string;\n Entity: BaseEntity;\n}\n\n/**\n * The placeholder messages `GraphQLDataProvider` stamps onto EVERY item of a failed transaction\n * group, refused or not.\n *\n * It registers a `BaseEntityResult` on each entity *before* enrolling the row, and when the group\n * fails its transaction callback writes one of these onto that result — `'Transaction failed'` for\n * a Save, `'Transaction failed to commit'` for a Delete. So a row carrying one of these is a row\n * the server did **not** single out: it was accepted and then abandoned when a sibling was\n * refused. Only a row whose message says something else has a reason worth showing an operator.\n *\n * This is a deliberate coupling to two constants in a sibling package, and it is documented rather\n * than removed because there is no other signal that separates them. Both outcomes end up as\n * `Success: false` on `LatestResult`; `recordServerFailure` appends the server's reason only when\n * the server sent one, and appends nothing otherwise, which leaves the provider's placeholder as\n * the latest result. Keeping the knowledge in one place, pinned by a test, is the containment:\n * if the provider's wording changes, one test fails and one constant moves.\n */\nexport const PROVIDER_PLACEHOLDER_MESSAGES: ReadonlySet<string> = new Set([\n 'Transaction failed',\n 'Transaction failed to commit',\n]);\n\n/**\n * The reasons the SERVER gave for the rows it refused, one line per row that carries one.\n *\n * Issue #4309 fixed the server half of this: `ExecuteTransactionGroup` now reports which rows it\n * refused, and `GraphQLTransactionGroup.recordServerFailure` copies each reason onto that item's\n * `BaseEntity.LatestResult`. This is the last hop — without it the reason reaches the entity and\n * stops there, and every caller falls back to its own generic \"rolled back\" sentence, which is\n * what #4309's \"Verify by\" rules out.\n *\n * Returns empty when the server named no row. That is a real outcome, not a failure of this\n * function: a transport error or a rollback the server could not attribute to one item leaves\n * nothing worth showing, and the caller should keep its generic message rather than invent detail.\n */\nexport function ServerRefusalReasons(rows: EnrolledRow[]): string[] {\n const lines: string[] = [];\n for (const row of rows) {\n const reason = row.Entity.LatestResult?.CompleteMessage?.trim();\n if (reason && !PROVIDER_PLACEHOLDER_MESSAGES.has(reason)) {\n lines.push(`${row.Label}: ${reason}`);\n }\n }\n return lines;\n}\n\n/** @deprecated Use {@link ServerRefusalReasons}. */\nexport function serverRefusalReasons(rows: EnrolledRow[]): string[] {\n return ServerRefusalReasons(rows);\n}\n"]}
@@ -13,30 +13,68 @@ export interface UserDialogResult {
13
13
  user?: MJUserEntity;
14
14
  }
15
15
  export declare class UserDialogComponent extends BaseAngularComponent implements OnInit, OnDestroy, OnChanges {
16
- data: UserDialogData | null;
17
- visible: boolean;
16
+ Data: UserDialogData | null;
17
+ /** @deprecated Use {@link Data}. */
18
+ set data(value: UserDialogData | null);
19
+ /** @deprecated Use {@link Data}. */
20
+ get data(): UserDialogData | null;
21
+ Visible: boolean;
22
+ /** @deprecated Use {@link Visible}. */
23
+ set visible(value: UserDialogComponent['Visible']);
24
+ /** @deprecated Use {@link Visible}. */
25
+ get visible(): UserDialogComponent['Visible'];
26
+ Result: EventEmitter<UserDialogResult>;
27
+ /**
28
+ * @deprecated Use {@link Result}.
29
+ *
30
+ * The same emitter under the old binding name, so a template still binding
31
+ * (result) keeps working. Must stay AFTER Result: class fields
32
+ * initialise in order, and the other way round this captures undefined.
33
+ */
18
34
  result: EventEmitter<UserDialogResult>;
19
35
  private fb;
20
36
  private cdr;
21
37
  private ngZone;
22
38
  private get metadata();
23
- userForm: FormGroup;
39
+ UserForm: FormGroup;
40
+ /** @deprecated Use {@link UserForm}. */
41
+ get userForm(): FormGroup;
42
+ /** @deprecated Use {@link UserForm}. */
43
+ set userForm(value: FormGroup);
24
44
  isLoading: boolean;
25
45
  error: string | null;
26
- selectedRoleIds: Set<string>;
27
- existingUserRoles: MJUserRoleEntity[];
46
+ SelectedRoleIds: Set<string>;
47
+ /** @deprecated Use {@link SelectedRoleIds}. */
48
+ get selectedRoleIds(): Set<string>;
49
+ /** @deprecated Use {@link SelectedRoleIds}. */
50
+ set selectedRoleIds(value: Set<string>);
51
+ ExistingUserRoles: MJUserRoleEntity[];
52
+ /** @deprecated Use {@link ExistingUserRoles}. */
53
+ get existingUserRoles(): MJUserRoleEntity[];
54
+ /** @deprecated Use {@link ExistingUserRoles}. */
55
+ set existingUserRoles(value: MJUserRoleEntity[]);
28
56
  constructor();
29
57
  ngOnInit(): void;
30
58
  ngOnChanges(changes: SimpleChanges): void;
31
59
  ngOnDestroy(): void;
32
60
  private resetForm;
33
61
  onEscapeKey(event: Event): void;
62
+ get WindowTitle(): string;
63
+ /** @deprecated Use {@link WindowTitle}. */
34
64
  get windowTitle(): string;
65
+ get IsEditMode(): boolean;
66
+ /** @deprecated Use {@link IsEditMode}. */
35
67
  get isEditMode(): boolean;
36
68
  private loadUserData;
37
69
  private loadExistingUserRoles;
70
+ OnRoleToggle(roleId: string, event: Event): void;
71
+ /** @deprecated Use {@link OnRoleToggle}. */
38
72
  onRoleToggle(roleId: string, event: Event): void;
73
+ ToggleRole(roleId: string): void;
74
+ /** @deprecated Use {@link ToggleRole}. */
39
75
  toggleRole(roleId: string): void;
76
+ OnSubmit(): Promise<void>;
77
+ /** @deprecated Use {@link OnSubmit}. */
40
78
  onSubmit(): Promise<void>;
41
79
  private updateUserRoles;
42
80
  /** Names a role for a refusal message; falls back to the ID when the catalog has no match. */
@@ -44,6 +82,6 @@ export declare class UserDialogComponent extends BaseAngularComponent implements
44
82
  onCancel(): void;
45
83
  private markFormGroupTouched;
46
84
  static ɵfac: i0.ɵɵFactoryDeclaration<UserDialogComponent, never>;
47
- static ɵcmp: i0.ɵɵComponentDeclaration<UserDialogComponent, "mj-user-dialog", never, { "data": { "alias": "data"; "required": false; }; "visible": { "alias": "visible"; "required": false; }; }, { "result": "result"; }, never, never, false, never>;
85
+ static ɵcmp: i0.ɵɵComponentDeclaration<UserDialogComponent, "mj-user-dialog", never, { "Data": { "alias": "Data"; "required": false; }; "data": { "alias": "data"; "required": false; }; "Visible": { "alias": "Visible"; "required": false; }; "visible": { "alias": "visible"; "required": false; }; }, { "Result": "Result"; "result": "result"; }, never, never, false, never>;
48
86
  }
49
87
  //# sourceMappingURL=user-dialog.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"user-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/user-management/user-dialog/user-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAsE,MAAM,eAAe,CAAC;AAExL,OAAO,EAAiD,SAAS,EAAc,MAAM,gBAAgB,CAAC;AAEtG,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAG7F,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AAErE,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxB,cAAc,EAAE,YAAY,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB;AAED,qBAOa,mBAAoB,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS,EAAE,SAAS;IAC1F,IAAI,EAAE,cAAc,GAAG,IAAI,CAAQ;IACnC,OAAO,UAAS;IACf,MAAM,iCAAwC;IAExD,OAAO,CAAC,EAAE,CAAuB;IACjC,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,KAAK,QAAQ,GAAiC;IAC9C,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,UAAS;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC5B,eAAe,cAAqB;IACpC,iBAAiB,EAAE,gBAAgB,EAAE,CAAM;;IAelD,QAAQ,IAAI,IAAI;IAIhB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAmBzC,WAAW,IAAI,IAAI;IAInB,OAAO,CAAC,SAAS;IAejB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAM/B,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,IAAW,UAAU,IAAI,OAAO,CAE/B;YAEa,YAAY;YAkBZ,qBAAqB;IAqB5B,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAUhD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQ1B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAwDxB,eAAe;IAuE7B,8FAA8F;IAC9F,OAAO,CAAC,YAAY;IAIb,QAAQ,IAAI,IAAI;IAIvB,OAAO,CAAC,oBAAoB;yCArRjB,mBAAmB;2CAAnB,mBAAmB;CA2R/B"}
1
+ {"version":3,"file":"user-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/user-management/user-dialog/user-dialog.component.ts"],"names":[],"mappings":"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"}