@memberjunction/ng-explorer-core 4.0.0 → 4.2.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 (142) hide show
  1. package/README.md +117 -726
  2. package/dist/lib/resource-wrappers/record-resource.component.d.ts.map +1 -1
  3. package/dist/lib/resource-wrappers/record-resource.component.js +11 -29
  4. package/dist/lib/resource-wrappers/record-resource.component.js.map +1 -1
  5. package/dist/lib/shell/components/header/app-nav.component.d.ts +71 -14
  6. package/dist/lib/shell/components/header/app-nav.component.d.ts.map +1 -1
  7. package/dist/lib/shell/components/header/app-nav.component.js +195 -54
  8. package/dist/lib/shell/components/header/app-nav.component.js.map +1 -1
  9. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts.map +1 -1
  10. package/dist/lib/shell/components/tabs/component-cache-manager.js +0 -6
  11. package/dist/lib/shell/components/tabs/component-cache-manager.js.map +1 -1
  12. package/dist/lib/shell/shell.component.d.ts +5 -1
  13. package/dist/lib/shell/shell.component.d.ts.map +1 -1
  14. package/dist/lib/shell/shell.component.js +28 -17
  15. package/dist/lib/shell/shell.component.js.map +1 -1
  16. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js +1 -1
  17. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js +1 -1
  18. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js +1 -1
  19. package/dist/lib/single-record/single-record.component.d.ts +9 -0
  20. package/dist/lib/single-record/single-record.component.d.ts.map +1 -1
  21. package/dist/lib/single-record/single-record.component.js +43 -2
  22. package/dist/lib/single-record/single-record.component.js.map +1 -1
  23. package/dist/lib/user-menu/base-user-menu.d.ts.map +1 -1
  24. package/dist/lib/user-menu/base-user-menu.js +2 -13
  25. package/dist/lib/user-menu/base-user-menu.js.map +1 -1
  26. package/package.json +35 -35
  27. package/dist/generic/Events.types.d.ts +0 -174
  28. package/dist/generic/Events.types.d.ts.map +0 -1
  29. package/dist/generic/Events.types.js +0 -220
  30. package/dist/generic/Events.types.js.map +0 -1
  31. package/dist/lib/app-view/application-view.component.d.ts +0 -65
  32. package/dist/lib/app-view/application-view.component.d.ts.map +0 -1
  33. package/dist/lib/app-view/application-view.component.js +0 -611
  34. package/dist/lib/app-view/application-view.component.js.map +0 -1
  35. package/dist/lib/auth-button/auth-button.component.d.ts +0 -13
  36. package/dist/lib/auth-button/auth-button.component.d.ts.map +0 -1
  37. package/dist/lib/auth-button/auth-button.component.js +0 -36
  38. package/dist/lib/auth-button/auth-button.component.js.map +0 -1
  39. package/dist/lib/base-browser-component/base-browser-component.d.ts +0 -44
  40. package/dist/lib/base-browser-component/base-browser-component.d.ts.map +0 -1
  41. package/dist/lib/base-browser-component/base-browser-component.js +0 -195
  42. package/dist/lib/base-browser-component/base-browser-component.js.map +0 -1
  43. package/dist/lib/chat-wrapper/chat-wrapper.component.d.ts +0 -54
  44. package/dist/lib/chat-wrapper/chat-wrapper.component.d.ts.map +0 -1
  45. package/dist/lib/chat-wrapper/chat-wrapper.component.js +0 -257
  46. package/dist/lib/chat-wrapper/chat-wrapper.component.js.map +0 -1
  47. package/dist/lib/dashboard-browser-component/dashboard-browser.component.d.ts +0 -32
  48. package/dist/lib/dashboard-browser-component/dashboard-browser.component.d.ts.map +0 -1
  49. package/dist/lib/dashboard-browser-component/dashboard-browser.component.js +0 -244
  50. package/dist/lib/dashboard-browser-component/dashboard-browser.component.js.map +0 -1
  51. package/dist/lib/data-browser-component/data-browser.component.d.ts +0 -23
  52. package/dist/lib/data-browser-component/data-browser.component.d.ts.map +0 -1
  53. package/dist/lib/data-browser-component/data-browser.component.js +0 -267
  54. package/dist/lib/data-browser-component/data-browser.component.js.map +0 -1
  55. package/dist/lib/expansion-panel-component/expansion-panel-component.d.ts +0 -21
  56. package/dist/lib/expansion-panel-component/expansion-panel-component.d.ts.map +0 -1
  57. package/dist/lib/expansion-panel-component/expansion-panel-component.js +0 -158
  58. package/dist/lib/expansion-panel-component/expansion-panel-component.js.map +0 -1
  59. package/dist/lib/favorites/favorites.component.d.ts +0 -15
  60. package/dist/lib/favorites/favorites.component.d.ts.map +0 -1
  61. package/dist/lib/favorites/favorites.component.js +0 -135
  62. package/dist/lib/favorites/favorites.component.js.map +0 -1
  63. package/dist/lib/files/files.component.d.ts +0 -10
  64. package/dist/lib/files/files.component.d.ts.map +0 -1
  65. package/dist/lib/files/files.component.js +0 -41
  66. package/dist/lib/files/files.component.js.map +0 -1
  67. package/dist/lib/generic-browse-list/generic-browse-list.component.d.ts +0 -30
  68. package/dist/lib/generic-browse-list/generic-browse-list.component.d.ts.map +0 -1
  69. package/dist/lib/generic-browse-list/generic-browse-list.component.js +0 -171
  70. package/dist/lib/generic-browse-list/generic-browse-list.component.js.map +0 -1
  71. package/dist/lib/generic-browser-list/generic-browser-list.component.d.ts +0 -120
  72. package/dist/lib/generic-browser-list/generic-browser-list.component.d.ts.map +0 -1
  73. package/dist/lib/generic-browser-list/generic-browser-list.component.js +0 -1093
  74. package/dist/lib/generic-browser-list/generic-browser-list.component.js.map +0 -1
  75. package/dist/lib/header/MSFT_UserImageService.d.ts +0 -12
  76. package/dist/lib/header/MSFT_UserImageService.d.ts.map +0 -1
  77. package/dist/lib/header/MSFT_UserImageService.js +0 -25
  78. package/dist/lib/header/MSFT_UserImageService.js.map +0 -1
  79. package/dist/lib/header/header.component.d.ts +0 -69
  80. package/dist/lib/header/header.component.d.ts.map +0 -1
  81. package/dist/lib/header/header.component.js +0 -342
  82. package/dist/lib/header/header.component.js.map +0 -1
  83. package/dist/lib/home-component/home.component.d.ts +0 -22
  84. package/dist/lib/home-component/home.component.d.ts.map +0 -1
  85. package/dist/lib/home-component/home.component.js +0 -194
  86. package/dist/lib/home-component/home.component.js.map +0 -1
  87. package/dist/lib/home-wrapper/home-wrapper.component.d.ts +0 -7
  88. package/dist/lib/home-wrapper/home-wrapper.component.d.ts.map +0 -1
  89. package/dist/lib/home-wrapper/home-wrapper.component.js +0 -30
  90. package/dist/lib/home-wrapper/home-wrapper.component.js.map +0 -1
  91. package/dist/lib/list-view/list-view.component.d.ts +0 -45
  92. package/dist/lib/list-view/list-view.component.d.ts.map +0 -1
  93. package/dist/lib/list-view/list-view.component.js +0 -329
  94. package/dist/lib/list-view/list-view.component.js.map +0 -1
  95. package/dist/lib/navigation/navigation.component.d.ts +0 -142
  96. package/dist/lib/navigation/navigation.component.d.ts.map +0 -1
  97. package/dist/lib/navigation/navigation.component.js +0 -1212
  98. package/dist/lib/navigation/navigation.component.js.map +0 -1
  99. package/dist/lib/query-browser-component/query-browser.component.d.ts +0 -75
  100. package/dist/lib/query-browser-component/query-browser.component.d.ts.map +0 -1
  101. package/dist/lib/query-browser-component/query-browser.component.js +0 -908
  102. package/dist/lib/query-browser-component/query-browser.component.js.map +0 -1
  103. package/dist/lib/report-browser-component/report-browser.component.d.ts +0 -22
  104. package/dist/lib/report-browser-component/report-browser.component.d.ts.map +0 -1
  105. package/dist/lib/report-browser-component/report-browser.component.js +0 -80
  106. package/dist/lib/report-browser-component/report-browser.component.js.map +0 -1
  107. package/dist/lib/resource-browser/resource-browser.component.d.ts +0 -178
  108. package/dist/lib/resource-browser/resource-browser.component.d.ts.map +0 -1
  109. package/dist/lib/resource-browser/resource-browser.component.js +0 -1012
  110. package/dist/lib/resource-browser/resource-browser.component.js.map +0 -1
  111. package/dist/lib/resource-wrappers/report-resource.component.d.ts +0 -13
  112. package/dist/lib/resource-wrappers/report-resource.component.d.ts.map +0 -1
  113. package/dist/lib/resource-wrappers/report-resource.component.js +0 -49
  114. package/dist/lib/resource-wrappers/report-resource.component.js.map +0 -1
  115. package/dist/lib/shared/custom-icon/custom-icon.component.d.ts +0 -11
  116. package/dist/lib/shared/custom-icon/custom-icon.component.d.ts.map +0 -1
  117. package/dist/lib/shared/custom-icon/custom-icon.component.js +0 -44
  118. package/dist/lib/shared/custom-icon/custom-icon.component.js.map +0 -1
  119. package/dist/lib/single-application/single-application.component.d.ts +0 -24
  120. package/dist/lib/single-application/single-application.component.d.ts.map +0 -1
  121. package/dist/lib/single-application/single-application.component.js +0 -122
  122. package/dist/lib/single-application/single-application.component.js.map +0 -1
  123. package/dist/lib/single-entity/single-entity.component.d.ts +0 -34
  124. package/dist/lib/single-entity/single-entity.component.d.ts.map +0 -1
  125. package/dist/lib/single-entity/single-entity.component.js +0 -245
  126. package/dist/lib/single-entity/single-entity.component.js.map +0 -1
  127. package/dist/lib/single-report/single-report.component.d.ts +0 -17
  128. package/dist/lib/single-report/single-report.component.d.ts.map +0 -1
  129. package/dist/lib/single-report/single-report.component.js +0 -55
  130. package/dist/lib/single-report/single-report.component.js.map +0 -1
  131. package/dist/lib/single-view/single-view.component.d.ts +0 -43
  132. package/dist/lib/single-view/single-view.component.d.ts.map +0 -1
  133. package/dist/lib/single-view/single-view.component.js +0 -207
  134. package/dist/lib/single-view/single-view.component.js.map +0 -1
  135. package/dist/lib/style-guide-test/style-guide-test.component.d.ts +0 -70
  136. package/dist/lib/style-guide-test/style-guide-test.component.d.ts.map +0 -1
  137. package/dist/lib/style-guide-test/style-guide-test.component.js +0 -1024
  138. package/dist/lib/style-guide-test/style-guide-test.component.js.map +0 -1
  139. package/dist/lib/tabbed-dashboard/tabbed-dashboard.component.d.ts +0 -46
  140. package/dist/lib/tabbed-dashboard/tabbed-dashboard.component.d.ts.map +0 -1
  141. package/dist/lib/tabbed-dashboard/tabbed-dashboard.component.js +0 -547
  142. package/dist/lib/tabbed-dashboard/tabbed-dashboard.component.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"record-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/record-resource.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAAY,YAAY,EAAE,MAAM,sBAAsB,CAAC;;AAC9D,qBAMa,oBAAqB,SAAQ,qBAAqB;IAC3D,IAAW,UAAU,IAAI,YAAY,CAEpC;WAEa,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY;IAYvD,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAwC3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAzDtD,oBAAoB;2CAApB,oBAAoB;CAsEhC"}
