@memberjunction/ng-explorer-core 5.24.0 → 5.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/app-routing.module.d.ts.map +1 -1
  2. package/dist/app-routing.module.js +14 -19
  3. package/dist/app-routing.module.js.map +1 -1
  4. package/dist/generated/lazy-feature-config.js +3 -3
  5. package/dist/generated/lazy-feature-config.js.map +1 -1
  6. package/dist/lib/resource-wrappers/artifact-resource.component.d.ts.map +1 -1
  7. package/dist/lib/resource-wrappers/artifact-resource.component.js +1 -0
  8. package/dist/lib/resource-wrappers/artifact-resource.component.js.map +1 -1
  9. package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts +16 -17
  10. package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts.map +1 -1
  11. package/dist/lib/resource-wrappers/chat-collections-resource.component.js +56 -62
  12. package/dist/lib/resource-wrappers/chat-collections-resource.component.js.map +1 -1
  13. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts +2 -4
  14. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts.map +1 -1
  15. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +9 -13
  16. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
  17. package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts +2 -15
  18. package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts.map +1 -1
  19. package/dist/lib/resource-wrappers/chat-tasks-resource.component.js +18 -52
  20. package/dist/lib/resource-wrappers/chat-tasks-resource.component.js.map +1 -1
  21. package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts +2 -3
  22. package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts.map +1 -1
  23. package/dist/lib/resource-wrappers/dashboard-resource.component.js +7 -9
  24. package/dist/lib/resource-wrappers/dashboard-resource.component.js.map +1 -1
  25. package/dist/lib/resource-wrappers/list-detail-resource.component.d.ts.map +1 -1
  26. package/dist/lib/resource-wrappers/list-detail-resource.component.js +1 -0
  27. package/dist/lib/resource-wrappers/list-detail-resource.component.js.map +1 -1
  28. package/dist/lib/resource-wrappers/notifications-resource.component.d.ts.map +1 -1
  29. package/dist/lib/resource-wrappers/notifications-resource.component.js +1 -0
  30. package/dist/lib/resource-wrappers/notifications-resource.component.js.map +1 -1
  31. package/dist/lib/resource-wrappers/query-resource.component.js +1 -0
  32. package/dist/lib/resource-wrappers/query-resource.component.js.map +1 -1
  33. package/dist/lib/resource-wrappers/search-results-resource.component.d.ts +74 -4
  34. package/dist/lib/resource-wrappers/search-results-resource.component.d.ts.map +1 -1
  35. package/dist/lib/resource-wrappers/search-results-resource.component.js +786 -25
  36. package/dist/lib/resource-wrappers/search-results-resource.component.js.map +1 -1
  37. package/dist/lib/resource-wrappers/view-resource.component.d.ts +7 -4
  38. package/dist/lib/resource-wrappers/view-resource.component.d.ts.map +1 -1
  39. package/dist/lib/resource-wrappers/view-resource.component.js +30 -14
  40. package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
  41. package/dist/lib/shell/components/tabs/tab-container.component.d.ts.map +1 -1
  42. package/dist/lib/shell/components/tabs/tab-container.component.js +10 -3
  43. package/dist/lib/shell/components/tabs/tab-container.component.js.map +1 -1
  44. package/dist/lib/shell/shell.component.d.ts +28 -8
  45. package/dist/lib/shell/shell.component.d.ts.map +1 -1
  46. package/dist/lib/shell/shell.component.js +416 -218
  47. package/dist/lib/shell/shell.component.js.map +1 -1
  48. package/dist/lib/shell/shell.module.d.ts +2 -1
  49. package/dist/lib/shell/shell.module.d.ts.map +1 -1
  50. package/dist/lib/shell/shell.module.js +7 -3
  51. package/dist/lib/shell/shell.module.js.map +1 -1
  52. package/dist/lib/single-dashboard/Components/add-item/add-item.component.d.ts +6 -0
  53. package/dist/lib/single-dashboard/Components/add-item/add-item.component.d.ts.map +1 -1
  54. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js +63 -38
  55. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js.map +1 -1
  56. package/dist/lib/single-dashboard/single-dashboard.component.d.ts.map +1 -1
  57. package/dist/lib/single-dashboard/single-dashboard.component.js +1 -0
  58. package/dist/lib/single-dashboard/single-dashboard.component.js.map +1 -1
  59. package/dist/lib/user-menu/base-user-menu.d.ts +7 -7
  60. package/dist/lib/user-menu/base-user-menu.d.ts.map +1 -1
  61. package/dist/lib/user-menu/base-user-menu.js +8 -1
  62. package/dist/lib/user-menu/base-user-menu.js.map +1 -1
  63. package/dist/lib/user-menu/user-menu.types.d.ts +15 -0
  64. package/dist/lib/user-menu/user-menu.types.d.ts.map +1 -1
  65. package/dist/lib/user-menu/user-menu.types.js.map +1 -1
  66. package/dist/lib/user-notifications/user-notifications.component.d.ts +6 -3
  67. package/dist/lib/user-notifications/user-notifications.component.d.ts.map +1 -1
  68. package/dist/lib/user-notifications/user-notifications.component.js +46 -19
  69. package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
  70. package/dist/module.d.ts +3 -1
  71. package/dist/module.d.ts.map +1 -1
  72. package/dist/module.js +8 -0
  73. package/dist/module.js.map +1 -1
  74. package/package.json +40 -38
@@ -1,4 +1,4 @@
1
- import { UserMenuItem, UserMenuElement, UserMenuContext, UserMenuActionResult, UserMenuOptions } from './user-menu.types';
1
+ import { UserMenuItem, UserMenuElement, UserMenuContext, UserMenuActionResult, UserMenuOptions, UserDisplayInfo } from './user-menu.types';
2
2
  /**
3
3
  * Base class for user menu implementations with built-in default behavior.
4
4
  *
@@ -78,6 +78,11 @@ export declare class BaseUserMenu {
78
78
  * Check if a menu item should be visible based on current context
79
79
  */
80
80
  protected IsItemVisible(item: UserMenuItem): boolean;
81
+ /**
82
+ * Get the ordered list of group names for menu rendering.
83
+ * Override to insert custom groups (e.g., 'organization' before 'primary').
84
+ */
85
+ protected GetGroupOrder(): string[];
81
86
  /**
82
87
  * Group items by their group property
83
88
  */
