@memberjunction/ng-explorer-core 5.22.0 → 5.24.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 (91) hide show
  1. package/dist/app-routing.module.d.ts.map +1 -1
  2. package/dist/app-routing.module.js +1 -3
  3. package/dist/app-routing.module.js.map +1 -1
  4. package/dist/generated/lazy-feature-config.d.ts +1 -1
  5. package/dist/generated/lazy-feature-config.d.ts.map +1 -1
  6. package/dist/generated/lazy-feature-config.js +5 -2
  7. package/dist/generated/lazy-feature-config.js.map +1 -1
  8. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js +49 -49
  9. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js.map +1 -1
  10. package/dist/lib/oauth/oauth-callback.component.js +6 -6
  11. package/dist/lib/oauth/oauth-callback.component.js.map +1 -1
  12. package/dist/lib/oauth/oauth.module.d.ts +2 -3
  13. package/dist/lib/oauth/oauth.module.d.ts.map +1 -1
  14. package/dist/lib/oauth/oauth.module.js +0 -4
  15. package/dist/lib/oauth/oauth.module.js.map +1 -1
  16. package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts +6 -25
  17. package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts.map +1 -1
  18. package/dist/lib/resource-wrappers/chat-collections-resource.component.js +30 -124
  19. package/dist/lib/resource-wrappers/chat-collections-resource.component.js.map +1 -1
  20. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts +7 -23
  21. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts.map +1 -1
  22. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +50 -142
  23. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
  24. package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts +3 -19
  25. package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts.map +1 -1
  26. package/dist/lib/resource-wrappers/chat-tasks-resource.component.js +16 -98
  27. package/dist/lib/resource-wrappers/chat-tasks-resource.component.js.map +1 -1
  28. package/dist/lib/resource-wrappers/list-detail-resource.component.d.ts +3 -1
  29. package/dist/lib/resource-wrappers/list-detail-resource.component.d.ts.map +1 -1
  30. package/dist/lib/resource-wrappers/list-detail-resource.component.js +3 -0
  31. package/dist/lib/resource-wrappers/list-detail-resource.component.js.map +1 -1
  32. package/dist/lib/resource-wrappers/notifications-resource.component.js +1 -0
  33. package/dist/lib/resource-wrappers/notifications-resource.component.js.map +1 -1
  34. package/dist/lib/resource-wrappers/view-resource.component.d.ts +13 -11
  35. package/dist/lib/resource-wrappers/view-resource.component.d.ts.map +1 -1
  36. package/dist/lib/resource-wrappers/view-resource.component.js +80 -89
  37. package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
  38. package/dist/lib/services/startup-validation.service.d.ts.map +1 -1
  39. package/dist/lib/services/startup-validation.service.js +0 -3
  40. package/dist/lib/services/startup-validation.service.js.map +1 -1
  41. package/dist/lib/shell/components/header/app-nav.component.d.ts.map +1 -1
  42. package/dist/lib/shell/components/header/app-nav.component.js +18 -3
  43. package/dist/lib/shell/components/header/app-nav.component.js.map +1 -1
  44. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts +45 -16
  45. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts.map +1 -1
  46. package/dist/lib/shell/components/tabs/component-cache-manager.js +57 -35
  47. package/dist/lib/shell/components/tabs/component-cache-manager.js.map +1 -1
  48. package/dist/lib/shell/components/tabs/tab-container.component.d.ts +33 -0
  49. package/dist/lib/shell/components/tabs/tab-container.component.d.ts.map +1 -1
  50. package/dist/lib/shell/components/tabs/tab-container.component.js +99 -17
  51. package/dist/lib/shell/components/tabs/tab-container.component.js.map +1 -1
  52. package/dist/lib/shell/services/settings-dialog.service.d.ts +8 -8
  53. package/dist/lib/shell/services/settings-dialog.service.d.ts.map +1 -1
  54. package/dist/lib/shell/services/settings-dialog.service.js +20 -26
  55. package/dist/lib/shell/services/settings-dialog.service.js.map +1 -1
  56. package/dist/lib/shell/shell.component.d.ts.map +1 -1
  57. package/dist/lib/shell/shell.component.js +17 -17
  58. package/dist/lib/shell/shell.component.js.map +1 -1
  59. package/dist/lib/shell/shell.module.d.ts +4 -5
  60. package/dist/lib/shell/shell.module.d.ts.map +1 -1
  61. package/dist/lib/shell/shell.module.js +4 -8
  62. package/dist/lib/shell/shell.module.js.map +1 -1
  63. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js +72 -71
  64. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js.map +1 -1
  65. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js +11 -11
  66. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js.map +1 -1
  67. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.d.ts +36 -12
  68. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.d.ts.map +1 -1
  69. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js +78 -50
  70. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js.map +1 -1
  71. package/dist/lib/single-dashboard/single-dashboard.component.d.ts +12 -5
  72. package/dist/lib/single-dashboard/single-dashboard.component.d.ts.map +1 -1
  73. package/dist/lib/single-dashboard/single-dashboard.component.js +44 -55
  74. package/dist/lib/single-dashboard/single-dashboard.component.js.map +1 -1
  75. package/dist/lib/single-list-detail/single-list-detail.component.d.ts +10 -2
  76. package/dist/lib/single-list-detail/single-list-detail.component.d.ts.map +1 -1
  77. package/dist/lib/single-list-detail/single-list-detail.component.js +313 -243
  78. package/dist/lib/single-list-detail/single-list-detail.component.js.map +1 -1
  79. package/dist/module.d.ts +51 -63
  80. package/dist/module.d.ts.map +1 -1
  81. package/dist/module.js +35 -80
  82. package/dist/module.js.map +1 -1
  83. package/dist/public-api.d.ts +0 -1
  84. package/dist/public-api.d.ts.map +1 -1
  85. package/dist/public-api.js +0 -1
  86. package/dist/public-api.js.map +1 -1
  87. package/package.json +38 -47
  88. package/dist/lib/generic/form-toolbar.d.ts +0 -8
  89. package/dist/lib/generic/form-toolbar.d.ts.map +0 -1
  90. package/dist/lib/generic/form-toolbar.js +0 -114
  91. package/dist/lib/generic/form-toolbar.js.map +0 -1
@@ -5,17 +5,15 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  import { Component, ViewEncapsulation } from '@angular/core';
8
- import { NavigationEnd } from '@angular/router';
9
8
  import { Metadata, RunView } from '@memberjunction/core';
10
9
  import { RegisterClass } from '@memberjunction/global';
11
10
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
12
11
  import { MJEnvironmentEntityExtended } from '@memberjunction/core-entities';
13
- import { Subject, takeUntil, distinctUntilChanged, combineLatest, filter } from 'rxjs';
12
+ import { Subject, takeUntil, distinctUntilChanged, combineLatest } from 'rxjs';
14
13
  import * as i0 from "@angular/core";
15
14
  import * as i1 from "@memberjunction/ng-conversations";
16
15
  import * as i2 from "@memberjunction/ng-shared";
