@memberjunction/ng-dashboards 5.50.0 → 6.1.0-edge.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 (37) hide show
  1. package/LICENSE +7 -0
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +59 -63
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  6. package/dist/AI/components/models/model-management.component.js +67 -70
  7. package/dist/AI/components/models/model-management.component.js.map +1 -1
  8. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  9. package/dist/AI/components/prompts/prompt-management.component.js +55 -59
  10. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  11. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  12. package/dist/AI/components/system/system-configuration.component.js +59 -63
  13. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  14. package/dist/Admin/base-admin-container.component.d.ts.map +1 -1
  15. package/dist/Admin/base-admin-container.component.js +15 -0
  16. package/dist/Admin/base-admin-container.component.js.map +1 -1
  17. package/dist/DevTools/lazy-module-status.component.d.ts +5 -7
  18. package/dist/DevTools/lazy-module-status.component.d.ts.map +1 -1
  19. package/dist/DevTools/lazy-module-status.component.js +5 -8
  20. package/dist/DevTools/lazy-module-status.component.js.map +1 -1
  21. package/dist/Home/home-application.d.ts +5 -0
  22. package/dist/Home/home-application.d.ts.map +1 -1
  23. package/dist/Home/home-application.js +9 -0
  24. package/dist/Home/home-application.js.map +1 -1
  25. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +7 -3
  26. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  27. package/dist/SystemDiagnostics/system-diagnostics.component.js +22 -21
  28. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  29. package/dist/ai-dashboards.module.d.ts +1 -1
  30. package/dist/ai-dashboards.module.d.ts.map +1 -1
  31. package/dist/ai-dashboards.module.js +4 -1
  32. package/dist/ai-dashboards.module.js.map +1 -1
  33. package/dist/public-api.d.ts +1 -0
  34. package/dist/public-api.d.ts.map +1 -1
  35. package/dist/public-api.js +1 -0
  36. package/dist/public-api.js.map +1 -1
  37. package/package.json +69 -67
