@memberjunction/ng-explorer-core 5.31.0 → 5.33.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 (41) hide show
  1. package/dist/generated/lazy-feature-config.d.ts +1 -1
  2. package/dist/generated/lazy-feature-config.d.ts.map +1 -1
  3. package/dist/generated/lazy-feature-config.js +13 -2
  4. package/dist/generated/lazy-feature-config.js.map +1 -1
  5. package/dist/lib/about/about-dialog.component.d.ts +82 -0
  6. package/dist/lib/about/about-dialog.component.d.ts.map +1 -0
  7. package/dist/lib/about/about-dialog.component.js +689 -0
  8. package/dist/lib/about/about-dialog.component.js.map +1 -0
  9. package/dist/lib/profile/profile-dialog.component.d.ts +72 -0
  10. package/dist/lib/profile/profile-dialog.component.d.ts.map +1 -0
  11. package/dist/lib/profile/profile-dialog.component.js +722 -0
  12. package/dist/lib/profile/profile-dialog.component.js.map +1 -0
  13. package/dist/lib/services/lazy-module-registry.d.ts +20 -0
  14. package/dist/lib/services/lazy-module-registry.d.ts.map +1 -1
  15. package/dist/lib/services/lazy-module-registry.js +43 -0
  16. package/dist/lib/services/lazy-module-registry.js.map +1 -1
  17. package/dist/lib/shell/services/about-dialog.service.d.ts +23 -0
  18. package/dist/lib/shell/services/about-dialog.service.d.ts.map +1 -0
  19. package/dist/lib/shell/services/about-dialog.service.js +45 -0
  20. package/dist/lib/shell/services/about-dialog.service.js.map +1 -0
  21. package/dist/lib/shell/services/profile-dialog.service.d.ts +22 -0
  22. package/dist/lib/shell/services/profile-dialog.service.d.ts.map +1 -0
  23. package/dist/lib/shell/services/profile-dialog.service.js +49 -0
  24. package/dist/lib/shell/services/profile-dialog.service.js.map +1 -0
  25. package/dist/lib/shell/shell.component.d.ts +7 -11
  26. package/dist/lib/shell/shell.component.d.ts.map +1 -1
  27. package/dist/lib/shell/shell.component.js +69 -54
  28. package/dist/lib/shell/shell.component.js.map +1 -1
  29. package/dist/lib/user-menu/base-user-menu.d.ts +4 -13
  30. package/dist/lib/user-menu/base-user-menu.d.ts.map +1 -1
  31. package/dist/lib/user-menu/base-user-menu.js +26 -75
  32. package/dist/lib/user-menu/base-user-menu.js.map +1 -1
  33. package/dist/public-api.d.ts +4 -0
  34. package/dist/public-api.d.ts.map +1 -1
  35. package/dist/public-api.js +6 -0
  36. package/dist/public-api.js.map +1 -1
  37. package/package.json +42 -42
  38. package/dist/lib/shell/services/settings-dialog.service.d.ts +0 -28
  39. package/dist/lib/shell/services/settings-dialog.service.d.ts.map +0 -1
  40. package/dist/lib/shell/services/settings-dialog.service.js +0 -61
  41. package/dist/lib/shell/services/settings-dialog.service.js.map +0 -1