1
+ {"version":3,"file":"record-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/record-resource.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAAY,YAAY,EAAE,MAAM,sBAAsB,CAAC;;AAC9D,qBAMa,oBAAqB,SAAQ,qBAAqB;IAC3D,IAAW,UAAU,IAAI,YAAY,CAEpC;WAEa,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY;IAYvD,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAoB3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCArCtD,oBAAoB;2CAApB,oBAAoB;CAkDhC"}
@@ -27,39 +27,21 @@ let EntityRecordResource = class EntityRecordResource extends BaseResourceCompon
27
27
  return compositeKey;
28
28
  }
29
29
  async GetResourceDisplayName(data) {
30
- // console.log('[RecordResource.GetResourceDisplayName] Called with data:', {
31
- // entity: data.Configuration?.Entity,
32
- // resourceRecordID: data.ResourceRecordID,
33
- // configuration: data.Configuration
34
- // });
35
30
  if (!data.Configuration.Entity) {
36
31
  return '';
37
32
  }
33
+ const md = new Metadata();
34
+ const e = md.EntityByName(data.Configuration.Entity);
35
+ if (!e) {
36
+ return '';
37
+ }
38
+ const pk = EntityRecordResource_1.GetPrimaryKey(data);
39
+ if (pk.HasValue) {
40
+ const name = await md.GetEntityRecordName(data.Configuration.Entity, pk);
41
+ return name ? name : e.DisplayNameOrName;
42
+ }
38
43
  else {
39
- const md = new Metadata();
40
- const e = md.Entities.find(e => e.Name.trim().toLowerCase() === data.Configuration.Entity.trim().toLowerCase());
41
- if (!e) {
42
- console.warn(`[RecordResource.GetResourceDisplayName] Entity ${data.Configuration.Entity} not found in metadata`);
43
- return '';
44
- }
45
- let pk = EntityRecordResource_1.GetPrimaryKey(data);
46
- // console.log('[RecordResource.GetResourceDisplayName] Got primary key:', {
47
- // hasValue: pk.HasValue,
48
- // keyValuePairs: pk.KeyValuePairs
49
- // });
50
- if (pk.HasValue) {
51
- const name = await md.GetEntityRecordName(data.Configuration.Entity, pk);
52
- // console.log('[RecordResource.GetResourceDisplayName] Got record name from metadata:', {
53
- // name,
54
- // entityDisplayName: e.DisplayNameOrName,
55
- // willReturn: name ? name : e.DisplayNameOrName
56
- // });
57
- //const displayId = pk.KeyValuePairs.length > 1 ? pk.Values() : pk.GetValueByIndex(0);
58
- return (name ? name : e.DisplayNameOrName); // + ` (${displayId})`;
59
- }
60
- else {
61
- return `New ${e.DisplayNameOrName} Record`;
62
- }
44
+ return `New ${e.DisplayNameOrName} Record`;
63
45
  }
64
46
  }