@@ -139,12 +144,7 @@ export declare class BaseUserMenu {
139
144
  /**
140
145
  * Get user display information for menu header
141
146
  */
142
- GetUserDisplayInfo(): {
143
- name: string;
144
- email: string;
145
- avatarUrl: string | null;
146
- initials: string;
147
- };
147
+ GetUserDisplayInfo(): UserDisplayInfo;
148
148
  /**
149
149
  * Generate a unique tab ID
150
150
  */
@@ -1 +1 @@
1
- {"version":3,"file":"base-user-menu.d.ts","sourceRoot":"","sources":["../../../src/lib/user-menu/base-user-menu.ts"],"names":[],"mappings":"AACA,OAAO,EACH,YAAY,EACZ,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,eAAe,EAElB,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,qBAAa,YAAY;IACrB,SAAS,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAQ;IAClD,SAAS,CAAC,QAAQ,EAAE,eAAe,CAAC;;IAUpC;;OAEG;IACU,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhE;;OAEG;cACa,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE;;OAEG;IACI,OAAO,IAAI,IAAI;IAQtB;;OAEG;IACH,SAAS,CAAC,iBAAiB,IAAI,eAAe;IAS9C;;OAEG;IACI,UAAU,IAAI,eAAe;IAIpC;;OAEG;IACI,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IAQ1D;;;;;;;;OAQG;IACI,YAAY,IAAI,YAAY,EAAE;IA8FrC;;;OAGG;IACI,eAAe,IAAI,eAAe,EAAE;IA8B3C;;OAEG;IACH,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO;IAUpD;;OAEG;IACH,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;IAe3E;;;OAGG;IACU,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAyB3E;;;OAGG;cACa,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAS9E;;OAEG;cACa,cAAc,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAO/D;;OAEG;cACa,sBAAsB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAUvE;;OAEG;cACa,iBAAiB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAYlE;;OAEG;cACa,oBAAoB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAYrE;;;OAGG;cACa,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAQpF;;OAEG;cACa,mBAAmB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IASpE;;OAEG;cACa,aAAa,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAmB9D;;OAEG;cACa,kBAAkB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAcnE;;;;OAIG;IACH,SAAS,CAAC,mBAAmB,IAAI,YAAY,EAAE;IAwC/C;;;OAGG;IACH,SAAS,CAAC,wBAAwB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM;IAQvE;;OAEG;IACI,kBAAkB,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAexG;;OAEG;IACH,SAAS,CAAC,aAAa,IAAI,MAAM;IAIjC;;OAEG;IACH,SAAS,KAAK,OAAO,IAAI,eAAe,GAAG,IAAI,CAE9C;IAED;;OAEG;IACI,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;CAKhE"}
1
+ {"version":3,"file":"base-user-menu.d.ts","sourceRoot":"","sources":["../../../src/lib/user-menu/base-user-menu.ts"],"names":[],"mappings":"AACA,OAAO,EACH,YAAY,EACZ,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,eAAe,EAEf,eAAe,EAClB,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,qBAAa,YAAY;IACrB,SAAS,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAQ;IAClD,SAAS,CAAC,QAAQ,EAAE,eAAe,CAAC;;IAUpC;;OAEG;IACU,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhE;;OAEG;cACa,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE;;OAEG;IACI,OAAO,IAAI,IAAI;IAQtB;;OAEG;IACH,SAAS,CAAC,iBAAiB,IAAI,eAAe;IAS9C;;OAEG;IACI,UAAU,IAAI,eAAe;IAIpC;;OAEG;IACI,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IAQ1D;;;;;;;;OAQG;IACI,YAAY,IAAI,YAAY,EAAE;IA8FrC;;;OAGG;IACI,eAAe,IAAI,eAAe,EAAE;IA8B3C;;OAEG;IACH,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO;IAUpD;;;OAGG;IACH,SAAS,CAAC,aAAa,IAAI,MAAM,EAAE;IAInC;;OAEG;IACH,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;IAe3E;;;OAGG;IACU,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAyB3E;;;OAGG;cACa,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAS9E;;OAEG;cACa,cAAc,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAO/D;;OAEG;cACa,sBAAsB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAUvE;;OAEG;cACa,iBAAiB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAYlE;;OAEG;cACa,oBAAoB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAYrE;;;OAGG;cACa,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAQpF;;OAEG;cACa,mBAAmB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IASpE;;OAEG;cACa,aAAa,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAmB9D;;OAEG;cACa,kBAAkB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAcnE;;;;OAIG;IACH,SAAS,CAAC,mBAAmB,IAAI,YAAY,EAAE;IAwC/C;;;OAGG;IACH,SAAS,CAAC,wBAAwB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM;IAQvE;;OAEG;IACI,kBAAkB,IAAI,eAAe;IAe5C;;OAEG;IACH,SAAS,CAAC,aAAa,IAAI,MAAM;IAIjC;;OAEG;IACH,SAAS,KAAK,OAAO,IAAI,eAAe,GAAG,IAAI,CAE9C;IAED;;OAEG;IACI,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;CAKhE"}
@@ -196,7 +196,7 @@ export class BaseUserMenu {
196
196
  const groups = this.GroupItems(visibleItems);
197
197
  const elements = [];
198
198
  // Define group order
199
- const groupOrder = ['primary', 'developer', 'system', 'danger'];
199
+ const groupOrder = this.GetGroupOrder();
200
200
  const sortedGroupKeys = Object.keys(groups).sort((a, b) => {
201
201
  const aIndex = groupOrder.indexOf(a);
202
202
  const bIndex = groupOrder.indexOf(b);
@@ -224,6 +224,13 @@ export class BaseUserMenu {
224
224
  // Check item's own visible flag
225
225
  return item.visible;
226
226
  }
227
+ /**
228
+ * Get the ordered list of group names for menu rendering.
229
+ * Override to insert custom groups (e.g., 'organization' before 'primary').
230
+ */
231
+ GetGroupOrder() {
232
+ return ['primary', 'developer', 'system', 'danger'];
233
+ }
227
234
  /**
228
235
  * Group items by their group property
229
236
  */
@@ -1 +1 @@
1
- {"version":3,"file":"base-user-menu.js","sourceRoot":"","sources":["../../../src/lib/user-menu/base-user-menu.ts"],"names":[],"mappings":"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","sourcesContent":["import { RegisterClass } from '@memberjunction/global';\nimport {\n UserMenuItem,\n UserMenuElement,\n UserMenuContext,\n UserMenuActionResult,\n UserMenuOptions,\n UserMenuDivider\n} from './user-menu.types';\n\n/**\n * Base class for user menu implementations with built-in default behavior.\n *\n * This class provides the standard MemberJunction user menu. To customize:\n * 1. Create a subclass\n * 2. Register with @RegisterClass(BaseUserMenu)\n * 3. Override methods as needed\n *\n * Subclasses automatically get higher priority via compiler order since they\n * import this class, causing their @RegisterClass to execute after this one.\n *\n * @example\n * ```typescript\n * // In your custom app\n * import { BaseUserMenu } from '@memberjunction/ng-explorer-core';\n *\n * @RegisterClass(BaseUserMenu)\n * export class MyAppUserMenu extends BaseUserMenu {\n * public override GetMenuItems(): UserMenuItem[] {\n * const items = super.GetMenuItems();\n * // Add, remove, or modify items\n * items.push({ id: 'custom', label: 'My Custom Action', ... });\n * return items;\n * }\n *\n * protected override async Handle_custom(): Promise<UserMenuActionResult> {\n * // Handle the custom action\n * return { success: true, closeMenu: true };\n * }\n * }\n * ```\n */\nexport class BaseUserMenu {\n protected _context: UserMenuContext | null = null;\n protected _options: UserMenuOptions;\n\n constructor() {\n this._options = this.GetDefaultOptions();\n }\n\n // ========================================\n // INITIALIZATION\n // ========================================\n\n /**\n * Initialize the menu with context. Called by shell component.\n */\n public async Initialize(context: UserMenuContext): Promise<void> {\n this._context = context;\n await this.OnInitialize(context);\n }\n\n /**\n * Override to perform custom initialization\n */\n protected async OnInitialize(context: UserMenuContext): Promise<void> {\n // Override in subclass for custom initialization\n }\n\n /**\n * Cleanup when menu is destroyed\n */\n public Destroy(): void {\n this._context = null;\n }\n\n // ========================================\n // OPTIONS\n // ========================================\n\n /**\n * Get default menu configuration options\n */\n protected GetDefaultOptions(): UserMenuOptions {\n return {\n showUserName: true,\n showUserEmail: true,\n menuPosition: 'below-left',\n animationStyle: 'fade'\n };\n }\n\n /**\n * Get current menu options\n */\n public GetOptions(): UserMenuOptions {\n return { ...this._options };\n }\n\n /**\n * Update menu options\n */\n public SetOptions(options: Partial<UserMenuOptions>): void {\n this._options = { ...this._options, ...options };\n }\n\n // ========================================\n // MENU ITEMS - Override to customize\n // ========================================\n\n /**\n * Get all menu items. Override to customize the menu structure.\n *\n * Items are grouped by the `group` property with dividers between groups.\n * Groups are rendered in this order: primary, developer, system, danger.\n *\n * Developer-only items are automatically hidden unless the user has\n * Developer role AND developer mode is enabled.\n */\n public GetMenuItems(): UserMenuItem[] {\n const devModeEnabled = this._context?.developerModeEnabled ?? false;\n\n return [\n // === PRIMARY GROUP ===\n {\n id: 'profile',\n label: 'My Profile',\n icon: 'fa-solid fa-user-circle',\n group: 'primary',\n order: 10,\n developerOnly: false,\n visible: true,\n enabled: true,\n tooltip: 'View and edit your profile'\n },\n {\n id: 'pin-to-home',\n label: 'Pin to Home',\n icon: 'fa-solid fa-house-chimney',\n group: 'primary',\n order: 20,\n developerOnly: false,\n visible: true,\n enabled: true,\n tooltip: 'Pin the current resource to your Home dashboard'\n },\n\n // === DEVELOPER GROUP (Only visible to developers) ===\n {\n id: 'toggle-dev-mode',\n label: devModeEnabled ? 'Developer Mode (On)' : 'Developer Mode (Off)',\n icon: devModeEnabled ? 'fa-solid fa-toggle-on' : 'fa-solid fa-toggle-off',\n color: devModeEnabled ? '#4CAF50' : undefined,\n group: 'developer',\n order: 10,\n developerOnly: true,\n visible: true,\n enabled: true,\n tooltip: 'Toggle developer tools visibility'\n },\n {\n id: 'log-layout',\n label: 'Log Layout (Debug)',\n icon: 'fa-solid fa-terminal',\n group: 'developer',\n order: 20,\n developerOnly: true,\n visible: devModeEnabled,\n enabled: true,\n tooltip: 'Output current layout configuration to console'\n },\n {\n id: 'inspect-state',\n label: 'Inspect App State',\n icon: 'fa-solid fa-magnifying-glass-chart',\n group: 'developer',\n order: 30,\n developerOnly: true,\n visible: devModeEnabled,\n enabled: true,\n tooltip: 'View current application state in console'\n },\n\n // === SYSTEM GROUP (Theme selection) ===\n ...this.BuildThemeMenuItems(),\n {\n id: 'reset-layout',\n label: 'Reset Layout',\n icon: 'fa-solid fa-rotate-left',\n group: 'system',\n order: 10,\n developerOnly: false,\n visible: true,\n enabled: true,\n tooltip: 'Reset workspace to default layout'\n },\n\n // === DANGER GROUP ===\n {\n id: 'logout',\n label: 'Sign Out',\n icon: 'fa-solid fa-sign-out-alt',\n color: '#c62828',\n cssClass: 'danger',\n group: 'danger',\n order: 100,\n developerOnly: false,\n visible: true,\n enabled: true\n }\n ];\n }\n\n /**\n * Get the complete menu element list including dividers between groups.\n * This is called by the template to render the menu.\n */\n public GetMenuElements(): UserMenuElement[] {\n const items = this.GetMenuItems();\n const visibleItems = items.filter(item => this.IsItemVisible(item));\n\n // Group items\n const groups = this.GroupItems(visibleItems);\n const elements: UserMenuElement[] = [];\n\n // Define group order\n const groupOrder = ['primary', 'developer', 'system', 'danger'];\n const sortedGroupKeys = Object.keys(groups).sort((a, b) => {\n const aIndex = groupOrder.indexOf(a);\n const bIndex = groupOrder.indexOf(b);\n return (aIndex === -1 ? 999 : aIndex) - (bIndex === -1 ? 999 : bIndex);\n });\n\n // Build element list with dividers\n sortedGroupKeys.forEach((group, index) => {\n if (index > 0) {\n elements.push({ type: 'divider', group } as UserMenuDivider);\n }\n\n // Sort items within group by order\n const groupItems = groups[group].sort((a, b) => a.order - b.order);\n elements.push(...groupItems);\n });\n\n return elements;\n }\n\n /**\n * Check if a menu item should be visible based on current context\n */\n protected IsItemVisible(item: UserMenuItem): boolean {\n // Check developer-only visibility\n if (item.developerOnly && !this._context?.isDeveloper) {\n return false;\n }\n\n // Check item's own visible flag\n return item.visible;\n }\n\n /**\n * Group items by their group property\n */\n protected GroupItems(items: UserMenuItem[]): Record<string, UserMenuItem[]> {\n return items.reduce((groups, item) => {\n const group = item.group || 'primary';\n if (!groups[group]) {\n groups[group] = [];\n }\n groups[group].push(item);\n return groups;\n }, {} as Record<string, UserMenuItem[]>);\n }\n\n // ========================================\n // CLICK HANDLING\n // ========================================\n\n /**\n * Handle menu item click. Dispatches to specific Handle_<id> methods.\n * Theme selection items (select-theme-*) are routed to HandleThemeSelection.\n */\n public async HandleItemClick(itemId: string): Promise<UserMenuActionResult> {\n const items = this.GetMenuItems();\n const item = items.find(i => i.id === itemId);\n\n if (!item || !item.enabled) {\n return { success: false, closeMenu: false, message: 'Item not found or disabled' };\n }\n\n // Route theme selection items to the theme handler\n if (itemId.startsWith('select-theme-')) {\n const themeId = itemId.substring('select-theme-'.length);\n return await this.HandleThemeSelection(themeId);\n }\n\n // Convert item id to handler method name (e.g., 'toggle-dev-mode' -> 'Handle_toggle_dev_mode')\n const handlerName = `Handle_${itemId.replace(/-/g, '_')}` as keyof this;\n\n if (typeof this[handlerName] === 'function') {\n return await (this[handlerName] as () => Promise<UserMenuActionResult>).call(this);\n }\n\n // Fall back to generic handler\n return await this.OnItemClick(item);\n }\n\n /**\n * Generic click handler for items without specific handlers.\n * Override for custom default behavior.\n */\n protected async OnItemClick(item: UserMenuItem): Promise<UserMenuActionResult> {\n console.warn(`No handler defined for menu item: ${item.id}`);\n return { success: false, closeMenu: true };\n }\n\n // ========================================\n // DEFAULT HANDLERS - Override to customize\n // ========================================\n\n /**\n * Handle \"My Profile\" click - Opens user profile/settings\n */\n protected async Handle_profile(): Promise<UserMenuActionResult> {\n if (this._context?.openSettings) {\n this._context.openSettings();\n }\n return { success: true, closeMenu: true };\n }\n\n /**\n * Handle \"Toggle Developer Mode\" click\n */\n protected async Handle_toggle_dev_mode(): Promise<UserMenuActionResult> {\n // This will be handled by the shell component which has access to DeveloperModeService\n // The result signals that the menu should refresh to show the updated state\n return {\n success: true,\n closeMenu: false, // Keep menu open to see updated state\n message: 'toggle-dev-mode' // Special signal for shell to handle\n };\n }\n\n /**\n * Handle \"Log Layout\" click - Debug utility\n */\n protected async Handle_log_layout(): Promise<UserMenuActionResult> {\n if (!this._context?.workspaceManager) {\n return { success: false, closeMenu: true, message: 'Workspace manager not available' };\n }\n\n const config = this._context.workspaceManager.GetConfiguration();\n console.log('📋 Workspace Configuration:', JSON.stringify(config, null, 2));\n console.log('📋 Workspace Configuration (object):', config);\n\n return { success: true, closeMenu: true };\n }\n\n /**\n * Handle \"Inspect App State\" click - Debug utility\n */\n protected async Handle_inspect_state(): Promise<UserMenuActionResult> {\n console.group('🔍 Application State Inspection');\n console.log('User:', this._context?.userEntity);\n console.log('Current App:', this._context?.currentApplication);\n console.log('Developer Mode:', this._context?.developerModeEnabled);\n console.log('Is Developer:', this._context?.isDeveloper);\n console.log('Workspace Config:', this._context?.workspaceManager?.GetConfiguration());\n console.groupEnd();\n\n return { success: true, closeMenu: true };\n }\n\n /**\n * Handle theme selection clicks.\n * Item IDs follow the pattern 'select-theme-<themeId>'.\n */\n protected async HandleThemeSelection(themeId: string): Promise<UserMenuActionResult> {\n return {\n success: true,\n closeMenu: false, // Keep menu open to see updated state\n message: `select-theme-${themeId}` // Signal for shell to handle\n };\n }\n\n /**\n * Handle \"Reset Layout\" click\n */\n protected async Handle_reset_layout(): Promise<UserMenuActionResult> {\n // Signal to shell to handle reset layout\n return {\n success: true,\n closeMenu: true,\n message: 'reset-layout' // Special signal for shell to handle\n };\n }\n\n /**\n * Handle \"Sign Out\" click\n */\n protected async Handle_logout(): Promise<UserMenuActionResult> {\n if (!this._context?.authService) {\n return { success: false, closeMenu: true, message: 'Auth service not available' };\n }\n\n // Clear auth data\n localStorage.removeItem('auth');\n localStorage.removeItem('claims');\n\n // Call logout\n await this._context.authService.logout();\n\n return { success: true, closeMenu: true };\n }\n\n // ========================================\n // PIN TO HOME HELPERS\n // ========================================\n\n /**\n * Handle \"Pin to Home\" click - signals the shell to pin the active resource\n */\n protected async Handle_pin_to_home(): Promise<UserMenuActionResult> {\n // Signal the shell to handle the actual pinning (it has access to DI and the active tab)\n // The shell's handler checks for Home app and duplicate pin conditions\n return {\n success: true,\n closeMenu: true,\n message: 'pin-to-home'\n };\n }\n\n // ========================================\n // THEME HELPERS\n // ========================================\n\n /**\n * Build menu items for each registered theme plus a 'System' option.\n * Each theme gets a `select-theme-<id>` item ID. The currently active\n * theme (or 'system' preference) shows a checkmark icon.\n */\n protected BuildThemeMenuItems(): UserMenuItem[] {\n const themes = this._context?.availableThemes ?? [];\n const currentPreference = this._context?.themePreference ?? 'system';\n const items: UserMenuItem[] = [];\n let order = 1;\n\n for (const theme of themes) {\n const isActive = currentPreference === theme.Id;\n items.push({\n id: `select-theme-${theme.Id}`,\n label: theme.Name,\n icon: isActive ? 'fa-solid fa-check' : this.GetThemeIconForBaseTheme(theme.BaseTheme),\n color: isActive ? '#4CAF50' : undefined,\n group: 'system',\n order: order++,\n developerOnly: false,\n visible: true,\n enabled: true,\n tooltip: theme.Description ?? `Switch to ${theme.Name} theme`\n });\n }\n\n // Always add a 'System' option (auto-detect OS preference)\n const isSystemActive = currentPreference === 'system';\n items.push({\n id: 'select-theme-system',\n label: 'System',\n icon: isSystemActive ? 'fa-solid fa-check' : 'fa-solid fa-desktop',\n color: isSystemActive ? '#4CAF50' : undefined,\n group: 'system',\n order: order++,\n developerOnly: false,\n visible: true,\n enabled: true,\n tooltip: 'Auto-detect theme from OS preference'\n });\n\n return items;\n }\n\n /**\n * Get an appropriate icon for a base theme type.\n * Used for non-active theme items to hint at light vs dark.\n */\n protected GetThemeIconForBaseTheme(baseTheme: 'light' | 'dark'): string {\n return baseTheme === 'dark' ? 'fa-solid fa-moon' : 'fa-solid fa-sun';\n }\n\n // ========================================\n // UTILITY METHODS\n // ========================================\n\n /**\n * Get user display information for menu header\n */\n public GetUserDisplayInfo(): { name: string; email: string; avatarUrl: string | null; initials: string } {\n const user = this._context?.userEntity;\n const name = user?.Name || this._context?.user?.Name || 'User';\n const email = user?.Email || '';\n const avatarUrl = user?.UserImageURL || null;\n\n // Generate initials from name\n const nameParts = name.split(' ').filter(Boolean);\n const initials = nameParts.length >= 2\n ? `${nameParts[0][0]}${nameParts[nameParts.length - 1][0]}`.toUpperCase()\n : name.substring(0, 2).toUpperCase();\n\n return { name, email, avatarUrl, initials };\n }\n\n /**\n * Generate a unique tab ID\n */\n protected GenerateTabId(): string {\n return `tab-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n /**\n * Get the current context (for subclasses)\n */\n protected get Context(): UserMenuContext | null {\n return this._context;\n }\n\n /**\n * Update context (called by shell when developer mode changes)\n */\n public UpdateContext(updates: Partial<UserMenuContext>): void {\n if (this._context) {\n this._context = { ...this._context, ...updates };\n }\n }\n}\n"]}
1
+ {"version":3,"file":"base-user-menu.js","sourceRoot":"","sources":["../../../src/lib/user-menu/base-user-menu.ts"],"names":[],"mappings":"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","sourcesContent":["import { RegisterClass } from '@memberjunction/global';\nimport {\n UserMenuItem,\n UserMenuElement,\n UserMenuContext,\n UserMenuActionResult,\n UserMenuOptions,\n UserMenuDivider,\n UserDisplayInfo\n} from './user-menu.types';\n\n/**\n * Base class for user menu implementations with built-in default behavior.\n *\n * This class provides the standard MemberJunction user menu. To customize:\n * 1. Create a subclass\n * 2. Register with @RegisterClass(BaseUserMenu)\n * 3. Override methods as needed\n *\n * Subclasses automatically get higher priority via compiler order since they\n * import this class, causing their @RegisterClass to execute after this one.\n *\n * @example\n * ```typescript\n * // In your custom app\n * import { BaseUserMenu } from '@memberjunction/ng-explorer-core';\n *\n * @RegisterClass(BaseUserMenu)\n * export class MyAppUserMenu extends BaseUserMenu {\n * public override GetMenuItems(): UserMenuItem[] {\n * const items = super.GetMenuItems();\n * // Add, remove, or modify items\n * items.push({ id: 'custom', label: 'My Custom Action', ... });\n * return items;\n * }\n *\n * protected override async Handle_custom(): Promise<UserMenuActionResult> {\n * // Handle the custom action\n * return { success: true, closeMenu: true };\n * }\n * }\n * ```\n */\nexport class BaseUserMenu {\n protected _context: UserMenuContext | null = null;\n protected _options: UserMenuOptions;\n\n constructor() {\n this._options = this.GetDefaultOptions();\n }\n\n // ========================================\n // INITIALIZATION\n // ========================================\n\n /**\n * Initialize the menu with context. Called by shell component.\n */\n public async Initialize(context: UserMenuContext): Promise<void> {\n this._context = context;\n await this.OnInitialize(context);\n }\n\n /**\n * Override to perform custom initialization\n */\n protected async OnInitialize(context: UserMenuContext): Promise<void> {\n // Override in subclass for custom initialization\n }\n\n /**\n * Cleanup when menu is destroyed\n */\n public Destroy(): void {\n this._context = null;\n }\n\n // ========================================\n // OPTIONS\n // ========================================\n\n /**\n * Get default menu configuration options\n */\n protected GetDefaultOptions(): UserMenuOptions {\n return {\n showUserName: true,\n showUserEmail: true,\n menuPosition: 'below-left',\n animationStyle: 'fade'\n };\n }\n\n /**\n * Get current menu options\n */\n public GetOptions(): UserMenuOptions {\n return { ...this._options };\n }\n\n /**\n * Update menu options\n */\n public SetOptions(options: Partial<UserMenuOptions>): void {\n this._options = { ...this._options, ...options };\n }\n\n // ========================================\n // MENU ITEMS - Override to customize\n // ========================================\n\n /**\n * Get all menu items. Override to customize the menu structure.\n *\n * Items are grouped by the `group` property with dividers between groups.\n * Groups are rendered in this order: primary, developer, system, danger.\n *\n * Developer-only items are automatically hidden unless the user has\n * Developer role AND developer mode is enabled.\n */\n public GetMenuItems(): UserMenuItem[] {\n const devModeEnabled = this._context?.developerModeEnabled ?? false;\n\n return [\n // === PRIMARY GROUP ===\n {\n id: 'profile',\n label: 'My Profile',\n icon: 'fa-solid fa-user-circle',\n group: 'primary',\n order: 10,\n developerOnly: false,\n visible: true,\n enabled: true,\n tooltip: 'View and edit your profile'\n },\n {\n id: 'pin-to-home',\n label: 'Pin to Home',\n icon: 'fa-solid fa-house-chimney',\n group: 'primary',\n order: 20,\n developerOnly: false,\n visible: true,\n enabled: true,\n tooltip: 'Pin the current resource to your Home dashboard'\n },\n\n // === DEVELOPER GROUP (Only visible to developers) ===\n {\n id: 'toggle-dev-mode',\n label: devModeEnabled ? 'Developer Mode (On)' : 'Developer Mode (Off)',\n icon: devModeEnabled ? 'fa-solid fa-toggle-on' : 'fa-solid fa-toggle-off',\n color: devModeEnabled ? '#4CAF50' : undefined,\n group: 'developer',\n order: 10,\n developerOnly: true,\n visible: true,\n enabled: true,\n tooltip: 'Toggle developer tools visibility'\n },\n {\n id: 'log-layout',\n label: 'Log Layout (Debug)',\n icon: 'fa-solid fa-terminal',\n group: 'developer',\n order: 20,\n developerOnly: true,\n visible: devModeEnabled,\n enabled: true,\n tooltip: 'Output current layout configuration to console'\n },\n {\n id: 'inspect-state',\n label: 'Inspect App State',\n icon: 'fa-solid fa-magnifying-glass-chart',\n group: 'developer',\n order: 30,\n developerOnly: true,\n visible: devModeEnabled,\n enabled: true,\n tooltip: 'View current application state in console'\n },\n\n // === SYSTEM GROUP (Theme selection) ===\n ...this.BuildThemeMenuItems(),\n {\n id: 'reset-layout',\n label: 'Reset Layout',\n icon: 'fa-solid fa-rotate-left',\n group: 'system',\n order: 10,\n developerOnly: false,\n visible: true,\n enabled: true,\n tooltip: 'Reset workspace to default layout'\n },\n\n // === DANGER GROUP ===\n {\n id: 'logout',\n label: 'Sign Out',\n icon: 'fa-solid fa-sign-out-alt',\n color: '#c62828',\n cssClass: 'danger',\n group: 'danger',\n order: 100,\n developerOnly: false,\n visible: true,\n enabled: true\n }\n ];\n }\n\n /**\n * Get the complete menu element list including dividers between groups.\n * This is called by the template to render the menu.\n */\n public GetMenuElements(): UserMenuElement[] {\n const items = this.GetMenuItems();\n const visibleItems = items.filter(item => this.IsItemVisible(item));\n\n // Group items\n const groups = this.GroupItems(visibleItems);\n const elements: UserMenuElement[] = [];\n\n // Define group order\n const groupOrder = this.GetGroupOrder();\n const sortedGroupKeys = Object.keys(groups).sort((a, b) => {\n const aIndex = groupOrder.indexOf(a);\n const bIndex = groupOrder.indexOf(b);\n return (aIndex === -1 ? 999 : aIndex) - (bIndex === -1 ? 999 : bIndex);\n });\n\n // Build element list with dividers\n sortedGroupKeys.forEach((group, index) => {\n if (index > 0) {\n elements.push({ type: 'divider', group } as UserMenuDivider);\n }\n\n // Sort items within group by order\n const groupItems = groups[group].sort((a, b) => a.order - b.order);\n elements.push(...groupItems);\n });\n\n return elements;\n }\n\n /**\n * Check if a menu item should be visible based on current context\n */\n protected IsItemVisible(item: UserMenuItem): boolean {\n // Check developer-only visibility\n if (item.developerOnly && !this._context?.isDeveloper) {\n return false;\n }\n\n // Check item's own visible flag\n return item.visible;\n }\n\n /**\n * Get the ordered list of group names for menu rendering.\n * Override to insert custom groups (e.g., 'organization' before 'primary').\n */\n protected GetGroupOrder(): string[] {\n return ['primary', 'developer', 'system', 'danger'];\n }\n\n /**\n * Group items by their group property\n */\n protected GroupItems(items: UserMenuItem[]): Record<string, UserMenuItem[]> {\n return items.reduce((groups, item) => {\n const group = item.group || 'primary';\n if (!groups[group]) {\n groups[group] = [];\n }\n groups[group].push(item);\n return groups;\n }, {} as Record<string, UserMenuItem[]>);\n }\n\n // ========================================\n // CLICK HANDLING\n // ========================================\n\n /**\n * Handle menu item click. Dispatches to specific Handle_<id> methods.\n * Theme selection items (select-theme-*) are routed to HandleThemeSelection.\n */\n public async HandleItemClick(itemId: string): Promise<UserMenuActionResult> {\n const items = this.GetMenuItems();\n const item = items.find(i => i.id === itemId);\n\n if (!item || !item.enabled) {\n return { success: false, closeMenu: false, message: 'Item not found or disabled' };\n }\n\n // Route theme selection items to the theme handler\n if (itemId.startsWith('select-theme-')) {\n const themeId = itemId.substring('select-theme-'.length);\n return await this.HandleThemeSelection(themeId);\n }\n\n // Convert item id to handler method name (e.g., 'toggle-dev-mode' -> 'Handle_toggle_dev_mode')\n const handlerName = `Handle_${itemId.replace(/-/g, '_')}` as keyof this;\n\n if (typeof this[handlerName] === 'function') {\n return await (this[handlerName] as () => Promise<UserMenuActionResult>).call(this);\n }\n\n // Fall back to generic handler\n return await this.OnItemClick(item);\n }\n\n /**\n * Generic click handler for items without specific handlers.\n * Override for custom default behavior.\n */\n protected async OnItemClick(item: UserMenuItem): Promise<UserMenuActionResult> {\n console.warn(`No handler defined for menu item: ${item.id}`);\n return { success: false, closeMenu: true };\n }\n\n // ========================================\n // DEFAULT HANDLERS - Override to customize\n // ========================================\n\n /**\n * Handle \"My Profile\" click - Opens user profile/settings\n */\n protected async Handle_profile(): Promise<UserMenuActionResult> {\n if (this._context?.openSettings) {\n this._context.openSettings();\n }\n return { success: true, closeMenu: true };\n }\n\n /**\n * Handle \"Toggle Developer Mode\" click\n */\n protected async Handle_toggle_dev_mode(): Promise<UserMenuActionResult> {\n // This will be handled by the shell component which has access to DeveloperModeService\n // The result signals that the menu should refresh to show the updated state\n return {\n success: true,\n closeMenu: false, // Keep menu open to see updated state\n message: 'toggle-dev-mode' // Special signal for shell to handle\n };\n }\n\n /**\n * Handle \"Log Layout\" click - Debug utility\n */\n protected async Handle_log_layout(): Promise<UserMenuActionResult> {\n if (!this._context?.workspaceManager) {\n return { success: false, closeMenu: true, message: 'Workspace manager not available' };\n }\n\n const config = this._context.workspaceManager.GetConfiguration();\n console.log('📋 Workspace Configuration:', JSON.stringify(config, null, 2));\n console.log('📋 Workspace Configuration (object):', config);\n\n return { success: true, closeMenu: true };\n }\n\n /**\n * Handle \"Inspect App State\" click - Debug utility\n */\n protected async Handle_inspect_state(): Promise<UserMenuActionResult> {\n console.group('🔍 Application State Inspection');\n console.log('User:', this._context?.userEntity);\n console.log('Current App:', this._context?.currentApplication);\n console.log('Developer Mode:', this._context?.developerModeEnabled);\n console.log('Is Developer:', this._context?.isDeveloper);\n console.log('Workspace Config:', this._context?.workspaceManager?.GetConfiguration());\n console.groupEnd();\n\n return { success: true, closeMenu: true };\n }\n\n /**\n * Handle theme selection clicks.\n * Item IDs follow the pattern 'select-theme-<themeId>'.\n */\n protected async HandleThemeSelection(themeId: string): Promise<UserMenuActionResult> {\n return {\n success: true,\n closeMenu: false, // Keep menu open to see updated state\n message: `select-theme-${themeId}` // Signal for shell to handle\n };\n }\n\n /**\n * Handle \"Reset Layout\" click\n */\n protected async Handle_reset_layout(): Promise<UserMenuActionResult> {\n // Signal to shell to handle reset layout\n return {\n success: true,\n closeMenu: true,\n message: 'reset-layout' // Special signal for shell to handle\n };\n }\n\n /**\n * Handle \"Sign Out\" click\n */\n protected async Handle_logout(): Promise<UserMenuActionResult> {\n if (!this._context?.authService) {\n return { success: false, closeMenu: true, message: 'Auth service not available' };\n }\n\n // Clear auth data\n localStorage.removeItem('auth');\n localStorage.removeItem('claims');\n\n // Call logout\n await this._context.authService.logout();\n\n return { success: true, closeMenu: true };\n }\n\n // ========================================\n // PIN TO HOME HELPERS\n // ========================================\n\n /**\n * Handle \"Pin to Home\" click - signals the shell to pin the active resource\n */\n protected async Handle_pin_to_home(): Promise<UserMenuActionResult> {\n // Signal the shell to handle the actual pinning (it has access to DI and the active tab)\n // The shell's handler checks for Home app and duplicate pin conditions\n return {\n success: true,\n closeMenu: true,\n message: 'pin-to-home'\n };\n }\n\n // ========================================\n // THEME HELPERS\n // ========================================\n\n /**\n * Build menu items for each registered theme plus a 'System' option.\n * Each theme gets a `select-theme-<id>` item ID. The currently active\n * theme (or 'system' preference) shows a checkmark icon.\n */\n protected BuildThemeMenuItems(): UserMenuItem[] {\n const themes = this._context?.availableThemes ?? [];\n const currentPreference = this._context?.themePreference ?? 'system';\n const items: UserMenuItem[] = [];\n let order = 1;\n\n for (const theme of themes) {\n const isActive = currentPreference === theme.Id;\n items.push({\n id: `select-theme-${theme.Id}`,\n label: theme.Name,\n icon: isActive ? 'fa-solid fa-check' : this.GetThemeIconForBaseTheme(theme.BaseTheme),\n color: isActive ? '#4CAF50' : undefined,\n group: 'system',\n order: order++,\n developerOnly: false,\n visible: true,\n enabled: true,\n tooltip: theme.Description ?? `Switch to ${theme.Name} theme`\n });\n }\n\n // Always add a 'System' option (auto-detect OS preference)\n const isSystemActive = currentPreference === 'system';\n items.push({\n id: 'select-theme-system',\n label: 'System',\n icon: isSystemActive ? 'fa-solid fa-check' : 'fa-solid fa-desktop',\n color: isSystemActive ? '#4CAF50' : undefined,\n group: 'system',\n order: order++,\n developerOnly: false,\n visible: true,\n enabled: true,\n tooltip: 'Auto-detect theme from OS preference'\n });\n\n return items;\n }\n\n /**\n * Get an appropriate icon for a base theme type.\n * Used for non-active theme items to hint at light vs dark.\n */\n protected GetThemeIconForBaseTheme(baseTheme: 'light' | 'dark'): string {\n return baseTheme === 'dark' ? 'fa-solid fa-moon' : 'fa-solid fa-sun';\n }\n\n // ========================================\n // UTILITY METHODS\n // ========================================\n\n /**\n * Get user display information for menu header\n */\n public GetUserDisplayInfo(): UserDisplayInfo {\n const user = this._context?.userEntity;\n const name = user?.Name || this._context?.user?.Name || 'User';\n const email = user?.Email || '';\n const avatarUrl = user?.UserImageURL || null;\n\n // Generate initials from name\n const nameParts = name.split(' ').filter(Boolean);\n const initials = nameParts.length >= 2\n ? `${nameParts[0][0]}${nameParts[nameParts.length - 1][0]}`.toUpperCase()\n : name.substring(0, 2).toUpperCase();\n\n return { name, email, avatarUrl, initials };\n }\n\n /**\n * Generate a unique tab ID\n */\n protected GenerateTabId(): string {\n return `tab-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n /**\n * Get the current context (for subclasses)\n */\n protected get Context(): UserMenuContext | null {\n return this._context;\n }\n\n /**\n * Update context (called by shell when developer mode changes)\n */\n public UpdateContext(updates: Partial<UserMenuContext>): void {\n if (this._context) {\n this._context = { ...this._context, ...updates };\n }\n }\n}\n"]}
@@ -132,6 +132,21 @@ export interface UserMenuActionResult {
132
132
  /** Optional message to display (toast notification) */
133
133
  message?: string;
134
134
  }
135
+ /**
136
+ * User display information for the menu header
137
+ */
138
+ export interface UserDisplayInfo {
139
+ /** User's display name */
140
+ name: string;
141
+ /** User's email address */
142
+ email: string;
143
+ /** URL to user's avatar image, or null */
144
+ avatarUrl: string | null;
145
+ /** Two-character initials derived from name */
146
+ initials: string;
147
+ /** Optional subtitle shown below email (e.g., organization name) */
148
+ subtitle?: string;
149
+ }
135
150
  /**
136
151
  * Options for menu configuration
137
152
  */
@@ -1 +1 @@
1
- {"version":3,"file":"user-menu.types.d.ts","sourceRoot":"","sources":["../../../src/lib/user-menu/user-menu.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"user-menu.types.d.ts","sourceRoot":"","sources":["../../../src/lib/user-menu/user-menu.types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"user-menu.types.js","sourceRoot":"","sources":["../../../src/lib/user-menu/user-menu.types.ts"],"names":[],"mappings":"AA2DA;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAwB;IACtD,OAAO,MAAM,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAwB;IACnD,OAAO,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC;AAChC,CAAC","sourcesContent":["import { ViewContainerRef } from '@angular/core';\nimport { UserInfo } from '@memberjunction/core';\nimport { MJUserEntity } from '@memberjunction/core-entities';\nimport type { ThemeDefinition } from '@memberjunction/ng-shared-generic';\n\n/**\n * Defines a single menu item in the user context menu\n */\nexport interface UserMenuItem {\n /** Unique identifier for the menu item */\n id: string;\n\n /** Display text for the menu item */\n label: string;\n\n /** Font Awesome icon class (e.g., 'fa-solid fa-gear') */\n icon: string;\n\n /** Optional icon/text color (CSS color value) */\n color?: string;\n\n /** Optional CSS class for custom styling */\n cssClass?: string;\n\n /** Group ID for organizing items (items with same group have dividers between groups) */\n group: 'primary' | 'developer' | 'system' | 'danger' | string;\n\n /** Sort order within group (lower = higher in menu) */\n order: number;\n\n /** Whether item requires Developer role to be visible */\n developerOnly: boolean;\n\n /** Whether the item is currently visible (dynamic control) */\n visible: boolean;\n\n /** Whether the item is currently enabled/clickable */\n enabled: boolean;\n\n /** Optional tooltip text */\n tooltip?: string;\n\n /** Optional keyboard shortcut hint */\n shortcut?: string;\n}\n\n/**\n * Defines a separator/divider in the menu\n */\nexport interface UserMenuDivider {\n type: 'divider';\n group: string;\n}\n\n/**\n * Union type for all menu element types\n */\nexport type UserMenuElement = UserMenuItem | UserMenuDivider;\n\n/**\n * Type guard to check if element is a divider\n */\nexport function isUserMenuDivider(element: UserMenuElement): element is UserMenuDivider {\n return 'type' in element && element.type === 'divider';\n}\n\n/**\n * Type guard to check if element is a menu item\n */\nexport function isUserMenuItem(element: UserMenuElement): element is UserMenuItem {\n return !('type' in element);\n}\n\n/**\n * Minimal application info needed by user menu\n */\nexport interface ApplicationInfoRef {\n ID: string;\n Name: string;\n [key: string]: unknown;\n}\n\n/**\n * Minimal tab info exposed to user menu (avoids importing full WorkspaceTab)\n */\nexport interface WorkspaceTabRef {\n id: string;\n title: string;\n applicationId: string;\n resourceTypeId: string;\n configuration: Record<string, unknown>;\n}\n\n/**\n * Interface for workspace manager operations needed by user menu\n */\nexport interface WorkspaceManagerRef {\n GetConfiguration: () => unknown;\n GetActiveTabId?: () => string | null;\n GetTab?: (tabId: string) => WorkspaceTabRef | undefined;\n}\n\n/**\n * Interface for pin service operations needed by user menu\n */\nexport interface PinServiceRef {\n IsPinned: (resourceType: string, config: Record<string, unknown>) => boolean;\n}\n\n/**\n * Interface for auth service operations needed by user menu\n */\nexport interface AuthServiceRef {\n logout: () => void | Promise<void>;\n}\n\n/**\n * Context passed to menu handlers\n */\nexport interface UserMenuContext {\n /** Current authenticated user info */\n user: UserInfo;\n\n /** Full user entity with all fields */\n userEntity: MJUserEntity;\n\n /** Reference to shell component for advanced operations */\n shell: Record<string, unknown>;\n\n /** View container for opening dialogs/modals */\n viewContainerRef: ViewContainerRef;\n\n /** Whether user has Developer role */\n isDeveloper: boolean;\n\n /** Whether developer mode is currently enabled (can be toggled) */\n developerModeEnabled: boolean;\n\n /** Current application context */\n currentApplication: ApplicationInfoRef | null;\n\n /** Workspace manager for layout operations */\n workspaceManager: WorkspaceManagerRef;\n\n /** Auth service for logout operations */\n authService: AuthServiceRef;\n\n /** Pin service for Home dashboard pinning */\n pinService?: PinServiceRef;\n\n /** Function to open settings dialog */\n openSettings: () => void;\n\n /** Current theme preference (theme ID or 'system') */\n themePreference?: string;\n\n /** All registered theme definitions, for building theme picker menus */\n availableThemes?: ThemeDefinition[];\n\n /** Currently applied theme ID (resolved, never 'system') */\n appliedTheme?: string;\n}\n\n/**\n * Result of a menu item click handler\n */\nexport interface UserMenuActionResult {\n /** Whether the action succeeded */\n success: boolean;\n\n /** Whether to close the menu after action */\n closeMenu: boolean;\n\n /** Optional message to display (toast notification) */\n message?: string;\n}\n\n/**\n * Options for menu configuration\n */\nexport interface UserMenuOptions {\n /** Whether to show the user name in menu header */\n showUserName: boolean;\n\n /** Whether to show the user email in menu header */\n showUserEmail: boolean;\n\n /** Menu position relative to avatar */\n menuPosition: 'below-left' | 'below-right';\n\n /** Animation style for menu opening */\n animationStyle: 'fade' | 'slide' | 'none';\n}\n"]}
1
+ {"version":3,"file":"user-menu.types.js","sourceRoot":"","sources":["../../../src/lib/user-menu/user-menu.types.ts"],"names":[],"mappings":"AA2DA;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAwB;IACtD,OAAO,MAAM,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAwB;IACnD,OAAO,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC;AAChC,CAAC","sourcesContent":["import { ViewContainerRef } from '@angular/core';\nimport { UserInfo } from '@memberjunction/core';\nimport { MJUserEntity } from '@memberjunction/core-entities';\nimport type { ThemeDefinition } from '@memberjunction/ng-shared-generic';\n\n/**\n * Defines a single menu item in the user context menu\n */\nexport interface UserMenuItem {\n /** Unique identifier for the menu item */\n id: string;\n\n /** Display text for the menu item */\n label: string;\n\n /** Font Awesome icon class (e.g., 'fa-solid fa-gear') */\n icon: string;\n\n /** Optional icon/text color (CSS color value) */\n color?: string;\n\n /** Optional CSS class for custom styling */\n cssClass?: string;\n\n /** Group ID for organizing items (items with same group have dividers between groups) */\n group: 'primary' | 'developer' | 'system' | 'danger' | string;\n\n /** Sort order within group (lower = higher in menu) */\n order: number;\n\n /** Whether item requires Developer role to be visible */\n developerOnly: boolean;\n\n /** Whether the item is currently visible (dynamic control) */\n visible: boolean;\n\n /** Whether the item is currently enabled/clickable */\n enabled: boolean;\n\n /** Optional tooltip text */\n tooltip?: string;\n\n /** Optional keyboard shortcut hint */\n shortcut?: string;\n}\n\n/**\n * Defines a separator/divider in the menu\n */\nexport interface UserMenuDivider {\n type: 'divider';\n group: string;\n}\n\n/**\n * Union type for all menu element types\n */\nexport type UserMenuElement = UserMenuItem | UserMenuDivider;\n\n/**\n * Type guard to check if element is a divider\n */\nexport function isUserMenuDivider(element: UserMenuElement): element is UserMenuDivider {\n return 'type' in element && element.type === 'divider';\n}\n\n/**\n * Type guard to check if element is a menu item\n */\nexport function isUserMenuItem(element: UserMenuElement): element is UserMenuItem {\n return !('type' in element);\n}\n\n/**\n * Minimal application info needed by user menu\n */\nexport interface ApplicationInfoRef {\n ID: string;\n Name: string;\n [key: string]: unknown;\n}\n\n/**\n * Minimal tab info exposed to user menu (avoids importing full WorkspaceTab)\n */\nexport interface WorkspaceTabRef {\n id: string;\n title: string;\n applicationId: string;\n resourceTypeId: string;\n configuration: Record<string, unknown>;\n}\n\n/**\n * Interface for workspace manager operations needed by user menu\n */\nexport interface WorkspaceManagerRef {\n GetConfiguration: () => unknown;\n GetActiveTabId?: () => string | null;\n GetTab?: (tabId: string) => WorkspaceTabRef | undefined;\n}\n\n/**\n * Interface for pin service operations needed by user menu\n */\nexport interface PinServiceRef {\n IsPinned: (resourceType: string, config: Record<string, unknown>) => boolean;\n}\n\n/**\n * Interface for auth service operations needed by user menu\n */\nexport interface AuthServiceRef {\n logout: () => void | Promise<void>;\n}\n\n/**\n * Context passed to menu handlers\n */\nexport interface UserMenuContext {\n /** Current authenticated user info */\n user: UserInfo;\n\n /** Full user entity with all fields */\n userEntity: MJUserEntity;\n\n /** Reference to shell component for advanced operations */\n shell: Record<string, unknown>;\n\n /** View container for opening dialogs/modals */\n viewContainerRef: ViewContainerRef;\n\n /** Whether user has Developer role */\n isDeveloper: boolean;\n\n /** Whether developer mode is currently enabled (can be toggled) */\n developerModeEnabled: boolean;\n\n /** Current application context */\n currentApplication: ApplicationInfoRef | null;\n\n /** Workspace manager for layout operations */\n workspaceManager: WorkspaceManagerRef;\n\n /** Auth service for logout operations */\n authService: AuthServiceRef;\n\n /** Pin service for Home dashboard pinning */\n pinService?: PinServiceRef;\n\n /** Function to open settings dialog */\n openSettings: () => void;\n\n /** Current theme preference (theme ID or 'system') */\n themePreference?: string;\n\n /** All registered theme definitions, for building theme picker menus */\n availableThemes?: ThemeDefinition[];\n\n /** Currently applied theme ID (resolved, never 'system') */\n appliedTheme?: string;\n}\n\n/**\n * Result of a menu item click handler\n */\nexport interface UserMenuActionResult {\n /** Whether the action succeeded */\n success: boolean;\n\n /** Whether to close the menu after action */\n closeMenu: boolean;\n\n /** Optional message to display (toast notification) */\n message?: string;\n}\n\n/**\n * User display information for the menu header\n */\nexport interface UserDisplayInfo {\n /** User's display name */\n name: string;\n\n /** User's email address */\n email: string;\n\n /** URL to user's avatar image, or null */\n avatarUrl: string | null;\n\n /** Two-character initials derived from name */\n initials: string;\n\n /** Optional subtitle shown below email (e.g., organization name) */\n subtitle?: string;\n}\n\n/**\n * Options for menu configuration\n */\nexport interface UserMenuOptions {\n /** Whether to show the user name in menu header */\n showUserName: boolean;\n\n /** Whether to show the user email in menu header */\n showUserEmail: boolean;\n\n /** Menu position relative to avatar */\n menuPosition: 'below-left' | 'below-right';\n\n /** Animation style for menu opening */\n animationStyle: 'fade' | 'slide' | 'none';\n}\n"]}
@@ -2,7 +2,6 @@ import { ElementRef, AfterViewInit, OnInit } from '@angular/core';
2
2
  import { SharedService, NavigationService } from '@memberjunction/ng-shared';
3
3
  import { MJUserNotificationEntity, MJUserNotificationTypeEntity } from '@memberjunction/core-entities';
4
4
  import { TransactionGroupBase } from '@memberjunction/core';
5
- import { Router } from '@angular/router';
6
5
  import { ApplicationManager } from '@memberjunction/ng-base-application';
7
6
  import * as i0 from "@angular/core";
8
7
  /**
@@ -18,7 +17,6 @@ interface NotificationUrlInfo {
18
17
  }
19
18
  export declare class UserNotificationsComponent implements OnInit, AfterViewInit {
20
19
  sharedService: SharedService;
21
- private router;
22
20
  private navigationService;
23
21
  private appManager;
24
22
  allRadio: ElementRef<HTMLInputElement>;
@@ -29,7 +27,7 @@ export declare class UserNotificationsComponent implements OnInit, AfterViewInit
29
27
  notificationTypes: MJUserNotificationTypeEntity[];
30
28
  selectedTypeFilter: string | null;
31
29
  loadingTypes: boolean;
32
- constructor(sharedService: SharedService, router: Router, navigationService: NavigationService, appManager: ApplicationManager);
30
+ constructor(sharedService: SharedService, navigationService: NavigationService, appManager: ApplicationManager);
33
31
  ngOnInit(): Promise<void>;
34
32
  ngAfterViewInit(): void;
35
33
  private loadNotificationTypes;
@@ -50,6 +48,11 @@ export declare class UserNotificationsComponent implements OnInit, AfterViewInit
50
48
  markAllAsUnread(): Promise<void>;
51
49
  markAll(bRead: boolean): Promise<void>;
52
50
  notificationClicked(notification: MJUserNotificationEntity): void;
51
+ /**
52
+ * Navigate to a resource-based notification using NavigationService methods.
53
+ * Routes to the correct resource based on the notification's ResourceType.
54
+ */
55
+ private navigateToResource;
53
56
  /**
54
57
  * Handle navigation to an agent request via NavigationService.
55
58
  * Returns true if the notification was an agent-request type and navigation was attempted.
@@ -1 +1 @@
1
- {"version":3,"file":"user-notifications.component.d.ts","sourceRoot":"","sources":["../../../src/lib/user-notifications/user-notifications.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAoD,wBAAwB,EAAE,4BAA4B,EAAkB,MAAM,+BAA+B,CAAC;AACzK,OAAO,EAAY,oBAAoB,EAAuB,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;;AAEzE;;GAEG;AACH,KAAK,gBAAgB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AA6BlD;;GAEG;AACH,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAMa,0BAA2B,YAAW,MAAM,EAAE,aAAa;IAY7D,aAAa,EAAE,aAAa;IACnC,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,UAAU;IAdG,QAAQ,EAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IACrC,WAAW,EAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC7C,SAAS,EAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAE1D,aAAa,EAAE,gBAAgB,CAAS;IACxC,aAAa,EAAE,MAAM,CAAM;IAC3B,iBAAiB,EAAE,4BAA4B,EAAE,CAAM;IACvD,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACzC,YAAY,EAAE,OAAO,CAAQ;gBAG3B,aAAa,EAAE,aAAa,EAC3B,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,iBAAiB,EACpC,UAAU,EAAE,kBAAkB;IAGlC,QAAQ;IAId,eAAe,IAAI,IAAI;IAIvB,OAAO,CAAC,qBAAqB;IAc7B,IAAW,mBAAmB,IAAI,wBAAwB,EAAE,CA4B3D;IAEM,uBAAuB,CAAC,YAAY,EAAE,wBAAwB,GAAG,OAAO;IAaxE,eAAe,CAAC,YAAY,EAAE,wBAAwB,GAAG,mBAAmB;IAkDnF,IAAW,gBAAgB,IAAI,wBAAwB,EAAE,CAExD;IAED,IAAW,mBAAmB,IAAI,wBAAwB,EAAE,CAE3D;IAED,IAAW,iBAAiB,IAAI,wBAAwB,EAAE,CAEzD;IAED,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAgBhD,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAMtC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIpC,iBAAiB,CAAC,YAAY,EAAE,wBAAwB,GAAG,MAAM;IAOjE,mBAAmB,CAAC,YAAY,EAAE,wBAAwB,GAAG,MAAM;IAY7D,UAAU,CAAC,YAAY,EAAE,wBAAwB,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,oBAAoB,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAoCtH,aAAa;IAOb,6BAA6B;IAkC7B,eAAe;IAIf,OAAO,CAAC,KAAK,EAAE,OAAO;IAoBnC,mBAAmB,CAAC,YAAY,EAAE,wBAAwB,GAAG,IAAI;IAwBjE;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAmC9B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IA8BvB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,4BAA4B,GAAG,IAAI;IAK/E,WAAW,CAAC,YAAY,EAAE,wBAAwB,GAAG,MAAM;IAK3D,YAAY,CAAC,YAAY,EAAE,wBAAwB,GAAG,MAAM;IAK5D,WAAW,CAAC,YAAY,EAAE,wBAAwB,GAAG,MAAM;IAK3D,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;yCAxZ3C,0BAA0B;2CAA1B,0BAA0B;CA2ZtC"}
1
+ {"version":3,"file":"user-notifications.component.d.ts","sourceRoot":"","sources":["../../../src/lib/user-notifications/user-notifications.component.ts"],"names":[],"mappings":"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"}