@@ -1 +1 @@
1
- {"version":3,"file":"lazy-module-status.component.js","sourceRoot":"","sources":["../../src/DevTools/lazy-module-status.component.ts","../../src/DevTools/lazy-module-status.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, AfterViewInit, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { DevToolsPrefs } from './dev-tools-prefs';\nimport { buildLazyModuleStatusAgentContext } from './dev-tools-agent-context';\nimport { AgentToolResult, validateStringParam } from '../shared/agent-tool-validation';\n\ninterface LazyChunk {\n /** A friendly label inferred from the underlying loader source. */\n label: string;\n /** The loader function's source-string (used as the unique chunk id internally). */\n chunkId: string;\n loaded: boolean;\n keys: string[];\n /** True when the user clicks \"Force Load\" — used to disable the button + show spinner. */\n loading?: boolean;\n /** UI state — false initially, user can expand to see all keys. */\n expanded: boolean;\n}\n\n/** How many entry pills to show in the collapsed card before \"Show all\". */\nconst COLLAPSED_KEY_LIMIT = 8;\n\ninterface LazyRegistryShape {\n GetSnapshot(): {\n registered: string[];\n loaded: string[];\n chunks: Array<{ chunkId: string; loaded: boolean; keys: string[] }>;\n chunkCount: number;\n };\n ForceLoad(compoundKey: string): Promise<boolean>;\n}\n\n/**\n * Lazy Module Status — visualizes the Explorer's lazy-loading registry.\n * Shows each chunk, its status (loaded vs not), the registrations it\n * brings in, and offers a \"Force Load\" button to preload on demand.\n *\n * Reads from the global `__mj_lazy_registry__` published by `LazyModuleRegistry`\n * — no hard package dep on explorer-core.\n */\n@RegisterClass(BaseResourceComponent, 'LazyModuleStatusInspector')\n@Component({\n standalone: false,\n selector: 'mj-lazy-module-status',\n templateUrl: './lazy-module-status.component.html',\n styleUrls: ['./inspector-shared.css', './lazy-module-status.component.css']\n})\nexport class LazyModuleStatusComponent extends BaseResourceComponent implements OnInit, OnDestroy, AfterViewInit {\n\n public Stats = { totalKeys: 0, loadedKeys: 0, chunkCount: 0, loadedChunks: 0, percent: 0 };\n public Chunks: LazyChunk[] = [];\n public Available = false;\n public Filter: 'all' | 'loaded' | 'not-loaded' = 'all';\n /** Free-text search narrowing chunks by label or registration key. */\n public SearchQuery = '';\n public LastRefreshed = new Date();\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n public ngOnInit(): void {\n const prefs = DevToolsPrefs.Get<{ filter?: 'all' | 'loaded' | 'not-loaded'; expanded?: string[] }>('lazyModule');\n if (prefs?.filter) this.Filter = prefs.filter;\n this.refresh();\n if (prefs?.expanded) {\n for (const c of this.Chunks) c.expanded = prefs.expanded.includes(c.chunkId);\n }\n this.NotifyLoadComplete();\n }\n\n public ngAfterViewInit(): void {\n // Publish initial agent context + register the read-only client tools.\n // Re-emit happens on refresh, filter change, and the search tool.\n this.publishAgentContext();\n this.registerAgentClientTools();\n }\n\n public override ngOnDestroy(): void {\n this.savePrefs();\n super.ngOnDestroy();\n }\n\n private savePrefs(): void {\n DevToolsPrefs.Save('lazyModule', {\n filter: this.Filter,\n expanded: this.Chunks.filter(c => c.expanded).map(c => c.chunkId)\n });\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'Lazy Loading'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-puzzle-piece'; }\n\n public refresh(): void {\n const reg = (globalThis as { __mj_lazy_registry__?: LazyRegistryShape }).__mj_lazy_registry__;\n if (!reg || typeof reg.GetSnapshot !== 'function') {\n this.Available = false;\n this.cdr.markForCheck();\n return;\n }\n this.Available = true;\n const snap = reg.GetSnapshot();\n // Preserve expansion state across refreshes\n const prevExpansion = new Map(this.Chunks.map(c => [c.chunkId, c.expanded] as const));\n this.Chunks = snap.chunks.map(c => ({\n label: this.deriveChunkLabel(c.chunkId, c.keys),\n chunkId: c.chunkId,\n loaded: c.loaded,\n keys: c.keys,\n expanded: prevExpansion.get(c.chunkId) ?? false\n })).sort((a, b) => {\n if (a.loaded !== b.loaded) return a.loaded ? -1 : 1; // loaded first\n return a.label.localeCompare(b.label);\n });\n\n const loadedChunks = this.Chunks.filter(c => c.loaded).length;\n this.Stats = {\n totalKeys: snap.registered.length,\n loadedKeys: snap.loaded.length,\n chunkCount: snap.chunks.length,\n loadedChunks,\n percent: snap.chunks.length === 0 ? 0 : Math.round((loadedChunks / snap.chunks.length) * 100)\n };\n this.LastRefreshed = new Date();\n this.cdr.markForCheck();\n this.publishAgentContext();\n }\n\n public OnFilterClick(filter: 'all' | 'loaded' | 'not-loaded'): void {\n this.Filter = filter;\n this.savePrefs();\n this.publishAgentContext();\n }\n\n public get FilteredChunks(): LazyChunk[] {\n let list: LazyChunk[];\n switch (this.Filter) {\n case 'loaded': list = this.Chunks.filter(c => c.loaded); break;\n case 'not-loaded': list = this.Chunks.filter(c => !c.loaded); break;\n default: list = this.Chunks; break;\n }\n const q = this.SearchQuery.trim().toLowerCase();\n if (q) {\n list = list.filter(c =>\n c.label.toLowerCase().includes(q) ||\n c.keys.some(k => k.toLowerCase().includes(q))\n );\n }\n return list;\n }\n\n public async OnForceLoad(chunk: LazyChunk): Promise<void> {\n if (chunk.loaded || chunk.loading) return;\n const reg = (globalThis as { __mj_lazy_registry__?: LazyRegistryShape }).__mj_lazy_registry__;\n if (!reg || chunk.keys.length === 0) return;\n\n chunk.loading = true;\n this.cdr.markForCheck();\n try {\n await reg.ForceLoad(chunk.keys[0]); // any key in the chunk loads the same chunk\n // Re-read snapshot to get authoritative state\n this.refresh();\n } catch {\n chunk.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n public get LastRefreshedLabel(): string {\n return this.LastRefreshed.toLocaleTimeString();\n }\n\n public TrackByChunk = (_i: number, c: LazyChunk) => c.chunkId;\n public readonly CollapsedKeyLimit = COLLAPSED_KEY_LIMIT;\n\n public ToggleChunkExpand(chunk: LazyChunk): void {\n chunk.expanded = !chunk.expanded;\n this.savePrefs();\n }\n\n public VisibleKeys(chunk: LazyChunk): string[] {\n return chunk.expanded ? chunk.keys : chunk.keys.slice(0, COLLAPSED_KEY_LIMIT);\n }\n\n public HiddenCount(chunk: LazyChunk): number {\n return Math.max(0, chunk.keys.length - COLLAPSED_KEY_LIMIT);\n }\n\n /**\n * Derive a friendly chunk label from the loader function's source. The\n * generated `LAZY_FEATURE_CONFIG` builds loaders that look like:\n * () => importFn().then(() => {})\n * where importFn is `() => import('@memberjunction/ng-dashboards/foo.module')`\n * So the chunk id (loader.toString()) usually contains the dynamic import path.\n */\n private deriveChunkLabel(chunkId: string, keys: string[]): string {\n const m = chunkId.match(/import\\([\"']([^\"']+)[\"']\\)/);\n if (m && m[1]) {\n // Strip the @memberjunction/ prefix for brevity\n return m[1].replace(/^@memberjunction\\//, '');\n }\n // Fallback: derive from a representative key\n if (keys.length > 0) {\n const first = keys[0];\n const parts = first.split('::');\n return parts.length === 2 ? parts[1] : first;\n }\n return '(unknown chunk)';\n }\n\n // ========================================\n // AI AGENT CONTEXT & CLIENT TOOLS\n //\n // 🔒 SAFETY BOUNDARY — CLASSIFICATION: SAFE developer diagnostic.\n // The Lazy Module Status inspector is a read-only view of the Explorer's\n // lazy-loading registry. Context reports module counts; tools only search the\n // chunk list and refresh the snapshot. No application data is read or mutated.\n // (Note: the existing in-UI \"Force Load\" button is intentionally NOT exposed\n // as an agent tool — preloading chunks is a user-driven action.)\n // ========================================\n\n /** Publish the current lazy-module status to the AI agent. */\n private publishAgentContext(): void {\n const visible = this.FilteredChunks;\n const context = buildLazyModuleStatusAgentContext({\n Available: this.Available,\n TotalModules: this.Stats.chunkCount,\n LoadedModules: this.Stats.loadedChunks,\n Filter: this.Filter,\n SearchQuery: this.SearchQuery,\n VisibleModuleCount: visible.length,\n VisibleModuleNames: visible.map(c => c.label),\n });\n this.navigationService.SetAgentContext(this, context);\n }\n\n /**\n * Register the read-only client tools the AI agent can invoke against the\n * Lazy Module Status inspector: SearchLazyModules, RefreshModuleStatus.\n */\n private registerAgentClientTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'SearchLazyModules',\n Description: 'Search lazy modules by label or registration key. Pass an empty string to clear the search.',\n ParameterSchema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n Handler: async (params: Record<string, unknown>) => this.toolSearch(params),\n },\n {\n Name: 'RefreshModuleStatus',\n Description: 'Re-read the lazy-loading registry snapshot to reflect any modules loaded since the last refresh.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.refresh();\n return { Success: true };\n },\n },\n ]);\n }\n\n /** Apply (or clear, on empty string) the lazy-module search query. */\n private toolSearch(params: Record<string, unknown>): AgentToolResult {\n const validated = validateStringParam(params['query'], 'query');\n if (!validated.ok) {\n return validated.result;\n }\n this.SearchQuery = validated.value;\n this.savePrefs();\n this.publishAgentContext();\n this.cdr.markForCheck();\n return { Success: true };\n }\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Lazy loading inspector\"\n Title=\"Lazy Loading\"\n Subtitle=\"Code-split chunks: registered, loaded, and on-demand\">\n <div actions>\n <mj-refresh-button [Loading]=\"false\" (Clicked)=\"refresh()\"></mj-refresh-button>\n </div>\n </mj-page-header-interior>\n\n @if (!Available) {\n <div class=\"lz-unavailable\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <div>\n <strong>Lazy registry not available.</strong>\n The shell hasn't published the LazyModuleRegistry to globalThis yet, or you're viewing this in an environment that doesn't use it.\n </div>\n </div>\n } @else {\n <div class=\"lz-summary\">\n <div class=\"lz-progress\">\n <div class=\"lz-progress-bar\">\n <div class=\"lz-progress-fill\" [style.width.%]=\"Stats.percent\"></div>\n </div>\n <div class=\"lz-progress-meta\">\n <span class=\"lz-progress-pct\">{{ Stats.percent }}%</span>\n <span class=\"lz-progress-label\">{{ Stats.loadedChunks }} of {{ Stats.chunkCount }} chunks loaded</span>\n </div>\n </div>\n <div class=\"lz-summary-stats\">\n <div class=\"lz-summary-stat\">\n <div class=\"lz-summary-value\">{{ Stats.totalKeys }}</div>\n <div class=\"lz-summary-label\">Registered keys</div>\n </div>\n <div class=\"lz-summary-stat\">\n <div class=\"lz-summary-value\">{{ Stats.loadedKeys }}</div>\n <div class=\"lz-summary-label\">Loaded keys</div>\n </div>\n <div class=\"lz-summary-stat\">\n <div class=\"lz-summary-value\">{{ Stats.chunkCount }}</div>\n <div class=\"lz-summary-label\">Total chunks</div>\n </div>\n </div>\n </div>\n\n <div class=\"lz-filter-bar\">\n <button type=\"button\"\n class=\"lz-filter\"\n [class.lz-filter--active]=\"Filter === 'all'\"\n (click)=\"OnFilterClick('all')\">\n All <span class=\"lz-filter-count\">{{ Stats.chunkCount }}</span>\n </button>\n <button type=\"button\"\n class=\"lz-filter\"\n [class.lz-filter--active]=\"Filter === 'loaded'\"\n (click)=\"OnFilterClick('loaded')\">\n <i class=\"fa-solid fa-check-circle\"></i> Loaded <span class=\"lz-filter-count\">{{ Stats.loadedChunks }}</span>\n </button>\n <button type=\"button\"\n class=\"lz-filter\"\n [class.lz-filter--active]=\"Filter === 'not-loaded'\"\n (click)=\"OnFilterClick('not-loaded')\">\n <i class=\"fa-regular fa-circle\"></i> Not loaded <span class=\"lz-filter-count\">{{ Stats.chunkCount - Stats.loadedChunks }}</span>\n </button>\n <span class=\"lz-spacer\"></span>\n <span class=\"lz-refreshed\">Refreshed {{ LastRefreshedLabel }}</span>\n </div>\n\n <div class=\"lz-grid\">\n @for (chunk of FilteredChunks; track TrackByChunk($index, chunk)) {\n <div class=\"lz-card\" [class.lz-card--loaded]=\"chunk.loaded\">\n <div class=\"lz-card-head\">\n <div class=\"lz-card-status\" [class.lz-card-status--loaded]=\"chunk.loaded\">\n @if (chunk.loaded) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <i class=\"fa-regular fa-circle\"></i>\n }\n </div>\n <div class=\"lz-card-title\">\n <code>{{ chunk.label }}</code>\n <span class=\"lz-card-kcount\">{{ chunk.keys.length }} entries</span>\n </div>\n @if (!chunk.loaded) {\n <button type=\"button\"\n class=\"lz-load-btn\"\n [disabled]=\"chunk.loading\"\n (click)=\"OnForceLoad(chunk)\"\n title=\"Force-load this chunk now\">\n @if (chunk.loading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading\n } @else {\n <i class=\"fa-solid fa-bolt\"></i> Load\n }\n </button>\n }\n </div>\n <div class=\"lz-card-keys\" [class.lz-card-keys--expanded]=\"chunk.expanded\">\n @for (k of VisibleKeys(chunk); track k) {\n <span class=\"lz-key\">{{ k }}</span>\n }\n </div>\n @if (HiddenCount(chunk) > 0 || chunk.expanded) {\n <button class=\"lz-card-expand\"\n type=\"button\"\n (click)=\"ToggleChunkExpand(chunk)\">\n @if (chunk.expanded) {\n <i class=\"fa-solid fa-chevron-up\"></i> Show less\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i> Show all {{ chunk.keys.length }} entries\n }\n </button>\n }\n </div>\n }\n @if (FilteredChunks.length === 0) {\n <mj-empty-state class=\"lz-empty\" Variant=\"no-results\" Size=\"compact\" Icon=\"fa-solid fa-circle-info\"\n Title=\"No chunks match the current filter.\" />\n }\n </div>\n }\n</div>\n"]}
1
+ {"version":3,"file":"lazy-module-status.component.js","sourceRoot":"","sources":["../../src/DevTools/lazy-module-status.component.ts","../../src/DevTools/lazy-module-status.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, AfterViewInit, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { DevToolsPrefs } from './dev-tools-prefs';\nimport { buildLazyModuleStatusAgentContext } from './dev-tools-agent-context';\nimport { AgentToolResult, validateStringParam } from '../shared/agent-tool-validation';\n\ninterface LazyChunk {\n /** A friendly label derived from the chunk id. */\n label: string;\n /** The chunk's stable id — its dynamic import specifier. */\n chunkId: string;\n loaded: boolean;\n keys: string[];\n /** True when the user clicks \"Force Load\" — used to disable the button + show spinner. */\n loading?: boolean;\n /** UI state — false initially, user can expand to see all keys. */\n expanded: boolean;\n}\n\n/** How many entry pills to show in the collapsed card before \"Show all\". */\nconst COLLAPSED_KEY_LIMIT = 8;\n\ninterface LazyRegistryShape {\n GetSnapshot(): {\n registered: string[];\n loaded: string[];\n chunks: Array<{ chunkId: string; loaded: boolean; keys: string[] }>;\n loadedChunkCount: number;\n };\n ForceLoad(compoundKey: string): Promise<boolean>;\n}\n\n/**\n * Lazy Module Status — visualizes the Explorer's lazy-loading registry.\n * Shows each chunk, its status (loaded vs not), the registrations it\n * brings in, and offers a \"Force Load\" button to preload on demand.\n *\n * Reads from the global `__mj_lazy_registry__` published by `LazyModuleRegistry`\n * — no hard package dep on explorer-core.\n */\n@RegisterClass(BaseResourceComponent, 'LazyModuleStatusInspector')\n@Component({\n standalone: false,\n selector: 'mj-lazy-module-status',\n templateUrl: './lazy-module-status.component.html',\n styleUrls: ['./inspector-shared.css', './lazy-module-status.component.css']\n})\nexport class LazyModuleStatusComponent extends BaseResourceComponent implements OnInit, OnDestroy, AfterViewInit {\n\n public Stats = { totalKeys: 0, loadedKeys: 0, chunkCount: 0, loadedChunks: 0, percent: 0 };\n public Chunks: LazyChunk[] = [];\n public Available = false;\n public Filter: 'all' | 'loaded' | 'not-loaded' = 'all';\n /** Free-text search narrowing chunks by label or registration key. */\n public SearchQuery = '';\n public LastRefreshed = new Date();\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n public ngOnInit(): void {\n const prefs = DevToolsPrefs.Get<{ filter?: 'all' | 'loaded' | 'not-loaded'; expanded?: string[] }>('lazyModule');\n if (prefs?.filter) this.Filter = prefs.filter;\n this.refresh();\n if (prefs?.expanded) {\n for (const c of this.Chunks) c.expanded = prefs.expanded.includes(c.chunkId);\n }\n this.NotifyLoadComplete();\n }\n\n public ngAfterViewInit(): void {\n // Publish initial agent context + register the read-only client tools.\n // Re-emit happens on refresh, filter change, and the search tool.\n this.publishAgentContext();\n this.registerAgentClientTools();\n }\n\n public override ngOnDestroy(): void {\n this.savePrefs();\n super.ngOnDestroy();\n }\n\n private savePrefs(): void {\n DevToolsPrefs.Save('lazyModule', {\n filter: this.Filter,\n expanded: this.Chunks.filter(c => c.expanded).map(c => c.chunkId)\n });\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'Lazy Loading'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-puzzle-piece'; }\n\n public refresh(): void {\n const reg = (globalThis as { __mj_lazy_registry__?: LazyRegistryShape }).__mj_lazy_registry__;\n if (!reg || typeof reg.GetSnapshot !== 'function') {\n this.Available = false;\n this.cdr.markForCheck();\n return;\n }\n this.Available = true;\n const snap = reg.GetSnapshot();\n // Preserve expansion state across refreshes\n const prevExpansion = new Map(this.Chunks.map(c => [c.chunkId, c.expanded] as const));\n this.Chunks = snap.chunks.map(c => ({\n label: this.deriveChunkLabel(c.chunkId, c.keys),\n chunkId: c.chunkId,\n loaded: c.loaded,\n keys: c.keys,\n expanded: prevExpansion.get(c.chunkId) ?? false\n })).sort((a, b) => {\n if (a.loaded !== b.loaded) return a.loaded ? -1 : 1; // loaded first\n return a.label.localeCompare(b.label);\n });\n\n const loadedChunks = this.Chunks.filter(c => c.loaded).length;\n this.Stats = {\n totalKeys: snap.registered.length,\n loadedKeys: snap.loaded.length,\n chunkCount: snap.chunks.length,\n loadedChunks,\n percent: snap.chunks.length === 0 ? 0 : Math.round((loadedChunks / snap.chunks.length) * 100)\n };\n this.LastRefreshed = new Date();\n this.cdr.markForCheck();\n this.publishAgentContext();\n }\n\n public OnFilterClick(filter: 'all' | 'loaded' | 'not-loaded'): void {\n this.Filter = filter;\n this.savePrefs();\n this.publishAgentContext();\n }\n\n public get FilteredChunks(): LazyChunk[] {\n let list: LazyChunk[];\n switch (this.Filter) {\n case 'loaded': list = this.Chunks.filter(c => c.loaded); break;\n case 'not-loaded': list = this.Chunks.filter(c => !c.loaded); break;\n default: list = this.Chunks; break;\n }\n const q = this.SearchQuery.trim().toLowerCase();\n if (q) {\n list = list.filter(c =>\n c.label.toLowerCase().includes(q) ||\n c.keys.some(k => k.toLowerCase().includes(q))\n );\n }\n return list;\n }\n\n public async OnForceLoad(chunk: LazyChunk): Promise<void> {\n if (chunk.loaded || chunk.loading) return;\n const reg = (globalThis as { __mj_lazy_registry__?: LazyRegistryShape }).__mj_lazy_registry__;\n if (!reg || chunk.keys.length === 0) return;\n\n chunk.loading = true;\n this.cdr.markForCheck();\n try {\n await reg.ForceLoad(chunk.keys[0]); // any key in the chunk loads the same chunk\n // Re-read snapshot to get authoritative state\n this.refresh();\n } catch {\n chunk.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n public get LastRefreshedLabel(): string {\n return this.LastRefreshed.toLocaleTimeString();\n }\n\n public TrackByChunk = (_i: number, c: LazyChunk) => c.chunkId;\n public readonly CollapsedKeyLimit = COLLAPSED_KEY_LIMIT;\n\n public ToggleChunkExpand(chunk: LazyChunk): void {\n chunk.expanded = !chunk.expanded;\n this.savePrefs();\n }\n\n public VisibleKeys(chunk: LazyChunk): string[] {\n return chunk.expanded ? chunk.keys : chunk.keys.slice(0, COLLAPSED_KEY_LIMIT);\n }\n\n public HiddenCount(chunk: LazyChunk): number {\n return Math.max(0, chunk.keys.length - COLLAPSED_KEY_LIMIT);\n }\n\n /**\n * Derive a friendly chunk label from the chunk id, which is the dynamic import\n * specifier the generated `LAZY_FEATURE_CONFIG` declared for the chunk\n * (e.g. '@memberjunction/ng-dashboards/ai-dashboards.module').\n */\n private deriveChunkLabel(chunkId: string, keys: string[]): string {\n if (chunkId) {\n // Strip the @memberjunction/ prefix for brevity\n return chunkId.replace(/^@memberjunction\\//, '');\n }\n // Fallback: derive from a representative key\n if (keys.length > 0) {\n const first = keys[0];\n const parts = first.split('::');\n return parts.length === 2 ? parts[1] : first;\n }\n return '(unknown chunk)';\n }\n\n // ========================================\n // AI AGENT CONTEXT & CLIENT TOOLS\n //\n // 🔒 SAFETY BOUNDARY — CLASSIFICATION: SAFE developer diagnostic.\n // The Lazy Module Status inspector is a read-only view of the Explorer's\n // lazy-loading registry. Context reports module counts; tools only search the\n // chunk list and refresh the snapshot. No application data is read or mutated.\n // (Note: the existing in-UI \"Force Load\" button is intentionally NOT exposed\n // as an agent tool — preloading chunks is a user-driven action.)\n // ========================================\n\n /** Publish the current lazy-module status to the AI agent. */\n private publishAgentContext(): void {\n const visible = this.FilteredChunks;\n const context = buildLazyModuleStatusAgentContext({\n Available: this.Available,\n TotalModules: this.Stats.chunkCount,\n LoadedModules: this.Stats.loadedChunks,\n Filter: this.Filter,\n SearchQuery: this.SearchQuery,\n VisibleModuleCount: visible.length,\n VisibleModuleNames: visible.map(c => c.label),\n });\n this.navigationService.SetAgentContext(this, context);\n }\n\n /**\n * Register the read-only client tools the AI agent can invoke against the\n * Lazy Module Status inspector: SearchLazyModules, RefreshModuleStatus.\n */\n private registerAgentClientTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'SearchLazyModules',\n Description: 'Search lazy modules by label or registration key. Pass an empty string to clear the search.',\n ParameterSchema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n Handler: async (params: Record<string, unknown>) => this.toolSearch(params),\n },\n {\n Name: 'RefreshModuleStatus',\n Description: 'Re-read the lazy-loading registry snapshot to reflect any modules loaded since the last refresh.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.refresh();\n return { Success: true };\n },\n },\n ]);\n }\n\n /** Apply (or clear, on empty string) the lazy-module search query. */\n private toolSearch(params: Record<string, unknown>): AgentToolResult {\n const validated = validateStringParam(params['query'], 'query');\n if (!validated.ok) {\n return validated.result;\n }\n this.SearchQuery = validated.value;\n this.savePrefs();\n this.publishAgentContext();\n this.cdr.markForCheck();\n return { Success: true };\n }\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Lazy loading inspector\"\n Title=\"Lazy Loading\"\n Subtitle=\"Code-split chunks: registered, loaded, and on-demand\">\n <div actions>\n <mj-refresh-button [Loading]=\"false\" (Clicked)=\"refresh()\"></mj-refresh-button>\n </div>\n </mj-page-header-interior>\n\n @if (!Available) {\n <div class=\"lz-unavailable\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <div>\n <strong>Lazy registry not available.</strong>\n The shell hasn't published the LazyModuleRegistry to globalThis yet, or you're viewing this in an environment that doesn't use it.\n </div>\n </div>\n } @else {\n <div class=\"lz-summary\">\n <div class=\"lz-progress\">\n <div class=\"lz-progress-bar\">\n <div class=\"lz-progress-fill\" [style.width.%]=\"Stats.percent\"></div>\n </div>\n <div class=\"lz-progress-meta\">\n <span class=\"lz-progress-pct\">{{ Stats.percent }}%</span>\n <span class=\"lz-progress-label\">{{ Stats.loadedChunks }} of {{ Stats.chunkCount }} chunks loaded</span>\n </div>\n </div>\n <div class=\"lz-summary-stats\">\n <div class=\"lz-summary-stat\">\n <div class=\"lz-summary-value\">{{ Stats.totalKeys }}</div>\n <div class=\"lz-summary-label\">Registered keys</div>\n </div>\n <div class=\"lz-summary-stat\">\n <div class=\"lz-summary-value\">{{ Stats.loadedKeys }}</div>\n <div class=\"lz-summary-label\">Loaded keys</div>\n </div>\n <div class=\"lz-summary-stat\">\n <div class=\"lz-summary-value\">{{ Stats.chunkCount }}</div>\n <div class=\"lz-summary-label\">Total chunks</div>\n </div>\n </div>\n </div>\n\n <div class=\"lz-filter-bar\">\n <button type=\"button\"\n class=\"lz-filter\"\n [class.lz-filter--active]=\"Filter === 'all'\"\n (click)=\"OnFilterClick('all')\">\n All <span class=\"lz-filter-count\">{{ Stats.chunkCount }}</span>\n </button>\n <button type=\"button\"\n class=\"lz-filter\"\n [class.lz-filter--active]=\"Filter === 'loaded'\"\n (click)=\"OnFilterClick('loaded')\">\n <i class=\"fa-solid fa-check-circle\"></i> Loaded <span class=\"lz-filter-count\">{{ Stats.loadedChunks }}</span>\n </button>\n <button type=\"button\"\n class=\"lz-filter\"\n [class.lz-filter--active]=\"Filter === 'not-loaded'\"\n (click)=\"OnFilterClick('not-loaded')\">\n <i class=\"fa-regular fa-circle\"></i> Not loaded <span class=\"lz-filter-count\">{{ Stats.chunkCount - Stats.loadedChunks }}</span>\n </button>\n <span class=\"lz-spacer\"></span>\n <span class=\"lz-refreshed\">Refreshed {{ LastRefreshedLabel }}</span>\n </div>\n\n <div class=\"lz-grid\">\n @for (chunk of FilteredChunks; track TrackByChunk($index, chunk)) {\n <div class=\"lz-card\" [class.lz-card--loaded]=\"chunk.loaded\">\n <div class=\"lz-card-head\">\n <div class=\"lz-card-status\" [class.lz-card-status--loaded]=\"chunk.loaded\">\n @if (chunk.loaded) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <i class=\"fa-regular fa-circle\"></i>\n }\n </div>\n <div class=\"lz-card-title\">\n <code>{{ chunk.label }}</code>\n <span class=\"lz-card-kcount\">{{ chunk.keys.length }} entries</span>\n </div>\n @if (!chunk.loaded) {\n <button type=\"button\"\n class=\"lz-load-btn\"\n [disabled]=\"chunk.loading\"\n (click)=\"OnForceLoad(chunk)\"\n title=\"Force-load this chunk now\">\n @if (chunk.loading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading\n } @else {\n <i class=\"fa-solid fa-bolt\"></i> Load\n }\n </button>\n }\n </div>\n <div class=\"lz-card-keys\" [class.lz-card-keys--expanded]=\"chunk.expanded\">\n @for (k of VisibleKeys(chunk); track k) {\n <span class=\"lz-key\">{{ k }}</span>\n }\n </div>\n @if (HiddenCount(chunk) > 0 || chunk.expanded) {\n <button class=\"lz-card-expand\"\n type=\"button\"\n (click)=\"ToggleChunkExpand(chunk)\">\n @if (chunk.expanded) {\n <i class=\"fa-solid fa-chevron-up\"></i> Show less\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i> Show all {{ chunk.keys.length }} entries\n }\n </button>\n }\n </div>\n }\n @if (FilteredChunks.length === 0) {\n <mj-empty-state class=\"lz-empty\" Variant=\"no-results\" Size=\"compact\" Icon=\"fa-solid fa-circle-info\"\n Title=\"No chunks match the current filter.\" />\n }\n </div>\n }\n</div>\n"]}
@@ -50,6 +50,11 @@ export declare class HomeApplication extends BaseApplication {
50
50
  * Returns navigation items including dynamic items for recently visited orphan resources.
51
51
  * Static items come from DefaultNavItems in metadata.
52
52
  * Dynamic items are generated from the recent orphan stack (up to 3).
53
+ *
54
+ * Records style (Shell.RecordOpen.Style = 'records', the default): dynamic
55
+ * items are SKIPPED — the shell's Records pill + strip represent open
56
+ * records globally, and Home's own stack would double-represent records
57
+ * opened from Home. Classic style keeps this behavior as-is.
53
58
  */
54
59
  GetNavItems(): Promise<NavItem[]>;
55
60
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"home-application.d.ts","sourceRoot":"","sources":["../../src/Home/home-application.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAkB,OAAO,EAAE,qBAAqB,EAAgB,MAAM,qCAAqC,CAAC;AACpI,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAiC1D;;;;;;;;;;;;;;;;;GAiBG;AACH,qBACa,eAAgB,SAAQ,eAAe;IAClD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAK;IAE7C,OAAO,CAAC,gBAAgB,CAAsC;IAC9D,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,iBAAiB,CAAgC;IACzD,OAAO,CAAC,mBAAmB,CAA8B;IAEzD;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,uBAAuB,CAAuB;IAEtD;;;OAGG;IACI,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI;IAOhE;;OAEG;IACI,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAIrD;;;;OAIG;IACY,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAwBhD;;;;OAIG;IACI,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAiBhD;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAe7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAezB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAuBnB;;;;;;OAMG;YACW,iBAAiB;IAqE/B;;;;;;;;;;;;;OAaG;YACW,4BAA4B;IAsB1C;;;;OAIG;YACW,sBAAsB;IAgCpC;;OAEG;YACW,oBAAoB;IAoBlC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAsB5B;;;;;;;;;;OAUG;YACW,kBAAkB;IAwBhC;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;;OAGG;IACH,OAAO,CAAC,SAAS;IAiBjB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IA4B1B;;;OAGG;YACW,oBAAoB;CAsBnC"}
1
+ {"version":3,"file":"home-application.d.ts","sourceRoot":"","sources":["../../src/Home/home-application.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAkB,OAAO,EAAE,qBAAqB,EAAgB,MAAM,qCAAqC,CAAC;AACpI,OAAO,EAAE,aAAa,EAAqB,MAAM,2BAA2B,CAAC;AAiC7E;;;;;;;;;;;;;;;;;GAiBG;AACH,qBACa,eAAgB,SAAQ,eAAe;IAClD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAK;IAE7C,OAAO,CAAC,gBAAgB,CAAsC;IAC9D,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,iBAAiB,CAAgC;IACzD,OAAO,CAAC,mBAAmB,CAA8B;IAEzD;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,uBAAuB,CAAuB;IAEtD;;;OAGG;IACI,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI;IAOhE;;OAEG;IACI,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAIrD;;;;;;;;;OASG;IACY,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IA4BhD;;;;OAIG;IACI,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAiBhD;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAe7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAezB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAuBnB;;;;;;OAMG;YACW,iBAAiB;IAqE/B;;;;;;;;;;;;;OAaG;YACW,4BAA4B;IAsB1C;;;;OAIG;YACW,sBAAsB;IAgCpC;;OAEG;YACW,oBAAoB;IAoBlC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAsB5B;;;;;;;;;;OAUG;YACW,kBAAkB;IAwBhC;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;;OAGG;IACH,OAAO,CAAC,SAAS;IAiBjB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IA4B1B;;;OAGG;YACW,oBAAoB;CAsBnC"}
@@ -7,6 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var HomeApplication_1;
8
8
  import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
9
9
  import { BaseApplication } from '@memberjunction/ng-base-application';
10
+ import { IsRecordTabsStyle } from '@memberjunction/ng-shared';
10
11
  import { CompositeKey, FieldValueCollection } from '@memberjunction/core';
11
12
  /** Storage key and category for persisting the recent orphan stack */
12
13
  const STORAGE_KEY = 'HomeApp_RecentOrphanStack';
@@ -71,8 +72,16 @@ let HomeApplication = class HomeApplication extends BaseApplication {
71
72
  * Returns navigation items including dynamic items for recently visited orphan resources.
72
73
  * Static items come from DefaultNavItems in metadata.
73
74
  * Dynamic items are generated from the recent orphan stack (up to 3).
75
+ *
76
+ * Records style (Shell.RecordOpen.Style = 'records', the default): dynamic
77
+ * items are SKIPPED — the shell's Records pill + strip represent open
78
+ * records globally, and Home's own stack would double-represent records
79
+ * opened from Home. Classic style keeps this behavior as-is.
74
80
  */
75
81
  async GetNavItems() {
82
+ if (IsRecordTabsStyle()) {
83
+ return super.GetNavItems();
84
+ }
76
85
  // Ensure persisted stack is loaded before building nav items.
77
86
  // On first call after page load, this awaits the IndexedDB read;
78
87
  // on subsequent calls the promise is already resolved (no-op await).
@@ -1 +1 @@
1
- {"version":3,"file":"home-application.js","sourceRoot":"","sources":["../../src/Home/home-application.ts"],"names":[],"mappings":"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","sourcesContent":["import { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { BaseApplication, DynamicNavItem, NavItem, WorkspaceStateManager, WorkspaceTab } from '@memberjunction/ng-base-application';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { Metadata, CompositeKey, FieldValueCollection } from '@memberjunction/core';\n\n/** Storage key and category for persisting the recent orphan stack */\nconst STORAGE_KEY = 'HomeApp_RecentOrphanStack';\nconst STORAGE_CATEGORY = 'HomeApplication';\n\n/**\n * Snapshot of an orphan resource tab for the recent navigation stack.\n * Persisted to localStorage (via Provider) so it survives page reloads.\n */\ninterface OrphanResourceSnapshot {\n /** URL-encoded composite key segment — primary dedup key */\n resourceRecordId: string;\n /** Resource type name (e.g., 'record', 'Dashboards') */\n resourceType: string;\n /** Entity name from tab configuration (for record name resolution) */\n entityName?: string;\n /** Tab title at time of capture (fallback label) */\n title: string;\n /** Resolved display label (cached record name). Persisted to avoid async lookups on reload. */\n resolvedLabel: string;\n /** Full tab configuration (passed to DynamicNavItem for re-opening) */\n configuration: Record<string, unknown>;\n /** Tab ID for fallback matching when no resourceRecordId */\n tabId: string;\n /** Timestamp (ms since epoch) when this snapshot was created or last promoted */\n timestamp: number;\n}\n\n/** Max age for persisted snapshots — 7 days */\nconst MAX_SNAPSHOT_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\n/**\n * Home Application - Provides dynamic navigation items for orphan resources.\n *\n * Maintains a recency-ordered stack of up to 3 recently visited orphan resources.\n * When the user opens a record/view/dashboard from within the Home app, the resource\n * appears as a dynamic nav item. When they navigate away (e.g., click Home), the\n * nav item persists so they can quickly jump back. Older items drop off as new ones\n * are added.\n *\n * The stack is persisted to localStorage (via Metadata.Provider.LocalStorageProvider)\n * so it survives page reloads. Resolved record labels are stored alongside each\n * snapshot to avoid async lookups when restoring from storage.\n *\n * @example\n * User opens \"John Smith\" contact, then \"Acme Corp\" company:\n * - Nav shows: [Home] [Favorites] | [person] \"Acme Corp\" [building] \"John Smith\"\n * - Clicking \"John Smith\" re-opens that record\n */\n@RegisterClass(BaseApplication, 'HomeApplication')\nexport class HomeApplication extends BaseApplication {\n private static readonly MAX_RECENT_ITEMS = 3;\n\n private workspaceManager: WorkspaceStateManager | null = null;\n private sharedService: SharedService | null = null;\n private recentOrphanStack: OrphanResourceSnapshot[] = [];\n private _storageLoadPromise: Promise<void> | null = null;\n\n /**\n * Fingerprint of the last-processed active tab state (tabId::resourceRecordId::title).\n * Guards against redundant stack mutations while still detecting content changes.\n * In single-resource mode the tab ID stays constant when navigating between records\n * (OpenTab replaces the temp tab's content but keeps its ID), so we must also\n * include the resourceRecordId to detect when the tab shows a different record.\n *\n * Title is also included so an in-place display-name change (e.g. user edits a\n * record's Name field and saves — tabId and resourceRecordId stay the same but the\n * title changes) triggers a re-evaluation. Without this, the dynamic nav item keeps\n * showing the pre-edit name forever.\n */\n private _lastSeenTabFingerprint: string | null = null;\n\n /**\n * Inject WorkspaceStateManager for accessing current tab state.\n * Also triggers loading the persisted stack from storage on first call.\n */\n public SetWorkspaceManager(manager: WorkspaceStateManager): void {\n this.workspaceManager = manager;\n if (!this._storageLoadPromise) {\n this._storageLoadPromise = this.loadStackFromStorage();\n }\n }\n\n /**\n * Inject SharedService for accessing ResourceTypes metadata\n */\n public SetSharedService(service: SharedService): void {\n this.sharedService = service;\n }\n\n /**\n * Returns navigation items including dynamic items for recently visited orphan resources.\n * Static items come from DefaultNavItems in metadata.\n * Dynamic items are generated from the recent orphan stack (up to 3).\n */\n override async GetNavItems(): Promise<NavItem[]> {\n // Ensure persisted stack is loaded before building nav items.\n // On first call after page load, this awaits the IndexedDB read;\n // on subsequent calls the promise is already resolved (no-op await).\n if (this._storageLoadPromise) {\n await this._storageLoadPromise;\n }\n\n const staticItems = await super.GetNavItems();\n\n // Update the recent stack based on current active tab\n // Must await — updateRecentStack is async (calls matchesStaticNavItem → super.GetNavItems())\n // and buildDynamicNavItems reads recentOrphanStack, so the stack must be fully updated first.\n await this.updateRecentStack();\n\n // Build dynamic nav items from the stack\n const dynamicItems = this.buildDynamicNavItems();\n if (dynamicItems.length > 0) {\n return [...staticItems, ...dynamicItems];\n }\n\n return staticItems;\n }\n\n /**\n * Removes a dynamic nav item from the recent stack by RecordID.\n * Called by AppNavComponent when the user clicks the dismiss X button.\n * If the dismissed item is currently active, navigates back to the app's default tab.\n */\n public RemoveDynamicNavItem(item: NavItem): void {\n const index = this.recentOrphanStack.findIndex(\n s => s.resourceRecordId === item.RecordID\n );\n if (index < 0) {\n return;\n }\n\n const wasActive = this.isDismissedItemActive(item);\n this.recentOrphanStack.splice(index, 1);\n this.saveStackToStorage();\n\n if (wasActive) {\n this.navigateToDefault();\n }\n }\n\n /**\n * Checks whether the dismissed nav item matches the currently active tab.\n */\n private isDismissedItemActive(item: NavItem): boolean {\n if (!this.workspaceManager) {\n return false;\n }\n const config = this.workspaceManager.GetConfiguration();\n if (!config?.activeTabId) {\n return false;\n }\n const activeTab = config.tabs.find(t => t.id === config.activeTabId);\n if (!activeTab) {\n return false;\n }\n return activeTab.resourceRecordId === item.RecordID;\n }\n\n /**\n * Navigates back to the app's default tab (first static nav item / Home dashboard).\n */\n private navigateToDefault(): void {\n if (!this.workspaceManager) {\n return;\n }\n this.CreateDefaultTab().then(tabRequest => {\n if (tabRequest && this.workspaceManager) {\n this.workspaceManager.OpenTab(tabRequest, this.GetColor());\n }\n });\n }\n\n // ========================================\n // Icon Resolution\n // ========================================\n\n /**\n * Resolves the best icon for a dynamic nav item.\n * Priority: entity-specific icon from metadata → resource type icon → generic fallback.\n */\n private resolveIcon(entityName: string | undefined, resourceTypeName: string): string {\n if (entityName) {\n const md = this.Provider;\n const entityIcon = md.EntityByName(entityName)?.Icon;\n if (entityIcon) {\n return entityIcon;\n }\n }\n\n if (this.sharedService) {\n const resourceType = this.sharedService.ResourceTypeByName(resourceTypeName);\n if (resourceType?.Icon) {\n return resourceType.Icon;\n }\n }\n\n return 'fa-solid fa-file';\n }\n\n // ========================================\n // Recent Stack Management\n // ========================================\n\n /**\n * Updates the recent orphan stack based on the currently active tab.\n * If the active tab is a new orphan resource (not already in the stack and not\n * matching any static nav item), it gets added to the front. Items already in the\n * stack keep their position to avoid visually jarring reordering when users click\n * between existing dynamic nav items.\n */\n private async updateRecentStack(): Promise<void> {\n if (!this.workspaceManager) {\n return;\n }\n\n const config = this.workspaceManager.GetConfiguration();\n if (!config?.activeTabId) {\n return;\n }\n\n const activeTab = config.tabs.find(t => t.id === config.activeTabId);\n if (!activeTab || !UUIDsEqual(activeTab.applicationId, this.ID)) {\n return;\n }\n\n // ALWAYS refresh the matching snapshot's label first — BEFORE the fingerprint\n // bail. A burst of configuration$ emissions (typical on save) causes multiple\n // concurrent updateCachedData calls; the first one proceeds past the fingerprint\n // check and gets stuck awaiting createSnapshotIfOrphan, while the rest bail at\n // fingerprint and race ahead with the *stale* snapshot. By the time the first\n // call's async work completes and updates the snapshot, the gen-check in\n // AppNav.updateCachedData has already discarded its results. The user is left\n // with the right data in memory but rendered against the wrong label.\n //\n // Refreshing here is cheap (cache hit after my save-handler's pre-warm) and\n // ensures every call — even fast bailers — produces fresh dynamic nav items.\n await this.refreshExistingSnapshotLabel(activeTab);\n\n // Build a fingerprint from tab ID + record content + title. In single-resource\n // mode, OpenTab replaces the temp tab's content but keeps the same tab ID, so we\n // need the resourceRecordId to detect when a different record is shown. Title is\n // included so an in-place rename (record's Name field edited and saved — tabId\n // and resourceRecordId stay the same but title changes) also triggers a refresh.\n const fingerprint = `${activeTab.id}::${activeTab.resourceRecordId ?? ''}::${activeTab.title ?? ''}`;\n if (fingerprint === this._lastSeenTabFingerprint) {\n return;\n }\n this._lastSeenTabFingerprint = fingerprint;\n\n // Check if active tab qualifies as an orphan resource\n const snapshot = await this.createSnapshotIfOrphan(activeTab);\n if (!snapshot) {\n // Active tab is a static resource (Home dashboard, etc.) — leave stack as-is\n return;\n }\n\n // If this item is already in the stack, leave the ORDER unchanged (reordering\n // on every click is visually jarring) — but DO refresh its `resolvedLabel` if the\n // underlying display name has changed. Without this, editing a record's Name\n // field would leave the dynamic nav item showing the pre-edit name forever.\n // Already-tracked snapshots are kept in their existing position (no jarring\n // reorder) and have their label kept fresh by refreshExistingSnapshotLabel\n // above — so here we only need to handle the NEW-snapshot case.\n const alreadyTracked = this.recentOrphanStack.some(\n s => s.resourceRecordId === snapshot.resourceRecordId\n );\n if (alreadyTracked) {\n return;\n }\n\n // New orphan — push to front (most recent first) and trim oldest if needed\n this.recentOrphanStack.unshift(snapshot);\n if (this.recentOrphanStack.length > HomeApplication.MAX_RECENT_ITEMS) {\n this.recentOrphanStack.length = HomeApplication.MAX_RECENT_ITEMS;\n }\n\n this.saveStackToStorage();\n }\n\n /**\n * Refreshes an already-tracked snapshot's `resolvedLabel` against the latest cached\n * record name. Called unconditionally at the top of `updateRecentStack` (BEFORE the\n * fingerprint bail), so even no-op-fingerprint calls don't render stale labels.\n *\n * Why this matters: when a record is saved, `configuration$` typically emits multiple\n * times in quick succession (UpdateTabTitle, UpdateConfiguration, etc.). AppNav's\n * subscription kicks off a `updateCachedData` for each. The first call wins the\n * fingerprint race and starts the slow async `createSnapshotIfOrphan` chain;\n * subsequent calls bail at fingerprint and race ahead with the still-unrefreshed\n * snapshot. AppNav's `_updateGeneration` then discards the slow call's results.\n * Without this method, the freshly-saved label lands in the snapshot — but never\n * makes it to the rendered nav until some unrelated event triggers another cycle.\n */\n private async refreshExistingSnapshotLabel(activeTab: WorkspaceTab): Promise<void> {\n if (!activeTab.resourceRecordId) {\n return;\n }\n const existing = this.recentOrphanStack.find(\n s => s.resourceRecordId === activeTab.resourceRecordId\n );\n if (!existing || !existing.entityName) {\n return;\n }\n const newLabel = await this.resolveRecordLabel(\n existing.entityName,\n activeTab.resourceRecordId,\n activeTab.title\n );\n if (newLabel && newLabel !== existing.resolvedLabel) {\n existing.resolvedLabel = newLabel;\n existing.title = activeTab.title;\n this.saveStackToStorage();\n }\n }\n\n /**\n * Creates an OrphanResourceSnapshot from a tab if it qualifies as an orphan resource.\n * Returns null if the tab is a static nav item, has no resource type, or is an\n * app-level custom dashboard (no record ID).\n */\n private async createSnapshotIfOrphan(tab: WorkspaceTab): Promise<OrphanResourceSnapshot | null> {\n const resourceType = tab.configuration?.['resourceType'] as string | undefined;\n if (!resourceType) {\n return null;\n }\n\n // Skip 'custom' resource type without a specific record (app-level dashboards)\n if (resourceType.toLowerCase() === 'custom' && !tab.resourceRecordId) {\n return null;\n }\n\n // Skip if it matches a static nav item\n if (await this.matchesStaticNavItem(tab)) {\n return null;\n }\n\n // Resolve the label now so it's stored with the snapshot\n const entityName = tab.configuration?.['Entity'] as string | undefined;\n const resolvedLabel = await this.resolveRecordLabel(entityName, tab.resourceRecordId, tab.title);\n\n return {\n resourceRecordId: tab.resourceRecordId,\n resourceType,\n entityName,\n title: tab.title,\n resolvedLabel,\n configuration: tab.configuration as Record<string, unknown>,\n tabId: tab.id,\n timestamp: Date.now()\n };\n }\n\n /**\n * Checks whether a tab matches any static nav item (by label, route, or driver class).\n */\n private async matchesStaticNavItem(tab: WorkspaceTab): Promise<boolean> {\n const staticItems = await super.GetNavItems();\n return staticItems.some(item => {\n if (item.Label === tab.title) {\n return true;\n }\n if (item.Route && tab.configuration?.['route'] === item.Route) {\n return true;\n }\n if (item.DriverClass && tab.configuration?.['driverClass'] === item.DriverClass) {\n return true;\n }\n return false;\n });\n }\n\n // ========================================\n // Dynamic NavItem Building\n // ========================================\n\n /**\n * Creates DynamicNavItem entries for each item in the recent orphan stack.\n * Uses the pre-resolved label from the snapshot (no async needed).\n */\n private buildDynamicNavItems(): DynamicNavItem[] {\n return this.recentOrphanStack.map(snapshot => this.createDynamicNavItem(snapshot));\n }\n\n /**\n * Creates a single DynamicNavItem from an OrphanResourceSnapshot.\n * Uses the snapshot's resolvedLabel directly — no async lookup needed.\n */\n private createDynamicNavItem(snapshot: OrphanResourceSnapshot): DynamicNavItem {\n return {\n Label: snapshot.resolvedLabel,\n Icon: this.resolveIcon(snapshot.entityName, snapshot.resourceType),\n ResourceType: snapshot.resourceType,\n RecordID: snapshot.resourceRecordId,\n Configuration: snapshot.configuration,\n isDynamic: true,\n isActiveMatch: (tab: unknown) => {\n const wsTab = tab as WorkspaceTab;\n if (snapshot.resourceRecordId) {\n return wsTab.resourceRecordId === snapshot.resourceRecordId;\n }\n return wsTab.id === snapshot.tabId;\n }\n };\n }\n\n // ========================================\n // Label Resolution\n // ========================================\n\n /**\n * Resolves the best available display label for an entity record nav item.\n * Priority order:\n * 1. Cached record name (from EntityRecordNameCache, populated by entity Load/Save)\n * 2. Tab title (whatever the workspace assigned when the tab was opened)\n * 3. Generated default (entity name + truncated primary key values)\n *\n * @param entityName - Entity name from tab configuration, may be undefined for non-entity resources\n * @param tabRecordId - URL-encoded composite key segment (e.g. \"ID|abc-123\" or \"Field1|val1||Field2|val2\")\n * @param tabTitle - Fallback title assigned by the workspace when the tab was opened\n */\n private async resolveRecordLabel(entityName: string | undefined, tabRecordId: string | undefined, tabTitle: string): Promise<string> {\n if (!entityName || !tabRecordId) {\n return tabTitle || '';\n }\n\n // Parse the URL segment into a CompositeKey\n const fvCollection = new FieldValueCollection();\n fvCollection.SimpleLoadFromURLSegment(tabRecordId);\n const compositeKey = new CompositeKey(fvCollection.KeyValuePairs);\n\n // Check the cache first\n try {\n const cachedName = await this.Provider.GetCachedRecordName(entityName, compositeKey, true);\n if (cachedName) {\n return cachedName;\n }\n } catch (error) {\n console.warn('Failed to look up cached record name:', error);\n }\n\n // Fall back generated default from the key values, then tabTitle if we have no default label(unlikely)\n return this.createDefaultLabel(entityName, compositeKey) || tabTitle;\n }\n\n /**\n * Generates a fallback label when no cached record name or tab title is available.\n * Format: \"EntityName: <truncated key value(s)>\"\n *\n * @example\n * // Single key: \"Contacts: abc1234...\"\n * // Multi key: \"Order Details: abc1..., 42\"\n * // No key: \"Contacts record\"\n */\n private createDefaultLabel(entityName: string, key: CompositeKey): string {\n if (!key || key.KeyValuePairs.length === 0) {\n return `${entityName} record`;\n }\n\n if (key.KeyValuePairs.length === 1) {\n return `${entityName}: ${this.trimValue(key.KeyValuePairs[0].Value)}`;\n }\n\n // Multiple keys - show each value trimmed, comma-separated\n const values = key.KeyValuePairs.map(kv => this.trimValue(kv.Value)).join(', ');\n return `${entityName}: ${values}`;\n }\n\n /**\n * Truncates a primary key value for display, appending \"...\" if it exceeds maxLength.\n * Returns the value as-is if it's short enough or empty.\n */\n private trimValue(value: string, maxLength: number = 8): string {\n if (!value || value.trim().length === 0) {\n return value;\n }\n\n const trimmed = value.trim();\n if (trimmed.length <= maxLength) {\n return trimmed;\n }\n\n return trimmed.substring(0, maxLength) + '...';\n }\n\n // ========================================\n // Storage Persistence\n // ========================================\n\n /**\n * Persists the current recentOrphanStack to localStorage via Provider.\n * Fire-and-forget — errors are logged but don't affect the UX.\n */\n private saveStackToStorage(): void {\n try {\n const provider = this.Provider.LocalStorageProvider;\n if (!provider) {\n return;\n }\n\n // Strip non-serializable fields (isActiveMatch closures are rebuilt on load)\n const serializable = this.recentOrphanStack.map(s => ({\n resourceRecordId: s.resourceRecordId,\n resourceType: s.resourceType,\n entityName: s.entityName,\n title: s.title,\n resolvedLabel: s.resolvedLabel,\n configuration: s.configuration,\n tabId: s.tabId,\n timestamp: s.timestamp\n }));\n\n // Native object storage — provider handles any required serialization internally.\n provider.SetItem<OrphanResourceSnapshot[]>(STORAGE_KEY, serializable, STORAGE_CATEGORY).catch(err => {\n console.warn('Failed to persist recent nav stack:', err);\n });\n } catch (err) {\n console.warn('Failed to persist recent nav stack:', err);\n }\n }\n\n /**\n * Loads the recent orphan stack from localStorage via Provider.\n * Filters out stale entries (older than MAX_SNAPSHOT_AGE_MS).\n */\n private async loadStackFromStorage(): Promise<void> {\n try {\n const provider = this.Provider.LocalStorageProvider;\n if (!provider) {\n return;\n }\n\n // Native object read — IDB returns the array directly; localStorage / Redis JSON-decode internally.\n const parsed = await provider.GetItem<OrphanResourceSnapshot[]>(STORAGE_KEY, STORAGE_CATEGORY);\n if (!parsed || !Array.isArray(parsed)) {\n return;\n }\n\n // Filter out stale snapshots\n const now = Date.now();\n this.recentOrphanStack = parsed\n .filter(s => s.resourceRecordId && s.timestamp && (now - s.timestamp) < MAX_SNAPSHOT_AGE_MS)\n .slice(0, HomeApplication.MAX_RECENT_ITEMS);\n } catch (err) {\n console.warn('Failed to load recent nav stack from storage:', err);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"home-application.js","sourceRoot":"","sources":["../../src/Home/home-application.ts"],"names":[],"mappings":"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","sourcesContent":["import { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { BaseApplication, DynamicNavItem, NavItem, WorkspaceStateManager, WorkspaceTab } from '@memberjunction/ng-base-application';\nimport { SharedService, IsRecordTabsStyle } from '@memberjunction/ng-shared';\nimport { Metadata, CompositeKey, FieldValueCollection } from '@memberjunction/core';\n\n/** Storage key and category for persisting the recent orphan stack */\nconst STORAGE_KEY = 'HomeApp_RecentOrphanStack';\nconst STORAGE_CATEGORY = 'HomeApplication';\n\n/**\n * Snapshot of an orphan resource tab for the recent navigation stack.\n * Persisted to localStorage (via Provider) so it survives page reloads.\n */\ninterface OrphanResourceSnapshot {\n /** URL-encoded composite key segment — primary dedup key */\n resourceRecordId: string;\n /** Resource type name (e.g., 'record', 'Dashboards') */\n resourceType: string;\n /** Entity name from tab configuration (for record name resolution) */\n entityName?: string;\n /** Tab title at time of capture (fallback label) */\n title: string;\n /** Resolved display label (cached record name). Persisted to avoid async lookups on reload. */\n resolvedLabel: string;\n /** Full tab configuration (passed to DynamicNavItem for re-opening) */\n configuration: Record<string, unknown>;\n /** Tab ID for fallback matching when no resourceRecordId */\n tabId: string;\n /** Timestamp (ms since epoch) when this snapshot was created or last promoted */\n timestamp: number;\n}\n\n/** Max age for persisted snapshots — 7 days */\nconst MAX_SNAPSHOT_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\n/**\n * Home Application - Provides dynamic navigation items for orphan resources.\n *\n * Maintains a recency-ordered stack of up to 3 recently visited orphan resources.\n * When the user opens a record/view/dashboard from within the Home app, the resource\n * appears as a dynamic nav item. When they navigate away (e.g., click Home), the\n * nav item persists so they can quickly jump back. Older items drop off as new ones\n * are added.\n *\n * The stack is persisted to localStorage (via Metadata.Provider.LocalStorageProvider)\n * so it survives page reloads. Resolved record labels are stored alongside each\n * snapshot to avoid async lookups when restoring from storage.\n *\n * @example\n * User opens \"John Smith\" contact, then \"Acme Corp\" company:\n * - Nav shows: [Home] [Favorites] | [person] \"Acme Corp\" [building] \"John Smith\"\n * - Clicking \"John Smith\" re-opens that record\n */\n@RegisterClass(BaseApplication, 'HomeApplication')\nexport class HomeApplication extends BaseApplication {\n private static readonly MAX_RECENT_ITEMS = 3;\n\n private workspaceManager: WorkspaceStateManager | null = null;\n private sharedService: SharedService | null = null;\n private recentOrphanStack: OrphanResourceSnapshot[] = [];\n private _storageLoadPromise: Promise<void> | null = null;\n\n /**\n * Fingerprint of the last-processed active tab state (tabId::resourceRecordId::title).\n * Guards against redundant stack mutations while still detecting content changes.\n * In single-resource mode the tab ID stays constant when navigating between records\n * (OpenTab replaces the temp tab's content but keeps its ID), so we must also\n * include the resourceRecordId to detect when the tab shows a different record.\n *\n * Title is also included so an in-place display-name change (e.g. user edits a\n * record's Name field and saves — tabId and resourceRecordId stay the same but the\n * title changes) triggers a re-evaluation. Without this, the dynamic nav item keeps\n * showing the pre-edit name forever.\n */\n private _lastSeenTabFingerprint: string | null = null;\n\n /**\n * Inject WorkspaceStateManager for accessing current tab state.\n * Also triggers loading the persisted stack from storage on first call.\n */\n public SetWorkspaceManager(manager: WorkspaceStateManager): void {\n this.workspaceManager = manager;\n if (!this._storageLoadPromise) {\n this._storageLoadPromise = this.loadStackFromStorage();\n }\n }\n\n /**\n * Inject SharedService for accessing ResourceTypes metadata\n */\n public SetSharedService(service: SharedService): void {\n this.sharedService = service;\n }\n\n /**\n * Returns navigation items including dynamic items for recently visited orphan resources.\n * Static items come from DefaultNavItems in metadata.\n * Dynamic items are generated from the recent orphan stack (up to 3).\n *\n * Records style (Shell.RecordOpen.Style = 'records', the default): dynamic\n * items are SKIPPED — the shell's Records pill + strip represent open\n * records globally, and Home's own stack would double-represent records\n * opened from Home. Classic style keeps this behavior as-is.\n */\n override async GetNavItems(): Promise<NavItem[]> {\n if (IsRecordTabsStyle()) {\n return super.GetNavItems();\n }\n\n // Ensure persisted stack is loaded before building nav items.\n // On first call after page load, this awaits the IndexedDB read;\n // on subsequent calls the promise is already resolved (no-op await).\n if (this._storageLoadPromise) {\n await this._storageLoadPromise;\n }\n\n const staticItems = await super.GetNavItems();\n\n // Update the recent stack based on current active tab\n // Must await — updateRecentStack is async (calls matchesStaticNavItem → super.GetNavItems())\n // and buildDynamicNavItems reads recentOrphanStack, so the stack must be fully updated first.\n await this.updateRecentStack();\n\n // Build dynamic nav items from the stack\n const dynamicItems = this.buildDynamicNavItems();\n if (dynamicItems.length > 0) {\n return [...staticItems, ...dynamicItems];\n }\n\n return staticItems;\n }\n\n /**\n * Removes a dynamic nav item from the recent stack by RecordID.\n * Called by AppNavComponent when the user clicks the dismiss X button.\n * If the dismissed item is currently active, navigates back to the app's default tab.\n */\n public RemoveDynamicNavItem(item: NavItem): void {\n const index = this.recentOrphanStack.findIndex(\n s => s.resourceRecordId === item.RecordID\n );\n if (index < 0) {\n return;\n }\n\n const wasActive = this.isDismissedItemActive(item);\n this.recentOrphanStack.splice(index, 1);\n this.saveStackToStorage();\n\n if (wasActive) {\n this.navigateToDefault();\n }\n }\n\n /**\n * Checks whether the dismissed nav item matches the currently active tab.\n */\n private isDismissedItemActive(item: NavItem): boolean {\n if (!this.workspaceManager) {\n return false;\n }\n const config = this.workspaceManager.GetConfiguration();\n if (!config?.activeTabId) {\n return false;\n }\n const activeTab = config.tabs.find(t => t.id === config.activeTabId);\n if (!activeTab) {\n return false;\n }\n return activeTab.resourceRecordId === item.RecordID;\n }\n\n /**\n * Navigates back to the app's default tab (first static nav item / Home dashboard).\n */\n private navigateToDefault(): void {\n if (!this.workspaceManager) {\n return;\n }\n this.CreateDefaultTab().then(tabRequest => {\n if (tabRequest && this.workspaceManager) {\n this.workspaceManager.OpenTab(tabRequest, this.GetColor());\n }\n });\n }\n\n // ========================================\n // Icon Resolution\n // ========================================\n\n /**\n * Resolves the best icon for a dynamic nav item.\n * Priority: entity-specific icon from metadata → resource type icon → generic fallback.\n */\n private resolveIcon(entityName: string | undefined, resourceTypeName: string): string {\n if (entityName) {\n const md = this.Provider;\n const entityIcon = md.EntityByName(entityName)?.Icon;\n if (entityIcon) {\n return entityIcon;\n }\n }\n\n if (this.sharedService) {\n const resourceType = this.sharedService.ResourceTypeByName(resourceTypeName);\n if (resourceType?.Icon) {\n return resourceType.Icon;\n }\n }\n\n return 'fa-solid fa-file';\n }\n\n // ========================================\n // Recent Stack Management\n // ========================================\n\n /**\n * Updates the recent orphan stack based on the currently active tab.\n * If the active tab is a new orphan resource (not already in the stack and not\n * matching any static nav item), it gets added to the front. Items already in the\n * stack keep their position to avoid visually jarring reordering when users click\n * between existing dynamic nav items.\n */\n private async updateRecentStack(): Promise<void> {\n if (!this.workspaceManager) {\n return;\n }\n\n const config = this.workspaceManager.GetConfiguration();\n if (!config?.activeTabId) {\n return;\n }\n\n const activeTab = config.tabs.find(t => t.id === config.activeTabId);\n if (!activeTab || !UUIDsEqual(activeTab.applicationId, this.ID)) {\n return;\n }\n\n // ALWAYS refresh the matching snapshot's label first — BEFORE the fingerprint\n // bail. A burst of configuration$ emissions (typical on save) causes multiple\n // concurrent updateCachedData calls; the first one proceeds past the fingerprint\n // check and gets stuck awaiting createSnapshotIfOrphan, while the rest bail at\n // fingerprint and race ahead with the *stale* snapshot. By the time the first\n // call's async work completes and updates the snapshot, the gen-check in\n // AppNav.updateCachedData has already discarded its results. The user is left\n // with the right data in memory but rendered against the wrong label.\n //\n // Refreshing here is cheap (cache hit after my save-handler's pre-warm) and\n // ensures every call — even fast bailers — produces fresh dynamic nav items.\n await this.refreshExistingSnapshotLabel(activeTab);\n\n // Build a fingerprint from tab ID + record content + title. In single-resource\n // mode, OpenTab replaces the temp tab's content but keeps the same tab ID, so we\n // need the resourceRecordId to detect when a different record is shown. Title is\n // included so an in-place rename (record's Name field edited and saved — tabId\n // and resourceRecordId stay the same but title changes) also triggers a refresh.\n const fingerprint = `${activeTab.id}::${activeTab.resourceRecordId ?? ''}::${activeTab.title ?? ''}`;\n if (fingerprint === this._lastSeenTabFingerprint) {\n return;\n }\n this._lastSeenTabFingerprint = fingerprint;\n\n // Check if active tab qualifies as an orphan resource\n const snapshot = await this.createSnapshotIfOrphan(activeTab);\n if (!snapshot) {\n // Active tab is a static resource (Home dashboard, etc.) — leave stack as-is\n return;\n }\n\n // If this item is already in the stack, leave the ORDER unchanged (reordering\n // on every click is visually jarring) — but DO refresh its `resolvedLabel` if the\n // underlying display name has changed. Without this, editing a record's Name\n // field would leave the dynamic nav item showing the pre-edit name forever.\n // Already-tracked snapshots are kept in their existing position (no jarring\n // reorder) and have their label kept fresh by refreshExistingSnapshotLabel\n // above — so here we only need to handle the NEW-snapshot case.\n const alreadyTracked = this.recentOrphanStack.some(\n s => s.resourceRecordId === snapshot.resourceRecordId\n );\n if (alreadyTracked) {\n return;\n }\n\n // New orphan — push to front (most recent first) and trim oldest if needed\n this.recentOrphanStack.unshift(snapshot);\n if (this.recentOrphanStack.length > HomeApplication.MAX_RECENT_ITEMS) {\n this.recentOrphanStack.length = HomeApplication.MAX_RECENT_ITEMS;\n }\n\n this.saveStackToStorage();\n }\n\n /**\n * Refreshes an already-tracked snapshot's `resolvedLabel` against the latest cached\n * record name. Called unconditionally at the top of `updateRecentStack` (BEFORE the\n * fingerprint bail), so even no-op-fingerprint calls don't render stale labels.\n *\n * Why this matters: when a record is saved, `configuration$` typically emits multiple\n * times in quick succession (UpdateTabTitle, UpdateConfiguration, etc.). AppNav's\n * subscription kicks off a `updateCachedData` for each. The first call wins the\n * fingerprint race and starts the slow async `createSnapshotIfOrphan` chain;\n * subsequent calls bail at fingerprint and race ahead with the still-unrefreshed\n * snapshot. AppNav's `_updateGeneration` then discards the slow call's results.\n * Without this method, the freshly-saved label lands in the snapshot — but never\n * makes it to the rendered nav until some unrelated event triggers another cycle.\n */\n private async refreshExistingSnapshotLabel(activeTab: WorkspaceTab): Promise<void> {\n if (!activeTab.resourceRecordId) {\n return;\n }\n const existing = this.recentOrphanStack.find(\n s => s.resourceRecordId === activeTab.resourceRecordId\n );\n if (!existing || !existing.entityName) {\n return;\n }\n const newLabel = await this.resolveRecordLabel(\n existing.entityName,\n activeTab.resourceRecordId,\n activeTab.title\n );\n if (newLabel && newLabel !== existing.resolvedLabel) {\n existing.resolvedLabel = newLabel;\n existing.title = activeTab.title;\n this.saveStackToStorage();\n }\n }\n\n /**\n * Creates an OrphanResourceSnapshot from a tab if it qualifies as an orphan resource.\n * Returns null if the tab is a static nav item, has no resource type, or is an\n * app-level custom dashboard (no record ID).\n */\n private async createSnapshotIfOrphan(tab: WorkspaceTab): Promise<OrphanResourceSnapshot | null> {\n const resourceType = tab.configuration?.['resourceType'] as string | undefined;\n if (!resourceType) {\n return null;\n }\n\n // Skip 'custom' resource type without a specific record (app-level dashboards)\n if (resourceType.toLowerCase() === 'custom' && !tab.resourceRecordId) {\n return null;\n }\n\n // Skip if it matches a static nav item\n if (await this.matchesStaticNavItem(tab)) {\n return null;\n }\n\n // Resolve the label now so it's stored with the snapshot\n const entityName = tab.configuration?.['Entity'] as string | undefined;\n const resolvedLabel = await this.resolveRecordLabel(entityName, tab.resourceRecordId, tab.title);\n\n return {\n resourceRecordId: tab.resourceRecordId,\n resourceType,\n entityName,\n title: tab.title,\n resolvedLabel,\n configuration: tab.configuration as Record<string, unknown>,\n tabId: tab.id,\n timestamp: Date.now()\n };\n }\n\n /**\n * Checks whether a tab matches any static nav item (by label, route, or driver class).\n */\n private async matchesStaticNavItem(tab: WorkspaceTab): Promise<boolean> {\n const staticItems = await super.GetNavItems();\n return staticItems.some(item => {\n if (item.Label === tab.title) {\n return true;\n }\n if (item.Route && tab.configuration?.['route'] === item.Route) {\n return true;\n }\n if (item.DriverClass && tab.configuration?.['driverClass'] === item.DriverClass) {\n return true;\n }\n return false;\n });\n }\n\n // ========================================\n // Dynamic NavItem Building\n // ========================================\n\n /**\n * Creates DynamicNavItem entries for each item in the recent orphan stack.\n * Uses the pre-resolved label from the snapshot (no async needed).\n */\n private buildDynamicNavItems(): DynamicNavItem[] {\n return this.recentOrphanStack.map(snapshot => this.createDynamicNavItem(snapshot));\n }\n\n /**\n * Creates a single DynamicNavItem from an OrphanResourceSnapshot.\n * Uses the snapshot's resolvedLabel directly — no async lookup needed.\n */\n private createDynamicNavItem(snapshot: OrphanResourceSnapshot): DynamicNavItem {\n return {\n Label: snapshot.resolvedLabel,\n Icon: this.resolveIcon(snapshot.entityName, snapshot.resourceType),\n ResourceType: snapshot.resourceType,\n RecordID: snapshot.resourceRecordId,\n Configuration: snapshot.configuration,\n isDynamic: true,\n isActiveMatch: (tab: unknown) => {\n const wsTab = tab as WorkspaceTab;\n if (snapshot.resourceRecordId) {\n return wsTab.resourceRecordId === snapshot.resourceRecordId;\n }\n return wsTab.id === snapshot.tabId;\n }\n };\n }\n\n // ========================================\n // Label Resolution\n // ========================================\n\n /**\n * Resolves the best available display label for an entity record nav item.\n * Priority order:\n * 1. Cached record name (from EntityRecordNameCache, populated by entity Load/Save)\n * 2. Tab title (whatever the workspace assigned when the tab was opened)\n * 3. Generated default (entity name + truncated primary key values)\n *\n * @param entityName - Entity name from tab configuration, may be undefined for non-entity resources\n * @param tabRecordId - URL-encoded composite key segment (e.g. \"ID|abc-123\" or \"Field1|val1||Field2|val2\")\n * @param tabTitle - Fallback title assigned by the workspace when the tab was opened\n */\n private async resolveRecordLabel(entityName: string | undefined, tabRecordId: string | undefined, tabTitle: string): Promise<string> {\n if (!entityName || !tabRecordId) {\n return tabTitle || '';\n }\n\n // Parse the URL segment into a CompositeKey\n const fvCollection = new FieldValueCollection();\n fvCollection.SimpleLoadFromURLSegment(tabRecordId);\n const compositeKey = new CompositeKey(fvCollection.KeyValuePairs);\n\n // Check the cache first\n try {\n const cachedName = await this.Provider.GetCachedRecordName(entityName, compositeKey, true);\n if (cachedName) {\n return cachedName;\n }\n } catch (error) {\n console.warn('Failed to look up cached record name:', error);\n }\n\n // Fall back generated default from the key values, then tabTitle if we have no default label(unlikely)\n return this.createDefaultLabel(entityName, compositeKey) || tabTitle;\n }\n\n /**\n * Generates a fallback label when no cached record name or tab title is available.\n * Format: \"EntityName: <truncated key value(s)>\"\n *\n * @example\n * // Single key: \"Contacts: abc1234...\"\n * // Multi key: \"Order Details: abc1..., 42\"\n * // No key: \"Contacts record\"\n */\n private createDefaultLabel(entityName: string, key: CompositeKey): string {\n if (!key || key.KeyValuePairs.length === 0) {\n return `${entityName} record`;\n }\n\n if (key.KeyValuePairs.length === 1) {\n return `${entityName}: ${this.trimValue(key.KeyValuePairs[0].Value)}`;\n }\n\n // Multiple keys - show each value trimmed, comma-separated\n const values = key.KeyValuePairs.map(kv => this.trimValue(kv.Value)).join(', ');\n return `${entityName}: ${values}`;\n }\n\n /**\n * Truncates a primary key value for display, appending \"...\" if it exceeds maxLength.\n * Returns the value as-is if it's short enough or empty.\n */\n private trimValue(value: string, maxLength: number = 8): string {\n if (!value || value.trim().length === 0) {\n return value;\n }\n\n const trimmed = value.trim();\n if (trimmed.length <= maxLength) {\n return trimmed;\n }\n\n return trimmed.substring(0, maxLength) + '...';\n }\n\n // ========================================\n // Storage Persistence\n // ========================================\n\n /**\n * Persists the current recentOrphanStack to localStorage via Provider.\n * Fire-and-forget — errors are logged but don't affect the UX.\n */\n private saveStackToStorage(): void {\n try {\n const provider = this.Provider.LocalStorageProvider;\n if (!provider) {\n return;\n }\n\n // Strip non-serializable fields (isActiveMatch closures are rebuilt on load)\n const serializable = this.recentOrphanStack.map(s => ({\n resourceRecordId: s.resourceRecordId,\n resourceType: s.resourceType,\n entityName: s.entityName,\n title: s.title,\n resolvedLabel: s.resolvedLabel,\n configuration: s.configuration,\n tabId: s.tabId,\n timestamp: s.timestamp\n }));\n\n // Native object storage — provider handles any required serialization internally.\n provider.SetItem<OrphanResourceSnapshot[]>(STORAGE_KEY, serializable, STORAGE_CATEGORY).catch(err => {\n console.warn('Failed to persist recent nav stack:', err);\n });\n } catch (err) {\n console.warn('Failed to persist recent nav stack:', err);\n }\n }\n\n /**\n * Loads the recent orphan stack from localStorage via Provider.\n * Filters out stale entries (older than MAX_SNAPSHOT_AGE_MS).\n */\n private async loadStackFromStorage(): Promise<void> {\n try {\n const provider = this.Provider.LocalStorageProvider;\n if (!provider) {\n return;\n }\n\n // Native object read — IDB returns the array directly; localStorage / Redis JSON-decode internally.\n const parsed = await provider.GetItem<OrphanResourceSnapshot[]>(STORAGE_KEY, STORAGE_CATEGORY);\n if (!parsed || !Array.isArray(parsed)) {\n return;\n }\n\n // Filter out stale snapshots\n const now = Date.now();\n this.recentOrphanStack = parsed\n .filter(s => s.resourceRecordId && s.timestamp && (now - s.timestamp) < MAX_SNAPSHOT_AGE_MS)\n .slice(0, HomeApplication.MAX_RECENT_ITEMS);\n } catch (err) {\n console.warn('Failed to load recent nav stack from storage:', err);\n }\n }\n}\n"]}
@@ -1,5 +1,4 @@
1
1
  import { OnInit, OnDestroy, ChangeDetectorRef, ElementRef, AfterViewInit, NgZone } from '@angular/core';
2
- import { ActivatedRoute } from '@angular/router';
3
2
  import { Subject } from 'rxjs';
4
3
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
5
4
  import { TelemetryInsight, TelemetryCategory, TelemetryParamsUnion } from '@memberjunction/core';
@@ -152,7 +151,6 @@ export interface SystemDiagnosticsUserPreferences {
152
151
  export declare class SystemDiagnosticsComponent extends BaseResourceComponent implements OnInit, OnDestroy, AfterViewInit {
153
152
  private cdr;
154
153
  private ngZone;
155
- private route;
156
154
  protected destroy$: Subject<void>;
157
155
  private metadata;
158
156
  private userSettingEntity;
@@ -212,7 +210,7 @@ export declare class SystemDiagnosticsComponent extends BaseResourceComponent im
212
210
  cacheHitRate: number;
213
211
  engineDetailPanel: EngineDetailPanelState;
214
212
  isRefreshingSingleEngine: string | null;
215
- constructor(cdr: ChangeDetectorRef, ngZone: NgZone, route: ActivatedRoute);
213
+ constructor(cdr: ChangeDetectorRef, ngZone: NgZone);
216
214
  ngOnInit(): Promise<void>;
217
215
  ngOnDestroy(): void;
218
216
  ngAfterViewInit(): void;
@@ -494,6 +492,12 @@ export declare class SystemDiagnosticsComponent extends BaseResourceComponent im
494
492
  * Open an entity in the explorer (placeholder - would need routing integration)
495
493
  */
496
494
  openEntityInExplorer(entityName: string): void;
495
+ /**
496
+ * Back/forward, deep link, or Home-pin restore. The framework calls this whenever the tab's
497
+ * query params change after initial load — the replacement for a `route.queryParams`
498
+ * subscription, which desyncs from the shell's cached-component lifecycle.
499
+ */
500
+ protected OnQueryParamsChanged(_params: Record<string, string>, _source: 'popstate' | 'deeplink'): void;
497
501
  /**
498
502
  * Apply query parameters to component state (deep linking support)
499
503
  * Query params take precedence over saved preferences
@@ -1 +1 @@
1
- {"version":3,"file":"system-diagnostics.component.d.ts","sourceRoot":"","sources":["../../src/SystemDiagnostics/system-diagnostics.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"system-diagnostics.component.d.ts","sourceRoot":"","sources":["../../src/SystemDiagnostics/system-diagnostics.component.ts"],"names":[],"mappings":"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"}