65
47
  async GetResourceIconClass(data) {
@@ -1 +1 @@
1
- {"version":3,"file":"record-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/record-resource.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"record-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/record-resource.component.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';
1
+ import { EventEmitter, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';
2
2
  import { BaseApplication, NavItem, WorkspaceStateManager } from '@memberjunction/ng-base-application';
3
3
  import { SharedService } from '@memberjunction/ng-shared';
4
4
  import * as i0 from "@angular/core";
@@ -12,38 +12,95 @@ export interface NavItemClickEvent {
12
12
  }
13
13
  /**
14
14
  * Horizontal navigation items for the current app.
15
+ * Uses OnPush change detection and reactive state management for optimal performance.
15
16
  */
16
- export declare class AppNavComponent implements OnInit, OnChanges {
17
+ export declare class AppNavComponent implements OnInit, OnDestroy {
17
18
  private workspaceManager;
18
19
  private sharedService;
19
- app: BaseApplication | null;
20
+ private cdr;
21
+ private destroy$;
22
+ private _app;
23
+ private _cachedNavItems;
24
+ private _cachedAppColor;
25
+ private _servicesInjected;
26
+ /**
27
+ * Monotonically increasing counter used to detect and discard stale async results.
28
+ *
29
+ * Because GetNavItems() is async (HomeApplication does a DB lookup for record names),
30
+ * and RxJS subscribe() does NOT serialize async callbacks, multiple calls to
31
+ * updateCachedData() can overlap. Without this guard, a slow call (e.g., Home app
32
+ * doing a DB lookup) that started BEFORE a fast call (e.g., switching to App B)
33
+ * could resolve AFTER the fast call and overwrite the correct nav items with stale ones.
34
+ *
35
+ * How it works:
36
+ * 1. Each updateCachedData() call increments this counter and captures it as `gen`
37
+ * 2. After the await, it checks: does `gen` still match `_updateGeneration`?
38
+ * 3. If not, a newer call started while we were waiting — discard our stale results
39
+ */
40
+ private _updateGeneration;
41
+ private activeStateMap;
20
42
  navItemClick: EventEmitter<NavItemClickEvent>;
21
- constructor(workspaceManager: WorkspaceStateManager, sharedService: SharedService);
43
+ navItemDismiss: EventEmitter<NavItem>;
44
+ constructor(workspaceManager: WorkspaceStateManager, sharedService: SharedService, cdr: ChangeDetectorRef);
45
+ /**
46
+ * Input setter for app - triggers cache update when app changes
47
+ */
48
+ set app(value: BaseApplication | null);
49
+ get app(): BaseApplication | null;
22
50
  ngOnInit(): void;
23
- ngOnChanges(changes: SimpleChanges): void;
51
+ ngOnDestroy(): void;
52
+ /**
53
+ * Update cached nav items and app color when app changes
54
+ */
55
+ private updateCachedData;
56
+ /**
57
+ * Update active state map based on current workspace configuration
58
+ */
59
+ private updateActiveStates;
60
+ /**
61
+ * Get unique key for nav item (used for tracking and active state).
62
+ * Prefers RecordID for dynamic items to avoid label collisions.
63
+ */
64
+ private getItemKey;
65
+ /**
66
+ * Check if a nav item is dynamic (generated from recent orphan resources)
67
+ */
68
+ isDynamic(item: NavItem): boolean;
24
69
  /**
25
- * Get navigation items for current app.
26
- * Filters out items that are not Active (Pending or Disabled).
27
- * For HomeApplication, also injects required services for dynamic nav items.
70
+ * Compute if nav item is active based on active tab
71
+ */
72
+ private computeIsActive;
73
+ /**
74
+ * Get cached navigation items (no computation in getter)
28
75
  */
29
76
  get navItems(): NavItem[];
30
77
  /**
31
- * Get app color for theming
78
+ * Get cached app color (no computation in getter)
32
79
  */
33
80
  get appColor(): string;
81
+ /**
82
+ * Check if nav item is active (uses cached state from Map)
83
+ */
84
+ isActive(item: NavItem): boolean;
85
+ /**
86
+ * Track function for @for to optimize rendering
87
+ */
88
+ trackByNavItem(_index: number, item: NavItem): string;
34
89
  /**
35
90
  * Handle nav item click
36
91
  */
37
92
  onNavClick(item: NavItem, event?: MouseEvent): void;
38
93
  /**
39
- * Handle nav item double-click (opens in new tab)
94
+ * Handle dismiss click on a dynamic nav item.
95
+ * Removes from the app's recent stack and refreshes nav items immediately.
96
+ * Stops propagation so the nav click handler doesn't fire.
40
97
  */
41
- onNavDblClick(item: NavItem, event?: MouseEvent): void;
98
+ onDismiss(item: NavItem, event: MouseEvent): void;
42
99
  /**
43
- * Check if nav item is active (has matching tab)
100
+ * Handle nav item double-click (opens in new tab)
44
101
  */
45
- isActive(item: NavItem): boolean;
102
+ onNavDblClick(item: NavItem, event?: MouseEvent): void;
46
103
  static ɵfac: i0.ɵɵFactoryDeclaration<AppNavComponent, never>;
47
- static ɵcmp: i0.ɵɵComponentDeclaration<AppNavComponent, "mj-app-nav", never, { "app": { "alias": "app"; "required": false; }; }, { "navItemClick": "navItemClick"; }, never, never, false, never>;
104
+ static ɵcmp: i0.ɵɵComponentDeclaration<AppNavComponent, "mj-app-nav", never, { "app": { "alias": "app"; "required": false; }; }, { "navItemClick": "navItemClick"; "navItemDismiss": "navItemDismiss"; }, never, never, false, never>;
48
105
  }
49
106
  //# sourceMappingURL=app-nav.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-nav.component.d.ts","sourceRoot":"","sources":["../../../../../src/lib/shell/components/header/app-nav.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACzG,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AACtG,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;;AAE1D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,qBAMa,eAAgB,YAAW,MAAM,EAAE,SAAS;IAKrD,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,aAAa;IALd,GAAG,EAAE,eAAe,GAAG,IAAI,CAAQ;IAClC,YAAY,kCAAyC;gBAGrD,gBAAgB,EAAE,qBAAqB,EACvC,aAAa,EAAE,aAAa;IAGtC,QAAQ,IAAI,IAAI;IAGhB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAKzC;;;;OAIG;IACH,IAAI,QAAQ,IAAI,OAAO,EAAE,CAoBxB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI;IAQnD;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI;IAStD;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;yCA7ErB,eAAe;2CAAf,eAAe;CAgG3B"}
1
+ {"version":3,"file":"app-nav.component.d.ts","sourceRoot":"","sources":["../../../../../src/lib/shell/components/header/app-nav.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAA2B,MAAM,eAAe,CAAC;AACtI,OAAO,EAAE,eAAe,EAAkB,OAAO,EAAE,qBAAqB,EAA0B,MAAM,qCAAqC,CAAC;AAC9I,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;;AAG1D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,qBAOa,eAAgB,YAAW,MAAM,EAAE,SAAS;IA8BrD,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,GAAG;IA/Bb,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,iBAAiB,CAAS;IAElC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,iBAAiB,CAAK;IAG9B,OAAO,CAAC,cAAc,CAA8B;IAE1C,YAAY,kCAAyC;IACrD,cAAc,wBAA+B;gBAG7C,gBAAgB,EAAE,qBAAqB,EACvC,aAAa,EAAE,aAAa,EAC5B,GAAG,EAAE,iBAAiB;IAGhC;;OAEG;IACH,IACI,GAAG,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,EASpC;IAED,IAAI,GAAG,IAAI,eAAe,GAAG,IAAI,CAEhC;IAED,QAAQ,IAAI,IAAI;IAahB,WAAW,IAAI,IAAI;IAKnB;;OAEG;YACW,gBAAgB;IA6C9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;;OAGG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAIjC;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,EAAE,CAExB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAKhC;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM;IAIrD;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI;IAQnD;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;IAiBjD;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI;yCA9O3C,eAAe;2CAAf,eAAe;CAsP3B"}
@@ -1,4 +1,5 @@
1
- import { Component, Input, Output, EventEmitter } from '@angular/core';
1
+ import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
2
+ import { Subject, takeUntil } from 'rxjs';
2
3
  import * as i0 from "@angular/core";
3
4
  import * as i1 from "@memberjunction/ng-base-application";
4
5
  import * as i2 from "@memberjunction/ng-shared";
@@ -17,6 +18,13 @@ function AppNavComponent_For_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
17
18
  i0.ɵɵadvance();
18
19
  i0.ɵɵtextInterpolate(item_r2.Badge);
19
20
  } }
21
+ function AppNavComponent_For_2_Conditional_5_Template(rf, ctx) { if (rf & 1) {
22
+ const _r4 = i0.ɵɵgetCurrentView();
23
+ i0.ɵɵelementStart(0, "button", 6);
24
+ i0.ɵɵlistener("click", function AppNavComponent_For_2_Conditional_5_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r4); const item_r2 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onDismiss(item_r2, $event)); });
25
+ i0.ɵɵelement(1, "i", 7);
26
+ i0.ɵɵelementEnd();
27
+ } }
20
28
  function AppNavComponent_For_2_Template(rf, ctx) { if (rf & 1) {
21
29
  const _r1 = i0.ɵɵgetCurrentView();
22
30
  i0.ɵɵelementStart(0, "div", 2);
@@ -26,62 +34,197 @@ function AppNavComponent_For_2_Template(rf, ctx) { if (rf & 1) {
26
34
  i0.ɵɵtext(3);
27
35
  i0.ɵɵelementEnd();
28
36
  i0.ɵɵconditionalCreate(4, AppNavComponent_For_2_Conditional_4_Template, 2, 1, "span", 4);
37
+ i0.ɵɵconditionalCreate(5, AppNavComponent_For_2_Conditional_5_Template, 2, 0, "button", 5);
29
38
  i0.ɵɵelementEnd();
30
39
  } if (rf & 2) {
31
40
  const item_r2 = ctx.$implicit;
32
41
  const ctx_r2 = i0.ɵɵnextContext();
33
- i0.ɵɵclassProp("active", ctx_r2.isActive(item_r2))("no-icon", !item_r2.Icon);
42
+ i0.ɵɵclassProp("active", ctx_r2.isActive(item_r2))("dynamic", ctx_r2.isDynamic(item_r2))("no-icon", !item_r2.Icon);
34
43
  i0.ɵɵadvance();
35
44
  i0.ɵɵconditional(item_r2.Icon ? 1 : -1);
36
45
  i0.ɵɵadvance(2);
37
46
  i0.ɵɵtextInterpolate(item_r2.Label);
38
47
  i0.ɵɵadvance();
39
48
  i0.ɵɵconditional(item_r2.Badge ? 4 : -1);
49
+ i0.ɵɵadvance();
50
+ i0.ɵɵconditional(ctx_r2.isDynamic(item_r2) ? 5 : -1);
40
51
  } }
41
52
  /**
42
53
  * Horizontal navigation items for the current app.
54
+ * Uses OnPush change detection and reactive state management for optimal performance.
43
55
  */
44
56
  export class AppNavComponent {
45
57
  workspaceManager;
46
58
  sharedService;
47
- app = null;
59
+ cdr;
60
+ destroy$ = new Subject();
61
+ _app = null;
62
+ _cachedNavItems = [];
63
+ _cachedAppColor = '#1976d2';
64
+ _servicesInjected = false;
65
+ /**
66
+ * Monotonically increasing counter used to detect and discard stale async results.
67
+ *
68
+ * Because GetNavItems() is async (HomeApplication does a DB lookup for record names),
69
+ * and RxJS subscribe() does NOT serialize async callbacks, multiple calls to
70
+ * updateCachedData() can overlap. Without this guard, a slow call (e.g., Home app
71
+ * doing a DB lookup) that started BEFORE a fast call (e.g., switching to App B)
72
+ * could resolve AFTER the fast call and overwrite the correct nav items with stale ones.
73
+ *
74
+ * How it works:
75
+ * 1. Each updateCachedData() call increments this counter and captures it as `gen`
76
+ * 2. After the await, it checks: does `gen` still match `_updateGeneration`?
77
+ * 3. If not, a newer call started while we were waiting — discard our stale results
78
+ */
79
+ _updateGeneration = 0;
80
+ // Map of nav item key (Route or Label) to active state
81
+ activeStateMap = new Map();
48
82
  navItemClick = new EventEmitter();
49
- constructor(workspaceManager, sharedService) {
83
+ navItemDismiss = new EventEmitter();
84
+ constructor(workspaceManager, sharedService, cdr) {
50
85
  this.workspaceManager = workspaceManager;
51
86
  this.sharedService = sharedService;
87
+ this.cdr = cdr;
88
+ }
89
+ /**
90
+ * Input setter for app - triggers cache update when app changes
91
+ */
92
+ set app(value) {
93
+ if (this._app !== value) {
94
+ this._app = value;
95
+ this._cachedNavItems = []; // Clear stale items immediately so previous app's items don't flash
96
+ this.activeStateMap.clear();
97
+ this._servicesInjected = false; // Reset injection flag
98
+ this.updateCachedData();
99
+ this.cdr.markForCheck();
100
+ }
101
+ }
102
+ get app() {
103
+ return this._app;
52
104
  }
53
105
  ngOnInit() {
106
+ // Subscribe to workspace configuration changes.
107
+ // Must rebuild nav items (not just active states) because dynamic nav items
108
+ // are generated based on the currently active tab - when a user navigates
109
+ // from one record to another (e.g., via OpenEntityRecord), the active tab
110
+ // changes and the dynamic nav item needs to reflect the new record.
111
+ this.workspaceManager.Configuration
112
+ .pipe(takeUntil(this.destroy$))
113
+ .subscribe(async () => {
114
+ await this.updateCachedData();
115
+ });
54
116
  }
55
- ngOnChanges(changes) {
56
- if (changes['app']) {
57
- }
117
+ ngOnDestroy() {
118
+ this.destroy$.next();
119
+ this.destroy$.complete();
58
120
  }
59
121
  /**
60
- * Get navigation items for current app.
61
- * Filters out items that are not Active (Pending or Disabled).
62
- * For HomeApplication, also injects required services for dynamic nav items.
122
+ * Update cached nav items and app color when app changes
63
123
  */
64
- get navItems() {
65
- if (this.app) {
66
- // Inject services for apps that need them (e.g., HomeApplication for dynamic nav items)
67
- // These setters are optional - only defined on apps that need dynamic behavior
68
- const appWithServices = this.app;
69
- if (typeof appWithServices.SetWorkspaceManager === 'function') {
70
- appWithServices.SetWorkspaceManager(this.workspaceManager);
124
+ async updateCachedData() {
125
+ // Capture the current generation before any async work.
126
+ // See _updateGeneration JSDoc for full explanation of the race condition this prevents.
127
+ const gen = ++this._updateGeneration;
128
+ if (this._app) {
129
+ // Inject services once for apps that need them (e.g., HomeApplication for dynamic nav items)
130
+ if (!this._servicesInjected) {
131
+ const appWithServices = this._app;
132
+ if (typeof appWithServices.SetWorkspaceManager === 'function') {
133
+ appWithServices.SetWorkspaceManager(this.workspaceManager);
134
+ }
135
+ if (typeof appWithServices.SetSharedService === 'function') {
136
+ appWithServices.SetSharedService(this.sharedService);
137
+ }
138
+ this._servicesInjected = true;
71
139
  }
72
- if (typeof appWithServices.SetSharedService === 'function') {
73
- appWithServices.SetSharedService(this.sharedService);
140
+ const items = await this._app.GetNavItems() || [];
141
+ // If a newer call started while we were awaiting, our results are stale — bail out
142
+ // so we don't overwrite the newer call's (correct) results.
143
+ if (gen !== this._updateGeneration) {
144
+ return;
74
145
  }
146
+ // Only show items with Status 'Active' or undefined (default to Active)
147
+ this._cachedNavItems = items.filter(item => !item.Status || item.Status === 'Active');
148
+ this._cachedAppColor = this._app.GetColor() || '#1976d2';
149
+ }
150
+ else {
151
+ this._cachedNavItems = [];
152
+ this._cachedAppColor = '#1976d2';
153
+ }
154
+ // Update active states after nav items change
155
+ const config = this.workspaceManager.GetConfiguration();
156
+ this.updateActiveStates(config);
157
+ this.cdr.markForCheck();
158
+ }
159
+ /**
160
+ * Update active state map based on current workspace configuration
161
+ */
162
+ updateActiveStates(config) {
163
+ this.activeStateMap.clear();
164
+ if (!config || !this._app) {
165
+ return;
166
+ }
167
+ const activeTab = config.tabs.find(t => t.id === config.activeTabId);
168
+ if (!activeTab || activeTab.applicationId !== this._app.ID) {
169
+ return;
170
+ }
171
+ // Compute active state for each nav item once
172
+ for (const item of this._cachedNavItems) {
173
+ const key = this.getItemKey(item);
174
+ const isActive = this.computeIsActive(item, activeTab);
175
+ this.activeStateMap.set(key, isActive);
75
176
  }
76
- const items = this.app?.GetNavItems() || [];
77
- // Only show items with Status 'Active' or undefined (default to Active)
78
- return items.filter(item => !item.Status || item.Status === 'Active');
79
177
  }
80
178
  /**
81
- * Get app color for theming
179
+ * Get unique key for nav item (used for tracking and active state).
180
+ * Prefers RecordID for dynamic items to avoid label collisions.
181
+ */
182
+ getItemKey(item) {
183
+ return item.RecordID || item.Route || item.Label || '';
184
+ }
185
+ /**
186
+ * Check if a nav item is dynamic (generated from recent orphan resources)
187
+ */
188
+ isDynamic(item) {
189
+ return item.isDynamic === true;
190
+ }
191
+ /**
192
+ * Compute if nav item is active based on active tab
193
+ */
194
+ computeIsActive(item, activeTab) {
195
+ // Check if nav item has a custom matching function (for dynamic items)
196
+ const dynamicItem = item;
197
+ if (dynamicItem.isActiveMatch && typeof dynamicItem.isActiveMatch === 'function') {
198
+ return dynamicItem.isActiveMatch(activeTab);
199
+ }
200
+ // Standard matching: route or label
201
+ return (item.Route && activeTab.configuration['route'] === item.Route) ||
202
+ activeTab.title === item.Label;
203
+ }
204
+ /**
205
+ * Get cached navigation items (no computation in getter)
206
+ */
207
+ get navItems() {
208
+ return this._cachedNavItems;
209
+ }
210
+ /**
211
+ * Get cached app color (no computation in getter)
82
212
  */
83
213
  get appColor() {
84
- return this.app?.GetColor() || '#1976d2';
214
+ return this._cachedAppColor;
215
+ }
216
+ /**
217
+ * Check if nav item is active (uses cached state from Map)
218
+ */
219
+ isActive(item) {
220
+ const key = this.getItemKey(item);
221
+ return this.activeStateMap.get(key) || false;
222
+ }
223
+ /**
224
+ * Track function for @for to optimize rendering
225
+ */
226
+ trackByNavItem(_index, item) {
227
+ return this.getItemKey(item);
85
228
  }
86
229
  /**
87
230
  * Handle nav item click
@@ -93,6 +236,23 @@ export class AppNavComponent {
93
236
  dblClick: false
94
237
  });
95
238
  }
239
+ /**
240
+ * Handle dismiss click on a dynamic nav item.
241
+ * Removes from the app's recent stack and refreshes nav items immediately.
242
+ * Stops propagation so the nav click handler doesn't fire.
243
+ */
244
+ onDismiss(item, event) {
245
+ event.stopPropagation();
246
+ // Remove from the app's recent stack directly so we can refresh immediately
247
+ if (this._app) {
248
+ const appWithRemove = this._app;
249
+ if (typeof appWithRemove.RemoveDynamicNavItem === 'function') {
250
+ appWithRemove.RemoveDynamicNavItem(item);
251
+ this.updateCachedData();
252
+ }
253
+ }
254
+ this.navItemDismiss.emit(item);
255
+ }
96
256
  /**
97
257
  * Handle nav item double-click (opens in new tab)
98
258
  */
@@ -104,45 +264,26 @@ export class AppNavComponent {
104
264
  dblClick: true
105
265
  });
106
266
  }
107
- /**
108
- * Check if nav item is active (has matching tab)
109
- */
110
- isActive(item) {
111
- const config = this.workspaceManager.GetConfiguration();
112
- if (!config || !this.app)
113
- return false;
114
- // Check if active tab matches this nav item
115
- const activeTab = config.tabs.find(t => t.id === config.activeTabId);
116
- if (activeTab && activeTab.applicationId === this.app.ID) {
117
- // Check if nav item has a custom matching function (for dynamic items)
118
- const dynamicItem = item;
119
- if (dynamicItem.isActiveMatch && typeof dynamicItem.isActiveMatch === 'function') {
120
- return dynamicItem.isActiveMatch(activeTab);
121
- }
122
- // Standard matching: route or label
123
- return (item.Route && activeTab.configuration['route'] === item.Route) ||
124
- activeTab.title === item.Label;
125
- }
126
- return false;
127
- }
128
- static ɵfac = function AppNavComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AppNavComponent)(i0.ɵɵdirectiveInject(i1.WorkspaceStateManager), i0.ɵɵdirectiveInject(i2.SharedService)); };
129
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AppNavComponent, selectors: [["mj-app-nav"]], inputs: { app: "app" }, outputs: { navItemClick: "navItemClick" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 3, vars: 2, consts: [[1, "nav-list"], [1, "nav-item", 3, "active", "no-icon"], [1, "nav-item", 3, "click", "dblclick"], [3, "class"], [1, "badge"]], template: function AppNavComponent_Template(rf, ctx) { if (rf & 1) {
267
+ static ɵfac = function AppNavComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AppNavComponent)(i0.ɵɵdirectiveInject(i1.WorkspaceStateManager), i0.ɵɵdirectiveInject(i2.SharedService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
268
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AppNavComponent, selectors: [["mj-app-nav"]], inputs: { app: "app" }, outputs: { navItemClick: "navItemClick", navItemDismiss: "navItemDismiss" }, standalone: false, decls: 3, vars: 2, consts: [[1, "nav-list"], [1, "nav-item", 3, "active", "dynamic", "no-icon"], [1, "nav-item", 3, "click", "dblclick"], [3, "class"], [1, "badge"], ["title", "Remove", 1, "dismiss-btn"], ["title", "Remove", 1, "dismiss-btn", 3, "click"], [1, "fa-solid", "fa-xmark"]], template: function AppNavComponent_Template(rf, ctx) { if (rf & 1) {
130
269
  i0.ɵɵelementStart(0, "nav", 0);
131
- i0.ɵɵrepeaterCreate(1, AppNavComponent_For_2_Template, 5, 7, "div", 1, i0.ɵɵrepeaterTrackByIdentity);
270
+ i0.ɵɵrepeaterCreate(1, AppNavComponent_For_2_Template, 6, 10, "div", 1, ctx.trackByNavItem, true);
132
271
  i0.ɵɵelementEnd();
133
272
  } if (rf & 2) {
134
273
  i0.ɵɵstyleProp("--app-color", ctx.appColor);
135
274
  i0.ɵɵadvance();
136
275
  i0.ɵɵrepeater(ctx.navItems);
137
- } }, styles: [".nav-list[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border-radius: 6px;\n text-decoration: none;\n color: #616161;\n font-weight: 500;\n font-size: 14px;\n transition: all 0.15s;\n position: relative;\n cursor: pointer;\n user-select: none;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%]:hover {\n background: #f5f5f5;\n color: #424242;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--app-color, #1976d2) 12%, white);\n color: var(--app-color, #1976d2);\n}\n.nav-list[_ngcontent-%COMP%] .nav-item.active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--app-color, #1976d2);\n}\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item.no-icon[_ngcontent-%COMP%] {\n padding-left: 12px;\n padding-right: 12px;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] .badge[_ngcontent-%COMP%] {\n background: #f44336;\n color: white;\n border-radius: 10px;\n padding: 2px 6px;\n font-size: 11px;\n font-weight: 600;\n min-width: 18px;\n text-align: center;\n}\n\n\n\n.mobile-nav-content[_nghost-%COMP%] .nav-list[_ngcontent-%COMP%], .mobile-nav-content [_nghost-%COMP%] .nav-list[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 2px;\n padding: 0 12px;\n}\n.mobile-nav-content[_nghost-%COMP%] .nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%], .mobile-nav-content [_nghost-%COMP%] .nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-radius: 8px;\n}\n.mobile-nav-content[_nghost-%COMP%] .nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%], .mobile-nav-content [_nghost-%COMP%] .nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 20px;\n text-align: center;\n}"] });
276
+ } }, styles: [".nav-list[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border-radius: 6px;\n text-decoration: none;\n color: #616161;\n font-weight: 500;\n font-size: 14px;\n transition: all 0.15s;\n position: relative;\n cursor: pointer;\n user-select: none;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%]:hover {\n background: #f5f5f5;\n color: #424242;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--app-color, #1976d2) 12%, white);\n color: var(--app-color, #1976d2);\n}\n.nav-list[_ngcontent-%COMP%] .nav-item.active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--app-color, #1976d2);\n}\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item.no-icon[_ngcontent-%COMP%] {\n padding-left: 12px;\n padding-right: 12px;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] .badge[_ngcontent-%COMP%] {\n background: #f44336;\n color: white;\n border-radius: 10px;\n padding: 2px 6px;\n font-size: 11px;\n font-weight: 600;\n min-width: 18px;\n text-align: center;\n}\n\n\n\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%]:not(.dynamic) + .nav-item.dynamic[_ngcontent-%COMP%] {\n margin-left: 4px;\n padding-left: 16px;\n border-left: 1px solid #e0e0e0;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item.dynamic[_ngcontent-%COMP%]:not(.active) {\n opacity: 0.7;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item.dynamic[_ngcontent-%COMP%]:not(.active):hover {\n opacity: 1;\n}\n\n\n\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] .dismiss-btn[_ngcontent-%COMP%] {\n display: none;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n padding: 0;\n border: none;\n border-radius: 50%;\n background: transparent;\n color: #9e9e9e;\n font-size: 10px;\n cursor: pointer;\n transition: all 0.15s;\n margin-left: -2px;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item.dynamic[_ngcontent-%COMP%]:hover .dismiss-btn[_ngcontent-%COMP%] {\n display: flex;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] .dismiss-btn[_ngcontent-%COMP%]:hover {\n background: rgba(0, 0, 0, 0.1);\n color: #616161;\n}\n\n\n\n.mobile-nav-content[_nghost-%COMP%] .nav-list[_ngcontent-%COMP%], .mobile-nav-content [_nghost-%COMP%] .nav-list[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 2px;\n padding: 0 12px;\n}\n.mobile-nav-content[_nghost-%COMP%] .nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%], .mobile-nav-content [_nghost-%COMP%] .nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-radius: 8px;\n}\n.mobile-nav-content[_nghost-%COMP%] .nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%], .mobile-nav-content [_nghost-%COMP%] .nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 20px;\n text-align: center;\n}"], changeDetection: 0 });
138
277
  }
139
278
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AppNavComponent, [{
140
279
  type: Component,
141
- args: [{ standalone: false, selector: 'mj-app-nav', template: "<nav class=\"nav-list\" [style.--app-color]=\"appColor\">\n @for (item of navItems; track item) {\n <div\n class=\"nav-item\"\n [class.active]=\"isActive(item)\"\n [class.no-icon]=\"!item.Icon\"\n (click)=\"onNavClick(item, $event)\"\n (dblclick)=\"onNavDblClick(item, $event)\">\n @if (item.Icon) {\n <i [class]=\"item.Icon\"></i>\n }\n <span>{{ item.Label }}</span>\n @if (item.Badge) {\n <span class=\"badge\">{{ item.Badge }}</span>\n }\n </div>\n }\n</nav>\n", styles: [".nav-list {\n display: flex;\n gap: 4px;\n}\n.nav-list .nav-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border-radius: 6px;\n text-decoration: none;\n color: #616161;\n font-weight: 500;\n font-size: 14px;\n transition: all 0.15s;\n position: relative;\n cursor: pointer;\n user-select: none;\n}\n.nav-list .nav-item:hover {\n background: #f5f5f5;\n color: #424242;\n}\n.nav-list .nav-item.active {\n background: color-mix(in srgb, var(--app-color, #1976d2) 12%, white);\n color: var(--app-color, #1976d2);\n}\n.nav-list .nav-item.active i {\n color: var(--app-color, #1976d2);\n}\n.nav-list .nav-item i {\n font-size: 16px;\n}\n.nav-list .nav-item.no-icon {\n padding-left: 12px;\n padding-right: 12px;\n}\n.nav-list .nav-item .badge {\n background: #f44336;\n color: white;\n border-radius: 10px;\n padding: 2px 6px;\n font-size: 11px;\n font-weight: 600;\n min-width: 18px;\n text-align: center;\n}\n\n/* Mobile drawer vertical layout */\n:host-context(.mobile-nav-content) .nav-list {\n flex-direction: column;\n gap: 2px;\n padding: 0 12px;\n}\n:host-context(.mobile-nav-content) .nav-list .nav-item {\n padding: 12px 16px;\n border-radius: 8px;\n}\n:host-context(.mobile-nav-content) .nav-list .nav-item i {\n width: 20px;\n text-align: center;\n}\n"] }]
142
- }], () => [{ type: i1.WorkspaceStateManager }, { type: i2.SharedService }], { app: [{
143
- type: Input
144
- }], navItemClick: [{
280
+ args: [{ standalone: false, selector: 'mj-app-nav', changeDetection: ChangeDetectionStrategy.OnPush, template: "<nav class=\"nav-list\" [style.--app-color]=\"appColor\">\n @for (item of navItems; track trackByNavItem($index, item)) {\n <div\n class=\"nav-item\"\n [class.active]=\"isActive(item)\"\n [class.dynamic]=\"isDynamic(item)\"\n [class.no-icon]=\"!item.Icon\"\n (click)=\"onNavClick(item, $event)\"\n (dblclick)=\"onNavDblClick(item, $event)\">\n @if (item.Icon) {\n <i [class]=\"item.Icon\"></i>\n }\n <span>{{ item.Label }}</span>\n @if (item.Badge) {\n <span class=\"badge\">{{ item.Badge }}</span>\n }\n @if (isDynamic(item)) {\n <button class=\"dismiss-btn\" title=\"Remove\" (click)=\"onDismiss(item, $event)\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n }\n</nav>\n", styles: [".nav-list {\n display: flex;\n gap: 4px;\n}\n.nav-list .nav-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border-radius: 6px;\n text-decoration: none;\n color: #616161;\n font-weight: 500;\n font-size: 14px;\n transition: all 0.15s;\n position: relative;\n cursor: pointer;\n user-select: none;\n}\n.nav-list .nav-item:hover {\n background: #f5f5f5;\n color: #424242;\n}\n.nav-list .nav-item.active {\n background: color-mix(in srgb, var(--app-color, #1976d2) 12%, white);\n color: var(--app-color, #1976d2);\n}\n.nav-list .nav-item.active i {\n color: var(--app-color, #1976d2);\n}\n.nav-list .nav-item i {\n font-size: 16px;\n}\n.nav-list .nav-item.no-icon {\n padding-left: 12px;\n padding-right: 12px;\n}\n.nav-list .nav-item .badge {\n background: #f44336;\n color: white;\n border-radius: 10px;\n padding: 2px 6px;\n font-size: 11px;\n font-weight: 600;\n min-width: 18px;\n text-align: center;\n}\n\n/* Dynamic nav items (recent orphan resources) \u2014 separator and dimming */\n.nav-list .nav-item:not(.dynamic) + .nav-item.dynamic {\n margin-left: 4px;\n padding-left: 16px;\n border-left: 1px solid #e0e0e0;\n}\n.nav-list .nav-item.dynamic:not(.active) {\n opacity: 0.7;\n}\n.nav-list .nav-item.dynamic:not(.active):hover {\n opacity: 1;\n}\n\n/* Dismiss button for dynamic nav items */\n.nav-list .nav-item .dismiss-btn {\n display: none;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n padding: 0;\n border: none;\n border-radius: 50%;\n background: transparent;\n color: #9e9e9e;\n font-size: 10px;\n cursor: pointer;\n transition: all 0.15s;\n margin-left: -2px;\n}\n.nav-list .nav-item.dynamic:hover .dismiss-btn {\n display: flex;\n}\n.nav-list .nav-item .dismiss-btn:hover {\n background: rgba(0, 0, 0, 0.1);\n color: #616161;\n}\n\n/* Mobile drawer vertical layout */\n:host-context(.mobile-nav-content) .nav-list {\n flex-direction: column;\n gap: 2px;\n padding: 0 12px;\n}\n:host-context(.mobile-nav-content) .nav-list .nav-item {\n padding: 12px 16px;\n border-radius: 8px;\n}\n:host-context(.mobile-nav-content) .nav-list .nav-item i {\n width: 20px;\n text-align: center;\n}\n"] }]
281
+ }], () => [{ type: i1.WorkspaceStateManager }, { type: i2.SharedService }, { type: i0.ChangeDetectorRef }], { navItemClick: [{
282
+ type: Output
283
+ }], navItemDismiss: [{
145
284
  type: Output
285
+ }], app: [{
286
+ type: Input
146
287
  }] }); })();
