@memberjunction/ng-explorer-core 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 (178) hide show
  1. package/dist/app-routing.module.d.ts +23 -1
  2. package/dist/app-routing.module.d.ts.map +1 -1
  3. package/dist/app-routing.module.js +50 -14
  4. package/dist/app-routing.module.js.map +1 -1
  5. package/dist/lib/command-palette/command-palette.component.d.ts +7 -1
  6. package/dist/lib/command-palette/command-palette.component.d.ts.map +1 -1
  7. package/dist/lib/command-palette/command-palette.component.js +28 -14
  8. package/dist/lib/command-palette/command-palette.component.js.map +1 -1
  9. package/dist/lib/conversation-feedback/conversation-feedback.d.ts +103 -13
  10. package/dist/lib/conversation-feedback/conversation-feedback.d.ts.map +1 -1
  11. package/dist/lib/conversation-feedback/conversation-feedback.js +219 -67
  12. package/dist/lib/conversation-feedback/conversation-feedback.js.map +1 -1
  13. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.d.ts +64 -10
  14. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.d.ts.map +1 -1
  15. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js +172 -66
  16. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js.map +1 -1
  17. package/dist/lib/generic/resource-container-component.d.ts +19 -5
  18. package/dist/lib/generic/resource-container-component.d.ts.map +1 -1
  19. package/dist/lib/generic/resource-container-component.js +43 -13
  20. package/dist/lib/generic/resource-container-component.js.map +1 -1
  21. package/dist/lib/guards/entities.guard.d.ts +4 -0
  22. package/dist/lib/guards/entities.guard.d.ts.map +1 -1
  23. package/dist/lib/guards/entities.guard.js +10 -2
  24. package/dist/lib/guards/entities.guard.js.map +1 -1
  25. package/dist/lib/identity-claims/claim-redeem.component.d.ts +4 -0
  26. package/dist/lib/identity-claims/claim-redeem.component.d.ts.map +1 -1
  27. package/dist/lib/identity-claims/claim-redeem.component.js +10 -2
  28. package/dist/lib/identity-claims/claim-redeem.component.js.map +1 -1
  29. package/dist/lib/oauth/oauth-callback.component.d.ts +4 -0
  30. package/dist/lib/oauth/oauth-callback.component.d.ts.map +1 -1
  31. package/dist/lib/oauth/oauth-callback.component.js +10 -2
  32. package/dist/lib/oauth/oauth-callback.component.js.map +1 -1
  33. package/dist/lib/profile/profile-dialog.component.d.ts.map +1 -1
  34. package/dist/lib/profile/profile-dialog.component.js +194 -191
  35. package/dist/lib/profile/profile-dialog.component.js.map +1 -1
  36. package/dist/lib/resource-wrappers/artifact-resource.component.d.ts +20 -2
  37. package/dist/lib/resource-wrappers/artifact-resource.component.d.ts.map +1 -1
  38. package/dist/lib/resource-wrappers/artifact-resource.component.js +33 -9
  39. package/dist/lib/resource-wrappers/artifact-resource.component.js.map +1 -1
  40. package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts +80 -10
  41. package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts.map +1 -1
  42. package/dist/lib/resource-wrappers/chat-collections-resource.component.js +168 -56
  43. package/dist/lib/resource-wrappers/chat-collections-resource.component.js.map +1 -1
  44. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts +186 -23
  45. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts.map +1 -1
  46. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +500 -177
  47. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
  48. package/dist/lib/resource-wrappers/chat-deeplink-params.d.ts +2 -0
  49. package/dist/lib/resource-wrappers/chat-deeplink-params.d.ts.map +1 -1
  50. package/dist/lib/resource-wrappers/chat-deeplink-params.js +5 -1
  51. package/dist/lib/resource-wrappers/chat-deeplink-params.js.map +1 -1
  52. package/dist/lib/resource-wrappers/chat-search-routing.d.ts +25 -0
  53. package/dist/lib/resource-wrappers/chat-search-routing.d.ts.map +1 -0
  54. package/dist/lib/resource-wrappers/chat-search-routing.js +24 -0
  55. package/dist/lib/resource-wrappers/chat-search-routing.js.map +1 -0
  56. package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts +14 -2
  57. package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts.map +1 -1
  58. package/dist/lib/resource-wrappers/chat-tasks-resource.component.js +32 -8
  59. package/dist/lib/resource-wrappers/chat-tasks-resource.component.js.map +1 -1
  60. package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts +54 -8
  61. package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts.map +1 -1
  62. package/dist/lib/resource-wrappers/dashboard-resource.component.js +138 -46
  63. package/dist/lib/resource-wrappers/dashboard-resource.component.js.map +1 -1
  64. package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts +223 -30
  65. package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts.map +1 -1
  66. package/dist/lib/resource-wrappers/livekit-room-resource.component.js +438 -118
  67. package/dist/lib/resource-wrappers/livekit-room-resource.component.js.map +1 -1
  68. package/dist/lib/resource-wrappers/search-results-resource.component.d.ts +7 -3
  69. package/dist/lib/resource-wrappers/search-results-resource.component.d.ts.map +1 -1
  70. package/dist/lib/resource-wrappers/search-results-resource.component.js +23 -15
  71. package/dist/lib/resource-wrappers/search-results-resource.component.js.map +1 -1
  72. package/dist/lib/resource-wrappers/view-resource.component.d.ts +68 -10
  73. package/dist/lib/resource-wrappers/view-resource.component.d.ts.map +1 -1
  74. package/dist/lib/resource-wrappers/view-resource.component.js +178 -62
  75. package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
  76. package/dist/lib/services/startup-validation.service.d.ts +4 -0
  77. package/dist/lib/services/startup-validation.service.d.ts.map +1 -1
  78. package/dist/lib/services/startup-validation.service.js +10 -2
  79. package/dist/lib/services/startup-validation.service.js.map +1 -1
  80. package/dist/lib/services/system-validation.service.d.ts +13 -1
  81. package/dist/lib/services/system-validation.service.d.ts.map +1 -1
  82. package/dist/lib/services/system-validation.service.js +29 -5
  83. package/dist/lib/services/system-validation.service.js.map +1 -1
  84. package/dist/lib/shell/components/dialogs/app-access-dialog.component.d.ts +54 -4
  85. package/dist/lib/shell/components/dialogs/app-access-dialog.component.d.ts.map +1 -1
  86. package/dist/lib/shell/components/dialogs/app-access-dialog.component.js +130 -40
  87. package/dist/lib/shell/components/dialogs/app-access-dialog.component.js.map +1 -1
  88. package/dist/lib/shell/components/header/app-nav.component.d.ts +29 -1
  89. package/dist/lib/shell/components/header/app-nav.component.d.ts.map +1 -1
  90. package/dist/lib/shell/components/header/app-nav.component.js +56 -12
  91. package/dist/lib/shell/components/header/app-nav.component.js.map +1 -1
  92. package/dist/lib/shell/components/header/app-switcher.component.d.ts +33 -5
  93. package/dist/lib/shell/components/header/app-switcher.component.d.ts.map +1 -1
  94. package/dist/lib/shell/components/header/app-switcher.component.js +85 -29
  95. package/dist/lib/shell/components/header/app-switcher.component.js.map +1 -1
  96. package/dist/lib/shell/components/record-open/record-origin-crumb.component.js +1 -1
  97. package/dist/lib/shell/components/record-open/record-origin-crumb.component.js.map +1 -1
  98. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts +50 -6
  99. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts.map +1 -1
  100. package/dist/lib/shell/components/tabs/component-cache-manager.js +95 -22
  101. package/dist/lib/shell/components/tabs/component-cache-manager.js.map +1 -1
  102. package/dist/lib/shell/components/tabs/tab-container.component.d.ts +91 -9
  103. package/dist/lib/shell/components/tabs/tab-container.component.d.ts.map +1 -1
  104. package/dist/lib/shell/components/tabs/tab-container.component.js +257 -101
  105. package/dist/lib/shell/components/tabs/tab-container.component.js.map +1 -1
  106. package/dist/lib/shell/loading-themes.d.ts +16 -12
  107. package/dist/lib/shell/loading-themes.d.ts.map +1 -1
  108. package/dist/lib/shell/loading-themes.js +145 -137
  109. package/dist/lib/shell/loading-themes.js.map +1 -1
  110. package/dist/lib/shell/readiness-beacon.d.ts +2 -0
  111. package/dist/lib/shell/readiness-beacon.d.ts.map +1 -1
  112. package/dist/lib/shell/readiness-beacon.js +5 -1
  113. package/dist/lib/shell/readiness-beacon.js.map +1 -1
  114. package/dist/lib/shell/services/about-dialog.service.d.ts +6 -0
  115. package/dist/lib/shell/services/about-dialog.service.d.ts.map +1 -1
  116. package/dist/lib/shell/services/about-dialog.service.js +16 -4
  117. package/dist/lib/shell/services/about-dialog.service.js.map +1 -1
  118. package/dist/lib/shell/services/profile-dialog.service.d.ts +6 -0
  119. package/dist/lib/shell/services/profile-dialog.service.d.ts.map +1 -1
  120. package/dist/lib/shell/services/profile-dialog.service.js +16 -4
  121. package/dist/lib/shell/services/profile-dialog.service.js.map +1 -1
  122. package/dist/lib/shell/services/user-sharing-center-dialog.service.d.ts +6 -0
  123. package/dist/lib/shell/services/user-sharing-center-dialog.service.d.ts.map +1 -1
  124. package/dist/lib/shell/services/user-sharing-center-dialog.service.js +15 -3
  125. package/dist/lib/shell/services/user-sharing-center-dialog.service.js.map +1 -1
  126. package/dist/lib/shell/shell.component.d.ts +262 -39
  127. package/dist/lib/shell/shell.component.d.ts.map +1 -1
  128. package/dist/lib/shell/shell.component.js +688 -292
  129. package/dist/lib/shell/shell.component.js.map +1 -1
  130. package/dist/lib/single-dashboard/Components/add-item/add-item.component.d.ts +64 -8
  131. package/dist/lib/single-dashboard/Components/add-item/add-item.component.d.ts.map +1 -1
  132. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js +129 -37
  133. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js.map +1 -1
  134. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.d.ts +26 -2
  135. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.d.ts.map +1 -1
  136. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js +48 -10
  137. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js.map +1 -1
  138. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.d.ts +84 -6
  139. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.d.ts.map +1 -1
  140. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js +133 -29
  141. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js.map +1 -1
  142. package/dist/lib/single-dashboard/single-dashboard.component.d.ts +173 -23
  143. package/dist/lib/single-dashboard/single-dashboard.component.d.ts.map +1 -1
  144. package/dist/lib/single-dashboard/single-dashboard.component.js +383 -109
  145. package/dist/lib/single-dashboard/single-dashboard.component.js.map +1 -1
  146. package/dist/lib/single-list-detail/single-list-detail.component.d.ts +383 -55
  147. package/dist/lib/single-list-detail/single-list-detail.component.d.ts.map +1 -1
  148. package/dist/lib/single-list-detail/single-list-detail.component.js +962 -326
  149. package/dist/lib/single-list-detail/single-list-detail.component.js.map +1 -1
  150. package/dist/lib/single-query/single-query.component.d.ts +22 -2
  151. package/dist/lib/single-query/single-query.component.d.ts.map +1 -1
  152. package/dist/lib/single-query/single-query.component.js +40 -10
  153. package/dist/lib/single-query/single-query.component.js.map +1 -1
  154. package/dist/lib/single-record/single-record.component.d.ts +41 -3
  155. package/dist/lib/single-record/single-record.component.d.ts.map +1 -1
  156. package/dist/lib/single-record/single-record.component.js +71 -11
  157. package/dist/lib/single-record/single-record.component.js.map +1 -1
  158. package/dist/lib/single-search-result/single-search-result.component.d.ts +23 -3
  159. package/dist/lib/single-search-result/single-search-result.component.d.ts.map +1 -1
  160. package/dist/lib/single-search-result/single-search-result.component.js +42 -12
  161. package/dist/lib/single-search-result/single-search-result.component.js.map +1 -1
  162. package/dist/lib/system-validation/system-validation-banner.component.d.ts +12 -2
  163. package/dist/lib/system-validation/system-validation-banner.component.d.ts.map +1 -1
  164. package/dist/lib/system-validation/system-validation-banner.component.js +25 -5
  165. package/dist/lib/system-validation/system-validation-banner.component.js.map +1 -1
  166. package/dist/lib/user-menu/user-menu.types.d.ts +4 -0
  167. package/dist/lib/user-menu/user-menu.types.d.ts.map +1 -1
  168. package/dist/lib/user-menu/user-menu.types.js +10 -2
  169. package/dist/lib/user-menu/user-menu.types.js.map +1 -1
  170. package/dist/lib/user-notifications/user-notifications.component.d.ts +59 -7
  171. package/dist/lib/user-notifications/user-notifications.component.d.ts.map +1 -1
  172. package/dist/lib/user-notifications/user-notifications.component.js +151 -47
  173. package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
  174. package/dist/lib/user-profile/user-profile.component.d.ts +3 -2
  175. package/dist/lib/user-profile/user-profile.component.d.ts.map +1 -1
  176. package/dist/lib/user-profile/user-profile.component.js +5 -4
  177. package/dist/lib/user-profile/user-profile.component.js.map +1 -1
  178. package/package.json +52 -52