17
- import * as i3 from "@angular/router";
18
- import * as i4 from "@memberjunction/ng-artifacts";
16
+ import * as i3 from "@memberjunction/ng-artifacts";
19
17
  function ChatCollectionsResource_Conditional_2_Template(rf, ctx) { if (rf & 1) {
20
18
  i0.ɵɵelement(0, "mj-collections-full-view", 2);
21
19
  } if (rf & 2) {
@@ -41,7 +39,7 @@ function ChatCollectionsResource_Conditional_3_Template(rf, ctx) { if (rf & 1) {
41
39
  i0.ɵɵstyleProp("width", ctx_r0.artifactPanelWidth, "%");
42
40
  i0.ɵɵclassProp("maximized", ctx_r0.isArtifactPanelMaximized);
43
41
  i0.ɵɵadvance();
44
- i0.ɵɵproperty("artifactId", ctx_r0.activeArtifactId)("currentUser", ctx_r0.currentUser)("environmentId", ctx_r0.environmentId)("versionNumber", ctx_r0.activeVersionNumber ?? undefined)("showSaveToCollection", false)("viewContext", "collection")("contextCollectionId", ctx_r0.collectionState.activeCollectionId ?? undefined)("canShare", ctx_r0.canShareActiveArtifact)("canEdit", ctx_r0.canEditActiveArtifact)("isMaximized", ctx_r0.isArtifactPanelMaximized);
42
+ i0.ɵɵproperty("artifactId", ctx_r0.activeArtifactId)("currentUser", ctx_r0.currentUser)("environmentId", ctx_r0.environmentId)("versionNumber", ctx_r0.activeVersionNumber ?? undefined)("showSaveToCollection", false)("viewContext", "collection")("contextCollectionId", ctx_r0.activeCollectionId ?? undefined)("canShare", ctx_r0.canShareActiveArtifact)("canEdit", ctx_r0.canEditActiveArtifact)("isMaximized", ctx_r0.isArtifactPanelMaximized);
45
43
  } }
46
44
  /**
47
45
  * Chat Collections Resource - displays the collections full view for tab-based display
@@ -54,10 +52,11 @@ let ChatCollectionsResource = class ChatCollectionsResource extends BaseResource
54
52
  artifactPermissionService;
55
53
  collectionState;
56
54
  navigationService;
57
- router;
55
+ cdr;
58
56
  currentUser = null;
59
57
  // Artifact panel state
60
58
  isArtifactPanelOpen = false;
59
+ activeCollectionId = null;
61
60
  activeArtifactId = null;
62
61
  activeVersionNumber = null;
63
62
  canShareActiveArtifact = false;
@@ -71,14 +70,13 @@ let ChatCollectionsResource = class ChatCollectionsResource extends BaseResource
71
70
  resizeStartWidth = 0;
72
71
  destroy$ = new Subject();
73
72
  skipUrlUpdate = true; // Skip URL updates during initialization
74
- lastNavigatedUrl = ''; // Track URL to avoid reacting to our own navigation
75
- constructor(artifactState, artifactPermissionService, collectionState, navigationService, router) {
73
+ constructor(artifactState, artifactPermissionService, collectionState, navigationService, cdr) {
76
74
  super();
77
75
  this.artifactState = artifactState;
78
76
  this.artifactPermissionService = artifactPermissionService;
79
77
  this.collectionState = collectionState;
80
78
  this.navigationService = navigationService;
81
- this.router = router;
79
+ this.cdr = cdr;
82
80
  }
83
81
  ngOnInit() {
84
82
  const md = new Metadata();
@@ -87,25 +85,20 @@ let ChatCollectionsResource = class ChatCollectionsResource extends BaseResource
87
85
  this.subscribeToArtifactState();
88
86
  // Setup resize listeners
89
87
  this.setupResizeListeners();
90
- // Parse URL first and apply state
91
- const urlState = this.parseUrlState();
92
- if (urlState) {
93
- this.applyUrlState(urlState);
94
- }
95
- else {
96
- // Check if we have navigation params from config (e.g., from Conversations linking here)
97
- this.applyNavigationParams();
98
- }
88
+ // Apply initial state from tab configuration (populated by shell from URL or nav params)
89
+ this.applyNavigationParams();
99
90
  // Subscribe to state changes to update URL
100
91
  this.subscribeToUrlStateChanges();
101
92
  // Subscribe to collection and artifact changes to update tab title
102
93
  this.collectionState.activeCollectionId$
103
94
  .pipe(takeUntil(this.destroy$), distinctUntilChanged())
104
95
  .subscribe(collectionId => {
96
+ this.activeCollectionId = collectionId;
105
97
  // Only update if no artifact is open (artifact title takes priority)
106
98
  if (!this.activeArtifactId) {
107
99
  this.updateCollectionTabTitle(collectionId);
108
100
  }
101
+ this.cdr.detectChanges();
109
102
  });
110
103
  this.artifactState.activeArtifact$
111
104
  .pipe(takeUntil(this.destroy$), distinctUntilChanged())
@@ -118,15 +111,6 @@ let ChatCollectionsResource = class ChatCollectionsResource extends BaseResource
118
111
  this.updateCollectionTabTitle(this.collectionState.activeCollectionId);
119
112
  }
120
113
  });
121
- // Subscribe to router NavigationEnd events for back/forward button support
122
- this.router.events
123
- .pipe(filter((event) => event instanceof NavigationEnd), takeUntil(this.destroy$))
124
- .subscribe(event => {
125
- const currentUrl = event.urlAfterRedirects || event.url;
126
- if (currentUrl !== this.lastNavigatedUrl) {
127
- this.onExternalNavigation(currentUrl);
128
- }
129
- });
130
114
  // Enable URL updates after initialization
131
115
  this.skipUrlUpdate = false;
132
116
  // Update URL to reflect current state
@@ -137,56 +121,24 @@ let ChatCollectionsResource = class ChatCollectionsResource extends BaseResource
137
121
  }, 100);
138
122
  }
139
123
  /**
140
- * Parse URL query string for collection state.
141
- * Query params: collectionId, artifactId, versionNumber
142
- */
143
- parseUrlState() {
144
- const url = this.router.url;
145
- const queryIndex = url.indexOf('?');
146
- if (queryIndex === -1)
147
- return null;
148
- const queryString = url.substring(queryIndex + 1);
149
- const params = new URLSearchParams(queryString);
150
- const collectionId = params.get('collectionId');
151
- const artifactId = params.get('artifactId');
152
- const versionNumber = params.get('versionNumber');
153
- if (!collectionId && !artifactId)
154
- return null;
155
- return {
156
- collectionId: collectionId || undefined,
157
- artifactId: artifactId || undefined,
158
- versionNumber: versionNumber ? parseInt(versionNumber, 10) : undefined
159
- };
160
- }
161
- /**
162
- * Apply URL state to collection services.
163
- */
164
- applyUrlState(state) {
165
- // Set active collection if specified
166
- if (state.collectionId) {
167
- this.collectionState.setActiveCollection(state.collectionId);
168
- }
169
- // Open artifact if specified
170
- if (state.artifactId) {
171
- this.artifactState.openArtifact(state.artifactId, state.versionNumber);
172
- }
173
- }
174
- /**
175
- * Apply navigation parameters from configuration.
176
- * This handles deep-linking from other resources (e.g., clicking a link in Conversations).
124
+ * Apply initial state from tab configuration.
125
+ * The shell populates queryParams from the URL, and nav params come from cross-resource linking.
177
126
  */
178
127
  applyNavigationParams() {
179
128
  const config = this.Data?.Configuration;
180
129
  if (!config)
181
130
  return;
182
- // Set active collection if specified
183
- if (config.collectionId) {
184
- this.collectionState.setActiveCollection(config.collectionId);
131
+ // Check queryParams first (shell populates these from the URL for deep-linking)
132
+ const qp = config['queryParams'];
133
+ const collectionId = qp?.['collectionId'] || config.collectionId;
134
+ const artifactId = qp?.['artifactId'] || config.artifactId;
135
+ const versionNumber = qp?.['versionNumber'] ? parseInt(qp['versionNumber'], 10)
136
+ : config.versionNumber ? config.versionNumber : undefined;
137
+ if (collectionId) {
138
+ this.collectionState.setActiveCollection(collectionId);
185
139
  }
186
- // Open artifact if specified
187
- if (config.artifactId) {
188
- const versionNumber = config.versionNumber ? config.versionNumber : undefined;
189
- this.artifactState.openArtifact(config.artifactId, versionNumber);
140
+ if (artifactId) {
141
+ this.artifactState.openArtifact(artifactId, versionNumber);
190
142
  }
191
143
  }
192
144
  /**
@@ -234,54 +186,6 @@ let ChatCollectionsResource = class ChatCollectionsResource extends BaseResource
234
186
  // Use NavigationService to update query params properly
235
187
  this.navigationService.UpdateActiveTabQueryParams(queryParams);
236
188
  }
237
- /**
238
- * Handle external navigation (back/forward buttons).
239
- * Parses the URL and applies the state without triggering a new navigation.
240
- */
241
- onExternalNavigation(url) {
242
- // Check if this URL is for our component (contains our base path)
243
- const currentPath = this.router.url.split('?')[0];
244
- const newPath = url.split('?')[0];
245
- // Only handle if we're still on the same base path (same component instance)
246
- if (currentPath !== newPath) {
247
- return; // Different route entirely, shell will handle it
248
- }
249
- // Parse the new URL state
250
- const urlState = this.parseUrlFromString(url);
251
- // Apply the state without triggering URL updates
252
- this.skipUrlUpdate = true;
253
- if (urlState) {
254
- this.applyUrlState(urlState);
255
- }
256
- else {
257
- // No params means clear state
258
- this.collectionState.setActiveCollection(null);
259
- this.artifactState.closeArtifact();
260
- }
261
- this.skipUrlUpdate = false;
262
- // Update the tracked URL
263
- this.lastNavigatedUrl = url;
264
- }
265
- /**
266
- * Parse URL state from a URL string (used for external navigation).
267
- */
268
- parseUrlFromString(url) {
269
- const queryIndex = url.indexOf('?');
270
- if (queryIndex === -1)
271
- return null;
272
- const queryString = url.substring(queryIndex + 1);
273
- const params = new URLSearchParams(queryString);
274
- const collectionId = params.get('collectionId');
275
- const artifactId = params.get('artifactId');
276
- const versionNumber = params.get('versionNumber');
277
- if (!collectionId && !artifactId)
278
- return null;
279
- return {
280
- collectionId: collectionId || undefined,
281
- artifactId: artifactId || undefined,
282
- versionNumber: versionNumber ? parseInt(versionNumber, 10) : undefined
283
- };
284
- }
285
189
  /**
286
190
  * Update the tab/browser title based on the active collection.
287
191
  */
@@ -321,6 +225,7 @@ let ChatCollectionsResource = class ChatCollectionsResource extends BaseResource
321
225
  .pipe(takeUntil(this.destroy$))
322
226
  .subscribe(isOpen => {
323
227
  this.isArtifactPanelOpen = isOpen;
228
+ this.cdr.detectChanges();
324
229
  });
325
230
  // Subscribe to active artifact ID
326
231
  this.artifactState.activeArtifactId$
@@ -334,6 +239,7 @@ let ChatCollectionsResource = class ChatCollectionsResource extends BaseResource
334
239
  this.canShareActiveArtifact = false;
335
240
  this.canEditActiveArtifact = false;
336
241
  }
242
+ this.cdr.detectChanges();
337
243
  });
338
244
  // Subscribe to active version number
339
245
  this.artifactState.activeVersionNumber$
@@ -476,7 +382,7 @@ let ChatCollectionsResource = class ChatCollectionsResource extends BaseResource
476
382
  document.body.style.cursor = '';
477
383
  document.body.style.userSelect = '';
478
384
  }