147
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AppNavComponent, { className: "AppNavComponent", filePath: "src/lib/shell/components/header/app-nav.component.ts", lineNumber: 23 }); })();
288
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AppNavComponent, { className: "AppNavComponent", filePath: "src/lib/shell/components/header/app-nav.component.ts", lineNumber: 26 }); })();
148
289
  //# sourceMappingURL=app-nav.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-nav.component.js","sourceRoot":"","sources":["../../../../../src/lib/shell/components/header/app-nav.component.ts","../../../../../src/lib/shell/components/header/app-nav.component.html"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app-nav.component.js","sourceRoot":"","sources":["../../../../../src/lib/shell/components/header/app-nav.component.ts","../../../../../src/lib/shell/components/header/app-nav.component.html"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"component-cache-manager.d.ts","sourceRoot":"","sources":["../../../../../src/lib/shell/components/tabs/component-cache-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAElC,YAAY,EAAE,YAAY,CAAC,qBAAqB,CAAC,CAAC;IAGlD,cAAc,EAAE,WAAW,CAAC;IAG5B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IAGtB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAG/B,QAAQ,EAAE,IAAI,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAGhB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,qBAAa,qBAAqB;IAGpB,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,KAAK,CAA0C;gBAEnC,MAAM,EAAE,cAAc;IAE1C;;OAEG;IACH,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACH,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAMrF;;OAEG;IACH,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI;IAgBrG;;OAEG;IACH,cAAc,CACZ,YAAY,EAAE,YAAY,CAAC,qBAAqB,CAAC,EACjD,cAAc,EAAE,WAAW,EAC3B,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,MAAM,GACZ,IAAI;IAwBP;;OAEG;IACH,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAY1F;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI;IAkBzD;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI;IAO9D;;OAEG;IACH,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAkB7E;;OAEG;IACH,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAoB5C;;;OAGG;IACH,UAAU,IAAI,IAAI;IAalB;;OAEG;IACH,aAAa,IAAI;QACf,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACrC;CAqBF"}