@@ -98,21 +98,10 @@ export declare class BaseUserMenu {
98
98
  */
99
99
  protected OnItemClick(item: UserMenuItem): Promise<UserMenuActionResult>;
100
100
  /**
101
- * Handle "My Profile" click - Opens user profile/settings
101
+ * Handle "My Profile" click signals the shell to open the new
102
+ * Identity Card profile dialog. The shell wires this to ProfileDialogService.
102
103
  */
103
104
  protected Handle_profile(): Promise<UserMenuActionResult>;
104
- /**
105
- * Handle "Toggle Developer Mode" click
106
- */
107
- protected Handle_toggle_dev_mode(): Promise<UserMenuActionResult>;
108
- /**
109
- * Handle "Log Layout" click - Debug utility
110
- */
111
- protected Handle_log_layout(): Promise<UserMenuActionResult>;
112
- /**
113
- * Handle "Inspect App State" click - Debug utility
114
- */
115
- protected Handle_inspect_state(): Promise<UserMenuActionResult>;
116
105
  /**
117
106
  * Handle theme selection clicks.
118
107
  * Item IDs follow the pattern 'select-theme-<themeId>'.
@@ -138,6 +127,8 @@ export declare class BaseUserMenu {
138
127
  protected Handle_sharing_center(): Promise<UserMenuActionResult>;
139
128
  /** Signal the shell to open the feedback dialog */
140
129
  protected Handle_submit_feedback(): Promise<UserMenuActionResult>;
130
+ /** Signal the shell to open the About dialog */
131
+ protected Handle_about(): Promise<UserMenuActionResult>;
141
132
  /**
142
133
  * Build menu items for each registered theme plus a 'System' option.
143
134
  * Each theme gets a `select-theme-<id>` item ID. The currently active
@@ -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,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;IAoHrC;;;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;IAUnE;;;;OAIG;cACa,qBAAqB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAQtE,mDAAmD;cACnC,sBAAsB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAYvE;;;;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"}
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;IA6FrC;;;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;;;OAGG;cACa,cAAc,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAQ/D;;;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;IAUnE;;;;OAIG;cACa,qBAAqB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAQtE,mDAAmD;cACnC,sBAAsB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAQvE,gDAAgD;cAChC,YAAY,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAY7D;;;;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"}
@@ -97,7 +97,6 @@ export class BaseUserMenu {
97
97
  * Developer role AND developer mode is enabled.
98
98
  */
99
99
  GetMenuItems() {
100
- const devModeEnabled = this._context?.developerModeEnabled ?? false;
101
100
  return [
102
101
  // === PRIMARY GROUP ===
103
102
  {
@@ -144,41 +143,9 @@ export class BaseUserMenu {
144
143
  enabled: true,
145
144
  tooltip: 'Report a bug or request a feature'
146
145
  },
147
- // === DEVELOPER GROUP (Only visible to developers) ===
148
- {
149
- id: 'toggle-dev-mode',
150
- label: devModeEnabled ? 'Developer Mode (On)' : 'Developer Mode (Off)',
151
- icon: devModeEnabled ? 'fa-solid fa-toggle-on' : 'fa-solid fa-toggle-off',
152
- color: devModeEnabled ? '#4CAF50' : undefined,
153
- group: 'developer',
154
- order: 10,
155
- developerOnly: true,
156
- visible: true,
157
- enabled: true,
158
- tooltip: 'Toggle developer tools visibility'
159
- },
160
- {
161
- id: 'log-layout',
162
- label: 'Log Layout (Debug)',
163
- icon: 'fa-solid fa-terminal',
164
- group: 'developer',
165
- order: 20,
166
- developerOnly: true,
167
- visible: devModeEnabled,
168
- enabled: true,
169
- tooltip: 'Output current layout configuration to console'
170
- },
171
- {
172
- id: 'inspect-state',
173
- label: 'Inspect App State',
174
- icon: 'fa-solid fa-magnifying-glass-chart',
175
- group: 'developer',
176
- order: 30,
177
- developerOnly: true,
178
- visible: devModeEnabled,
179
- enabled: true,
180
- tooltip: 'View current application state in console'
181
- },
146
+ // Developer tools live in the Admin app's "Developer Tools" section,
147
+ // not in this menu. The DeveloperModeService still exists for
148
+ // per-record dev affordances (e.g. "open in CodeGen" links).
182
149
  // === SYSTEM GROUP (Theme selection) ===
183
150
  ...this.BuildThemeMenuItems(),
184
151
  {
@@ -192,6 +159,17 @@ export class BaseUserMenu {
192
159
  enabled: true,
193
160
  tooltip: 'Reset workspace to default layout'
194
161
  },
162
+ {
163
+ id: 'about',
164
+ label: 'About MemberJunction',
165
+ icon: 'fa-solid fa-circle-info',
166
+ group: 'system',
167
+ order: 20,
168
+ developerOnly: false,
169
+ visible: true,
170
+ enabled: true,
171
+ tooltip: 'Version, diagnostics, and links'
172
+ },
195
173
  // === DANGER GROUP ===
196
174
  {
197
175
  id: 'logout',
@@ -304,51 +282,16 @@ export class BaseUserMenu {
304
282
  // DEFAULT HANDLERS - Override to customize
305
283
  // ========================================
306
284
  /**
307
- * Handle "My Profile" click - Opens user profile/settings
285
+ * Handle "My Profile" click signals the shell to open the new
286
+ * Identity Card profile dialog. The shell wires this to ProfileDialogService.
308
287
  */
309
288
  async Handle_profile() {
310
- if (this._context?.openSettings) {
311
- this._context.openSettings();
312
- }
313
- return { success: true, closeMenu: true };
314
- }
315
- /**
316
- * Handle "Toggle Developer Mode" click
317
- */
318
- async Handle_toggle_dev_mode() {
319
- // This will be handled by the shell component which has access to DeveloperModeService
320
- // The result signals that the menu should refresh to show the updated state
321
289
  return {
322
290
  success: true,
323
- closeMenu: false, // Keep menu open to see updated state
324
- message: 'toggle-dev-mode' // Special signal for shell to handle
291
+ closeMenu: true,
292
+ message: 'profile'
325
293
  };
326
294
  }
327
- /**
328
- * Handle "Log Layout" click - Debug utility
329
- */
330
- async Handle_log_layout() {
331
- if (!this._context?.workspaceManager) {
332
- return { success: false, closeMenu: true, message: 'Workspace manager not available' };
333
- }
334
- const config = this._context.workspaceManager.GetConfiguration();
335
- console.log('📋 Workspace Configuration:', JSON.stringify(config, null, 2));
336
- console.log('📋 Workspace Configuration (object):', config);
337
- return { success: true, closeMenu: true };
338
- }
339
- /**
340
- * Handle "Inspect App State" click - Debug utility
341
- */
342
- async Handle_inspect_state() {
343
- console.group('🔍 Application State Inspection');
344
- console.log('User:', this._context?.userEntity);
345
- console.log('Current App:', this._context?.currentApplication);
346
- console.log('Developer Mode:', this._context?.developerModeEnabled);
347
- console.log('Is Developer:', this._context?.isDeveloper);
348
- console.log('Workspace Config:', this._context?.workspaceManager?.GetConfiguration());
349
- console.groupEnd();
350
- return { success: true, closeMenu: true };
351
- }
352
295
  /**
353
296
  * Handle theme selection clicks.
354
297
  * Item IDs follow the pattern 'select-theme-<themeId>'.
@@ -420,6 +363,14 @@ export class BaseUserMenu {
420
363
  message: 'submit-feedback'
421
364
  };
422
365
  }
366
+ /** Signal the shell to open the About dialog */
367
+ async Handle_about() {
368
+ return {
369
+ success: true,
370
+ closeMenu: true,
371
+ message: 'about'
372
+ };
373
+ }
423
374
  // ========================================
424
375
  // THEME HELPERS
425
376
  // ========================================
@@ -1 +1 @@
1
- {"version":3,"file":"base-user-menu.js","sourceRoot":"","sources":["../../../src/lib/user-menu/base-user-menu.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,OAAO,YAAY;IACX,QAAQ,GAA2B,IAAI,CAAC;IACxC,QAAQ,CAAkB;IAEpC;QACI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC7C,CAAC;IAED,2CAA2C;IAC3C,iBAAiB;IACjB,2CAA2C;IAE3C;;OAEG;IACI,KAAK,CAAC,UAAU,CAAC,OAAwB;QAC5C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,YAAY,CAAC,OAAwB;QACjD,iDAAiD;IACrD,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,2CAA2C;IAC3C,UAAU;IACV,2CAA2C;IAE3C;;OAEG;IACO,iBAAiB;QACvB,OAAO;YACH,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,IAAI;YACnB,YAAY,EAAE,YAAY;YAC1B,cAAc,EAAE,MAAM;SACzB,CAAC;IACN,CAAC;IAED;;OAEG;IACI,UAAU;QACb,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,OAAiC;QAC/C,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC;IACrD,CAAC;IAED,2CAA2C;IAC3C,qCAAqC;IACrC,2CAA2C;IAE3C;;;;;;;;OAQG;IACI,YAAY;QACf,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,EAAE,oBAAoB,IAAI,KAAK,CAAC;QAEpE,OAAO;YACH,wBAAwB;YACxB;gBACI,EAAE,EAAE,SAAS;gBACb,KAAK,EAAE,YAAY;gBACnB,IAAI,EAAE,yBAAyB;gBAC/B,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,EAAE;gBACT,aAAa,EAAE,KAAK;gBACpB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,4BAA4B;aACxC;YACD;gBACI,EAAE,EAAE,aAAa;gBACjB,KAAK,EAAE,aAAa;gBACpB,IAAI,EAAE,2BAA2B;gBACjC,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,EAAE;gBACT,aAAa,EAAE,KAAK;gBACpB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,iDAAiD;aAC7D;YACD;gBACI,EAAE,EAAE,gBAAgB;gBACpB,KAAK,EAAE,gBAAgB;gBACvB,IAAI,EAAE,yBAAyB;gBAC/B,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,EAAE;gBACT,aAAa,EAAE,KAAK;gBACpB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,wDAAwD;aACpE;YACD;gBACI,EAAE,EAAE,iBAAiB;gBACrB,KAAK,EAAE,iBAAiB;gBACxB,IAAI,EAAE,0BAA0B;gBAChC,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,EAAE;gBACT,aAAa,EAAE,KAAK;gBACpB,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,eAAe,KAAK,KAAK;gBACjD,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,mCAAmC;aAC/C;YAED,uDAAuD;YACvD;gBACI,EAAE,EAAE,iBAAiB;gBACrB,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,sBAAsB;gBACtE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,wBAAwB;gBACzE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;gBAC7C,KAAK,EAAE,WAAW;gBAClB,KAAK,EAAE,EAAE;gBACT,aAAa,EAAE,IAAI;gBACnB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,mCAAmC;aAC/C;YACD;gBACI,EAAE,EAAE,YAAY;gBAChB,KAAK,EAAE,oBAAoB;gBAC3B,IAAI,EAAE,sBAAsB;gBAC5B,KAAK,EAAE,WAAW;gBAClB,KAAK,EAAE,EAAE;gBACT,aAAa,EAAE,IAAI;gBACnB,OAAO,EAAE,cAAc;gBACvB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,gDAAgD;aAC5D;YACD;gBACI,EAAE,EAAE,eAAe;gBACnB,KAAK,EAAE,mBAAmB;gBAC1B,IAAI,EAAE,oCAAoC;gBAC1C,KAAK,EAAE,WAAW;gBAClB,KAAK,EAAE,EAAE;gBACT,aAAa,EAAE,IAAI;gBACnB,OAAO,EAAE,cAAc;gBACvB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,2CAA2C;aACvD;YAED,yCAAyC;YACzC,GAAG,IAAI,CAAC,mBAAmB,EAAE;YAC7B;gBACI,EAAE,EAAE,cAAc;gBAClB,KAAK,EAAE,cAAc;gBACrB,IAAI,EAAE,yBAAyB;gBAC/B,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,EAAE;gBACT,aAAa,EAAE,KAAK;gBACpB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,mCAAmC;aAC/C;YAED,uBAAuB;YACvB;gBACI,EAAE,EAAE,QAAQ;gBACZ,KAAK,EAAE,UAAU;gBACjB,IAAI,EAAE,0BAA0B;gBAChC,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE,QAAQ;gBAClB,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,GAAG;gBACV,aAAa,EAAE,KAAK;gBACpB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;aAChB;SACJ,CAAC;IACN,CAAC;IAED;;;OAGG;IACI,eAAe;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QAEpE,cAAc;QACd,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAsB,EAAE,CAAC;QAEvC,qBAAqB;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACtD,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,mCAAmC;QACnC,eAAe,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACrC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACZ,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAqB,CAAC,CAAC;YACjE,CAAC;YAED,mCAAmC;YACnC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YACnE,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED;;OAEG;IACO,aAAa,CAAC,IAAkB;QACtC,kCAAkC;QAClC,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;YACpD,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,gCAAgC;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;;OAGG;IACO,aAAa;QACnB,OAAO,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACO,UAAU,CAAC,KAAqB;QACtC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;YACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YACvB,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,OAAO,MAAM,CAAC;QAClB,CAAC,EAAE,EAAoC,CAAC,CAAC;IAC7C,CAAC;IAED,2CAA2C;IAC3C,iBAAiB;IACjB,2CAA2C;IAE3C;;;OAGG;IACI,KAAK,CAAC,eAAe,CAAC,MAAc;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QAE9C,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC;QACvF,CAAC;QAED,mDAAmD;QACnD,IAAI,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YACzD,OAAO,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;QAED,+FAA+F;QAC/F,MAAM,WAAW,GAAG,UAAU,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAgB,CAAC;QAExE,IAAI,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,UAAU,EAAE,CAAC;YAC1C,OAAO,MAAO,IAAI,CAAC,WAAW,CAAyC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvF,CAAC;QAED,+BAA+B;QAC/B,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED;;;OAGG;IACO,KAAK,CAAC,WAAW,CAAC,IAAkB;QAC1C,OAAO,CAAC,IAAI,CAAC,qCAAqC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC/C,CAAC;IAED,2CAA2C;IAC3C,2CAA2C;IAC3C,2CAA2C;IAE3C;;OAEG;IACO,KAAK,CAAC,cAAc;QAC1B,IAAI,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,sBAAsB;QAClC,uFAAuF;QACvF,4EAA4E;QAC5E,OAAO;YACH,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,KAAK,EAAE,sCAAsC;YACxD,OAAO,EAAE,iBAAiB,CAAC,qCAAqC;SACnE,CAAC;IACN,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,iBAAiB;QAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;YACnC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC;QAC3F,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,sCAAsC,EAAE,MAAM,CAAC,CAAC;QAE5D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,oBAAoB;QAChC,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,QAAQ,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACtF,OAAO,CAAC,QAAQ,EAAE,CAAC;QAEnB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACO,KAAK,CAAC,oBAAoB,CAAC,OAAe;QAChD,OAAO;YACH,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,KAAK,EAAE,sCAAsC;YACxD,OAAO,EAAE,gBAAgB,OAAO,EAAE,CAAC,6BAA6B;SACnE,CAAC;IACN,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,mBAAmB;QAC/B,yCAAyC;QACzC,OAAO;YACH,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,cAAc,CAAC,qCAAqC;SAChE,CAAC;IACN,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,aAAa;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;YAC9B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC;QACtF,CAAC;QAED,kBAAkB;QAClB,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAChC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAElC,cAAc;QACd,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QAEzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC;IAED,2CAA2C;IAC3C,sBAAsB;IACtB,2CAA2C;IAE3C;;OAEG;IACO,KAAK,CAAC,kBAAkB;QAC9B,yFAAyF;QACzF,uEAAuE;QACvE,OAAO;YACH,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,aAAa;SACzB,CAAC;IACN,CAAC;IAED;;;;OAIG;IACO,KAAK,CAAC,qBAAqB;QACjC,OAAO;YACH,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,gBAAgB;SAC5B,CAAC;IACN,CAAC;IAED,mDAAmD;IACzC,KAAK,CAAC,sBAAsB;QAClC,OAAO;YACH,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,iBAAiB;SAC7B,CAAC;IACN,CAAC;IAED,2CAA2C;IAC3C,gBAAgB;IAChB,2CAA2C;IAE3C;;;;OAIG;IACO,mBAAmB;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,IAAI,EAAE,CAAC;QACpD,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,IAAI,QAAQ,CAAC;QACrE,MAAM,KAAK,GAAmB,EAAE,CAAC;QACjC,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,iBAAiB,KAAK,KAAK,CAAC,EAAE,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC;gBACP,EAAE,EAAE,gBAAgB,KAAK,CAAC,EAAE,EAAE;gBAC9B,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,SAAS,CAAC;gBACrF,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;gBACvC,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,KAAK,EAAE;gBACd,aAAa,EAAE,KAAK;gBACpB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,KAAK,CAAC,WAAW,IAAI,aAAa,KAAK,CAAC,IAAI,QAAQ;aAChE,CAAC,CAAC;QACP,CAAC;QAED,2DAA2D;QAC3D,MAAM,cAAc,GAAG,iBAAiB,KAAK,QAAQ,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC;YACP,EAAE,EAAE,qBAAqB;YACzB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,qBAAqB;YAClE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YAC7C,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,KAAK,EAAE;YACd,aAAa,EAAE,KAAK;YACpB,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,sCAAsC;SAClD,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;OAGG;IACO,wBAAwB,CAAC,SAA2B;QAC1D,OAAO,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACzE,CAAC;IAED,2CAA2C;IAC3C,kBAAkB;IAClB,2CAA2C;IAE3C;;OAEG;IACI,kBAAkB;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,IAAI,MAAM,CAAC;QAC/D,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,EAAE,YAAY,IAAI,IAAI,CAAC;QAE7C,8BAA8B;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC;YAClC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE;YACzE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAEzC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IAChD,CAAC;IAED;;OAEG;IACO,aAAa;QACnB,OAAO,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC1E,CAAC;IAED;;OAEG;IACH,IAAc,OAAO;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,OAAiC;QAClD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC;QACrD,CAAC;IACL,CAAC;CACJ","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 id: 'sharing-center',\n label: 'Sharing Center',\n icon: 'fa-solid fa-share-nodes',\n group: 'primary',\n order: 25,\n developerOnly: false,\n visible: true,\n enabled: true,\n tooltip: \"See what you've shared and what's been shared with you\"\n },\n {\n id: 'submit-feedback',\n label: 'Submit Feedback',\n icon: 'fa-solid fa-comment-dots',\n group: 'primary',\n order: 30,\n developerOnly: false,\n visible: this._context?.feedbackEnabled !== false,\n enabled: true,\n tooltip: 'Report a bug or request a feature'\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 * Handle \"Sharing Center\" click — signals the shell to open the dialog.\n * The shell has access to `ViewContainerRef` and the dialog service; the\n * menu only needs to report the intent.\n */\n protected async Handle_sharing_center(): Promise<UserMenuActionResult> {\n return {\n success: true,\n closeMenu: true,\n message: 'sharing-center'\n };\n }\n\n /** Signal the shell to open the feedback dialog */\n protected async Handle_submit_feedback(): Promise<UserMenuActionResult> {\n return {\n success: true,\n closeMenu: true,\n message: 'submit-feedback'\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"]}
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 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 id: 'sharing-center',\n label: 'Sharing Center',\n icon: 'fa-solid fa-share-nodes',\n group: 'primary',\n order: 25,\n developerOnly: false,\n visible: true,\n enabled: true,\n tooltip: \"See what you've shared and what's been shared with you\"\n },\n {\n id: 'submit-feedback',\n label: 'Submit Feedback',\n icon: 'fa-solid fa-comment-dots',\n group: 'primary',\n order: 30,\n developerOnly: false,\n visible: this._context?.feedbackEnabled !== false,\n enabled: true,\n tooltip: 'Report a bug or request a feature'\n },\n\n // Developer tools live in the Admin app's \"Developer Tools\" section,\n // not in this menu. The DeveloperModeService still exists for\n // per-record dev affordances (e.g. \"open in CodeGen\" links).\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 id: 'about',\n label: 'About MemberJunction',\n icon: 'fa-solid fa-circle-info',\n group: 'system',\n order: 20,\n developerOnly: false,\n visible: true,\n enabled: true,\n tooltip: 'Version, diagnostics, and links'\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 — signals the shell to open the new\n * Identity Card profile dialog. The shell wires this to ProfileDialogService.\n */\n protected async Handle_profile(): Promise<UserMenuActionResult> {\n return {\n success: true,\n closeMenu: true,\n message: 'profile'\n };\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 * Handle \"Sharing Center\" click — signals the shell to open the dialog.\n * The shell has access to `ViewContainerRef` and the dialog service; the\n * menu only needs to report the intent.\n */\n protected async Handle_sharing_center(): Promise<UserMenuActionResult> {\n return {\n success: true,\n closeMenu: true,\n message: 'sharing-center'\n };\n }\n\n /** Signal the shell to open the feedback dialog */\n protected async Handle_submit_feedback(): Promise<UserMenuActionResult> {\n return {\n success: true,\n closeMenu: true,\n message: 'submit-feedback'\n };\n }\n\n /** Signal the shell to open the About dialog */\n protected async Handle_about(): Promise<UserMenuActionResult> {\n return {\n success: true,\n closeMenu: true,\n message: 'about'\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"]}
@@ -32,6 +32,10 @@ export * from './lib/services/lazy-module-registry';
32
32
  export * from './generated/lazy-feature-config';
33
33
  export * from './lib/system-validation/system-validation-banner.component';
34
34
  export * from './lib/user-menu';
35
+ export * from './lib/about/about-dialog.component';
36
+ export * from './lib/shell/services/about-dialog.service';
37
+ export * from './lib/profile/profile-dialog.component';
38
+ export * from './lib/shell/services/profile-dialog.service';
35
39
  export * from './lib/oauth/oauth.module';
36
40
  export * from './lib/oauth/oauth-callback.component';
37
41
  export * from './app-routing.module';
@@ -1 +1 @@
1
- {"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"AAIA,cAAc,4CAA4C,CAAC;AAE3D,cAAc,sDAAsD,CAAA;AACpE,cAAc,2EAA2E,CAAA;AACzF,cAAc,mDAAmD,CAAA;AAEjE,cAAc,2DAA2D,CAAA;AACzE,cAAc,iDAAiD,CAAA;AAC/D,cAAc,wDAAwD,CAAA;AACtE,cAAc,+DAA+D,CAAA;AAC7E,cAAc,qDAAqD,CAAA;AAGnE,cAAc,iDAAiD,CAAC;AAChE,cAAc,+CAA+C,CAAC;AAG9D,cAAc,0BAA0B,CAAA;AACxC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,6CAA6C,CAAA;AAC3D,cAAc,2DAA2D,CAAA;AACzE,cAAc,mDAAmD,CAAA;AACjE,cAAc,+DAA+D,CAAA;AAC7E,cAAc,qEAAqE,CAAA;AACnF,cAAc,2EAA2E,CAAA;AACzF,cAAc,uDAAuD,CAAA;AACrE,cAAc,2CAA2C,CAAA;AACzD,cAAc,uDAAuD,CAAC;AACtE,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAE5C,cAAc,2CAA2C,CAAA;AACzD,cAAc,kDAAkD,CAAA;AAGhE,cAAc,0CAA0C,CAAA;AACxD,cAAc,2CAA2C,CAAA;AAGzD,cAAc,4CAA4C,CAAA;AAC1D,cAAc,gEAAgE,CAAA;AAG9E,cAAc,qCAAqC,CAAA;AACnD,cAAc,iCAAiC,CAAA;AAC/C,cAAc,4DAA4D,CAAA;AAG1E,cAAc,iBAAiB,CAAA;AAG/B,cAAc,0BAA0B,CAAA;AACxC,cAAc,sCAAsC,CAAA;AAGpD,cAAc,sBAAsB,CAAA;AAEpC,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"AAIA,cAAc,4CAA4C,CAAC;AAE3D,cAAc,sDAAsD,CAAA;AACpE,cAAc,2EAA2E,CAAA;AACzF,cAAc,mDAAmD,CAAA;AAEjE,cAAc,2DAA2D,CAAA;AACzE,cAAc,iDAAiD,CAAA;AAC/D,cAAc,wDAAwD,CAAA;AACtE,cAAc,+DAA+D,CAAA;AAC7E,cAAc,qDAAqD,CAAA;AAGnE,cAAc,iDAAiD,CAAC;AAChE,cAAc,+CAA+C,CAAC;AAG9D,cAAc,0BAA0B,CAAA;AACxC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,6CAA6C,CAAA;AAC3D,cAAc,2DAA2D,CAAA;AACzE,cAAc,mDAAmD,CAAA;AACjE,cAAc,+DAA+D,CAAA;AAC7E,cAAc,qEAAqE,CAAA;AACnF,cAAc,2EAA2E,CAAA;AACzF,cAAc,uDAAuD,CAAA;AACrE,cAAc,2CAA2C,CAAA;AACzD,cAAc,uDAAuD,CAAC;AACtE,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAE5C,cAAc,2CAA2C,CAAA;AACzD,cAAc,kDAAkD,CAAA;AAGhE,cAAc,0CAA0C,CAAA;AACxD,cAAc,2CAA2C,CAAA;AAGzD,cAAc,4CAA4C,CAAA;AAC1D,cAAc,gEAAgE,CAAA;AAG9E,cAAc,qCAAqC,CAAA;AACnD,cAAc,iCAAiC,CAAA;AAC/C,cAAc,4DAA4D,CAAA;AAG1E,cAAc,iBAAiB,CAAA;AAG/B,cAAc,oCAAoC,CAAA;AAClD,cAAc,2CAA2C,CAAA;AAGzD,cAAc,wCAAwC,CAAA;AACtD,cAAc,6CAA6C,CAAA;AAG3D,cAAc,0BAA0B,CAAA;AACxC,cAAc,sCAAsC,CAAA;AAGpD,cAAc,sBAAsB,CAAA;AAEpC,cAAc,UAAU,CAAC"}
@@ -42,6 +42,12 @@ export * from './generated/lazy-feature-config';
42
42
  export * from './lib/system-validation/system-validation-banner.component';
43
43
  // User Menu Plugin System
44
44
  export * from './lib/user-menu';
45
+ // About Dialog
46
+ export * from './lib/about/about-dialog.component';
47
+ export * from './lib/shell/services/about-dialog.service';
48
+ // Profile Dialog (Identity Card)
49
+ export * from './lib/profile/profile-dialog.component';
50
+ export * from './lib/shell/services/profile-dialog.service';
45
51
  // OAuth Module
46
52
  export * from './lib/oauth/oauth.module';
47
53
  export * from './lib/oauth/oauth-callback.component';
@@ -1 +1 @@
1
- {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,4CAA4C,CAAC;AAE3D,cAAc,sDAAsD,CAAA;AACpE,cAAc,2EAA2E,CAAA;AACzF,cAAc,mDAAmD,CAAA;AACjE,mEAAmE;AACnE,cAAc,2DAA2D,CAAA;AACzE,cAAc,iDAAiD,CAAA;AAC/D,cAAc,wDAAwD,CAAA;AACtE,cAAc,+DAA+D,CAAA;AAC7E,cAAc,qDAAqD,CAAA;AAEnE,0DAA0D;AAC1D,cAAc,iDAAiD,CAAC;AAChE,cAAc,+CAA+C,CAAC;AAE9D,qCAAqC;AACrC,cAAc,0BAA0B,CAAA;AACxC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,6CAA6C,CAAA;AAC3D,cAAc,2DAA2D,CAAA;AACzE,cAAc,mDAAmD,CAAA;AACjE,cAAc,+DAA+D,CAAA;AAC7E,cAAc,qEAAqE,CAAA;AACnF,cAAc,2EAA2E,CAAA;AACzF,cAAc,uDAAuD,CAAA;AACrE,cAAc,2CAA2C,CAAA;AACzD,cAAc,uDAAuD,CAAC;AACtE,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAE5C,cAAc,2CAA2C,CAAA;AACzD,cAAc,kDAAkD,CAAA;AAEhE,sBAAsB;AACtB,cAAc,0CAA0C,CAAA;AACxD,cAAc,2CAA2C,CAAA;AAEzD,sBAAsB;AACtB,cAAc,4CAA4C,CAAA;AAC1D,cAAc,gEAAgE,CAAA;AAE9E,8BAA8B;AAC9B,cAAc,qCAAqC,CAAA;AACnD,cAAc,iCAAiC,CAAA;AAC/C,cAAc,4DAA4D,CAAA;AAE1E,0BAA0B;AAC1B,cAAc,iBAAiB,CAAA;AAE/B,eAAe;AACf,cAAc,0BAA0B,CAAA;AACxC,cAAc,sCAAsC,CAAA;AAEpD,gEAAgE;AAChE,cAAc,sBAAsB,CAAA;AAEpC,cAAc,UAAU,CAAC","sourcesContent":["/*\n * Public API Surface \n */\n\nexport * from './lib/generic/resource-container-component';\n\nexport * from './lib/resource-wrappers/dashboard-resource.component'\nexport * from './lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component'\nexport * from './lib/resource-wrappers/record-resource.component'\n// export * from './lib/resource-wrappers/resource-wrappers-loader'\nexport * from './lib/resource-wrappers/search-results-resource.component'\nexport * from './lib/resource-wrappers/view-resource.component'\nexport * from './lib/resource-wrappers/list-detail-resource.component'\nexport * from './lib/resource-wrappers/chat-conversations-resource.component'\nexport * from './lib/resource-wrappers/artifact-resource.component'\n\n// Command Palette (only component and service, no module)\nexport * from './lib/command-palette/command-palette.component';\nexport * from './lib/command-palette/command-palette.service';\n\n// New Shell Module (New Explorer UX)\nexport * from './lib/shell/shell.module'\nexport * from './lib/shell/shell.component'\nexport * from './lib/single-record/single-record.component'\nexport * from './lib/single-search-result/single-search-result.component'\nexport * from './lib/single-dashboard/single-dashboard.component'\nexport * from './lib/single-dashboard/Components/add-item/add-item.component'\nexport * from './lib/single-dashboard/Components/delete-item/delete-item.component'\nexport * from './lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component'\nexport * from './lib/single-list-detail/single-list-detail.component'\nexport * from './lib/user-profile/user-profile.component'\nexport * from './lib/user-notifications/user-notifications.component';\nexport * from './lib/guards/auth-guard.service';\nexport * from './lib/guards/entities.guard';\n\nexport * from './lib/single-query/single-query.component'\nexport * from './lib/resource-wrappers/query-resource.component'\n\n// Validation services\nexport * from './lib/services/system-validation.service'\nexport * from './lib/services/startup-validation.service'\n\n// Server connectivity\nexport * from './lib/services/server-connectivity.service'\nexport * from './lib/server-connectivity/server-connectivity-banner.component'\n\n// Lazy loading infrastructure\nexport * from './lib/services/lazy-module-registry'\nexport * from './generated/lazy-feature-config'\nexport * from './lib/system-validation/system-validation-banner.component'\n\n// User Menu Plugin System\nexport * from './lib/user-menu'\n\n// OAuth Module\nexport * from './lib/oauth/oauth.module'\nexport * from './lib/oauth/oauth-callback.component'\n\n// Routing Module - must be imported directly in root app module\nexport * from './app-routing.module'\n\nexport * from './module';"]}
1
+ {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,4CAA4C,CAAC;AAE3D,cAAc,sDAAsD,CAAA;AACpE,cAAc,2EAA2E,CAAA;AACzF,cAAc,mDAAmD,CAAA;AACjE,mEAAmE;AACnE,cAAc,2DAA2D,CAAA;AACzE,cAAc,iDAAiD,CAAA;AAC/D,cAAc,wDAAwD,CAAA;AACtE,cAAc,+DAA+D,CAAA;AAC7E,cAAc,qDAAqD,CAAA;AAEnE,0DAA0D;AAC1D,cAAc,iDAAiD,CAAC;AAChE,cAAc,+CAA+C,CAAC;AAE9D,qCAAqC;AACrC,cAAc,0BAA0B,CAAA;AACxC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,6CAA6C,CAAA;AAC3D,cAAc,2DAA2D,CAAA;AACzE,cAAc,mDAAmD,CAAA;AACjE,cAAc,+DAA+D,CAAA;AAC7E,cAAc,qEAAqE,CAAA;AACnF,cAAc,2EAA2E,CAAA;AACzF,cAAc,uDAAuD,CAAA;AACrE,cAAc,2CAA2C,CAAA;AACzD,cAAc,uDAAuD,CAAC;AACtE,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAE5C,cAAc,2CAA2C,CAAA;AACzD,cAAc,kDAAkD,CAAA;AAEhE,sBAAsB;AACtB,cAAc,0CAA0C,CAAA;AACxD,cAAc,2CAA2C,CAAA;AAEzD,sBAAsB;AACtB,cAAc,4CAA4C,CAAA;AAC1D,cAAc,gEAAgE,CAAA;AAE9E,8BAA8B;AAC9B,cAAc,qCAAqC,CAAA;AACnD,cAAc,iCAAiC,CAAA;AAC/C,cAAc,4DAA4D,CAAA;AAE1E,0BAA0B;AAC1B,cAAc,iBAAiB,CAAA;AAE/B,eAAe;AACf,cAAc,oCAAoC,CAAA;AAClD,cAAc,2CAA2C,CAAA;AAEzD,iCAAiC;AACjC,cAAc,wCAAwC,CAAA;AACtD,cAAc,6CAA6C,CAAA;AAE3D,eAAe;AACf,cAAc,0BAA0B,CAAA;AACxC,cAAc,sCAAsC,CAAA;AAEpD,gEAAgE;AAChE,cAAc,sBAAsB,CAAA;AAEpC,cAAc,UAAU,CAAC","sourcesContent":["/*\n * Public API Surface \n */\n\nexport * from './lib/generic/resource-container-component';\n\nexport * from './lib/resource-wrappers/dashboard-resource.component'\nexport * from './lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component'\nexport * from './lib/resource-wrappers/record-resource.component'\n// export * from './lib/resource-wrappers/resource-wrappers-loader'\nexport * from './lib/resource-wrappers/search-results-resource.component'\nexport * from './lib/resource-wrappers/view-resource.component'\nexport * from './lib/resource-wrappers/list-detail-resource.component'\nexport * from './lib/resource-wrappers/chat-conversations-resource.component'\nexport * from './lib/resource-wrappers/artifact-resource.component'\n\n// Command Palette (only component and service, no module)\nexport * from './lib/command-palette/command-palette.component';\nexport * from './lib/command-palette/command-palette.service';\n\n// New Shell Module (New Explorer UX)\nexport * from './lib/shell/shell.module'\nexport * from './lib/shell/shell.component'\nexport * from './lib/single-record/single-record.component'\nexport * from './lib/single-search-result/single-search-result.component'\nexport * from './lib/single-dashboard/single-dashboard.component'\nexport * from './lib/single-dashboard/Components/add-item/add-item.component'\nexport * from './lib/single-dashboard/Components/delete-item/delete-item.component'\nexport * from './lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component'\nexport * from './lib/single-list-detail/single-list-detail.component'\nexport * from './lib/user-profile/user-profile.component'\nexport * from './lib/user-notifications/user-notifications.component';\nexport * from './lib/guards/auth-guard.service';\nexport * from './lib/guards/entities.guard';\n\nexport * from './lib/single-query/single-query.component'\nexport * from './lib/resource-wrappers/query-resource.component'\n\n// Validation services\nexport * from './lib/services/system-validation.service'\nexport * from './lib/services/startup-validation.service'\n\n// Server connectivity\nexport * from './lib/services/server-connectivity.service'\nexport * from './lib/server-connectivity/server-connectivity-banner.component'\n\n// Lazy loading infrastructure\nexport * from './lib/services/lazy-module-registry'\nexport * from './generated/lazy-feature-config'\nexport * from './lib/system-validation/system-validation-banner.component'\n\n// User Menu Plugin System\nexport * from './lib/user-menu'\n\n// About Dialog\nexport * from './lib/about/about-dialog.component'\nexport * from './lib/shell/services/about-dialog.service'\n\n// Profile Dialog (Identity Card)\nexport * from './lib/profile/profile-dialog.component'\nexport * from './lib/shell/services/profile-dialog.service'\n\n// OAuth Module\nexport * from './lib/oauth/oauth.module'\nexport * from './lib/oauth/oauth-callback.component'\n\n// Routing Module - must be imported directly in root app module\nexport * from './app-routing.module'\n\nexport * from './module';"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-explorer-core",
3
- "version": "5.31.0",
3
+ "version": "5.33.0",
4
4
  "description": "MemberJunction Explorer: Core Angular Components",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -32,47 +32,47 @@
32
32
  "@angular/cdk": "21.1.3",
33
33
  "@angular/platform-browser": "21.1.3",
34
34
  "@auth0/auth0-angular": "^2.6.0",
35
- "@memberjunction/ai-core-plus": "5.31.0",
36
- "@memberjunction/ai-engine-base": "5.31.0",
37
- "@memberjunction/communication-types": "5.31.0",
38
- "@memberjunction/core": "5.31.0",
39
- "@memberjunction/core-entities": "5.31.0",
40
- "@memberjunction/entity-communications-client": "5.31.0",
41
- "@memberjunction/export-engine": "5.31.0",
42
- "@memberjunction/global": "5.31.0",
43
- "@memberjunction/graphql-dataprovider": "5.31.0",
44
- "@memberjunction/ng-ai-test-harness": "5.31.0",
45
- "@memberjunction/ng-artifacts": "5.31.0",
46
- "@memberjunction/ng-auth-services": "5.31.0",
47
- "@memberjunction/ng-base-application": "5.31.0",
48
- "@memberjunction/ng-base-forms": "5.31.0",
49
- "@memberjunction/ng-base-types": "5.31.0",
50
- "@memberjunction/ng-container-directives": "5.31.0",
51
- "@memberjunction/ng-conversations": "5.31.0",
52
- "@memberjunction/ng-dashboard-viewer": "5.31.0",
53
- "@memberjunction/ng-dashboards": "5.31.0",
54
- "@memberjunction/ng-entity-form-dialog": "5.31.0",
55
- "@memberjunction/ng-entity-permissions": "5.31.0",
56
- "@memberjunction/ng-entity-viewer": "5.31.0",
57
- "@memberjunction/ng-explorer-settings": "5.31.0",
58
- "@memberjunction/ng-export-service": "5.31.0",
59
- "@memberjunction/ng-feedback": "5.31.0",
60
- "@memberjunction/ng-file-storage": "5.31.0",
61
- "@memberjunction/ng-generic-dialog": "5.31.0",
62
- "@memberjunction/ng-list-detail-grid": "5.31.0",
63
- "@memberjunction/ng-notifications": "5.31.0",
64
- "@memberjunction/ng-query-viewer": "5.31.0",
65
- "@memberjunction/ng-record-changes": "5.31.0",
66
- "@memberjunction/ng-record-selector": "5.31.0",
67
- "@memberjunction/ng-record-tags": "5.31.0",
68
- "@memberjunction/ng-resource-permissions": "5.31.0",
69
- "@memberjunction/ng-search": "5.31.0",
70
- "@memberjunction/ng-shared": "5.31.0",
71
- "@memberjunction/ng-shared-generic": "5.31.0",
72
- "@memberjunction/ng-ui-components": "5.31.0",
73
- "@memberjunction/ng-user-avatar": "5.31.0",
74
- "@memberjunction/ng-word-cloud": "5.31.0",
75
- "@memberjunction/templates-base-types": "5.31.0",
35
+ "@memberjunction/ai-core-plus": "5.33.0",
36
+ "@memberjunction/ai-engine-base": "5.33.0",
37
+ "@memberjunction/communication-types": "5.33.0",
38
+ "@memberjunction/core": "5.33.0",
39
+ "@memberjunction/core-entities": "5.33.0",
40
+ "@memberjunction/entity-communications-client": "5.33.0",
41
+ "@memberjunction/export-engine": "5.33.0",
42
+ "@memberjunction/global": "5.33.0",
43
+ "@memberjunction/graphql-dataprovider": "5.33.0",
44
+ "@memberjunction/ng-ai-test-harness": "5.33.0",
45
+ "@memberjunction/ng-artifacts": "5.33.0",
46
+ "@memberjunction/ng-auth-services": "5.33.0",
47
+ "@memberjunction/ng-base-application": "5.33.0",
48
+ "@memberjunction/ng-base-forms": "5.33.0",
49
+ "@memberjunction/ng-base-types": "5.33.0",
50
+ "@memberjunction/ng-container-directives": "5.33.0",
51
+ "@memberjunction/ng-conversations": "5.33.0",
52
+ "@memberjunction/ng-dashboard-viewer": "5.33.0",
53
+ "@memberjunction/ng-dashboards": "5.33.0",
54
+ "@memberjunction/ng-entity-form-dialog": "5.33.0",
55
+ "@memberjunction/ng-entity-permissions": "5.33.0",
56
+ "@memberjunction/ng-entity-viewer": "5.33.0",
57
+ "@memberjunction/ng-explorer-settings": "5.33.0",
58
+ "@memberjunction/ng-export-service": "5.33.0",
59
+ "@memberjunction/ng-feedback": "5.33.0",
60
+ "@memberjunction/ng-file-storage": "5.33.0",
61
+ "@memberjunction/ng-generic-dialog": "5.33.0",
62
+ "@memberjunction/ng-list-detail-grid": "5.33.0",
63
+ "@memberjunction/ng-notifications": "5.33.0",
64
+ "@memberjunction/ng-query-viewer": "5.33.0",
65
+ "@memberjunction/ng-record-changes": "5.33.0",
66
+ "@memberjunction/ng-record-selector": "5.33.0",
67
+ "@memberjunction/ng-record-tags": "5.33.0",
68
+ "@memberjunction/ng-resource-permissions": "5.33.0",
69
+ "@memberjunction/ng-search": "5.33.0",
70
+ "@memberjunction/ng-shared": "5.33.0",
71
+ "@memberjunction/ng-shared-generic": "5.33.0",
72
+ "@memberjunction/ng-ui-components": "5.33.0",
73
+ "@memberjunction/ng-user-avatar": "5.33.0",
74
+ "@memberjunction/ng-word-cloud": "5.33.0",
75
+ "@memberjunction/templates-base-types": "5.33.0",
76
76
  "golden-layout": "^2.6.0",
77
77
  "rxjs": "^7.8.2",
78
78
  "tslib": "^2.8.1"
@@ -1,28 +0,0 @@
1
- import { ViewContainerRef } from '@angular/core';
2
- import { MJDialogService } from '@memberjunction/ng-ui-components';
3
- import * as i0 from "@angular/core";
4
- /**
5
- * Service to open the Settings component in a full-screen modal dialog.
6
- * This keeps the workspace intact while allowing users to configure settings.
7
- */
8
- export declare class SettingsDialogService {
9
- private dialogService;
10
- private dialogRef;
11
- constructor(dialogService: MJDialogService);
12
- /**
13
- * Opens the Settings component in a full-screen MJ Dialog
14
- * @param containerRef ViewContainerRef to anchor the dialog (usually from the shell component)
15
- */
16
- open(containerRef: ViewContainerRef): void;
17
- /**
18
- * Closes the settings dialog if open
19
- */
20
- close(): void;
21
- /**
22
- * Check if the settings dialog is currently open
23
- */
24
- get isOpen(): boolean;
25
- static ɵfac: i0.ɵɵFactoryDeclaration<SettingsDialogService, never>;
26
- static ɵprov: i0.ɵɵInjectableDeclaration<SettingsDialogService>;
27
- }
28
- //# sourceMappingURL=settings-dialog.service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"settings-dialog.service.d.ts","sourceRoot":"","sources":["../../../../src/lib/shell/services/settings-dialog.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAe,MAAM,kCAAkC,CAAC;;AAGhF;;;GAGG;AACH,qBAGa,qBAAqB;IAGpB,OAAO,CAAC,aAAa;IAFjC,OAAO,CAAC,SAAS,CAA4B;gBAEzB,aAAa,EAAE,eAAe;IAElD;;;OAGG;IACH,IAAI,CAAC,YAAY,EAAE,gBAAgB,GAAG,IAAI;IAqB1C;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAEpB;yCA7CU,qBAAqB;6CAArB,qBAAqB;CA8CjC"}
@@ -1,61 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { SettingsComponent } from '@memberjunction/ng-explorer-settings';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@memberjunction/ng-ui-components";
5
- /**
6
- * Service to open the Settings component in a full-screen modal dialog.
7
- * This keeps the workspace intact while allowing users to configure settings.
8
- */
9
- export class SettingsDialogService {
10
- dialogService;
11
- dialogRef = null;
12
- constructor(dialogService) {
13
- this.dialogService = dialogService;
14
- }
15
- /**
16
- * Opens the Settings component in a full-screen MJ Dialog
17
- * @param containerRef ViewContainerRef to anchor the dialog (usually from the shell component)
18
- */
19
- open(containerRef) {
20
- // Don't open multiple windows
21
- if (this.dialogRef) {
22
- return;
23
- }
24
- this.dialogRef = this.dialogService.open({
25
- content: SettingsComponent,
26
- title: 'Settings',
27
- width: window.innerWidth,
28
- height: window.innerHeight,
29
- minWidth: 400,
30
- appendTo: containerRef
31
- });
32
- // Handle dialog close
33
- this.dialogRef.Result.subscribe(() => {
34
- this.dialogRef = null;
35
- });
36
- }
37
- /**
38
- * Closes the settings dialog if open
39
- */
40
- close() {
41
- if (this.dialogRef) {
42
- this.dialogRef.Close();
43
- this.dialogRef = null;
44
- }
45
- }
46
- /**
47
- * Check if the settings dialog is currently open
48
- */
49
- get isOpen() {
50
- return this.dialogRef !== null;
51
- }
52
- static ɵfac = function SettingsDialogService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SettingsDialogService)(i0.ɵɵinject(i1.MJDialogService)); };
53
- static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: SettingsDialogService, factory: SettingsDialogService.ɵfac, providedIn: 'root' });
54
- }
55
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SettingsDialogService, [{
56
- type: Injectable,
57
- args: [{
58
- providedIn: 'root'
59
- }]
60
- }], () => [{ type: i1.MJDialogService }], null); })();
61
- //# sourceMappingURL=settings-dialog.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"settings-dialog.service.js","sourceRoot":"","sources":["../../../../src/lib/shell/services/settings-dialog.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAoB,MAAM,eAAe,CAAC;AAE7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;;;AAEzE;;;GAGG;AAIH,MAAM,OAAO,qBAAqB;IAGZ;IAFZ,SAAS,GAAuB,IAAI,CAAC;IAE7C,YAAoB,aAA8B;QAA9B,kBAAa,GAAb,aAAa,CAAiB;IAAG,CAAC;IAEtD;;;OAGG;IACH,IAAI,CAAC,YAA8B;QACjC,8BAA8B;QAC9B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YACvC,OAAO,EAAE,iBAAiB;YAC1B,KAAK,EAAE,UAAU;YACjB,KAAK,EAAE,MAAM,CAAC,UAAU;YACxB,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,QAAQ,EAAE,GAAG;YACb,QAAQ,EAAE,YAAY;SACvB,CAAC,CAAC;QAEH,sBAAsB;QACtB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE;YACnC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;IACjC,CAAC;+GA7CU,qBAAqB;gEAArB,qBAAqB,WAArB,qBAAqB,mBAFpB,MAAM;;iFAEP,qBAAqB;cAHjC,UAAU;eAAC;gBACV,UAAU,EAAE,MAAM;aACnB","sourcesContent":["import { Injectable, ViewContainerRef } from '@angular/core';\nimport { MJDialogService, MJDialogRef } from '@memberjunction/ng-ui-components';\nimport { SettingsComponent } from '@memberjunction/ng-explorer-settings';\n\n/**\n * Service to open the Settings component in a full-screen modal dialog.\n * This keeps the workspace intact while allowing users to configure settings.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class SettingsDialogService {\n private dialogRef: MJDialogRef | null = null;\n\n constructor(private dialogService: MJDialogService) {}\n\n /**\n * Opens the Settings component in a full-screen MJ Dialog\n * @param containerRef ViewContainerRef to anchor the dialog (usually from the shell component)\n */\n open(containerRef: ViewContainerRef): void {\n // Don't open multiple windows\n if (this.dialogRef) {\n return;\n }\n\n this.dialogRef = this.dialogService.open({\n content: SettingsComponent,\n title: 'Settings',\n width: window.innerWidth,\n height: window.innerHeight,\n minWidth: 400,\n appendTo: containerRef\n });\n\n // Handle dialog close\n this.dialogRef.Result.subscribe(() => {\n this.dialogRef = null;\n });\n }\n\n /**\n * Closes the settings dialog if open\n */\n close(): void {\n if (this.dialogRef) {\n this.dialogRef.Close();\n this.dialogRef = null;\n }\n }\n\n /**\n * Check if the settings dialog is currently open\n */\n get isOpen(): boolean {\n return this.dialogRef !== null;\n }\n}\n"]}