479
- static ɵfac = function ChatCollectionsResource_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ChatCollectionsResource)(i0.ɵɵdirectiveInject(i1.ArtifactStateService), i0.ɵɵdirectiveInject(i1.ArtifactPermissionService), i0.ɵɵdirectiveInject(i1.CollectionStateService), i0.ɵɵdirectiveInject(i2.NavigationService), i0.ɵɵdirectiveInject(i3.Router)); };
385
+ static ɵfac = function ChatCollectionsResource_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ChatCollectionsResource)(i0.ɵɵdirectiveInject(i1.ArtifactStateService), i0.ɵɵdirectiveInject(i1.ArtifactPermissionService), i0.ɵɵdirectiveInject(i1.CollectionStateService), i0.ɵɵdirectiveInject(i2.NavigationService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
480
386
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ChatCollectionsResource, selectors: [["mj-chat-collections-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 4, consts: [[1, "chat-collections-container"], [1, "collections-main"], [3, "environmentId", "currentUser"], [1, "artifact-panel-resize-handle"], [1, "artifact-panel"], [3, "closed", "maximizeToggled", "navigateToLink", "openEntityRecord", "artifactId", "currentUser", "environmentId", "versionNumber", "showSaveToCollection", "viewContext", "contextCollectionId", "canShare", "canEdit", "isMaximized"], [1, "artifact-panel-resize-handle", 3, "mousedown"]], template: function ChatCollectionsResource_Template(rf, ctx) { if (rf & 1) {
481
387
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1);
482
388
  i0.ɵɵconditionalCreate(2, ChatCollectionsResource_Conditional_2_Template, 1, 2, "mj-collections-full-view", 2);
@@ -490,7 +396,7 @@ let ChatCollectionsResource = class ChatCollectionsResource extends BaseResource
490
396
  i0.ɵɵconditional(ctx.currentUser ? 2 : -1);
491
397
  i0.ɵɵadvance();
492
398
  i0.ɵɵconditional(ctx.isArtifactPanelOpen && ctx.activeArtifactId ? 3 : -1);
493
- } }, dependencies: [i1.CollectionsFullViewComponent, i4.ArtifactViewerPanelComponent], styles: ["\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .chat-collections-container {\n display: flex;\n width: 100%;\n height: 100%;\n flex: 1;\n overflow: hidden;\n position: relative; /* Required for absolute positioning of maximized panel */\n }\n\n .collections-main {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .collections-main.with-artifact-panel {\n /* When artifact panel is open, main area shrinks */\n }\n\n .artifact-panel-resize-handle {\n width: 8px;\n cursor: col-resize;\n background: transparent;\n transition: background 150ms ease;\n flex-shrink: 0;\n }\n\n .artifact-panel-resize-handle:hover {\n background: var(--mj-brand-primary);\n }\n\n .artifact-panel-resize-handle:active {\n background: var(--mj-brand-primary-hover);\n }\n\n .artifact-panel {\n border-left: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n transition: width 0.2s ease;\n }\n\n .artifact-panel.maximized {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: 100% !important;\n z-index: 100;\n }\n "], encapsulation: 2 });
399
+ } }, dependencies: [i1.CollectionsFullViewComponent, i3.ArtifactViewerPanelComponent], styles: ["\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .chat-collections-container {\n display: flex;\n width: 100%;\n height: 100%;\n flex: 1;\n overflow: hidden;\n position: relative; /* Required for absolute positioning of maximized panel */\n }\n\n .collections-main {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .collections-main.with-artifact-panel {\n /* When artifact panel is open, main area shrinks */\n }\n\n .artifact-panel-resize-handle {\n width: 8px;\n cursor: col-resize;\n background: transparent;\n transition: background 150ms ease;\n flex-shrink: 0;\n }\n\n .artifact-panel-resize-handle:hover {\n background: var(--mj-brand-primary);\n }\n\n .artifact-panel-resize-handle:active {\n background: var(--mj-brand-primary-hover);\n }\n\n .artifact-panel {\n border-left: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n transition: width 0.2s ease;\n }\n\n .artifact-panel.maximized {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: 100% !important;\n z-index: 100;\n }\n "], encapsulation: 2 });
494
400
  };