1
+ {"version":3,"file":"component-cache-manager.d.ts","sourceRoot":"","sources":["../../../../../src/lib/shell/components/tabs/component-cache-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAElC,YAAY,EAAE,YAAY,CAAC,qBAAqB,CAAC,CAAC;IAGlD,cAAc,EAAE,WAAW,CAAC;IAG5B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IAGtB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAG/B,QAAQ,EAAE,IAAI,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAGhB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,qBAAa,qBAAqB;IAGpB,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,KAAK,CAA0C;gBAEnC,MAAM,EAAE,cAAc;IAE1C;;OAEG;IACH,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACH,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAMrF;;OAEG;IACH,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI;IAgBrG;;OAEG;IACH,cAAc,CACZ,YAAY,EAAE,YAAY,CAAC,qBAAqB,CAAC,EACjD,cAAc,EAAE,WAAW,EAC3B,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,MAAM,GACZ,IAAI;IAuBP;;OAEG;IACH,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAW1F;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI;IAiBzD;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI;IAO9D;;OAEG;IACH,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAiB7E;;OAEG;IACH,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAmB5C;;;OAGG;IACH,UAAU,IAAI,IAAI;IAYlB;;OAEG;IACH,aAAa,IAAI;QACf,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACrC;CAqBF"}
@@ -62,7 +62,6 @@ export class ComponentCacheManager {
62
62
  resourceData
63
63
  };
64
64
  this.cache.set(key, info);
65
- console.log(`💾 Cached component: ${resourceData.ResourceType} (key: ${key})`);
66
65
  }