@@ -1 +1 @@
1
- {"version":3,"file":"profile-dialog.component.js","sourceRoot":"","sources":["../../../src/lib/profile/profile-dialog.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ChangeDetectorRef,\n inject\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RunView, UserRoleInfo } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport {\n MJThemeEntity,\n MJUserNotificationPreferenceEntity,\n UserInfoEngine\n} from '@memberjunction/core-entities';\nimport { MJAuthBase } from '@memberjunction/ng-auth-services';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { ThemeService, SharedService, ThemeDefinition } from '@memberjunction/ng-shared';\nimport type { ThemeSeeds } from '@memberjunction/theme-engine';\nimport { ExplorerSettingsModule } from '@memberjunction/ng-explorer-settings';\nimport { IsOmnibarAvailable, IsOmnibarEnabledForUser, OMNIBAR_USER_SETTING_KEY } from '../omnibar/omnibar-user-setting';\nimport { GetOmnibarShortcutLabel } from '../omnibar/omnibar-shortcut';\nimport { Subscription } from 'rxjs';\n\ninterface NotificationChannel {\n key: 'InApp' | 'Email' | 'SMS';\n label: string;\n icon: string;\n enabled: boolean;\n saving: boolean;\n}\n\ninterface StarredThemeItem {\n id: string;\n name: string;\n seeds: string;\n swatches: string[];\n overrides: string | null;\n customCss: string | null;\n}\n\ntype ProfilePanel = 'none' | 'photo' | 'theme';\n\n/**\n * \"Identity Card\" profile dialog with slide-in detail panels for editing\n * profile photo and switching theme. Replaces the legacy multi-tab Settings\n * dialog entirely. Brand-aligned with the About dialog.\n */\n@Component({\n selector: 'mj-profile-dialog',\n standalone: true,\n imports: [CommonModule, ExplorerSettingsModule],\n template: `\n<div class=\"mj-profile\" [class.mj-profile--panel-open]=\"ActivePanel !== 'none'\" role=\"document\">\n <button class=\"mj-profile__close\" type=\"button\" aria-label=\"Close\" (click)=\"OnCloseClick()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n\n <!-- ===== MAIN VIEW ===== -->\n <div class=\"mj-profile__main\">\n <div class=\"mj-profile__hero\">\n <h3 class=\"mj-profile__hero-title\">My Profile</h3>\n </div>\n\n <div class=\"mj-profile__avatar-zone\">\n @if (AvatarUrl) {\n <img class=\"mj-profile__avatar mj-profile__avatar--img\"\n [src]=\"AvatarUrl\" alt=\"\" (error)=\"OnAvatarLoadError()\" />\n } @else if (AvatarIconClass) {\n <div class=\"mj-profile__avatar mj-profile__avatar--icon\">\n <i [class]=\"AvatarIconClass\"></i>\n </div>\n } @else {\n <div class=\"mj-profile__avatar\">{{ UserInitials }}</div>\n }\n <button class=\"mj-profile__avatar-edit\" type=\"button\" title=\"Change photo\"\n (click)=\"OpenPanel('photo')\">\n <i class=\"fa-solid fa-camera\"></i>\n </button>\n </div>\n\n <div class=\"mj-profile__identity\">\n <h2 class=\"mj-profile__name\">{{ UserName }}</h2>\n <p class=\"mj-profile__email\">{{ UserEmail }}</p>\n @if (RoleChips.length > 0) {\n <div class=\"mj-profile__chips\">\n @for (chip of RoleChips; track chip.label) {\n <span class=\"mj-profile__chip\" [class]=\"'mj-profile__chip--' + chip.tone\">\n @if (chip.icon) { <i [class]=\"chip.icon\"></i> }\n {{ chip.label }}\n </span>\n }\n </div>\n }\n </div>\n\n <div class=\"mj-profile__field-list\">\n <div class=\"mj-profile__field\">\n <div class=\"mj-profile__field-icon\"><i class=\"fa-solid fa-id-badge\"></i></div>\n <div class=\"mj-profile__field-body\">\n <div class=\"mj-profile__field-label\">Account</div>\n <div class=\"mj-profile__field-value\">\n {{ AccountType }} · {{ AccountStatus }}\n @if (MemberSince) {\n <span class=\"mj-profile__field-muted\"> · {{ MemberSince }}</span>\n }\n </div>\n </div>\n </div>\n\n <button class=\"mj-profile__field mj-profile__field--button\" type=\"button\" (click)=\"OpenPanel('theme')\">\n <div class=\"mj-profile__field-icon\"><i class=\"fa-solid fa-palette\"></i></div>\n <div class=\"mj-profile__field-body\">\n <div class=\"mj-profile__field-label\">Theme</div>\n <div class=\"mj-profile__field-value\">{{ ThemeLabel }}</div>\n </div>\n <i class=\"fa-solid fa-chevron-right mj-profile__field-chev\"></i>\n </button>\n </div>\n\n @if (OmnibarAvailable) {\n <div class=\"mj-profile__section\">\n <div class=\"mj-profile__section-head\">\n <h4>Command Palette</h4>\n </div>\n <div class=\"mj-profile__channels\">\n <button type=\"button\"\n class=\"mj-profile__channel\"\n data-testid=\"omnibar-toggle\"\n [class.mj-profile__channel--on]=\"OmnibarEnabled\"\n [disabled]=\"SavingOmnibar\"\n (click)=\"ToggleOmnibar()\">\n <div class=\"mj-profile__channel-icon\"><i class=\"fa-solid fa-magnifying-glass\"></i></div>\n <div class=\"mj-profile__channel-label\">\n Unified command palette\n <div class=\"mj-profile__channel-hint\">{{ OmnibarShortcutLabel }} — search, records, agents &amp; commands in one bar</div>\n </div>\n <div class=\"mj-profile__channel-state\">\n @if (SavingOmnibar) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n <span class=\"mj-profile__switch\" [class.mj-profile__switch--on]=\"OmnibarEnabled\">\n <span class=\"mj-profile__switch-knob\"></span>\n </span>\n }\n </div>\n </button>\n </div>\n </div>\n }\n\n <div class=\"mj-profile__section\">\n <div class=\"mj-profile__section-head\">\n <h4>Notifications</h4>\n @if (UnreadCount > 0) {\n <span class=\"mj-profile__unread\">{{ UnreadCount }} unread</span>\n }\n </div>\n @if (LoadingNotifications) {\n <div class=\"mj-profile__channels-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading…\n </div>\n } @else {\n <div class=\"mj-profile__channels\">\n @for (ch of Channels; track ch.key) {\n <button type=\"button\"\n class=\"mj-profile__channel\"\n [class.mj-profile__channel--on]=\"ch.enabled\"\n [disabled]=\"ch.saving\"\n (click)=\"ToggleChannel(ch)\">\n <div class=\"mj-profile__channel-icon\"><i [class]=\"ch.icon\"></i></div>\n <div class=\"mj-profile__channel-label\">{{ ch.label }}</div>\n <div class=\"mj-profile__channel-state\">\n @if (ch.saving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n <span class=\"mj-profile__switch\" [class.mj-profile__switch--on]=\"ch.enabled\">\n <span class=\"mj-profile__switch-knob\"></span>\n </span>\n }\n </div>\n </button>\n }\n </div>\n }\n </div>\n\n <div class=\"mj-profile__footer\">\n <button class=\"mj-profile__btn mj-profile__btn--danger\" type=\"button\" (click)=\"OnSignOut()\">\n <i class=\"fa-solid fa-arrow-right-from-bracket\"></i>\n Sign out\n </button>\n <span class=\"mj-profile__spacer\"></span>\n <button class=\"mj-profile__btn mj-profile__btn--primary\" type=\"button\" (click)=\"OnCloseClick()\">\n Done\n </button>\n </div>\n </div>\n\n <!-- ===== SLIDE-IN PANEL ===== -->\n <div class=\"mj-profile__panel\" [class.mj-profile__panel--open]=\"ActivePanel !== 'none'\">\n <div class=\"mj-profile__panel-header\">\n <button class=\"mj-profile__panel-back\" type=\"button\" aria-label=\"Back\" (click)=\"ClosePanel()\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n </button>\n <h3 class=\"mj-profile__panel-title\">{{ PanelTitle }}</h3>\n </div>\n <div class=\"mj-profile__panel-body\">\n @if (ActivePanel === 'photo') {\n <mj-user-profile-settings></mj-user-profile-settings>\n } @else if (ActivePanel === 'theme') {\n <div class=\"mj-profile__themes\">\n @for (theme of ThemeOptions; track theme.id) {\n <button type=\"button\"\n class=\"mj-profile__theme\"\n [class.mj-profile__theme--active]=\"theme.id === ThemePreference\"\n [class.mj-profile__theme--saving]=\"SavingTheme === theme.id\"\n [disabled]=\"!!SavingTheme\"\n (click)=\"SelectTheme(theme.id)\">\n <div class=\"mj-profile__theme-swatch\" [class]=\"'mj-profile__theme-swatch--' + theme.swatch\">\n <i [class]=\"theme.icon\"></i>\n </div>\n <div class=\"mj-profile__theme-info\">\n <div class=\"mj-profile__theme-name\">{{ theme.name }}</div>\n @if (theme.description) {\n <div class=\"mj-profile__theme-desc\">{{ theme.description }}</div>\n }\n </div>\n @if (SavingTheme === theme.id) {\n <i class=\"fa-solid fa-spinner fa-spin mj-profile__theme-check\"></i>\n } @else if (theme.id === ThemePreference) {\n <i class=\"fa-solid fa-check mj-profile__theme-check\"></i>\n }\n </button>\n }\n @if (StarredThemes.length) {\n <div class=\"mj-profile__theme-sep\">Brand themes</div>\n @for (t of StarredThemes; track t.id) {\n <button type=\"button\"\n class=\"mj-profile__theme\"\n [class.mj-profile__theme--active]=\"IsAppliedBrand(t.id)\"\n (click)=\"ApplyStarredTheme(t)\">\n <div class=\"mj-profile__theme-swatch mj-profile__brand-swatch\">\n @for (c of t.swatches; track $index) { <i [style.background]=\"c\"></i> }\n </div>\n <div class=\"mj-profile__theme-info\">\n <div class=\"mj-profile__theme-name\">{{ t.name }}</div>\n </div>\n @if (IsAppliedBrand(t.id)) {\n <i class=\"fa-solid fa-check mj-profile__theme-check\"></i>\n }\n </button>\n }\n }\n </div>\n }\n </div>\n </div>\n</div>\n `,\n styles: [`\n:host {\n display: block;\n width: 100%;\n height: 100%;\n}\n.mj-profile {\n display: block;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n height: 100%;\n min-height: 0;\n position: relative;\n font-family: inherit;\n overflow: hidden;\n}\n.mj-profile__close {\n position: absolute;\n top: 12px; right: 12px;\n width: 36px; height: 36px;\n border: none; border-radius: 8px;\n background: rgba(255, 255, 255, 0.18);\n backdrop-filter: blur(8px);\n color: #fff;\n cursor: pointer;\n font-size: 16px;\n display: flex; align-items: center; justify-content: center;\n transition: background 0.15s, opacity 0.2s;\n z-index: 4;\n}\n.mj-profile__close:hover { background: rgba(255, 255, 255, 0.3); }\n.mj-profile--panel-open .mj-profile__close { opacity: 0; pointer-events: none; }\n\n/* ============ MAIN VIEW ============ */\n.mj-profile__main {\n display: flex;\n flex-direction: column;\n height: 100%;\n transition: transform 0.32s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.mj-profile--panel-open .mj-profile__main {\n transform: translateX(-12%);\n pointer-events: none;\n}\n\n.mj-profile__hero {\n background: linear-gradient(135deg, #264FAF 0%, #0076b6 100%);\n color: #fff;\n padding: 22px 24px 56px;\n position: relative;\n overflow: hidden;\n flex-shrink: 0;\n}\n.mj-profile__hero::before {\n content: '';\n position: absolute;\n inset: -50%;\n background: radial-gradient(circle, rgba(255, 255, 255, 0.10) 0%, transparent 60%);\n animation: mj-profile-rotate 24s linear infinite;\n pointer-events: none;\n}\n@media (prefers-reduced-motion: reduce) {\n .mj-profile__hero::before { animation: none; }\n}\n@keyframes mj-profile-rotate { to { transform: rotate(360deg); } }\n\n.mj-profile__hero-title {\n margin: 0;\n font-size: 12px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 1.2px;\n opacity: 0.85;\n position: relative;\n z-index: 1;\n}\n\n.mj-profile__avatar-zone {\n position: relative;\n width: 96px;\n height: 96px;\n margin: -48px auto 12px;\n z-index: 2;\n}\n.mj-profile__avatar {\n width: 96px;\n height: 96px;\n border-radius: 50%;\n background: linear-gradient(135deg, #264FAF 0%, #0076b6 100%);\n color: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 32px;\n font-weight: 700;\n border: 4px solid var(--mj-bg-surface);\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.18);\n object-fit: cover;\n overflow: hidden;\n}\nimg.mj-profile__avatar { background: var(--mj-bg-surface-card); }\n.mj-profile__avatar--icon i { font-size: 36px; }\n\n.mj-profile__avatar-edit {\n position: absolute;\n bottom: 2px; right: 2px;\n width: 30px; height: 30px;\n border-radius: 50%;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border: 2px solid var(--mj-bg-surface);\n cursor: pointer;\n display: flex; align-items: center; justify-content: center;\n font-size: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.18);\n transition: transform 0.15s;\n}\n.mj-profile__avatar-edit:hover { transform: scale(1.1); }\n\n.mj-profile__identity {\n text-align: center;\n padding: 0 24px 16px;\n flex-shrink: 0;\n}\n.mj-profile__name {\n margin: 0 0 4px;\n font-size: 22px;\n font-weight: 700;\n letter-spacing: -0.4px;\n color: var(--mj-text-primary);\n}\n.mj-profile__email {\n margin: 0 0 12px;\n color: var(--mj-text-muted);\n font-size: 13px;\n word-break: break-all;\n}\n.mj-profile__chips {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n justify-content: center;\n}\n.mj-profile__chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 9px;\n border-radius: 100px;\n font-size: 11px;\n font-weight: 600;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n color: var(--mj-brand-primary);\n}\n.mj-profile__chip--admin {\n background: color-mix(in srgb, #f59e0b 14%, transparent);\n color: #b45309;\n}\n.mj-profile__chip--dev {\n background: color-mix(in srgb, #10b981 14%, transparent);\n color: #047857;\n}\n\n.mj-profile__field-list {\n padding: 0 24px;\n flex-shrink: 0;\n}\n.mj-profile__field {\n display: flex;\n align-items: center;\n padding: 12px 0;\n gap: 14px;\n border-top: 1px solid var(--mj-border-subtle);\n width: 100%;\n text-align: left;\n background: transparent;\n border-left: none;\n border-right: none;\n border-bottom: none;\n font-family: inherit;\n color: inherit;\n}\n.mj-profile__field:first-child { border-top: none; }\n.mj-profile__field--button {\n cursor: pointer;\n transition: background 0.12s;\n margin: 0 -8px;\n padding-left: 8px;\n padding-right: 8px;\n border-radius: 8px;\n border-top: none;\n}\n.mj-profile__field--button + .mj-profile__field--button { margin-top: 0; }\n.mj-profile__field--button:hover { background: var(--mj-bg-surface-hover); }\n.mj-profile__field--button:hover .mj-profile__field-chev { color: var(--mj-brand-primary); }\n.mj-profile__field-icon {\n width: 32px; height: 32px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n flex-shrink: 0;\n}\n.mj-profile__field-body { flex: 1; min-width: 0; }\n.mj-profile__field-label {\n font-size: 10.5px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n font-weight: 600;\n letter-spacing: 0.5px;\n}\n.mj-profile__field-value {\n font-size: 13px;\n color: var(--mj-text-primary);\n margin-top: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.mj-profile__field-muted { color: var(--mj-text-muted); }\n.mj-profile__field-chev {\n color: var(--mj-text-muted);\n font-size: 11px;\n transition: color 0.15s;\n}\n\n.mj-profile__section {\n padding: 16px 24px 8px;\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n}\n.mj-profile__section-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 10px;\n}\n.mj-profile__section-head h4 {\n margin: 0;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.6px;\n}\n.mj-profile__unread {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n padding: 2px 8px;\n border-radius: 100px;\n}\n.mj-profile__channels-loading {\n color: var(--mj-text-muted);\n font-size: 12.5px;\n padding: 12px;\n text-align: center;\n}\n.mj-profile__channels {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.mj-profile__channel {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.15s;\n font-family: inherit;\n text-align: left;\n width: 100%;\n}\n.mj-profile__channel:hover:not(:disabled) {\n border-color: var(--mj-border-default);\n background: var(--mj-bg-surface-hover);\n}\n.mj-profile__channel:disabled { cursor: wait; opacity: 0.7; }\n.mj-profile__channel-icon {\n width: 32px; height: 32px;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n display: flex; align-items: center; justify-content: center;\n font-size: 13px;\n flex-shrink: 0;\n transition: all 0.15s;\n}\n.mj-profile__channel--on .mj-profile__channel-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n color: var(--mj-brand-primary);\n}\n.mj-profile__channel-label {\n flex: 1;\n font-size: 13.5px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n.mj-profile__channel-hint {\n font-size: 11.5px;\n font-weight: 400;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n.mj-profile__channel-state {\n flex-shrink: 0;\n color: var(--mj-text-muted);\n font-size: 13px;\n min-width: 36px;\n display: flex; justify-content: flex-end; align-items: center;\n}\n\n.mj-profile__switch {\n width: 36px;\n height: 20px;\n background: var(--mj-border-strong);\n border-radius: 100px;\n position: relative;\n transition: background 0.2s;\n display: inline-block;\n}\n.mj-profile__switch-knob {\n position: absolute;\n top: 2px; left: 2px;\n width: 16px; height: 16px;\n background: white;\n border-radius: 50%;\n transition: transform 0.2s;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);\n}\n.mj-profile__switch--on { background: var(--mj-brand-primary); }\n.mj-profile__switch--on .mj-profile__switch-knob { transform: translateX(16px); }\n\n.mj-profile__footer {\n border-top: 1px solid var(--mj-border-subtle);\n padding: 14px 20px;\n display: flex;\n gap: 8px;\n align-items: center;\n flex-shrink: 0;\n}\n.mj-profile__spacer { flex: 1; }\n.mj-profile__btn {\n padding: 9px 16px;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n font-family: inherit;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n transition: all 0.15s;\n}\n.mj-profile__btn:hover { background: var(--mj-bg-surface-hover); border-color: var(--mj-border-strong); }\n.mj-profile__btn--primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n.mj-profile__btn--primary:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 88%, black);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 88%, black);\n}\n.mj-profile__btn--danger {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-border-default));\n}\n.mj-profile__btn--danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 8%, transparent);\n border-color: var(--mj-status-error);\n}\n\n/* ============ SLIDE-IN PANEL ============ */\n.mj-profile__panel {\n position: absolute;\n inset: 0;\n background: var(--mj-bg-surface);\n transform: translateX(100%);\n transition: transform 0.32s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n flex-direction: column;\n z-index: 3;\n}\n.mj-profile__panel--open {\n transform: translateX(0);\n box-shadow: -8px 0 24px rgba(0, 0, 0, 0.06);\n}\n.mj-profile__panel-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 18px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n}\n.mj-profile__panel-back {\n width: 34px; height: 34px;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n display: flex; align-items: center; justify-content: center;\n font-size: 13px;\n transition: all 0.15s;\n font-family: inherit;\n}\n.mj-profile__panel-back:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n.mj-profile__panel-title {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n letter-spacing: -0.2px;\n}\n.mj-profile__panel-body {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 16px 20px 20px;\n}\n\n/* Theme picker */\n.mj-profile__themes {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.mj-profile__theme {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 12px 14px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.15s;\n text-align: left;\n width: 100%;\n font-family: inherit;\n}\n.mj-profile__theme:hover:not(:disabled) {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-hover);\n}\n.mj-profile__theme:disabled { cursor: wait; opacity: 0.7; }\n.mj-profile__theme--active {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface-card));\n}\n.mj-profile__theme-swatch {\n width: 40px; height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n flex-shrink: 0;\n border: 1px solid var(--mj-border-default);\n}\n.mj-profile__theme-swatch--light {\n background: linear-gradient(135deg, #ffffff 0%, #f1f5f9 100%);\n color: #f59e0b;\n}\n.mj-profile__theme-swatch--dark {\n background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%);\n color: #94a3b8;\n border-color: #334155;\n}\n.mj-profile__theme-swatch--system {\n background: linear-gradient(135deg, #ffffff 0%, #ffffff 49%, #1e293b 51%, #0f172a 100%);\n color: var(--mj-text-secondary);\n}\n.mj-profile__theme-info { flex: 1; min-width: 0; }\n.mj-profile__theme-name {\n font-size: 13.5px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.mj-profile__theme-desc {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.mj-profile__theme-check {\n color: var(--mj-brand-primary);\n font-size: 14px;\n flex-shrink: 0;\n}\n\n/* Starred brand themes shown inline in the theme list */\n.mj-profile__theme-sep {\n font-size: 11px; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase;\n color: var(--mj-text-muted); padding: 6px 4px 2px; margin-top: 6px;\n}\n.mj-profile__brand-swatch {\n display: flex; align-items: center; justify-content: center; overflow: hidden; padding: 0;\n}\n.mj-profile__brand-swatch i {\n width: 33%; height: 100%; display: block;\n}\n\n@media (max-width: 480px) {\n .mj-profile__hero { padding: 20px 18px 48px; }\n .mj-profile__avatar-zone { width: 88px; height: 88px; margin-top: -44px; }\n .mj-profile__avatar { width: 88px; height: 88px; font-size: 28px; }\n .mj-profile__name { font-size: 19px; }\n .mj-profile__field-list,\n .mj-profile__section { padding-left: 18px; padding-right: 18px; }\n .mj-profile__footer { padding: 12px 16px; }\n .mj-profile--panel-open .mj-profile__main { transform: translateX(-20%); }\n .mj-profile__panel-body { padding: 14px 16px 16px; }\n}\n `]\n})\nexport class ProfileDialogComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n @Output() CloseRequested = new EventEmitter<void>();\n\n @Input() AvatarUrl: string | null = null;\n @Input() AvatarIconClass: string | null = null;\n\n public UserName = '';\n public UserEmail = '';\n public UserInitials = '?';\n public AccountType = '';\n public AccountStatus = '';\n public MemberSince = '';\n public ThemeLabel = '';\n public RoleChips: Array<{ label: string; tone: string; icon: string | null }> = [];\n\n public LoadingNotifications = true;\n public Channels: NotificationChannel[] = [\n { key: 'InApp', label: 'In-app', icon: 'fa-solid fa-bell', enabled: false, saving: false },\n { key: 'Email', label: 'Email', icon: 'fa-solid fa-envelope', enabled: false, saving: false },\n { key: 'SMS', label: 'SMS', icon: 'fa-solid fa-mobile', enabled: false, saving: false }\n ];\n public UnreadCount = 0;\n\n // Omnibar per-user opt-in (shown only when the instance makes it available)\n public OmnibarAvailable = false;\n public OmnibarEnabled = false;\n public SavingOmnibar = false;\n\n /** Platform-correct summon-shortcut label ('⌘K' on Mac, 'Ctrl+K' elsewhere). */\n public get OmnibarShortcutLabel(): string {\n return GetOmnibarShortcutLabel();\n }\n\n // Slide-in panel state\n public ActivePanel: ProfilePanel = 'none';\n public ThemeOptions: Array<{ id: string; name: string; description: string; icon: string; swatch: 'light' | 'dark' | 'system' }> = [];\n public ThemePreference = '';\n public SavingTheme: string | null = null;\n\n // Starred brand themes shown inline in the theme list\n public StarredThemes: StarredThemeItem[] = [];\n public get AppliedBrandId(): string | null {\n return this.themeService.BrandOverlayId;\n }\n\n /** Whether a theme id is the applied brand overlay (case-insensitive GUID compare). */\n public IsAppliedBrand(id: string): boolean {\n const active = this.themeService.BrandOverlayId;\n return !!active && UUIDsEqual(id, active);\n }\n\n public get PanelTitle(): string {\n switch (this.ActivePanel) {\n case 'photo': return 'Profile photo';\n case 'theme': return 'Theme';\n default: return '';\n }\n }\n\n private authBase = inject(MJAuthBase);\n private themeService = inject(ThemeService);\n private sharedService = inject(SharedService);\n private cdr = inject(ChangeDetectorRef);\n\n private themeSub?: Subscription;\n\n public ngOnInit(): void {\n this.populateIdentity();\n this.populateThemeOptions();\n this.loadNotifications();\n this.OmnibarAvailable = IsOmnibarAvailable();\n this.OmnibarEnabled = IsOmnibarEnabledForUser();\n this.themeSub = this.themeService.Preference$.subscribe(pref => {\n this.ThemePreference = pref;\n this.ThemeLabel = this.computeThemeLabel();\n this.cdr.markForCheck();\n });\n }\n\n public ngOnDestroy(): void {\n this.themeSub?.unsubscribe();\n }\n\n public OnCloseClick(): void {\n if (this.ActivePanel !== 'none') {\n this.ClosePanel();\n return;\n }\n this.CloseRequested.emit();\n }\n\n public OnAvatarLoadError(): void {\n this.AvatarUrl = null;\n this.cdr.markForCheck();\n }\n\n public OpenPanel(panel: ProfilePanel): void {\n this.ActivePanel = panel;\n if (panel === 'theme') {\n this.loadStarredThemes();\n }\n }\n\n public ClosePanel(): void {\n this.ActivePanel = 'none';\n }\n\n public async OnSignOut(): Promise<void> {\n try {\n localStorage.removeItem('auth');\n localStorage.removeItem('claims');\n await this.authBase.logout();\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Unknown error';\n this.sharedService.CreateSimpleNotification(`Sign out failed: ${msg}`, 'error', 3000);\n }\n }\n\n public async SelectTheme(themeId: string): Promise<void> {\n if (this.SavingTheme) return;\n if (themeId === this.ThemePreference) return;\n this.SavingTheme = themeId;\n this.cdr.markForCheck();\n try {\n await this.themeService.SetTheme(themeId);\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Unknown error';\n this.sharedService.CreateSimpleNotification(`Theme change failed: ${msg}`, 'error', 3000);\n } finally {\n this.SavingTheme = null;\n this.cdr.markForCheck();\n }\n }\n\n // ========================================\n // Starred brand themes\n // ========================================\n\n /** Load the user's starred brand themes to show inline in the theme list. */\n private async loadStarredThemes(): Promise<void> {\n this.StarredThemes = [];\n try {\n const ids = this.themeService.GetStarredThemeIds();\n if (ids.length) {\n const idList = ids.map((id) => `'${id.replace(/'/g, \"''\")}'`).join(', ');\n const rv = new RunView();\n const result = await rv.RunView<MJThemeEntity>({\n EntityName: 'MJ: Themes',\n ExtraFilter: `ID IN (${idList}) AND Status = 'Active'`,\n OrderBy: 'Name',\n ResultType: 'entity_object',\n });\n if (result.Success) {\n this.StarredThemes = result.Results.map((t) => ({\n id: t.ID,\n name: t.Name,\n seeds: t.Seeds,\n swatches: this.swatchesFor(t.Seeds),\n overrides: t.Overrides,\n customCss: t.CustomCSS,\n }));\n }\n }\n } catch {\n /* non-fatal: the list just stays light/dark/system */\n }\n this.cdr.markForCheck();\n }\n\n /** Apply a starred brand theme to the running app and persist it as the user's choice. */\n public async ApplyStarredTheme(t: StarredThemeItem): Promise<void> {\n try {\n this.themeService.RegisterBrandTheme({ id: t.id, name: t.name, seeds: t.seeds, overrides: t.overrides, customCss: t.customCss });\n await this.themeService.ApplyBrandOverlay(t.id);\n await this.themeService.SetSelectedBrandTheme(t.id);\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Unknown error';\n this.sharedService.CreateSimpleNotification(`Could not apply theme: ${msg}`, 'error', 3000);\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n private swatchesFor(seedsJson: string): string[] {\n try {\n const s = JSON.parse(seedsJson) as ThemeSeeds;\n return [s.primary, s.accent ?? s.primary, s.tertiary ?? s.accent ?? s.primary];\n } catch {\n return ['#0076b6', '#38a9d9', '#8b5cf6'];\n }\n }\n\n /**\n * Per-user omnibar opt-in/out. Persists via UserInfoEngine (MJ: User\n * Settings) so the choice follows the user across browsers/devices. The\n * shell reads the same setting on every change-detection pass, so the\n * header affordance and Ctrl+K behavior flip live — no reload needed.\n */\n public async ToggleOmnibar(): Promise<void> {\n if (this.SavingOmnibar) return;\n const next = !this.OmnibarEnabled;\n this.SavingOmnibar = true;\n this.cdr.markForCheck();\n try {\n const saved = await UserInfoEngine.Instance.SetSetting(OMNIBAR_USER_SETTING_KEY, String(next));\n if (saved) {\n this.OmnibarEnabled = next;\n } else {\n this.sharedService.CreateSimpleNotification('Could not save the command palette preference', 'error', 3000);\n }\n } finally {\n this.SavingOmnibar = false;\n this.cdr.markForCheck();\n }\n }\n\n public async ToggleChannel(channel: NotificationChannel): Promise<void> {\n if (channel.saving) return;\n const newState = !channel.enabled;\n channel.saving = true;\n this.cdr.markForCheck();\n\n const provider = this.ProviderToUse;\n const currentUser = provider?.CurrentUser;\n if (!provider || !currentUser) {\n channel.saving = false;\n return;\n }\n\n try {\n const transGroup = await provider.CreateTransactionGroup();\n const types = UserInfoEngine.Instance.NotificationTypes;\n const preferences = UserInfoEngine.Instance.NotificationPreferences;\n\n for (const type of types) {\n if (type.AllowUserPreference === false) continue;\n\n let pref = preferences.find(p => UUIDsEqual(p.NotificationTypeID, type.ID));\n if (!pref) {\n pref = await provider.GetEntityObject<MJUserNotificationPreferenceEntity>(\n 'MJ: User Notification Preferences'\n );\n pref.UserID = currentUser.ID;\n pref.NotificationTypeID = type.ID;\n pref.InAppEnabled = type.DefaultInApp ?? true;\n pref.EmailEnabled = type.DefaultEmail ?? false;\n pref.SMSEnabled = type.DefaultSMS ?? false;\n }\n\n if (channel.key === 'InApp') pref.InAppEnabled = newState;\n else if (channel.key === 'Email') pref.EmailEnabled = newState;\n else pref.SMSEnabled = newState;\n\n pref.Enabled = pref.InAppEnabled || pref.EmailEnabled || pref.SMSEnabled;\n pref.TransactionGroup = transGroup;\n pref.Save();\n }\n\n const success = await transGroup.Submit();\n if (success) {\n channel.enabled = newState;\n this.sharedService.CreateSimpleNotification(\n `${channel.label} notifications ${newState ? 'enabled' : 'disabled'}`,\n 'success',\n 2000\n );\n } else {\n throw new Error('Save failed');\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Unknown error';\n this.sharedService.CreateSimpleNotification(`Update failed: ${msg}`, 'error', 3000);\n await this.loadNotifications();\n } finally {\n channel.saving = false;\n this.cdr.markForCheck();\n }\n }\n\n // ---------- private helpers ----------\n\n private populateIdentity(): void {\n const provider = this.ProviderToUse;\n const user = provider?.CurrentUser;\n if (user) {\n const name = user.Name || `${user.FirstName ?? ''} ${user.LastName ?? ''}`.trim();\n this.UserName = name || 'User';\n this.UserEmail = user.Email || '';\n this.UserInitials = this.computeInitials(this.UserName);\n this.AccountType = user.Type || 'User';\n this.AccountStatus = user.IsActive ? 'Active' : 'Inactive';\n this.MemberSince = this.formatMemberSince(user.__mj_CreatedAt);\n this.RoleChips = this.computeRoleChips(user.UserRoles);\n }\n this.ThemePreference = this.themeService.Preference;\n this.ThemeLabel = this.computeThemeLabel();\n }\n\n private populateThemeOptions(): void {\n const themes: ThemeDefinition[] = this.themeService.AvailableThemes ?? [];\n this.ThemeOptions = themes.map(t => ({\n id: t.Id,\n name: t.Name,\n description: t.Description ?? (t.BaseTheme === 'dark' ? 'Dark interface' : 'Light interface'),\n icon: t.BaseTheme === 'dark' ? 'fa-solid fa-moon' : 'fa-solid fa-sun',\n swatch: t.BaseTheme as 'light' | 'dark'\n }));\n this.ThemeOptions.push({\n id: 'system',\n name: 'System',\n description: 'Follow your operating system',\n icon: 'fa-solid fa-desktop',\n swatch: 'system'\n });\n }\n\n private async loadNotifications(): Promise<void> {\n this.LoadingNotifications = true;\n try {\n this.UnreadCount = UserInfoEngine.Instance.UnreadNotificationCount ?? 0;\n const preferences = UserInfoEngine.Instance.NotificationPreferences;\n const types = UserInfoEngine.Instance.NotificationTypes;\n\n let inApp: boolean, email: boolean, sms: boolean;\n if (preferences.length === 0 && types.length > 0) {\n inApp = types.some(t => t.DefaultInApp ?? true);\n email = types.some(t => t.DefaultEmail ?? false);\n sms = types.some(t => t.DefaultSMS ?? false);\n } else {\n inApp = preferences.some(p => p.InAppEnabled);\n email = preferences.some(p => p.EmailEnabled);\n sms = preferences.some(p => p.SMSEnabled);\n }\n\n this.Channels[0].enabled = inApp;\n this.Channels[1].enabled = email;\n this.Channels[2].enabled = sms;\n } catch {\n // non-fatal; leave defaults\n } finally {\n this.LoadingNotifications = false;\n this.cdr.markForCheck();\n }\n }\n\n private computeInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n\n private computeRoleChips(roles: UserRoleInfo[] | undefined): Array<{ label: string; tone: string; icon: string | null }> {\n if (!roles || roles.length === 0) return [];\n return roles\n .map(r => r.Role)\n .filter((n): n is string => !!n)\n .map(roleName => {\n const lower = roleName.toLowerCase();\n if (lower.includes('admin')) return { label: roleName, tone: 'admin', icon: 'fa-solid fa-shield' };\n if (lower.includes('developer') || lower.includes('integration')) return { label: roleName, tone: 'dev', icon: 'fa-solid fa-code' };\n return { label: roleName, tone: '', icon: null };\n });\n }\n\n private formatMemberSince(date: Date | string | null | undefined): string {\n if (!date) return '';\n const d = date instanceof Date ? date : new Date(date);\n if (isNaN(d.getTime())) return '';\n return d.toLocaleDateString(undefined, { month: 'short', year: 'numeric' });\n }\n\n private computeThemeLabel(): string {\n const applied = this.themeService.AppliedTheme;\n const preference = this.themeService.Preference;\n const def = this.themeService.GetThemeDefinition(applied);\n const themeName = def?.Name ?? applied;\n return preference === 'system' ? `${themeName} · System` : themeName;\n }\n}\n"]}
1
+ {"version":3,"file":"profile-dialog.component.js","sourceRoot":"","sources":["../../../src/lib/profile/profile-dialog.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ChangeDetectorRef,\n inject\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RunView, UserRoleInfo } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport {\n MJThemeEntity,\n MJUserNotificationPreferenceEntity,\n UserInfoEngine\n} from '@memberjunction/core-entities';\nimport { MJAuthBase } from '@memberjunction/ng-auth-services';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { ThemeService, SharedService, ThemeDefinition } from '@memberjunction/ng-shared';\nimport type { ThemeSeeds } from '@memberjunction/theme-engine';\nimport { ExplorerSettingsModule } from '@memberjunction/ng-explorer-settings';\nimport { IsOmnibarAvailable, IsOmnibarEnabledForUser, OMNIBAR_USER_SETTING_KEY } from '../omnibar/omnibar-user-setting';\nimport { GetOmnibarShortcutLabel } from '../omnibar/omnibar-shortcut';\nimport { Subscription } from 'rxjs';\n\ninterface NotificationChannel {\n key: 'InApp' | 'Email' | 'SMS';\n label: string;\n icon: string;\n enabled: boolean;\n saving: boolean;\n}\n\ninterface StarredThemeItem {\n id: string;\n name: string;\n seeds: string;\n swatches: string[];\n overrides: string | null;\n customCss: string | null;\n}\n\ntype ProfilePanel = 'none' | 'photo' | 'theme';\n\n/**\n * \"Identity Card\" profile dialog with slide-in detail panels for editing\n * profile photo and switching theme. Replaces the legacy multi-tab Settings\n * dialog entirely. Brand-aligned with the About dialog.\n */\n@Component({\n selector: 'mj-profile-dialog',\n standalone: true,\n imports: [CommonModule, ExplorerSettingsModule],\n template: `\n<div class=\"mj-profile\" [class.mj-profile--panel-open]=\"ActivePanel !== 'none'\" role=\"document\">\n <button class=\"mj-profile__close\" type=\"button\" aria-label=\"Close\" (click)=\"OnCloseClick()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n\n <!-- ===== MAIN VIEW ===== -->\n <div class=\"mj-profile__main\">\n <div class=\"mj-profile__hero\">\n <h3 class=\"mj-profile__hero-title\">My Profile</h3>\n </div>\n\n <div class=\"mj-profile__avatar-zone\">\n @if (AvatarUrl) {\n <img class=\"mj-profile__avatar mj-profile__avatar--img\"\n [src]=\"AvatarUrl\" alt=\"\" (error)=\"OnAvatarLoadError()\" />\n } @else if (AvatarIconClass) {\n <div class=\"mj-profile__avatar mj-profile__avatar--icon\">\n <i [class]=\"AvatarIconClass\"></i>\n </div>\n } @else {\n <div class=\"mj-profile__avatar\">{{ UserInitials }}</div>\n }\n <button class=\"mj-profile__avatar-edit\" type=\"button\" title=\"Change photo\"\n (click)=\"OpenPanel('photo')\">\n <i class=\"fa-solid fa-camera\"></i>\n </button>\n </div>\n\n <div class=\"mj-profile__identity\">\n <h2 class=\"mj-profile__name\">{{ UserName }}</h2>\n <p class=\"mj-profile__email\">{{ UserEmail }}</p>\n @if (RoleChips.length > 0) {\n <div class=\"mj-profile__chips\">\n @for (chip of RoleChips; track chip.label) {\n <span class=\"mj-profile__chip\" [class]=\"'mj-profile__chip--' + chip.tone\">\n @if (chip.icon) { <i [class]=\"chip.icon\"></i> }\n {{ chip.label }}\n </span>\n }\n </div>\n }\n </div>\n\n <!-- The one scroll region: hero, avatar, identity and footer stay put; only the settings rows scroll. -->\n <div class=\"mj-profile__scroll\">\n <div class=\"mj-profile__field-list\">\n <div class=\"mj-profile__field\">\n <div class=\"mj-profile__field-icon\"><i class=\"fa-solid fa-id-badge\"></i></div>\n <div class=\"mj-profile__field-body\">\n <div class=\"mj-profile__field-label\">Account</div>\n <div class=\"mj-profile__field-value\">\n {{ AccountType }} · {{ AccountStatus }}\n @if (MemberSince) {\n <span class=\"mj-profile__field-muted\"> · {{ MemberSince }}</span>\n }\n </div>\n </div>\n </div>\n\n <button class=\"mj-profile__field mj-profile__field--button\" type=\"button\" (click)=\"OpenPanel('theme')\">\n <div class=\"mj-profile__field-icon\"><i class=\"fa-solid fa-palette\"></i></div>\n <div class=\"mj-profile__field-body\">\n <div class=\"mj-profile__field-label\">Theme</div>\n <div class=\"mj-profile__field-value\">{{ ThemeLabel }}</div>\n </div>\n <i class=\"fa-solid fa-chevron-right mj-profile__field-chev\"></i>\n </button>\n </div>\n\n @if (OmnibarAvailable) {\n <div class=\"mj-profile__section\">\n <div class=\"mj-profile__section-head\">\n <h4>Command Palette</h4>\n </div>\n <div class=\"mj-profile__channels\">\n <button type=\"button\"\n class=\"mj-profile__channel\"\n data-testid=\"omnibar-toggle\"\n [class.mj-profile__channel--on]=\"OmnibarEnabled\"\n [disabled]=\"SavingOmnibar\"\n (click)=\"ToggleOmnibar()\">\n <div class=\"mj-profile__channel-icon\"><i class=\"fa-solid fa-magnifying-glass\"></i></div>\n <div class=\"mj-profile__channel-label\">\n Unified command palette\n <div class=\"mj-profile__channel-hint\">{{ OmnibarShortcutLabel }} — search, records, agents &amp; commands in one bar</div>\n </div>\n <div class=\"mj-profile__channel-state\">\n @if (SavingOmnibar) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n <span class=\"mj-profile__switch\" [class.mj-profile__switch--on]=\"OmnibarEnabled\">\n <span class=\"mj-profile__switch-knob\"></span>\n </span>\n }\n </div>\n </button>\n </div>\n </div>\n }\n\n <div class=\"mj-profile__section\">\n <div class=\"mj-profile__section-head\">\n <h4>Notifications</h4>\n @if (UnreadCount > 0) {\n <span class=\"mj-profile__unread\">{{ UnreadCount }} unread</span>\n }\n </div>\n @if (LoadingNotifications) {\n <div class=\"mj-profile__channels-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading…\n </div>\n } @else {\n <div class=\"mj-profile__channels\">\n @for (ch of Channels; track ch.key) {\n <button type=\"button\"\n class=\"mj-profile__channel\"\n [class.mj-profile__channel--on]=\"ch.enabled\"\n [disabled]=\"ch.saving\"\n (click)=\"ToggleChannel(ch)\">\n <div class=\"mj-profile__channel-icon\"><i [class]=\"ch.icon\"></i></div>\n <div class=\"mj-profile__channel-label\">{{ ch.label }}</div>\n <div class=\"mj-profile__channel-state\">\n @if (ch.saving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n <span class=\"mj-profile__switch\" [class.mj-profile__switch--on]=\"ch.enabled\">\n <span class=\"mj-profile__switch-knob\"></span>\n </span>\n }\n </div>\n </button>\n }\n </div>\n }\n </div>\n </div>\n\n <div class=\"mj-profile__footer\">\n <button class=\"mj-profile__btn mj-profile__btn--danger\" type=\"button\" (click)=\"OnSignOut()\">\n <i class=\"fa-solid fa-arrow-right-from-bracket\"></i>\n Sign out\n </button>\n <span class=\"mj-profile__spacer\"></span>\n <button class=\"mj-profile__btn mj-profile__btn--primary\" type=\"button\" (click)=\"OnCloseClick()\">\n Done\n </button>\n </div>\n </div>\n\n <!-- ===== SLIDE-IN PANEL ===== -->\n <div class=\"mj-profile__panel\" [class.mj-profile__panel--open]=\"ActivePanel !== 'none'\">\n <div class=\"mj-profile__panel-header\">\n <button class=\"mj-profile__panel-back\" type=\"button\" aria-label=\"Back\" (click)=\"ClosePanel()\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n </button>\n <h3 class=\"mj-profile__panel-title\">{{ PanelTitle }}</h3>\n </div>\n <div class=\"mj-profile__panel-body\">\n @if (ActivePanel === 'photo') {\n <mj-user-profile-settings></mj-user-profile-settings>\n } @else if (ActivePanel === 'theme') {\n <div class=\"mj-profile__themes\">\n @for (theme of ThemeOptions; track theme.id) {\n <button type=\"button\"\n class=\"mj-profile__theme\"\n [class.mj-profile__theme--active]=\"theme.id === ThemePreference\"\n [class.mj-profile__theme--saving]=\"SavingTheme === theme.id\"\n [disabled]=\"!!SavingTheme\"\n (click)=\"SelectTheme(theme.id)\">\n <div class=\"mj-profile__theme-swatch\" [class]=\"'mj-profile__theme-swatch--' + theme.swatch\">\n <i [class]=\"theme.icon\"></i>\n </div>\n <div class=\"mj-profile__theme-info\">\n <div class=\"mj-profile__theme-name\">{{ theme.name }}</div>\n @if (theme.description) {\n <div class=\"mj-profile__theme-desc\">{{ theme.description }}</div>\n }\n </div>\n @if (SavingTheme === theme.id) {\n <i class=\"fa-solid fa-spinner fa-spin mj-profile__theme-check\"></i>\n } @else if (theme.id === ThemePreference) {\n <i class=\"fa-solid fa-check mj-profile__theme-check\"></i>\n }\n </button>\n }\n @if (StarredThemes.length) {\n <div class=\"mj-profile__theme-sep\">Brand themes</div>\n @for (t of StarredThemes; track t.id) {\n <button type=\"button\"\n class=\"mj-profile__theme\"\n [class.mj-profile__theme--active]=\"IsAppliedBrand(t.id)\"\n (click)=\"ApplyStarredTheme(t)\">\n <div class=\"mj-profile__theme-swatch mj-profile__brand-swatch\">\n @for (c of t.swatches; track $index) { <i [style.background]=\"c\"></i> }\n </div>\n <div class=\"mj-profile__theme-info\">\n <div class=\"mj-profile__theme-name\">{{ t.name }}</div>\n </div>\n @if (IsAppliedBrand(t.id)) {\n <i class=\"fa-solid fa-check mj-profile__theme-check\"></i>\n }\n </button>\n }\n }\n </div>\n }\n </div>\n </div>\n</div>\n `,\n styles: [`\n:host {\n display: block;\n width: 100%;\n height: 100%;\n}\n/* A flex column, so the dialog's height bound reaches the one scroll region inside the card.\n\n ProfileDialogService opens the dialog with a width and no height, so .mj-dialog-container is\n height:auto with max-height:90vh, and every box between it and this card is a shrinkable flex item\n (.mj-dialog-body and the host div inside it, both min-height:0). That chain already bounds the card\n at 90vh. What it could not bound was .mj-profile__main: while this element was display:block,\n __main's height:100% had nothing definite to resolve against, so it computed to auto, grew to its\n full content, and overflow:hidden here clipped the bottom of the card -- notification channels,\n footer, Sign out -- with nothing left to scroll. The same shape #4351 fixed for the user menu, one\n layer out.\n\n The flex chain is the fix: display:flex here, flex:1 + min-height:0 on __main, and flex:1 +\n min-height:0 + overflow-y:auto on __scroll. Flex hands the bounded height down; a percentage could\n not. Do not trade it for a max-height -- a max-height gives no child percentage a definite size to\n resolve against, so the clip would come back.\n\n max-height:100dvh (100vh first, for engines without dvh) is only a backstop. On desktop it never\n binds: the container's 90vh is tighter. It can bind on a phone (<768px wide), where the dialog\n forces the container to height:100vh and a mobile browser's dynamic toolbar can make 100dvh\n shorter. A max-height can only shorten the card, so there it can only lift the footer, never\n push it down. */\n.mj-profile {\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n height: 100%;\n max-height: 100vh;\n max-height: 100dvh;\n min-height: 0;\n position: relative;\n font-family: inherit;\n overflow: hidden;\n}\n.mj-profile__close {\n position: absolute;\n top: 12px; right: 12px;\n width: 36px; height: 36px;\n border: none; border-radius: 8px;\n background: rgba(255, 255, 255, 0.18);\n backdrop-filter: blur(8px);\n color: #fff;\n cursor: pointer;\n font-size: 16px;\n display: flex; align-items: center; justify-content: center;\n transition: background 0.15s, opacity 0.2s;\n z-index: 4;\n}\n.mj-profile__close:hover { background: rgba(255, 255, 255, 0.3); }\n.mj-profile--panel-open .mj-profile__close { opacity: 0; pointer-events: none; }\n\n/* ============ MAIN VIEW ============ */\n/* flex:1 with min-height:0 rather than height:100%: the card is a flex column, so this takes the\n card's bounded height, and min-height:0 lets it shrink below its content -- without it a flex\n item's automatic minimum size refuses to, and __scroll would never be short enough to scroll. */\n.mj-profile__main {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n transition: transform 0.32s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.mj-profile--panel-open .mj-profile__main {\n transform: translateX(-12%);\n pointer-events: none;\n}\n\n.mj-profile__hero {\n background: linear-gradient(135deg, #264FAF 0%, #0076b6 100%);\n color: #fff;\n padding: 22px 24px 56px;\n position: relative;\n overflow: hidden;\n flex-shrink: 0;\n}\n.mj-profile__hero::before {\n content: '';\n position: absolute;\n inset: -50%;\n background: radial-gradient(circle, rgba(255, 255, 255, 0.10) 0%, transparent 60%);\n animation: mj-profile-rotate 24s linear infinite;\n pointer-events: none;\n}\n@media (prefers-reduced-motion: reduce) {\n .mj-profile__hero::before { animation: none; }\n}\n@keyframes mj-profile-rotate { to { transform: rotate(360deg); } }\n\n.mj-profile__hero-title {\n margin: 0;\n font-size: 12px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 1.2px;\n opacity: 0.85;\n position: relative;\n z-index: 1;\n}\n\n.mj-profile__avatar-zone {\n position: relative;\n width: 96px;\n height: 96px;\n margin: -48px auto 12px;\n z-index: 2;\n}\n.mj-profile__avatar {\n width: 96px;\n height: 96px;\n border-radius: 50%;\n background: linear-gradient(135deg, #264FAF 0%, #0076b6 100%);\n color: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 32px;\n font-weight: 700;\n border: 4px solid var(--mj-bg-surface);\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.18);\n object-fit: cover;\n overflow: hidden;\n}\nimg.mj-profile__avatar { background: var(--mj-bg-surface-card); }\n.mj-profile__avatar--icon i { font-size: 36px; }\n\n.mj-profile__avatar-edit {\n position: absolute;\n bottom: 2px; right: 2px;\n width: 30px; height: 30px;\n border-radius: 50%;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border: 2px solid var(--mj-bg-surface);\n cursor: pointer;\n display: flex; align-items: center; justify-content: center;\n font-size: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.18);\n transition: transform 0.15s;\n}\n.mj-profile__avatar-edit:hover { transform: scale(1.1); }\n\n.mj-profile__identity {\n text-align: center;\n padding: 0 24px 16px;\n flex-shrink: 0;\n}\n.mj-profile__name {\n margin: 0 0 4px;\n font-size: 22px;\n font-weight: 700;\n letter-spacing: -0.4px;\n color: var(--mj-text-primary);\n}\n.mj-profile__email {\n margin: 0 0 12px;\n color: var(--mj-text-muted);\n font-size: 13px;\n word-break: break-all;\n}\n.mj-profile__chips {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n justify-content: center;\n}\n.mj-profile__chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 9px;\n border-radius: 100px;\n font-size: 11px;\n font-weight: 600;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n color: var(--mj-brand-primary);\n}\n.mj-profile__chip--admin {\n background: color-mix(in srgb, #f59e0b 14%, transparent);\n color: #b45309;\n}\n.mj-profile__chip--dev {\n background: color-mix(in srgb, #10b981 14%, transparent);\n color: #047857;\n}\n\n/* The only flex-grow and the only scroller in __main. Hero, avatar, identity and footer hold their\n size; this takes whatever height they leave and scrolls the settings rows inside it. One region,\n not one per section: peer scrollers split the leftover height between them and each shrinks to\n its own padding on a short window. */\n.mj-profile__scroll {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n}\n\n.mj-profile__field-list {\n padding: 0 24px;\n}\n.mj-profile__field {\n display: flex;\n align-items: center;\n padding: 12px 0;\n gap: 14px;\n border-top: 1px solid var(--mj-border-subtle);\n width: 100%;\n text-align: left;\n background: transparent;\n border-left: none;\n border-right: none;\n border-bottom: none;\n font-family: inherit;\n color: inherit;\n}\n.mj-profile__field:first-child { border-top: none; }\n.mj-profile__field--button {\n cursor: pointer;\n transition: background 0.12s;\n margin: 0 -8px;\n padding-left: 8px;\n padding-right: 8px;\n border-radius: 8px;\n border-top: none;\n}\n.mj-profile__field--button + .mj-profile__field--button { margin-top: 0; }\n.mj-profile__field--button:hover { background: var(--mj-bg-surface-hover); }\n.mj-profile__field--button:hover .mj-profile__field-chev { color: var(--mj-brand-primary); }\n.mj-profile__field-icon {\n width: 32px; height: 32px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n flex-shrink: 0;\n}\n.mj-profile__field-body { flex: 1; min-width: 0; }\n.mj-profile__field-label {\n font-size: 10.5px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n font-weight: 600;\n letter-spacing: 0.5px;\n}\n.mj-profile__field-value {\n font-size: 13px;\n color: var(--mj-text-primary);\n margin-top: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.mj-profile__field-muted { color: var(--mj-text-muted); }\n.mj-profile__field-chev {\n color: var(--mj-text-muted);\n font-size: 11px;\n transition: color 0.15s;\n}\n\n.mj-profile__section {\n padding: 16px 24px 8px;\n}\n.mj-profile__section-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 10px;\n}\n.mj-profile__section-head h4 {\n margin: 0;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.6px;\n}\n.mj-profile__unread {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n padding: 2px 8px;\n border-radius: 100px;\n}\n.mj-profile__channels-loading {\n color: var(--mj-text-muted);\n font-size: 12.5px;\n padding: 12px;\n text-align: center;\n}\n.mj-profile__channels {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.mj-profile__channel {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.15s;\n font-family: inherit;\n text-align: left;\n width: 100%;\n}\n.mj-profile__channel:hover:not(:disabled) {\n border-color: var(--mj-border-default);\n background: var(--mj-bg-surface-hover);\n}\n.mj-profile__channel:disabled { cursor: wait; opacity: 0.7; }\n.mj-profile__channel-icon {\n width: 32px; height: 32px;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n display: flex; align-items: center; justify-content: center;\n font-size: 13px;\n flex-shrink: 0;\n transition: all 0.15s;\n}\n.mj-profile__channel--on .mj-profile__channel-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n color: var(--mj-brand-primary);\n}\n.mj-profile__channel-label {\n flex: 1;\n font-size: 13.5px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n.mj-profile__channel-hint {\n font-size: 11.5px;\n font-weight: 400;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n.mj-profile__channel-state {\n flex-shrink: 0;\n color: var(--mj-text-muted);\n font-size: 13px;\n min-width: 36px;\n display: flex; justify-content: flex-end; align-items: center;\n}\n\n.mj-profile__switch {\n width: 36px;\n height: 20px;\n background: var(--mj-border-strong);\n border-radius: 100px;\n position: relative;\n transition: background 0.2s;\n display: inline-block;\n}\n.mj-profile__switch-knob {\n position: absolute;\n top: 2px; left: 2px;\n width: 16px; height: 16px;\n background: white;\n border-radius: 50%;\n transition: transform 0.2s;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);\n}\n.mj-profile__switch--on { background: var(--mj-brand-primary); }\n.mj-profile__switch--on .mj-profile__switch-knob { transform: translateX(16px); }\n\n.mj-profile__footer {\n border-top: 1px solid var(--mj-border-subtle);\n padding: 14px 20px;\n display: flex;\n gap: 8px;\n align-items: center;\n flex-shrink: 0;\n}\n.mj-profile__spacer { flex: 1; }\n.mj-profile__btn {\n padding: 9px 16px;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n font-family: inherit;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n transition: all 0.15s;\n}\n.mj-profile__btn:hover { background: var(--mj-bg-surface-hover); border-color: var(--mj-border-strong); }\n.mj-profile__btn--primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n.mj-profile__btn--primary:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 88%, black);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 88%, black);\n}\n.mj-profile__btn--danger {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-border-default));\n}\n.mj-profile__btn--danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 8%, transparent);\n border-color: var(--mj-status-error);\n}\n\n/* ============ SLIDE-IN PANEL ============ */\n.mj-profile__panel {\n position: absolute;\n inset: 0;\n background: var(--mj-bg-surface);\n transform: translateX(100%);\n transition: transform 0.32s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n flex-direction: column;\n z-index: 3;\n}\n.mj-profile__panel--open {\n transform: translateX(0);\n box-shadow: -8px 0 24px rgba(0, 0, 0, 0.06);\n}\n.mj-profile__panel-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 18px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n}\n.mj-profile__panel-back {\n width: 34px; height: 34px;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n display: flex; align-items: center; justify-content: center;\n font-size: 13px;\n transition: all 0.15s;\n font-family: inherit;\n}\n.mj-profile__panel-back:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n.mj-profile__panel-title {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n letter-spacing: -0.2px;\n}\n.mj-profile__panel-body {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 16px 20px 20px;\n}\n\n/* Theme picker */\n.mj-profile__themes {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.mj-profile__theme {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 12px 14px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.15s;\n text-align: left;\n width: 100%;\n font-family: inherit;\n}\n.mj-profile__theme:hover:not(:disabled) {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-hover);\n}\n.mj-profile__theme:disabled { cursor: wait; opacity: 0.7; }\n.mj-profile__theme--active {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface-card));\n}\n.mj-profile__theme-swatch {\n width: 40px; height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n flex-shrink: 0;\n border: 1px solid var(--mj-border-default);\n}\n.mj-profile__theme-swatch--light {\n background: linear-gradient(135deg, #ffffff 0%, #f1f5f9 100%);\n color: #f59e0b;\n}\n.mj-profile__theme-swatch--dark {\n background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%);\n color: #94a3b8;\n border-color: #334155;\n}\n.mj-profile__theme-swatch--system {\n background: linear-gradient(135deg, #ffffff 0%, #ffffff 49%, #1e293b 51%, #0f172a 100%);\n color: var(--mj-text-secondary);\n}\n.mj-profile__theme-info { flex: 1; min-width: 0; }\n.mj-profile__theme-name {\n font-size: 13.5px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.mj-profile__theme-desc {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.mj-profile__theme-check {\n color: var(--mj-brand-primary);\n font-size: 14px;\n flex-shrink: 0;\n}\n\n/* Starred brand themes shown inline in the theme list */\n.mj-profile__theme-sep {\n font-size: 11px; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase;\n color: var(--mj-text-muted); padding: 6px 4px 2px; margin-top: 6px;\n}\n.mj-profile__brand-swatch {\n display: flex; align-items: center; justify-content: center; overflow: hidden; padding: 0;\n}\n.mj-profile__brand-swatch i {\n width: 33%; height: 100%; display: block;\n}\n\n@media (max-width: 480px) {\n .mj-profile__hero { padding: 20px 18px 48px; }\n .mj-profile__avatar-zone { width: 88px; height: 88px; margin-top: -44px; }\n .mj-profile__avatar { width: 88px; height: 88px; font-size: 28px; }\n .mj-profile__name { font-size: 19px; }\n .mj-profile__field-list,\n .mj-profile__section { padding-left: 18px; padding-right: 18px; }\n .mj-profile__footer { padding: 12px 16px; }\n .mj-profile--panel-open .mj-profile__main { transform: translateX(-20%); }\n .mj-profile__panel-body { padding: 14px 16px 16px; }\n}\n `]\n})\nexport class ProfileDialogComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n @Output() CloseRequested = new EventEmitter<void>();\n\n @Input() AvatarUrl: string | null = null;\n @Input() AvatarIconClass: string | null = null;\n\n public UserName = '';\n public UserEmail = '';\n public UserInitials = '?';\n public AccountType = '';\n public AccountStatus = '';\n public MemberSince = '';\n public ThemeLabel = '';\n public RoleChips: Array<{ label: string; tone: string; icon: string | null }> = [];\n\n public LoadingNotifications = true;\n public Channels: NotificationChannel[] = [\n { key: 'InApp', label: 'In-app', icon: 'fa-solid fa-bell', enabled: false, saving: false },\n { key: 'Email', label: 'Email', icon: 'fa-solid fa-envelope', enabled: false, saving: false },\n { key: 'SMS', label: 'SMS', icon: 'fa-solid fa-mobile', enabled: false, saving: false }\n ];\n public UnreadCount = 0;\n\n // Omnibar per-user opt-in (shown only when the instance makes it available)\n public OmnibarAvailable = false;\n public OmnibarEnabled = false;\n public SavingOmnibar = false;\n\n /** Platform-correct summon-shortcut label ('⌘K' on Mac, 'Ctrl+K' elsewhere). */\n public get OmnibarShortcutLabel(): string {\n return GetOmnibarShortcutLabel();\n }\n\n // Slide-in panel state\n public ActivePanel: ProfilePanel = 'none';\n public ThemeOptions: Array<{ id: string; name: string; description: string; icon: string; swatch: 'light' | 'dark' | 'system' }> = [];\n public ThemePreference = '';\n public SavingTheme: string | null = null;\n\n // Starred brand themes shown inline in the theme list\n public StarredThemes: StarredThemeItem[] = [];\n public get AppliedBrandId(): string | null {\n return this.themeService.BrandOverlayId;\n }\n\n /** Whether a theme id is the applied brand overlay (case-insensitive GUID compare). */\n public IsAppliedBrand(id: string): boolean {\n const active = this.themeService.BrandOverlayId;\n return !!active && UUIDsEqual(id, active);\n }\n\n public get PanelTitle(): string {\n switch (this.ActivePanel) {\n case 'photo': return 'Profile photo';\n case 'theme': return 'Theme';\n default: return '';\n }\n }\n\n private authBase = inject(MJAuthBase);\n private themeService = inject(ThemeService);\n private sharedService = inject(SharedService);\n private cdr = inject(ChangeDetectorRef);\n\n private themeSub?: Subscription;\n\n public ngOnInit(): void {\n this.populateIdentity();\n this.populateThemeOptions();\n this.loadNotifications();\n this.OmnibarAvailable = IsOmnibarAvailable();\n this.OmnibarEnabled = IsOmnibarEnabledForUser();\n this.themeSub = this.themeService.Preference$.subscribe(pref => {\n this.ThemePreference = pref;\n this.ThemeLabel = this.computeThemeLabel();\n this.cdr.markForCheck();\n });\n }\n\n public ngOnDestroy(): void {\n this.themeSub?.unsubscribe();\n }\n\n public OnCloseClick(): void {\n if (this.ActivePanel !== 'none') {\n this.ClosePanel();\n return;\n }\n this.CloseRequested.emit();\n }\n\n public OnAvatarLoadError(): void {\n this.AvatarUrl = null;\n this.cdr.markForCheck();\n }\n\n public OpenPanel(panel: ProfilePanel): void {\n this.ActivePanel = panel;\n if (panel === 'theme') {\n this.loadStarredThemes();\n }\n }\n\n public ClosePanel(): void {\n this.ActivePanel = 'none';\n }\n\n public async OnSignOut(): Promise<void> {\n try {\n localStorage.removeItem('auth');\n localStorage.removeItem('claims');\n await this.authBase.logout();\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Unknown error';\n this.sharedService.CreateSimpleNotification(`Sign out failed: ${msg}`, 'error', 3000);\n }\n }\n\n public async SelectTheme(themeId: string): Promise<void> {\n if (this.SavingTheme) return;\n if (themeId === this.ThemePreference) return;\n this.SavingTheme = themeId;\n this.cdr.markForCheck();\n try {\n await this.themeService.SetTheme(themeId);\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Unknown error';\n this.sharedService.CreateSimpleNotification(`Theme change failed: ${msg}`, 'error', 3000);\n } finally {\n this.SavingTheme = null;\n this.cdr.markForCheck();\n }\n }\n\n // ========================================\n // Starred brand themes\n // ========================================\n\n /** Load the user's starred brand themes to show inline in the theme list. */\n private async loadStarredThemes(): Promise<void> {\n this.StarredThemes = [];\n try {\n const ids = this.themeService.GetStarredThemeIds();\n if (ids.length) {\n const idList = ids.map((id) => `'${id.replace(/'/g, \"''\")}'`).join(', ');\n const rv = new RunView();\n const result = await rv.RunView<MJThemeEntity>({\n EntityName: 'MJ: Themes',\n ExtraFilter: `ID IN (${idList}) AND Status = 'Active'`,\n OrderBy: 'Name',\n ResultType: 'entity_object',\n });\n if (result.Success) {\n this.StarredThemes = result.Results.map((t) => ({\n id: t.ID,\n name: t.Name,\n seeds: t.Seeds,\n swatches: this.swatchesFor(t.Seeds),\n overrides: t.Overrides,\n customCss: t.CustomCSS,\n }));\n }\n }\n } catch {\n /* non-fatal: the list just stays light/dark/system */\n }\n this.cdr.markForCheck();\n }\n\n /** Apply a starred brand theme to the running app and persist it as the user's choice. */\n public async ApplyStarredTheme(t: StarredThemeItem): Promise<void> {\n try {\n this.themeService.RegisterBrandTheme({ id: t.id, name: t.name, seeds: t.seeds, overrides: t.overrides, customCss: t.customCss });\n await this.themeService.ApplyBrandOverlay(t.id);\n await this.themeService.SetSelectedBrandTheme(t.id);\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Unknown error';\n this.sharedService.CreateSimpleNotification(`Could not apply theme: ${msg}`, 'error', 3000);\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n private swatchesFor(seedsJson: string): string[] {\n try {\n const s = JSON.parse(seedsJson) as ThemeSeeds;\n return [s.primary, s.accent ?? s.primary, s.tertiary ?? s.accent ?? s.primary];\n } catch {\n return ['#0076b6', '#38a9d9', '#8b5cf6'];\n }\n }\n\n /**\n * Per-user omnibar opt-in/out. Persists via UserInfoEngine (MJ: User\n * Settings) so the choice follows the user across browsers/devices. The\n * shell reads the same setting on every change-detection pass, so the\n * header affordance and Ctrl+K behavior flip live — no reload needed.\n */\n public async ToggleOmnibar(): Promise<void> {\n if (this.SavingOmnibar) return;\n const next = !this.OmnibarEnabled;\n this.SavingOmnibar = true;\n this.cdr.markForCheck();\n try {\n const saved = await UserInfoEngine.Instance.SetSetting(OMNIBAR_USER_SETTING_KEY, String(next));\n if (saved) {\n this.OmnibarEnabled = next;\n } else {\n this.sharedService.CreateSimpleNotification('Could not save the command palette preference', 'error', 3000);\n }\n } finally {\n this.SavingOmnibar = false;\n this.cdr.markForCheck();\n }\n }\n\n public async ToggleChannel(channel: NotificationChannel): Promise<void> {\n if (channel.saving) return;\n const newState = !channel.enabled;\n channel.saving = true;\n this.cdr.markForCheck();\n\n const provider = this.ProviderToUse;\n const currentUser = provider?.CurrentUser;\n if (!provider || !currentUser) {\n channel.saving = false;\n return;\n }\n\n try {\n const transGroup = await provider.CreateTransactionGroup();\n const types = UserInfoEngine.Instance.NotificationTypes;\n const preferences = UserInfoEngine.Instance.NotificationPreferences;\n\n for (const type of types) {\n if (type.AllowUserPreference === false) continue;\n\n let pref = preferences.find(p => UUIDsEqual(p.NotificationTypeID, type.ID));\n if (!pref) {\n pref = await provider.GetEntityObject<MJUserNotificationPreferenceEntity>(\n 'MJ: User Notification Preferences'\n );\n pref.UserID = currentUser.ID;\n pref.NotificationTypeID = type.ID;\n pref.InAppEnabled = type.DefaultInApp ?? true;\n pref.EmailEnabled = type.DefaultEmail ?? false;\n pref.SMSEnabled = type.DefaultSMS ?? false;\n }\n\n if (channel.key === 'InApp') pref.InAppEnabled = newState;\n else if (channel.key === 'Email') pref.EmailEnabled = newState;\n else pref.SMSEnabled = newState;\n\n pref.Enabled = pref.InAppEnabled || pref.EmailEnabled || pref.SMSEnabled;\n pref.TransactionGroup = transGroup;\n pref.Save();\n }\n\n const success = await transGroup.Submit();\n if (success) {\n channel.enabled = newState;\n this.sharedService.CreateSimpleNotification(\n `${channel.label} notifications ${newState ? 'enabled' : 'disabled'}`,\n 'success',\n 2000\n );\n } else {\n throw new Error('Save failed');\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Unknown error';\n this.sharedService.CreateSimpleNotification(`Update failed: ${msg}`, 'error', 3000);\n await this.loadNotifications();\n } finally {\n channel.saving = false;\n this.cdr.markForCheck();\n }\n }\n\n // ---------- private helpers ----------\n\n private populateIdentity(): void {\n const provider = this.ProviderToUse;\n const user = provider?.CurrentUser;\n if (user) {\n const name = user.Name || `${user.FirstName ?? ''} ${user.LastName ?? ''}`.trim();\n this.UserName = name || 'User';\n this.UserEmail = user.Email || '';\n this.UserInitials = this.computeInitials(this.UserName);\n this.AccountType = user.Type || 'User';\n this.AccountStatus = user.IsActive ? 'Active' : 'Inactive';\n this.MemberSince = this.formatMemberSince(user.__mj_CreatedAt);\n this.RoleChips = this.computeRoleChips(user.UserRoles);\n }\n this.ThemePreference = this.themeService.Preference;\n this.ThemeLabel = this.computeThemeLabel();\n }\n\n private populateThemeOptions(): void {\n const themes: ThemeDefinition[] = this.themeService.AvailableThemes ?? [];\n this.ThemeOptions = themes.map(t => ({\n id: t.Id,\n name: t.Name,\n description: t.Description ?? (t.BaseTheme === 'dark' ? 'Dark interface' : 'Light interface'),\n icon: t.BaseTheme === 'dark' ? 'fa-solid fa-moon' : 'fa-solid fa-sun',\n swatch: t.BaseTheme as 'light' | 'dark'\n }));\n this.ThemeOptions.push({\n id: 'system',\n name: 'System',\n description: 'Follow your operating system',\n icon: 'fa-solid fa-desktop',\n swatch: 'system'\n });\n }\n\n private async loadNotifications(): Promise<void> {\n this.LoadingNotifications = true;\n try {\n this.UnreadCount = UserInfoEngine.Instance.UnreadNotificationCount ?? 0;\n const preferences = UserInfoEngine.Instance.NotificationPreferences;\n const types = UserInfoEngine.Instance.NotificationTypes;\n\n let inApp: boolean, email: boolean, sms: boolean;\n if (preferences.length === 0 && types.length > 0) {\n inApp = types.some(t => t.DefaultInApp ?? true);\n email = types.some(t => t.DefaultEmail ?? false);\n sms = types.some(t => t.DefaultSMS ?? false);\n } else {\n inApp = preferences.some(p => p.InAppEnabled);\n email = preferences.some(p => p.EmailEnabled);\n sms = preferences.some(p => p.SMSEnabled);\n }\n\n this.Channels[0].enabled = inApp;\n this.Channels[1].enabled = email;\n this.Channels[2].enabled = sms;\n } catch {\n // non-fatal; leave defaults\n } finally {\n this.LoadingNotifications = false;\n this.cdr.markForCheck();\n }\n }\n\n private computeInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n\n private computeRoleChips(roles: UserRoleInfo[] | undefined): Array<{ label: string; tone: string; icon: string | null }> {\n if (!roles || roles.length === 0) return [];\n return roles\n .map(r => r.Role)\n .filter((n): n is string => !!n)\n .map(roleName => {\n const lower = roleName.toLowerCase();\n if (lower.includes('admin')) return { label: roleName, tone: 'admin', icon: 'fa-solid fa-shield' };\n if (lower.includes('developer') || lower.includes('integration')) return { label: roleName, tone: 'dev', icon: 'fa-solid fa-code' };\n return { label: roleName, tone: '', icon: null };\n });\n }\n\n private formatMemberSince(date: Date | string | null | undefined): string {\n if (!date) return '';\n const d = date instanceof Date ? date : new Date(date);\n if (isNaN(d.getTime())) return '';\n return d.toLocaleDateString(undefined, { month: 'short', year: 'numeric' });\n }\n\n private computeThemeLabel(): string {\n const applied = this.themeService.AppliedTheme;\n const preference = this.themeService.Preference;\n const def = this.themeService.GetThemeDefinition(applied);\n const themeName = def?.Name ?? applied;\n return preference === 'system' ? `${themeName} · System` : themeName;\n }\n}\n"]}
@@ -15,19 +15,37 @@ export declare class ArtifactResource extends BaseResourceComponent {
15
15
  * Confirms with the user, then routes to Create or Modify depending on
16
16
  * whether an Active override already exists for this entity+user.
17
17
  */
18
+ OnApplyFormRequested(event: {
19
+ spec: unknown;
20
+ entityName: string;
21
+ }): Promise<void>;
22
+ /** @deprecated Use {@link OnApplyFormRequested}. */
18
23
  onApplyFormRequested(event: {
19
24
  spec: unknown;
20
25
  entityName: string;
21
26
  }): Promise<void>;
22
- currentUser: UserInfo | null;
27
+ CurrentUser: UserInfo | null;
28
+ /** @deprecated Use {@link CurrentUser}. */
29
+ get currentUser(): UserInfo | null;
30
+ /** @deprecated Use {@link CurrentUser}. */
31
+ set currentUser(value: UserInfo | null);
23
32
  artifactId: string;
24
- environmentId: string;
33
+ EnvironmentId: string;
34
+ /** @deprecated Use {@link EnvironmentId}. */
35
+ get environmentId(): string;
36
+ /** @deprecated Use {@link EnvironmentId}. */
37
+ set environmentId(value: string);
25
38
  ngOnInit(): void;
26
39
  /**
27
40
  * Handler for the Analyze button on the artifact viewer panel.
28
41
  * Creates a Data Snapshot artifact from the live viewer state, opens a
29
42
  * new conversation with it attached as input, and routes the user there.
30
43
  */
44
+ OnAnalyzeRequested(event: {
45
+ artifactId: string;
46
+ snapshot: DataSnapshot;
47
+ }): Promise<void>;
48
+ /** @deprecated Use {@link OnAnalyzeRequested}. */
31
49
  onAnalyzeRequested(event: {
32
50
  artifactId: string;
33
51
  snapshot: DataSnapshot;
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/artifact-resource.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAY,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAExE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAA+B,MAAM,+BAA+B,CAAC;;AAK1F;;;;GAIG;AACH,qBA8Ba,gBAAiB,SAAQ,qBAAqB;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkC;IACjE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuC;IAEpE;;;;OAIG;IACG,oBAAoB,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhF,WAAW,EAAE,QAAQ,GAAG,IAAI,CAAQ;IACpC,UAAU,EAAE,MAAM,CAAM;IACxB,aAAa,EAAE,MAAM,CAAM;IAElC,QAAQ;IAoBR;;;;OAIG;IACG,kBAAkB,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBxF,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAe3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAjFpD,gBAAgB;2CAAhB,gBAAgB;CAoF5B"}
1
+ {"version":3,"file":"artifact-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/artifact-resource.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAY,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAExE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAA+B,MAAM,+BAA+B,CAAC;;AAK1F;;;;GAIG;AACH,qBA8Ba,gBAAiB,SAAQ,qBAAqB;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkC;IACjE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuC;IAEpE;;;;OAIG;IACG,oBAAoB,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvF,oDAAoD;IAC9C,oBAAoB,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhF,WAAW,EAAE,QAAQ,GAAG,IAAI,CAAQ;IAE3C,2CAA2C;IAC3C,IAAW,WAAW,IAAI,QAAQ,GAAG,IAAI,CAExC;IACD,2CAA2C;IAC3C,IAAW,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,EAE5C;IACM,UAAU,EAAE,MAAM,CAAM;IACxB,aAAa,EAAE,MAAM,CAAM;IAElC,6CAA6C;IAC7C,IAAW,aAAa,IAAI,MAAM,CAEjC;IACD,6CAA6C;IAC7C,IAAW,aAAa,CAAC,KAAK,EAAE,MAAM,EAErC;IAED,QAAQ;IAoBR;;;;OAIG;IACG,kBAAkB,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB9F,kDAAkD;IAC5C,kBAAkB,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxF,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAe3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCA7GpD,gBAAgB;2CAAhB,gBAAgB;CAgH5B"}
@@ -34,16 +34,36 @@ let ArtifactResource = class ArtifactResource extends BaseResourceComponent {
34
34
  * Confirms with the user, then routes to Create or Modify depending on
35
35
  * whether an Active override already exists for this entity+user.
36
36
  */
37
- async onApplyFormRequested(event) {
37
+ async OnApplyFormRequested(event) {
38
38
  await this.applyService.ConfirmAndApply(event.spec, event.entityName, this.ProviderToUse);
39
39
  }
40
- currentUser = null;
40
+ /** @deprecated Use {@link OnApplyFormRequested}. */
41
+ async onApplyFormRequested(event) {
42
+ return this.OnApplyFormRequested(event);
43
+ }
44
+ CurrentUser = null;
45
+ /** @deprecated Use {@link CurrentUser}. */
46
+ get currentUser() {
47
+ return this.CurrentUser;
48
+ }
49
+ /** @deprecated Use {@link CurrentUser}. */
50
+ set currentUser(value) {
51
+ this.CurrentUser = value;
52
+ }
41
53
  artifactId = '';
42
- environmentId = '';
54
+ EnvironmentId = '';
55
+ /** @deprecated Use {@link EnvironmentId}. */
56
+ get environmentId() {
57
+ return this.EnvironmentId;
58
+ }
59
+ /** @deprecated Use {@link EnvironmentId}. */
60
+ set environmentId(value) {
61
+ this.EnvironmentId = value;
62
+ }
43
63
  ngOnInit() {
44
64
  super.ngOnInit();
45
65
  const md = this.ProviderToUse;
46
- this.currentUser = md.CurrentUser;
66
+ this.CurrentUser = md.CurrentUser;
47
67
  // Get artifact ID from resource data
48
68
  if (this.Data && this.Data.ResourceRecordID) {
49
69
  this.artifactId = this.Data.ResourceRecordID;
@@ -52,7 +72,7 @@ let ArtifactResource = class ArtifactResource extends BaseResourceComponent {
52
72
  // fall back to the default environment. Must be a valid UUID since
53
73
  // downstream saves (e.g. AnalyzeArtifactService creating artifacts)
54
74
  // require a non-empty EnvironmentID.
55
- this.environmentId = this.Data?.Configuration?.['environmentId']
75
+ this.EnvironmentId = this.Data?.Configuration?.['environmentId']
56
76
  || MJEnvironmentEntityExtended.DefaultEnvironmentID;
57
77
  setTimeout(() => this.NotifyLoadComplete(), 100);
58
78
  }
@@ -61,14 +81,14 @@ let ArtifactResource = class ArtifactResource extends BaseResourceComponent {
61
81
  * Creates a Data Snapshot artifact from the live viewer state, opens a
62
82
  * new conversation with it attached as input, and routes the user there.
63
83
  */
64
- async onAnalyzeRequested(event) {
65
- if (!this.currentUser)
84
+ async OnAnalyzeRequested(event) {
85
+ if (!this.CurrentUser)
66
86
  return;
67
87
  try {
68
88
  const result = await this.analyzeService.StartAnalysisConversation({
69
89
  snapshot: event.snapshot,
70
- currentUser: this.currentUser,
71
- environmentId: this.environmentId,
90
+ currentUser: this.CurrentUser,
91
+ environmentId: this.EnvironmentId,
72
92
  });
73
93
  // Route to the new conversation in the Conversations nav item
74
94
  await this.navigationService.OpenNavItemByName('Conversations', {
@@ -80,6 +100,10 @@ let ArtifactResource = class ArtifactResource extends BaseResourceComponent {
80
100
  MJNotificationService.Instance.CreateSimpleNotification(message, 'error', 5000);
81
101
  }
82
102
  }
103
+ /** @deprecated Use {@link OnAnalyzeRequested}. */
104
+ async onAnalyzeRequested(event) {
105
+ return this.OnAnalyzeRequested(event);
106
+ }
83
107
  async GetResourceDisplayName(data) {
84
108
  // Try to load artifact name from database
85
109
  if (data.ResourceRecordID) {
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/artifact-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, inject } from '@angular/core';\nimport { DataSnapshot, Metadata, UserInfo } from '@memberjunction/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData, MJEnvironmentEntityExtended } from '@memberjunction/core-entities';\nimport { AnalyzeArtifactService, InteractiveFormApplyService } from '@memberjunction/ng-artifacts';\nimport type { ComponentSpec } from '@memberjunction/interactive-component-types';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\n/**\n * Artifact Resource - displays versioned content artifacts\n * Wraps the artifact-viewer-panel component for tab-based display\n * Supports reports, dashboards, forms, and other artifact types\n */\n@RegisterClass(BaseResourceComponent, 'ArtifactResource')\n@Component({\n standalone: false,\n selector: 'mj-artifact-resource',\n template: `\n <div class=\"artifact-container\">\n @if (currentUser && artifactId) {\n <mj-artifact-viewer-panel\n [artifactId]=\"artifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [showSaveToCollection]=\"true\"\n [canShare]=\"true\"\n [canEdit]=\"true\"\n (analyzeRequested)=\"onAnalyzeRequested($event)\"\n (applyFormRequested)=\"onApplyFormRequested($event)\">\n </mj-artifact-viewer-panel>\n }\n </div>\n `,\n styles: [`\n .artifact-container {\n display: flex;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ArtifactResource extends BaseResourceComponent {\n private readonly analyzeService = inject(AnalyzeArtifactService);\n private readonly applyService = inject(InteractiveFormApplyService);\n\n /**\n * Apply-to-my-form handler — see InteractiveFormApplyService.\n * Confirms with the user, then routes to Create or Modify depending on\n * whether an Active override already exists for this entity+user.\n */\n async onApplyFormRequested(event: { spec: unknown; entityName: string }): Promise<void> {\n await this.applyService.ConfirmAndApply(\n event.spec as ComponentSpec,\n event.entityName,\n this.ProviderToUse,\n );\n }\n\n public currentUser: UserInfo | null = null;\n public artifactId: string = '';\n public environmentId: string = '';\n\n ngOnInit() {\n super.ngOnInit();\n const md = this.ProviderToUse;\n this.currentUser = md.CurrentUser;\n\n // Get artifact ID from resource data\n if (this.Data && this.Data.ResourceRecordID) {\n this.artifactId = this.Data.ResourceRecordID;\n }\n\n // Environment ID — use the configured environment if present, otherwise\n // fall back to the default environment. Must be a valid UUID since\n // downstream saves (e.g. AnalyzeArtifactService creating artifacts)\n // require a non-empty EnvironmentID.\n this.environmentId = (this.Data?.Configuration?.['environmentId'] as string | undefined)\n || MJEnvironmentEntityExtended.DefaultEnvironmentID;\n\n setTimeout(() => this.NotifyLoadComplete(), 100);\n }\n\n /**\n * Handler for the Analyze button on the artifact viewer panel.\n * Creates a Data Snapshot artifact from the live viewer state, opens a\n * new conversation with it attached as input, and routes the user there.\n */\n async onAnalyzeRequested(event: { artifactId: string; snapshot: DataSnapshot }): Promise<void> {\n if (!this.currentUser) return;\n\n try {\n const result = await this.analyzeService.StartAnalysisConversation({\n snapshot: event.snapshot,\n currentUser: this.currentUser,\n environmentId: this.environmentId,\n });\n\n // Route to the new conversation in the Conversations nav item\n await this.navigationService.OpenNavItemByName('Conversations', {\n conversationId: result.conversationId,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to start analysis conversation';\n MJNotificationService.Instance.CreateSimpleNotification(message, 'error', 5000);\n }\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n // Try to load artifact name from database\n if (data.ResourceRecordID) {\n try {\n const md = this.ProviderToUse;\n const artifact = await md.GetEntityObject<any>('MJ: Conversation Artifacts');\n await artifact.Load(data.ResourceRecordID);\n return artifact.Name || `Artifact - ${data.ResourceRecordID}`;\n } catch (error) {\n console.error('Error loading artifact name:', error);\n }\n }\n return 'Artifact';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-file-code';\n }\n}\n"]}
1
+ {"version":3,"file":"artifact-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/artifact-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, inject } from '@angular/core';\nimport { DataSnapshot, Metadata, UserInfo } from '@memberjunction/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData, MJEnvironmentEntityExtended } from '@memberjunction/core-entities';\nimport { AnalyzeArtifactService, InteractiveFormApplyService } from '@memberjunction/ng-artifacts';\nimport type { ComponentSpec } from '@memberjunction/interactive-component-types';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\n/**\n * Artifact Resource - displays versioned content artifacts\n * Wraps the artifact-viewer-panel component for tab-based display\n * Supports reports, dashboards, forms, and other artifact types\n */\n@RegisterClass(BaseResourceComponent, 'ArtifactResource')\n@Component({\n standalone: false,\n selector: 'mj-artifact-resource',\n template: `\n <div class=\"artifact-container\">\n @if (currentUser && artifactId) {\n <mj-artifact-viewer-panel\n [artifactId]=\"artifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [showSaveToCollection]=\"true\"\n [canShare]=\"true\"\n [canEdit]=\"true\"\n (analyzeRequested)=\"onAnalyzeRequested($event)\"\n (applyFormRequested)=\"onApplyFormRequested($event)\">\n </mj-artifact-viewer-panel>\n }\n </div>\n `,\n styles: [`\n .artifact-container {\n display: flex;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ArtifactResource extends BaseResourceComponent {\n private readonly analyzeService = inject(AnalyzeArtifactService);\n private readonly applyService = inject(InteractiveFormApplyService);\n\n /**\n * Apply-to-my-form handler — see InteractiveFormApplyService.\n * Confirms with the user, then routes to Create or Modify depending on\n * whether an Active override already exists for this entity+user.\n */\n async OnApplyFormRequested(event: { spec: unknown; entityName: string }): Promise<void> {\n await this.applyService.ConfirmAndApply(\n event.spec as ComponentSpec,\n event.entityName,\n this.ProviderToUse,\n );\n }\n\n /** @deprecated Use {@link OnApplyFormRequested}. */\n async onApplyFormRequested(event: { spec: unknown; entityName: string }): Promise<void> {\n return this.OnApplyFormRequested(event);\n }\n\n public CurrentUser: UserInfo | null = null;\n\n /** @deprecated Use {@link CurrentUser}. */\n public get currentUser(): UserInfo | null {\n return this.CurrentUser;\n }\n /** @deprecated Use {@link CurrentUser}. */\n public set currentUser(value: UserInfo | null) {\n this.CurrentUser = value;\n }\n public artifactId: string = '';\n public EnvironmentId: string = '';\n\n /** @deprecated Use {@link EnvironmentId}. */\n public get environmentId(): string {\n return this.EnvironmentId;\n }\n /** @deprecated Use {@link EnvironmentId}. */\n public set environmentId(value: string) {\n this.EnvironmentId = value;\n }\n\n ngOnInit() {\n super.ngOnInit();\n const md = this.ProviderToUse;\n this.CurrentUser = md.CurrentUser;\n\n // Get artifact ID from resource data\n if (this.Data && this.Data.ResourceRecordID) {\n this.artifactId = this.Data.ResourceRecordID;\n }\n\n // Environment ID — use the configured environment if present, otherwise\n // fall back to the default environment. Must be a valid UUID since\n // downstream saves (e.g. AnalyzeArtifactService creating artifacts)\n // require a non-empty EnvironmentID.\n this.EnvironmentId = (this.Data?.Configuration?.['environmentId'] as string | undefined)\n || MJEnvironmentEntityExtended.DefaultEnvironmentID;\n\n setTimeout(() => this.NotifyLoadComplete(), 100);\n }\n\n /**\n * Handler for the Analyze button on the artifact viewer panel.\n * Creates a Data Snapshot artifact from the live viewer state, opens a\n * new conversation with it attached as input, and routes the user there.\n */\n async OnAnalyzeRequested(event: { artifactId: string; snapshot: DataSnapshot }): Promise<void> {\n if (!this.CurrentUser) return;\n\n try {\n const result = await this.analyzeService.StartAnalysisConversation({\n snapshot: event.snapshot,\n currentUser: this.CurrentUser,\n environmentId: this.EnvironmentId,\n });\n\n // Route to the new conversation in the Conversations nav item\n await this.navigationService.OpenNavItemByName('Conversations', {\n conversationId: result.conversationId,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to start analysis conversation';\n MJNotificationService.Instance.CreateSimpleNotification(message, 'error', 5000);\n }\n }\n\n /** @deprecated Use {@link OnAnalyzeRequested}. */\n async onAnalyzeRequested(event: { artifactId: string; snapshot: DataSnapshot }): Promise<void> {\n return this.OnAnalyzeRequested(event);\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n // Try to load artifact name from database\n if (data.ResourceRecordID) {\n try {\n const md = this.ProviderToUse;\n const artifact = await md.GetEntityObject<any>('MJ: Conversation Artifacts');\n await artifact.Load(data.ResourceRecordID);\n return artifact.Name || `Artifact - ${data.ResourceRecordID}`;\n } catch (error) {\n console.error('Error loading artifact name:', error);\n }\n }\n return 'Artifact';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-file-code';\n }\n}\n"]}