495
401
  ChatCollectionsResource = __decorate([
496
402
  RegisterClass(BaseResourceComponent, 'ChatCollectionsResource')
@@ -526,7 +432,7 @@ export { ChatCollectionsResource };
526
432
  [versionNumber]="activeVersionNumber ?? undefined"
527
433
  [showSaveToCollection]="false"
528
434
  [viewContext]="'collection'"
529
- [contextCollectionId]="collectionState.activeCollectionId ?? undefined"
435
+ [contextCollectionId]="activeCollectionId ?? undefined"
530
436
  [canShare]="canShareActiveArtifact"
531
437
  [canEdit]="canEditActiveArtifact"
532
438
  [isMaximized]="isArtifactPanelMaximized"
@@ -539,6 +445,6 @@ export { ChatCollectionsResource };
539
445
  }
540
446
  </div>
541
447
  `, encapsulation: ViewEncapsulation.None, styles: ["\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .chat-collections-container {\n display: flex;\n width: 100%;\n height: 100%;\n flex: 1;\n overflow: hidden;\n position: relative; /* Required for absolute positioning of maximized panel */\n }\n\n .collections-main {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .collections-main.with-artifact-panel {\n /* When artifact panel is open, main area shrinks */\n }\n\n .artifact-panel-resize-handle {\n width: 8px;\n cursor: col-resize;\n background: transparent;\n transition: background 150ms ease;\n flex-shrink: 0;\n }\n\n .artifact-panel-resize-handle:hover {\n background: var(--mj-brand-primary);\n }\n\n .artifact-panel-resize-handle:active {\n background: var(--mj-brand-primary-hover);\n }\n\n .artifact-panel {\n border-left: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n transition: width 0.2s ease;\n }\n\n .artifact-panel.maximized {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: 100% !important;\n z-index: 100;\n }\n "] }]
542
- }], () => [{ type: i1.ArtifactStateService }, { type: i1.ArtifactPermissionService }, { type: i1.CollectionStateService }, { type: i2.NavigationService }, { type: i3.Router }], null); })();
543
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ChatCollectionsResource, { className: "ChatCollectionsResource", filePath: "src/lib/resource-wrappers/chat-collections-resource.component.ts", lineNumber: 122 }); })();
448
+ }], () => [{ type: i1.ArtifactStateService }, { type: i1.ArtifactPermissionService }, { type: i1.CollectionStateService }, { type: i2.NavigationService }, { type: i0.ChangeDetectorRef }], null); })();
449
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ChatCollectionsResource, { className: "ChatCollectionsResource", filePath: "src/lib/resource-wrappers/chat-collections-resource.component.ts", lineNumber: 121 }); })();
544
450
  //# sourceMappingURL=chat-collections-resource.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-collections-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/chat-collections-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, OnInit, OnDestroy } from '@angular/core';\nimport { Router, NavigationEnd } from '@angular/router';\nimport { Metadata, CompositeKey, RunView } from '@memberjunction/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { ResourceData, MJEnvironmentEntityExtended } from '@memberjunction/core-entities';\nimport { ArtifactStateService, ArtifactPermissionService, CollectionStateService } from '@memberjunction/ng-conversations';\nimport { Subject, takeUntil, distinctUntilChanged, combineLatest, filter } from 'rxjs';\n/**\n * Chat Collections Resource - displays the collections full view for tab-based display\n * Extends BaseResourceComponent to work with the resource type system\n * Shows all collections and their artifacts in a comprehensive view\n * Includes artifact panel support for viewing selected artifacts\n */\n@RegisterClass(BaseResourceComponent, 'ChatCollectionsResource')\n@Component({\n standalone: false,\n selector: 'mj-chat-collections-resource',\n template: `\n <div class=\"chat-collections-container\">\n <!-- Collections view -->\n <div class=\"collections-main\" [class.with-artifact-panel]=\"isArtifactPanelOpen && activeArtifactId\">\n @if (currentUser) {\n <mj-collections-full-view\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\">\n </mj-collections-full-view>\n }\n </div>\n \n <!-- Artifact Panel -->\n @if (isArtifactPanelOpen && activeArtifactId) {\n @if (!isArtifactPanelMaximized) {\n <div class=\"artifact-panel-resize-handle\"\n (mousedown)=\"onResizeStart($event)\"></div>\n }\n <div class=\"artifact-panel\"\n [style.width.%]=\"artifactPanelWidth\"\n [class.maximized]=\"isArtifactPanelMaximized\">\n <mj-artifact-viewer-panel\n [artifactId]=\"activeArtifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [versionNumber]=\"activeVersionNumber ?? undefined\"\n [showSaveToCollection]=\"false\"\n [viewContext]=\"'collection'\"\n [contextCollectionId]=\"collectionState.activeCollectionId ?? undefined\"\n [canShare]=\"canShareActiveArtifact\"\n [canEdit]=\"canEditActiveArtifact\"\n [isMaximized]=\"isArtifactPanelMaximized\"\n (closed)=\"closeArtifactPanel()\"\n (maximizeToggled)=\"toggleMaximizeArtifactPanel()\"\n (navigateToLink)=\"onNavigateToLink($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\">\n </mj-artifact-viewer-panel>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .chat-collections-container {\n display: flex;\n width: 100%;\n height: 100%;\n flex: 1;\n overflow: hidden;\n position: relative; /* Required for absolute positioning of maximized panel */\n }\n\n .collections-main {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .collections-main.with-artifact-panel {\n /* When artifact panel is open, main area shrinks */\n }\n\n .artifact-panel-resize-handle {\n width: 8px;\n cursor: col-resize;\n background: transparent;\n transition: background 150ms ease;\n flex-shrink: 0;\n }\n\n .artifact-panel-resize-handle:hover {\n background: var(--mj-brand-primary);\n }\n\n .artifact-panel-resize-handle:active {\n background: var(--mj-brand-primary-hover);\n }\n\n .artifact-panel {\n border-left: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n transition: width 0.2s ease;\n }\n\n .artifact-panel.maximized {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: 100% !important;\n z-index: 100;\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ChatCollectionsResource extends BaseResourceComponent implements OnInit, OnDestroy {\n public currentUser: any = null;\n\n // Artifact panel state\n public isArtifactPanelOpen: boolean = false;\n public activeArtifactId: string | null = null;\n public activeVersionNumber: number | null = null;\n public canShareActiveArtifact: boolean = false;\n public canEditActiveArtifact: boolean = false;\n public artifactPanelWidth: number = 40; // Default 40% width (percentage-based)\n public isArtifactPanelMaximized: boolean = false;\n private artifactPanelWidthBeforeMaximize: number = 40; // Store width before maximizing\n\n // Resize state\n private isResizing: boolean = false;\n private resizeStartX: number = 0;\n private resizeStartWidth: number = 0;\n\n private destroy$ = new Subject<void>();\n private skipUrlUpdate = true; // Skip URL updates during initialization\n private lastNavigatedUrl: string = ''; // Track URL to avoid reacting to our own navigation\n\n constructor(\n private artifactState: ArtifactStateService,\n private artifactPermissionService: ArtifactPermissionService,\n public collectionState: CollectionStateService,\n private navigationService: NavigationService,\n private router: Router\n ) {\n super();\n }\n\n ngOnInit() {\n const md = new Metadata();\n this.currentUser = md.CurrentUser;\n\n // Subscribe to artifact state changes\n this.subscribeToArtifactState();\n\n // Setup resize listeners\n this.setupResizeListeners();\n\n // Parse URL first and apply state\n const urlState = this.parseUrlState();\n if (urlState) {\n this.applyUrlState(urlState);\n } else {\n // Check if we have navigation params from config (e.g., from Conversations linking here)\n this.applyNavigationParams();\n }\n\n // Subscribe to state changes to update URL\n this.subscribeToUrlStateChanges();\n\n // Subscribe to collection and artifact changes to update tab title\n this.collectionState.activeCollectionId$\n .pipe(takeUntil(this.destroy$), distinctUntilChanged())\n .subscribe(collectionId => {\n // Only update if no artifact is open (artifact title takes priority)\n if (!this.activeArtifactId) {\n this.updateCollectionTabTitle(collectionId);\n }\n });\n\n this.artifactState.activeArtifact$\n .pipe(takeUntil(this.destroy$), distinctUntilChanged())\n .subscribe(artifact => {\n if (artifact && artifact.Name) {\n this.NotifyDisplayNameChanged(artifact.Name);\n } else {\n // Artifact closed — fall back to collection name\n this.updateCollectionTabTitle(this.collectionState.activeCollectionId);\n }\n });\n\n // Subscribe to router NavigationEnd events for back/forward button support\n this.router.events\n .pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n takeUntil(this.destroy$)\n )\n .subscribe(event => {\n const currentUrl = event.urlAfterRedirects || event.url;\n if (currentUrl !== this.lastNavigatedUrl) {\n this.onExternalNavigation(currentUrl);\n }\n });\n\n // Enable URL updates after initialization\n this.skipUrlUpdate = false;\n\n // Update URL to reflect current state\n this.updateUrl();\n\n // Notify load complete after user is set\n setTimeout(() => {\n this.NotifyLoadComplete();\n }, 100);\n }\n\n /**\n * Parse URL query string for collection state.\n * Query params: collectionId, artifactId, versionNumber\n */\n private parseUrlState(): { collectionId?: string; artifactId?: string; versionNumber?: number } | null {\n const url = this.router.url;\n const queryIndex = url.indexOf('?');\n if (queryIndex === -1) return null;\n\n const queryString = url.substring(queryIndex + 1);\n const params = new URLSearchParams(queryString);\n const collectionId = params.get('collectionId');\n const artifactId = params.get('artifactId');\n const versionNumber = params.get('versionNumber');\n\n if (!collectionId && !artifactId) return null;\n\n return {\n collectionId: collectionId || undefined,\n artifactId: artifactId || undefined,\n versionNumber: versionNumber ? parseInt(versionNumber, 10) : undefined\n };\n }\n\n /**\n * Apply URL state to collection services.\n */\n private applyUrlState(state: { collectionId?: string; artifactId?: string; versionNumber?: number }): void {\n // Set active collection if specified\n if (state.collectionId) {\n this.collectionState.setActiveCollection(state.collectionId);\n }\n\n // Open artifact if specified\n if (state.artifactId) {\n this.artifactState.openArtifact(state.artifactId, state.versionNumber);\n }\n }\n\n /**\n * Apply navigation parameters from configuration.\n * This handles deep-linking from other resources (e.g., clicking a link in Conversations).\n */\n private applyNavigationParams(): void {\n const config = this.Data?.Configuration;\n if (!config) return;\n\n // Set active collection if specified\n if (config.collectionId) {\n this.collectionState.setActiveCollection(config.collectionId as string);\n }\n\n // Open artifact if specified\n if (config.artifactId) {\n const versionNumber = config.versionNumber ? (config.versionNumber as number) : undefined;\n this.artifactState.openArtifact(config.artifactId as string, versionNumber);\n }\n }\n\n /**\n * Subscribe to state changes for URL updates.\n */\n private subscribeToUrlStateChanges(): void {\n // Combine collection and artifact state changes\n combineLatest([\n this.collectionState.activeCollectionId$.pipe(distinctUntilChanged()),\n this.artifactState.activeArtifactId$.pipe(distinctUntilChanged()),\n this.artifactState.activeVersionNumber$.pipe(distinctUntilChanged())\n ])\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n if (!this.skipUrlUpdate) {\n this.updateUrl();\n }\n });\n }\n\n /**\n * Update URL query string to reflect current state.\n * Uses NavigationService for proper URL management that respects app-scoped routes.\n */\n private updateUrl(): void {\n const queryParams: Record<string, string | null> = {};\n\n // Add collection ID\n const collectionId = this.collectionState.activeCollectionId;\n if (collectionId) {\n queryParams['collectionId'] = collectionId;\n } else {\n queryParams['collectionId'] = null;\n }\n\n // Add artifact ID if panel is open\n if (this.activeArtifactId) {\n queryParams['artifactId'] = this.activeArtifactId;\n if (this.activeVersionNumber) {\n queryParams['versionNumber'] = this.activeVersionNumber.toString();\n }\n } else {\n queryParams['artifactId'] = null;\n queryParams['versionNumber'] = null;\n }\n\n // Use NavigationService to update query params properly\n this.navigationService.UpdateActiveTabQueryParams(queryParams);\n }\n\n /**\n * Handle external navigation (back/forward buttons).\n * Parses the URL and applies the state without triggering a new navigation.\n */\n private onExternalNavigation(url: string): void {\n // Check if this URL is for our component (contains our base path)\n const currentPath = this.router.url.split('?')[0];\n const newPath = url.split('?')[0];\n\n // Only handle if we're still on the same base path (same component instance)\n if (currentPath !== newPath) {\n return; // Different route entirely, shell will handle it\n }\n\n // Parse the new URL state\n const urlState = this.parseUrlFromString(url);\n\n // Apply the state without triggering URL updates\n this.skipUrlUpdate = true;\n if (urlState) {\n this.applyUrlState(urlState);\n } else {\n // No params means clear state\n this.collectionState.setActiveCollection(null as unknown as string);\n this.artifactState.closeArtifact();\n }\n this.skipUrlUpdate = false;\n\n // Update the tracked URL\n this.lastNavigatedUrl = url;\n }\n\n /**\n * Parse URL state from a URL string (used for external navigation).\n */\n private parseUrlFromString(url: string): { collectionId?: string; artifactId?: string; versionNumber?: number } | null {\n const queryIndex = url.indexOf('?');\n if (queryIndex === -1) return null;\n\n const queryString = url.substring(queryIndex + 1);\n const params = new URLSearchParams(queryString);\n const collectionId = params.get('collectionId');\n const artifactId = params.get('artifactId');\n const versionNumber = params.get('versionNumber');\n\n if (!collectionId && !artifactId) return null;\n\n return {\n collectionId: collectionId || undefined,\n artifactId: artifactId || undefined,\n versionNumber: versionNumber ? parseInt(versionNumber, 10) : undefined\n };\n }\n\n /**\n * Update the tab/browser title based on the active collection.\n */\n private async updateCollectionTabTitle(collectionId: string | null): Promise<void> {\n if (!collectionId) {\n this.NotifyDisplayNameChanged('Collections');\n return;\n }\n try {\n const rv = new RunView();\n const result = await rv.RunView<{ Name: string }>({\n EntityName: 'MJ: Collections',\n Fields: ['Name'],\n ExtraFilter: `ID='${collectionId}'`,\n ResultType: 'simple'\n });\n if (result.Results?.length > 0 && result.Results[0].Name) {\n this.NotifyDisplayNameChanged(result.Results[0].Name);\n }\n } catch {\n // Fall back to generic title\n this.NotifyDisplayNameChanged('Collections');\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n this.removeResizeListeners();\n }\n\n /**\n * Subscribe to artifact state service for panel open/close\n */\n private subscribeToArtifactState(): void {\n // Subscribe to panel open state\n this.artifactState.isPanelOpen$\n .pipe(takeUntil(this.destroy$))\n .subscribe(isOpen => {\n this.isArtifactPanelOpen = isOpen;\n });\n\n // Subscribe to active artifact ID\n this.artifactState.activeArtifactId$\n .pipe(takeUntil(this.destroy$))\n .subscribe(async id => {\n this.activeArtifactId = id;\n if (id) {\n await this.loadArtifactPermissions(id);\n } else {\n this.canShareActiveArtifact = false;\n this.canEditActiveArtifact = false;\n }\n });\n\n // Subscribe to active version number\n this.artifactState.activeVersionNumber$\n .pipe(takeUntil(this.destroy$))\n .subscribe(versionNumber => {\n this.activeVersionNumber = versionNumber;\n });\n }\n\n /**\n * Load permissions for the active artifact\n */\n private async loadArtifactPermissions(artifactId: string): Promise<void> {\n if (!artifactId || !this.currentUser) {\n this.canShareActiveArtifact = false;\n this.canEditActiveArtifact = false;\n return;\n }\n\n try {\n const permissions = await this.artifactPermissionService.getUserPermissions(artifactId, this.currentUser);\n this.canShareActiveArtifact = permissions.canShare;\n this.canEditActiveArtifact = permissions.canEdit;\n } catch (error) {\n console.error('Failed to load artifact permissions:', error);\n this.canShareActiveArtifact = false;\n this.canEditActiveArtifact = false;\n }\n }\n\n /**\n * Close the artifact panel\n */\n closeArtifactPanel(): void {\n this.artifactState.closeArtifact();\n }\n\n /**\n * Toggle maximize/restore state for artifact panel\n */\n toggleMaximizeArtifactPanel(): void {\n if (this.isArtifactPanelMaximized) {\n // Restore to previous width\n this.artifactPanelWidth = this.artifactPanelWidthBeforeMaximize;\n this.isArtifactPanelMaximized = false;\n } else {\n // Maximize - store current width and set to 100%\n this.artifactPanelWidthBeforeMaximize = this.artifactPanelWidth;\n this.artifactPanelWidth = 100;\n this.isArtifactPanelMaximized = true;\n }\n }\n\n /**\n * Handle navigation request from artifact viewer panel.\n * Converts the link event to a generic navigation request and uses NavigationService.\n */\n onNavigateToLink(event: {\n type: 'conversation' | 'collection';\n id: string;\n artifactId?: string;\n versionNumber?: number;\n versionId?: string;\n }): void {\n // Map the link type to the nav item name\n const navItemName = event.type === 'conversation' ? 'Conversations' : 'Collections';\n\n // Build configuration params to pass to the target resource\n const params: Record<string, unknown> = {};\n if (event.type === 'conversation') {\n params['conversationId'] = event.id;\n } else {\n params['collectionId'] = event.id;\n }\n\n // Include artifact info so destination can open it\n if (event.artifactId) {\n params['artifactId'] = event.artifactId;\n if (event.versionNumber) {\n params['versionNumber'] = event.versionNumber;\n }\n }\n\n // Navigate using the generic nav item method\n this.navigationService.OpenNavItemByName(navItemName, params);\n }\n\n /**\n * Handle entity record open request from artifact viewer (from React component grids).\n * Uses NavigationService to open the record in a new tab.\n */\n onOpenEntityRecord(event: {entityName: string; compositeKey: CompositeKey}): void {\n this.navigationService.OpenEntityRecord(event.entityName, event.compositeKey);\n }\n\n /**\n * Get the environment ID from configuration or use default\n */\n get environmentId(): string {\n return this.Data?.Configuration?.environmentId || MJEnvironmentEntityExtended.DefaultEnvironmentID;\n }\n\n /**\n * Get the display name for chat collections\n */\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Collections';\n }\n\n /**\n * Get the icon class for chat collections\n */\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-folder-open';\n }\n\n // Resize handling\n private setupResizeListeners(): void {\n this.boundOnResizeMove = this.onResizeMove.bind(this);\n this.boundOnResizeEnd = this.onResizeEnd.bind(this);\n }\n\n private removeResizeListeners(): void {\n window.removeEventListener('mousemove', this.boundOnResizeMove);\n window.removeEventListener('mouseup', this.boundOnResizeEnd);\n }\n\n private boundOnResizeMove: (e: MouseEvent) => void = () => {};\n private boundOnResizeEnd: (e: MouseEvent) => void = () => {};\n\n onResizeStart(event: MouseEvent): void {\n this.isResizing = true;\n this.resizeStartX = event.clientX;\n this.resizeStartWidth = this.artifactPanelWidth;\n window.addEventListener('mousemove', this.boundOnResizeMove);\n window.addEventListener('mouseup', this.boundOnResizeEnd);\n event.preventDefault();\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }\n\n private onResizeMove(event: MouseEvent): void {\n if (!this.isResizing) return;\n\n const container = document.querySelector('.chat-collections-container') as HTMLElement;\n if (!container) return;\n\n const containerWidth = container.offsetWidth;\n const deltaX = event.clientX - this.resizeStartX;\n const deltaPercent = (deltaX / containerWidth) * -100; // Negative because we're pulling from the right\n let newWidth = this.resizeStartWidth + deltaPercent;\n\n // Constrain between 20% and 80%\n newWidth = Math.max(20, Math.min(80, newWidth));\n this.artifactPanelWidth = newWidth;\n }\n\n private onResizeEnd(event: MouseEvent): void {\n this.isResizing = false;\n window.removeEventListener('mousemove', this.boundOnResizeMove);\n window.removeEventListener('mouseup', this.boundOnResizeEnd);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n }\n}\n"]}