67
66
  /**
68
67
  * Mark a component as attached to a tab
@@ -74,7 +73,6 @@ export class ComponentCacheManager {
74
73
  info.isAttached = true;
75
74
  info.attachedToTabId = tabId;
76
75
  info.lastUsed = new Date();
77
- console.log(`📌 Attached component: ${resourceType} to tab ${tabId}`);
78
76
  }
79
77
  }
80
78
  /**
@@ -91,7 +89,6 @@ export class ComponentCacheManager {
91
89
  info.isAttached = false;
92
90
  info.attachedToTabId = null;
93
91
  info.lastUsed = new Date();
94
- console.log(`📎 Detached component: ${info.resourceType} from tab ${tabId}`);
95
92
  return info;
96
93
  }
97
94
  /**
@@ -116,7 +113,6 @@ export class ComponentCacheManager {
116
113
  info.componentRef.destroy();
117
114
  // Remove from cache
118
115
  this.cache.delete(key);
119
- console.log(`🗑️ Destroyed component: ${resourceType}`);
120
116
  }
121
117
  /**
122
118
  * Remove and destroy component by tab ID
@@ -133,14 +129,12 @@ export class ComponentCacheManager {
133
129
  info.componentRef.destroy();
134
130
  // Remove from cache
135
131
  this.cache.delete(key);
136
- console.log(`🗑️ Destroyed component by tab ID: ${tabId}`);
137
132
  }
138
133
  /**
139
134
  * Clear the entire cache, destroying all components
140
135
  * Call this manually when needed (e.g., user logout, app shutdown)
141
136
  */
142
137
  clearCache() {
143
- console.log(`🧹 Clearing component cache (${this.cache.size} components)`);
144
138
  // Destroy all components
145
139
  this.cache.forEach(info => {
146
140
  this.appRef.detachView(info.componentRef.hostView);