1
+ {"version":3,"file":"chat-collections-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/chat-collections-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { Metadata, CompositeKey, RunView } from '@memberjunction/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { ResourceData, MJEnvironmentEntityExtended } from '@memberjunction/core-entities';\nimport { ArtifactStateService, ArtifactPermissionService, CollectionStateService } from '@memberjunction/ng-conversations';\nimport { Subject, takeUntil, distinctUntilChanged, combineLatest } from 'rxjs';\n/**\n * Chat Collections Resource - displays the collections full view for tab-based display\n * Extends BaseResourceComponent to work with the resource type system\n * Shows all collections and their artifacts in a comprehensive view\n * Includes artifact panel support for viewing selected artifacts\n */\n@RegisterClass(BaseResourceComponent, 'ChatCollectionsResource')\n@Component({\n standalone: false,\n selector: 'mj-chat-collections-resource',\n template: `\n <div class=\"chat-collections-container\">\n <!-- Collections view -->\n <div class=\"collections-main\" [class.with-artifact-panel]=\"isArtifactPanelOpen && activeArtifactId\">\n @if (currentUser) {\n <mj-collections-full-view\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\">\n </mj-collections-full-view>\n }\n </div>\n \n <!-- Artifact Panel -->\n @if (isArtifactPanelOpen && activeArtifactId) {\n @if (!isArtifactPanelMaximized) {\n <div class=\"artifact-panel-resize-handle\"\n (mousedown)=\"onResizeStart($event)\"></div>\n }\n <div class=\"artifact-panel\"\n [style.width.%]=\"artifactPanelWidth\"\n [class.maximized]=\"isArtifactPanelMaximized\">\n <mj-artifact-viewer-panel\n [artifactId]=\"activeArtifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [versionNumber]=\"activeVersionNumber ?? undefined\"\n [showSaveToCollection]=\"false\"\n [viewContext]=\"'collection'\"\n [contextCollectionId]=\"activeCollectionId ?? undefined\"\n [canShare]=\"canShareActiveArtifact\"\n [canEdit]=\"canEditActiveArtifact\"\n [isMaximized]=\"isArtifactPanelMaximized\"\n (closed)=\"closeArtifactPanel()\"\n (maximizeToggled)=\"toggleMaximizeArtifactPanel()\"\n (navigateToLink)=\"onNavigateToLink($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\">\n </mj-artifact-viewer-panel>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .chat-collections-container {\n display: flex;\n width: 100%;\n height: 100%;\n flex: 1;\n overflow: hidden;\n position: relative; /* Required for absolute positioning of maximized panel */\n }\n\n .collections-main {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .collections-main.with-artifact-panel {\n /* When artifact panel is open, main area shrinks */\n }\n\n .artifact-panel-resize-handle {\n width: 8px;\n cursor: col-resize;\n background: transparent;\n transition: background 150ms ease;\n flex-shrink: 0;\n }\n\n .artifact-panel-resize-handle:hover {\n background: var(--mj-brand-primary);\n }\n\n .artifact-panel-resize-handle:active {\n background: var(--mj-brand-primary-hover);\n }\n\n .artifact-panel {\n border-left: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n transition: width 0.2s ease;\n }\n\n .artifact-panel.maximized {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: 100% !important;\n z-index: 100;\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ChatCollectionsResource extends BaseResourceComponent implements OnInit, OnDestroy {\n public currentUser: any = null;\n\n // Artifact panel state\n public isArtifactPanelOpen: boolean = false;\n public activeCollectionId: string | null = null;\n public activeArtifactId: string | null = null;\n public activeVersionNumber: number | null = null;\n public canShareActiveArtifact: boolean = false;\n public canEditActiveArtifact: boolean = false;\n public artifactPanelWidth: number = 40; // Default 40% width (percentage-based)\n public isArtifactPanelMaximized: boolean = false;\n private artifactPanelWidthBeforeMaximize: number = 40; // Store width before maximizing\n\n // Resize state\n private isResizing: boolean = false;\n private resizeStartX: number = 0;\n private resizeStartWidth: number = 0;\n\n private destroy$ = new Subject<void>();\n private skipUrlUpdate = true; // Skip URL updates during initialization\n\n constructor(\n private artifactState: ArtifactStateService,\n private artifactPermissionService: ArtifactPermissionService,\n public collectionState: CollectionStateService,\n private navigationService: NavigationService,\n private cdr: ChangeDetectorRef\n ) {\n super();\n }\n\n ngOnInit() {\n const md = new Metadata();\n this.currentUser = md.CurrentUser;\n\n // Subscribe to artifact state changes\n this.subscribeToArtifactState();\n\n // Setup resize listeners\n this.setupResizeListeners();\n\n // Apply initial state from tab configuration (populated by shell from URL or nav params)\n this.applyNavigationParams();\n\n // Subscribe to state changes to update URL\n this.subscribeToUrlStateChanges();\n\n // Subscribe to collection and artifact changes to update tab title\n this.collectionState.activeCollectionId$\n .pipe(takeUntil(this.destroy$), distinctUntilChanged())\n .subscribe(collectionId => {\n this.activeCollectionId = collectionId;\n // Only update if no artifact is open (artifact title takes priority)\n if (!this.activeArtifactId) {\n this.updateCollectionTabTitle(collectionId);\n }\n this.cdr.detectChanges();\n });\n\n this.artifactState.activeArtifact$\n .pipe(takeUntil(this.destroy$), distinctUntilChanged())\n .subscribe(artifact => {\n if (artifact && artifact.Name) {\n this.NotifyDisplayNameChanged(artifact.Name);\n } else {\n // Artifact closed — fall back to collection name\n this.updateCollectionTabTitle(this.collectionState.activeCollectionId);\n }\n });\n\n // Enable URL updates after initialization\n this.skipUrlUpdate = false;\n\n // Update URL to reflect current state\n this.updateUrl();\n\n // Notify load complete after user is set\n setTimeout(() => {\n this.NotifyLoadComplete();\n }, 100);\n }\n\n\n /**\n * Apply initial state from tab configuration.\n * The shell populates queryParams from the URL, and nav params come from cross-resource linking.\n */\n private applyNavigationParams(): void {\n const config = this.Data?.Configuration;\n if (!config) return;\n\n // Check queryParams first (shell populates these from the URL for deep-linking)\n const qp = config['queryParams'] as Record<string, string> | undefined;\n const collectionId = (qp?.['collectionId'] as string) || (config.collectionId as string);\n const artifactId = (qp?.['artifactId'] as string) || (config.artifactId as string);\n const versionNumber = qp?.['versionNumber'] ? parseInt(qp['versionNumber'], 10)\n : config.versionNumber ? (config.versionNumber as number) : undefined;\n\n if (collectionId) {\n this.collectionState.setActiveCollection(collectionId);\n }\n\n if (artifactId) {\n this.artifactState.openArtifact(artifactId, versionNumber);\n }\n }\n\n /**\n * Subscribe to state changes for URL updates.\n */\n private subscribeToUrlStateChanges(): void {\n // Combine collection and artifact state changes\n combineLatest([\n this.collectionState.activeCollectionId$.pipe(distinctUntilChanged()),\n this.artifactState.activeArtifactId$.pipe(distinctUntilChanged()),\n this.artifactState.activeVersionNumber$.pipe(distinctUntilChanged())\n ])\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n if (!this.skipUrlUpdate) {\n this.updateUrl();\n }\n });\n }\n\n /**\n * Update URL query string to reflect current state.\n * Uses NavigationService for proper URL management that respects app-scoped routes.\n */\n private updateUrl(): void {\n const queryParams: Record<string, string | null> = {};\n\n // Add collection ID\n const collectionId = this.collectionState.activeCollectionId;\n if (collectionId) {\n queryParams['collectionId'] = collectionId;\n } else {\n queryParams['collectionId'] = null;\n }\n\n // Add artifact ID if panel is open\n if (this.activeArtifactId) {\n queryParams['artifactId'] = this.activeArtifactId;\n if (this.activeVersionNumber) {\n queryParams['versionNumber'] = this.activeVersionNumber.toString();\n }\n } else {\n queryParams['artifactId'] = null;\n queryParams['versionNumber'] = null;\n }\n\n // Use NavigationService to update query params properly\n this.navigationService.UpdateActiveTabQueryParams(queryParams);\n }\n\n\n /**\n * Update the tab/browser title based on the active collection.\n */\n private async updateCollectionTabTitle(collectionId: string | null): Promise<void> {\n if (!collectionId) {\n this.NotifyDisplayNameChanged('Collections');\n return;\n }\n try {\n const rv = new RunView();\n const result = await rv.RunView<{ Name: string }>({\n EntityName: 'MJ: Collections',\n Fields: ['Name'],\n ExtraFilter: `ID='${collectionId}'`,\n ResultType: 'simple'\n });\n if (result.Results?.length > 0 && result.Results[0].Name) {\n this.NotifyDisplayNameChanged(result.Results[0].Name);\n }\n } catch {\n // Fall back to generic title\n this.NotifyDisplayNameChanged('Collections');\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n this.removeResizeListeners();\n }\n\n /**\n * Subscribe to artifact state service for panel open/close\n */\n private subscribeToArtifactState(): void {\n // Subscribe to panel open state\n this.artifactState.isPanelOpen$\n .pipe(takeUntil(this.destroy$))\n .subscribe(isOpen => {\n this.isArtifactPanelOpen = isOpen;\n this.cdr.detectChanges();\n });\n\n // Subscribe to active artifact ID\n this.artifactState.activeArtifactId$\n .pipe(takeUntil(this.destroy$))\n .subscribe(async id => {\n this.activeArtifactId = id;\n if (id) {\n await this.loadArtifactPermissions(id);\n } else {\n this.canShareActiveArtifact = false;\n this.canEditActiveArtifact = false;\n }\n this.cdr.detectChanges();\n });\n\n // Subscribe to active version number\n this.artifactState.activeVersionNumber$\n .pipe(takeUntil(this.destroy$))\n .subscribe(versionNumber => {\n this.activeVersionNumber = versionNumber;\n });\n }\n\n /**\n * Load permissions for the active artifact\n */\n private async loadArtifactPermissions(artifactId: string): Promise<void> {\n if (!artifactId || !this.currentUser) {\n this.canShareActiveArtifact = false;\n this.canEditActiveArtifact = false;\n return;\n }\n\n try {\n const permissions = await this.artifactPermissionService.getUserPermissions(artifactId, this.currentUser);\n this.canShareActiveArtifact = permissions.canShare;\n this.canEditActiveArtifact = permissions.canEdit;\n } catch (error) {\n console.error('Failed to load artifact permissions:', error);\n this.canShareActiveArtifact = false;\n this.canEditActiveArtifact = false;\n }\n }\n\n /**\n * Close the artifact panel\n */\n closeArtifactPanel(): void {\n this.artifactState.closeArtifact();\n }\n\n /**\n * Toggle maximize/restore state for artifact panel\n */\n toggleMaximizeArtifactPanel(): void {\n if (this.isArtifactPanelMaximized) {\n // Restore to previous width\n this.artifactPanelWidth = this.artifactPanelWidthBeforeMaximize;\n this.isArtifactPanelMaximized = false;\n } else {\n // Maximize - store current width and set to 100%\n this.artifactPanelWidthBeforeMaximize = this.artifactPanelWidth;\n this.artifactPanelWidth = 100;\n this.isArtifactPanelMaximized = true;\n }\n }\n\n /**\n * Handle navigation request from artifact viewer panel.\n * Converts the link event to a generic navigation request and uses NavigationService.\n */\n onNavigateToLink(event: {\n type: 'conversation' | 'collection';\n id: string;\n artifactId?: string;\n versionNumber?: number;\n versionId?: string;\n }): void {\n // Map the link type to the nav item name\n const navItemName = event.type === 'conversation' ? 'Conversations' : 'Collections';\n\n // Build configuration params to pass to the target resource\n const params: Record<string, unknown> = {};\n if (event.type === 'conversation') {\n params['conversationId'] = event.id;\n } else {\n params['collectionId'] = event.id;\n }\n\n // Include artifact info so destination can open it\n if (event.artifactId) {\n params['artifactId'] = event.artifactId;\n if (event.versionNumber) {\n params['versionNumber'] = event.versionNumber;\n }\n }\n\n // Navigate using the generic nav item method\n this.navigationService.OpenNavItemByName(navItemName, params);\n }\n\n /**\n * Handle entity record open request from artifact viewer (from React component grids).\n * Uses NavigationService to open the record in a new tab.\n */\n onOpenEntityRecord(event: {entityName: string; compositeKey: CompositeKey}): void {\n this.navigationService.OpenEntityRecord(event.entityName, event.compositeKey);\n }\n\n /**\n * Get the environment ID from configuration or use default\n */\n get environmentId(): string {\n return this.Data?.Configuration?.environmentId || MJEnvironmentEntityExtended.DefaultEnvironmentID;\n }\n\n /**\n * Get the display name for chat collections\n */\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Collections';\n }\n\n /**\n * Get the icon class for chat collections\n */\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-folder-open';\n }\n\n // Resize handling\n private setupResizeListeners(): void {\n this.boundOnResizeMove = this.onResizeMove.bind(this);\n this.boundOnResizeEnd = this.onResizeEnd.bind(this);\n }\n\n private removeResizeListeners(): void {\n window.removeEventListener('mousemove', this.boundOnResizeMove);\n window.removeEventListener('mouseup', this.boundOnResizeEnd);\n }\n\n private boundOnResizeMove: (e: MouseEvent) => void = () => {};\n private boundOnResizeEnd: (e: MouseEvent) => void = () => {};\n\n onResizeStart(event: MouseEvent): void {\n this.isResizing = true;\n this.resizeStartX = event.clientX;\n this.resizeStartWidth = this.artifactPanelWidth;\n window.addEventListener('mousemove', this.boundOnResizeMove);\n window.addEventListener('mouseup', this.boundOnResizeEnd);\n event.preventDefault();\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }\n\n private onResizeMove(event: MouseEvent): void {\n if (!this.isResizing) return;\n\n const container = document.querySelector('.chat-collections-container') as HTMLElement;\n if (!container) return;\n\n const containerWidth = container.offsetWidth;\n const deltaX = event.clientX - this.resizeStartX;\n const deltaPercent = (deltaX / containerWidth) * -100; // Negative because we're pulling from the right\n let newWidth = this.resizeStartWidth + deltaPercent;\n\n // Constrain between 20% and 80%\n newWidth = Math.max(20, Math.min(80, newWidth));\n this.artifactPanelWidth = newWidth;\n }\n\n private onResizeEnd(event: MouseEvent): void {\n this.isResizing = false;\n window.removeEventListener('mousemove', this.boundOnResizeMove);\n window.removeEventListener('mouseup', this.boundOnResizeEnd);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n }\n}\n"]}
@@ -1,9 +1,8 @@
1
1
  import { OnDestroy, ChangeDetectorRef } from '@angular/core';
2
- import { Router } from '@angular/router';
3
2
  import { CompositeKey } from '@memberjunction/core';
4
3
  import { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';
5
4
  import { ResourceData, MJConversationEntity } from '@memberjunction/core-entities';
6
- import { ConversationDataService, ConversationChatAreaComponent, ConversationListComponent, MentionAutocompleteService, ConversationStreamingService, ActiveTasksService, PendingAttachment, UICommandHandlerService } from '@memberjunction/ng-conversations';
5
+ import { ConversationChatAreaComponent, ConversationListComponent, MentionAutocompleteService, ConversationStreamingService, ActiveTasksService, PendingAttachment, UICommandHandlerService, ConversationBridgeService } from '@memberjunction/ng-conversations';
7
6
  import { NavigationRequest } from '@memberjunction/ng-artifacts';
8
7
  import * as i0 from "@angular/core";
9
8
  /**
@@ -13,25 +12,23 @@ import * as i0 from "@angular/core";
13
12
  * Designed to work with the tab system for multi-tab conversation management
14
13
  *
15
14
  * This component manages its own selection state locally, following the encapsulation pattern:
16
- * - Services (ConversationDataService) are used for shared DATA (caching, loading, saving)
15
+ * - ConversationEngine singleton is used for shared DATA (caching, loading, saving)
17
16
  * - Local state variables manage SELECTION state (which conversation is active)
18
17
  * - State flows down to children via @Input, events flow up via @Output
19
18
  */
20
19
  export declare class ChatConversationsResource extends BaseResourceComponent implements OnDestroy {
21
20
  private navigationService;
22
- private conversationData;
23
- private router;
24
21
  private mentionAutocompleteService;
25
22
  private cdr;
26
23
  private streamingService;
27
24
  private activeTasksService;
28
25
  private uiCommandHandler;
26
+ private bridge;
29
27
  conversationList?: ConversationListComponent;
30
28
  chatArea?: ConversationChatAreaComponent;
31
29
  currentUser: any;
32
30
  private destroy$;
33
31
  private skipUrlUpdate;
34
- private lastNavigatedUrl;
35
32
  isReady: boolean;
36
33
  selectedConversationId: string | null;
37
34
  selectedConversation: MJConversationEntity | null;
@@ -55,7 +52,8 @@ export declare class ChatConversationsResource extends BaseResourceComponent imp
55
52
  pendingAttachmentsToSend: PendingAttachment[] | null;
56
53
  private readonly USER_SETTING_SIDEBAR_KEY;
57
54
  private saveSettingsTimeout;
58
- constructor(navigationService: NavigationService, conversationData: ConversationDataService, router: Router, mentionAutocompleteService: MentionAutocompleteService, cdr: ChangeDetectorRef, streamingService: ConversationStreamingService, activeTasksService: ActiveTasksService, uiCommandHandler: UICommandHandlerService);
55
+ private engine;
56
+ constructor(navigationService: NavigationService, mentionAutocompleteService: MentionAutocompleteService, cdr: ChangeDetectorRef, streamingService: ConversationStreamingService, activeTasksService: ActiveTasksService, uiCommandHandler: UICommandHandlerService, bridge: ConversationBridgeService);
59
57
  ngOnInit(): Promise<void>;
60
58
  ngOnDestroy(): void;
61
59
  /**
@@ -64,18 +62,14 @@ export declare class ChatConversationsResource extends BaseResourceComponent imp
64
62
  * The `false` parameter means "don't force refresh if already initialized".
65
63
  */
66
64
  private initializeEngines;
67
- /**
68
- * Parse URL query string for conversation state.
69
- * Query params: conversationId, artifactId, versionNumber
70
- */
71
- private parseUrlState;
72
65
  /**
73
66
  * Load the conversation entity asynchronously (non-blocking).
74
67
  * The conversationId is already set synchronously, this just loads the full entity.
75
68
  */
76
69
  private loadConversationEntity;
77
70
  /**
78
- * Apply configuration params from resource data (e.g., from deep-linking via Collections).
71
+ * Apply initial state from tab configuration.
72
+ * The shell populates queryParams from the URL, and nav params come from cross-resource linking.
79
73
  * Sets state synchronously so child components see values immediately.
80
74
  */
81
75
  private applyConfigurationParams;
@@ -83,7 +77,6 @@ export declare class ChatConversationsResource extends BaseResourceComponent imp
83
77
  * Apply navigation state to local selection state.
84
78
  * Sets state synchronously so child components see values immediately.
85
79
  */
86
- private applyNavigationState;
87
80
  /**
88
81
  * Select a conversation by ID - loads the entity and updates local state
89
82
  */
@@ -97,15 +90,6 @@ export declare class ChatConversationsResource extends BaseResourceComponent imp
97
90
  * Update the tab/browser title based on the currently selected conversation.
98
91
  */
99
92
  private updateTabTitle;
100
- /**
101
- * Handle external navigation (back/forward buttons).
102
- * Parses the URL and applies the state without triggering a new navigation.
103
- */
104
- private onExternalNavigation;
105
- /**
106
- * Parse URL state from a URL string (used for external navigation).
107
- */
108
- private parseUrlFromString;
109
93
  /**
110
94
  * Get the environment ID from configuration or use default
111
95
  */
@@ -1 +1 @@
1
- {"version":3,"file":"chat-conversations-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/chat-conversations-resource.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-conversations-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/chat-conversations-resource.component.ts"],"names":[],"mappings":"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"}