@memberjunction/ng-dashboards 5.4.1 → 5.5.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 (121) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.js +4 -4
  2. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  3. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  4. package/dist/AI/components/agents/agent-editor.component.js +5 -4
  5. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  6. package/dist/AI/components/models/model-management.component.js +3 -3
  7. package/dist/AI/components/models/model-management.component.js.map +1 -1
  8. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  9. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +8 -7
  10. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  11. package/dist/AI/components/prompts/prompt-management.component.js +3 -3
  12. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  13. package/dist/AI/components/system/system-configuration.component.js +4 -4
  14. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  15. package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
  16. package/dist/APIKeys/api-applications-panel.component.js +3 -2
  17. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  18. package/dist/APIKeys/api-keys-resource.component.js +2 -2
  19. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  20. package/dist/APIKeys/api-scopes-panel.component.d.ts.map +1 -1
  21. package/dist/APIKeys/api-scopes-panel.component.js +4 -3
  22. package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
  23. package/dist/Actions/components/actions-overview.component.js +3 -3
  24. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  25. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  26. package/dist/Actions/components/categories-list-view.component.js +3 -2
  27. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  28. package/dist/Actions/components/execution-monitoring.component.js +2 -2
  29. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  30. package/dist/Actions/components/explorer/action-explorer.component.js +2 -2
  31. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  32. package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -1
  33. package/dist/Actions/components/explorer/new-action-panel.component.js +3 -2
  34. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  35. package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -1
  36. package/dist/Actions/components/explorer/new-category-panel.component.js +3 -2
  37. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  38. package/dist/Communication/communication-templates-resource.component.js +2 -2
  39. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  40. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +6 -0
  41. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  42. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +19 -6
  43. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  44. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +4 -0
  45. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  46. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +13 -4
  47. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  48. package/dist/Credentials/components/credentials-categories-resource.component.d.ts +2 -0
  49. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  50. package/dist/Credentials/components/credentials-categories-resource.component.js +13 -9
  51. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  52. package/dist/Credentials/components/credentials-list-resource.component.js +11 -11
  53. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  54. package/dist/Credentials/components/credentials-overview-resource.component.js +3 -3
  55. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  56. package/dist/Credentials/components/credentials-types-resource.component.d.ts +2 -0
  57. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  58. package/dist/Credentials/components/credentials-types-resource.component.js +13 -9
  59. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  60. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +11 -11
  61. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  62. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
  63. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +4 -3
  64. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  65. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
  66. package/dist/DataExplorer/components/view-selector/view-selector.component.js +4 -3
  67. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
  68. package/dist/DataExplorer/data-explorer-dashboard.component.js +6 -6
  69. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  70. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  71. package/dist/DataExplorer/data-explorer-resource.component.js +4 -1
  72. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  73. package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
  74. package/dist/DataExplorer/services/explorer-state.service.js +9 -8
  75. package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
  76. package/dist/EntityAdmin/entity-admin-dashboard.component.js +2 -2
  77. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  78. package/dist/Home/home-application.js +2 -2
  79. package/dist/Home/home-application.js.map +1 -1
  80. package/dist/Lists/components/lists-browse-resource.component.js +3 -3
  81. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  82. package/dist/Lists/components/lists-categories-resource.component.d.ts +1 -0
  83. package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
  84. package/dist/Lists/components/lists-categories-resource.component.js +17 -14
  85. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  86. package/dist/Lists/components/lists-my-lists-resource.component.js +2 -2
  87. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  88. package/dist/Lists/components/lists-operations-resource.component.d.ts +1 -0
  89. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  90. package/dist/Lists/components/lists-operations-resource.component.js +15 -12
  91. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  92. package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -1
  93. package/dist/MCP/components/mcp-connection-dialog.component.js +3 -2
  94. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  95. package/dist/MCP/components/mcp-test-tool-dialog.component.d.ts.map +1 -1
  96. package/dist/MCP/components/mcp-test-tool-dialog.component.js +8 -7
  97. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
  98. package/dist/MCP/mcp-dashboard.component.js +22 -22
  99. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  100. package/dist/QueryBrowser/query-browser-resource.component.d.ts +2 -0
  101. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  102. package/dist/QueryBrowser/query-browser-resource.component.js +14 -10
  103. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  104. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  105. package/dist/Scheduling/services/scheduling-instrumentation.service.js +2 -1
  106. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  107. package/dist/Testing/components/testing-explorer.component.d.ts +1 -0
  108. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  109. package/dist/Testing/components/testing-explorer.component.js +22 -18
  110. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  111. package/dist/Testing/components/testing-review.component.d.ts +1 -0
  112. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  113. package/dist/Testing/components/testing-review.component.js +14 -10
  114. package/dist/Testing/components/testing-review.component.js.map +1 -1
  115. package/dist/VersionHistory/components/diff-resource.component.js +6 -6
  116. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  117. package/dist/VersionHistory/components/graph-resource.component.js +2 -2
  118. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  119. package/dist/VersionHistory/components/labels-resource.component.js +3 -3
  120. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  121. package/package.json +38 -38
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-browser-resource.component.js","sourceRoot":"","sources":["../../src/DashboardBrowser/dashboard-browser-resource.component.ts","../../src/DashboardBrowser/dashboard-browser-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ViewChild } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { RegisterClass } from '@memberjunction/global';\nimport { Metadata, CompositeKey } from '@memberjunction/core';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { ResourceData, MJDashboardEntity, MJDashboardCategoryEntity, MJDashboardPartTypeEntity, DashboardEngine, DashboardUserPermissions, MJDashboardCategoryLinkEntity } from '@memberjunction/core-entities';\nimport { ShareDialogResult } from './dashboard-share-dialog.component';\nimport {\n DashboardViewerComponent,\n DashboardNavRequestEvent,\n PanelInteractionEvent,\n AddPanelResult,\n createDefaultDashboardConfig,\n DashboardPanel,\n EditPartDialogResult,\n // Browser event types from generic component\n DashboardOpenEvent,\n DashboardEditEvent,\n DashboardDeleteEvent,\n DashboardMoveEvent,\n DashboardCreateEvent,\n CategoryCreateEvent,\n CategoryDeleteEvent,\n CategoryChangeEvent,\n ViewPreferenceChangeEvent,\n DashboardBrowserViewMode,\n BreadcrumbNavigateEvent\n} from '@memberjunction/ng-dashboard-viewer';\n/**\n * Mode for the dashboard browser\n */\ntype BrowserMode = 'list' | 'view' | 'edit';\n\n/**\n * Resource component for browsing, creating, and editing dashboards.\n * Uses the generic DashboardBrowserComponent for list mode and handles\n * view/edit mode internally with routing integration.\n */\n@RegisterClass(BaseResourceComponent, 'DashboardBrowserResource')\n@Component({\n standalone: false,\n selector: 'mj-dashboard-browser-resource',\n templateUrl: './dashboard-browser-resource.component.html',\n styleUrls: ['./dashboard-browser-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DashboardBrowserResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n // ========================================\n // State\n // ========================================\n\n public mode: BrowserMode = 'list';\n public isLoading = false;\n public dashboards: MJDashboardEntity[] = [];\n public categories: MJDashboardCategoryEntity[] = [];\n public selectedDashboard: MJDashboardEntity | null = null;\n public selectedCategoryId: string | null = null;\n public viewMode: DashboardBrowserViewMode = 'cards';\n public showAddPanelDialog = false;\n\n // Config dialog state\n public showConfigDialog = false;\n public configDialogPanel: DashboardPanel | null = null;\n public configDialogPartType: MJDashboardPartTypeEntity | null = null;\n public configDialogClass: string = '';\n\n // Confirm dialog state\n public showConfirmDialog = false;\n public confirmPanelId: string = '';\n public confirmPanelTitle: string = '';\n\n // Share dialog state\n public showShareDialog = false;\n\n // Edit mode state for name/description\n public editingName = '';\n public editingDescription = '';\n private originalName = '';\n private originalDescription = '';\n private originalConfig = '';\n\n // Permission state for selected dashboard\n public selectedDashboardPermissions: DashboardUserPermissions = {\n DashboardID: '',\n CanRead: true,\n CanEdit: true,\n CanDelete: true,\n CanShare: true,\n IsOwner: true,\n PermissionSource: 'owner'\n };\n\n // Permission map for all dashboards (used by browser component)\n public dashboardPermissionsMap: Map<string, DashboardUserPermissions> = new Map();\n\n // Effective category map for shared dashboards (maps dashboard ID to effective category for display)\n public effectiveCategoryMap: Map<string, string | null> = new Map();\n\n private readonly _destroy$ = new Subject<void>();\n\n @ViewChild('dashboardViewer') dashboardViewer!: DashboardViewerComponent;\n\n // ========================================\n // Constructor\n // ========================================\n\n constructor(\n private cdr: ChangeDetectorRef,\n private route: ActivatedRoute,\n private navigationService: NavigationService\n ) {\n super();\n }\n\n // ========================================\n // Lifecycle\n // ========================================\n\n ngOnInit(): void {\n this.loadDashboards();\n this.subscribeToQueryParams();\n this.loadViewPreference();\n }\n\n ngOnDestroy(): void {\n this._destroy$.next();\n this._destroy$.complete();\n }\n\n // ========================================\n // BaseResourceComponent Implementation\n // ========================================\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Dashboards';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-gauge-high';\n }\n\n // ========================================\n // Event Handlers from Generic Browser\n // ========================================\n\n /**\n * Handle dashboard open request from generic browser\n */\n public onDashboardOpen(event: DashboardOpenEvent): void {\n if (event.OpenInNewTab) {\n // Open in a dedicated Explorer tab via NavigationService\n this.navigationService.OpenDashboard(\n event.Dashboard.ID,\n event.Dashboard.Name,\n { forceNewTab: true }\n );\n } else {\n // Open inline in the browser's view pane\n this.openDashboard(event.Dashboard);\n }\n }\n\n /**\n * Open the current dashboard in its own dedicated Explorer tab\n */\n public openInNewTab(): void {\n if (this.selectedDashboard) {\n this.navigationService.OpenDashboard(\n this.selectedDashboard.ID,\n this.selectedDashboard.Name,\n { forceNewTab: true }\n );\n }\n }\n\n /**\n * Handle dashboard edit request from generic browser\n */\n public onDashboardEdit(event: DashboardEditEvent): void {\n this.editDashboard(event.Dashboard);\n }\n\n /**\n * Handle dashboard delete request from generic browser\n */\n public async onDashboardDelete(event: DashboardDeleteEvent): Promise<void> {\n // The generic browser handles the confirmation dialog\n // We just need to perform the actual deletion\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n for (const dashboard of event.Dashboards) {\n const deleted = await dashboard.Delete();\n if (deleted) {\n const index = this.dashboards.findIndex(d => d.ID === dashboard.ID);\n if (index >= 0) {\n this.dashboards.splice(index, 1);\n }\n }\n }\n\n // Create new array reference to trigger change detection\n this.dashboards = [...this.dashboards];\n } catch (err) {\n console.error('Failed to delete dashboards:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle dashboard move request from generic browser.\n * For owned dashboards: updates the dashboard's CategoryID directly.\n * For shared dashboards: creates/updates a DashboardCategoryLink to organize without modifying the original.\n */\n public async onDashboardMove(event: DashboardMoveEvent): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n const currentUserId = md.CurrentUser.ID;\n\n for (const dashboard of event.Dashboards) {\n const permissions = DashboardEngine.Instance.GetDashboardPermissions(dashboard.ID, currentUserId);\n\n if (permissions.IsOwner) {\n // Owner can modify the dashboard directly\n dashboard.CategoryID = event.TargetCategoryId;\n await dashboard.Save();\n } else {\n // Non-owner: create or update a category link instead\n await this.createOrUpdateCategoryLink(dashboard.ID, currentUserId, event.TargetCategoryId);\n\n // Update the effective category map immediately for UI refresh\n this.effectiveCategoryMap.set(dashboard.ID, event.TargetCategoryId);\n }\n }\n\n // Create new map reference to trigger change detection\n this.effectiveCategoryMap = new Map(this.effectiveCategoryMap);\n\n // Refresh the list\n this.dashboards = [...this.dashboards];\n\n // Navigate to the target category to follow the moved items\n this.selectedCategoryId = event.TargetCategoryId;\n this.updateUrlQueryParams();\n } catch (err) {\n console.error('Failed to move dashboards:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Creates or updates a DashboardCategoryLink for organizing a shared dashboard.\n * Ensures only one link exists per user/dashboard combination.\n * @param dashboardId - The ID of the shared dashboard\n * @param userId - The current user's ID\n * @param categoryId - The target category ID (null for root/uncategorized)\n */\n private async createOrUpdateCategoryLink(\n dashboardId: string,\n userId: string,\n categoryId: string | null\n ): Promise<void> {\n const md = new Metadata();\n\n // Check if a link already exists for this user/dashboard\n const existingLinks = DashboardEngine.Instance.DashboardCategoryLinks.filter(\n link => link.DashboardID === dashboardId && link.UserID === userId\n );\n\n let link: MJDashboardCategoryLinkEntity;\n\n if (existingLinks.length > 0) {\n // Update existing link\n link = existingLinks[0];\n link.DashboardCategoryID = categoryId;\n } else {\n // Create new link\n link = await md.GetEntityObject<MJDashboardCategoryLinkEntity>('MJ: Dashboard Category Links');\n link.DashboardID = dashboardId;\n link.UserID = userId;\n link.DashboardCategoryID = categoryId;\n }\n\n const saved = await link.Save();\n if (!saved) {\n console.error('Failed to save dashboard category link:', link.LatestResult);\n }\n }\n\n /**\n * Handle create dashboard request from generic browser\n */\n public async onDashboardCreate(event: DashboardCreateEvent): Promise<void> {\n await this.createDashboard(event.CategoryId);\n }\n\n /**\n * Handle category change from generic browser - update URL\n */\n public onCategoryChange(event: CategoryChangeEvent): void {\n this.selectedCategoryId = event.CategoryId;\n this.updateUrlQueryParams();\n }\n\n /**\n * Handle view preference change from generic browser - persist\n */\n public onViewPreferenceChange(event: ViewPreferenceChangeEvent): void {\n this.viewMode = event.ViewMode;\n this.saveViewPreference(event.ViewMode);\n }\n\n /**\n * Handle category create request from generic browser\n * Includes extensive logging for debugging category creation issues\n */\n public async onCategoryCreate(event: CategoryCreateEvent): Promise<void> {\n console.log('[DashboardBrowserResource] Category create requested:', {\n name: event.Name,\n parentCategoryId: event.ParentCategoryId\n });\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n console.log('[DashboardBrowserResource] Current user:', {\n userId: md.CurrentUser?.ID,\n userName: md.CurrentUser?.Name,\n email: md.CurrentUser?.Email\n });\n\n const category = await md.GetEntityObject<MJDashboardCategoryEntity>('MJ: Dashboard Categories');\n console.log('[DashboardBrowserResource] Created category entity object');\n\n // Set required fields\n category.Name = event.Name;\n category.UserID = md.CurrentUser.ID;\n\n if (event.ParentCategoryId) {\n category.ParentID = event.ParentCategoryId;\n }\n\n console.log('[DashboardBrowserResource] Category fields before save:', {\n name: category.Name,\n userId: category.UserID,\n parentId: category.ParentID,\n allFields: category.Fields.map(f => ({ name: f.Name, value: f.Value, dirty: f.Dirty }))\n });\n\n const saved = await category.Save();\n\n console.log('[DashboardBrowserResource] Save result:', {\n success: saved,\n latestResult: category.LatestResult,\n message: category.LatestResult?.Message,\n success2: category.LatestResult?.Success,\n id: category.ID\n });\n\n if (saved) {\n console.log('[DashboardBrowserResource] Category saved successfully, ID:', category.ID);\n // Add to local array - engine will self-update\n this.categories.push(category);\n this.categories = [...this.categories].sort((a, b) => a.Name.localeCompare(b.Name));\n } else {\n const errorMessage = category.LatestResult?.Message || 'Unknown error saving category';\n console.error('[DashboardBrowserResource] Failed to save category:', errorMessage);\n console.error('[DashboardBrowserResource] Full LatestResult:', JSON.stringify(category.LatestResult, null, 2));\n\n // Show toast or alert for user\n alert(`Failed to create category: ${errorMessage}`);\n }\n } catch (err) {\n console.error('[DashboardBrowserResource] Exception creating category:', err);\n alert(`Error creating category: ${err instanceof Error ? err.message : String(err)}`);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle category delete request from generic browser\n * Performs recursive deletion of category and all children\n */\n public async onCategoryDelete(event: CategoryDeleteEvent): Promise<void> {\n console.log('[DashboardBrowserResource] Category delete requested:', event.Category.Name);\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Get all child categories recursively\n const categoriesToDelete = this.getChildCategoriesRecursive(event.Category.ID);\n categoriesToDelete.push(event.Category);\n\n console.log('[DashboardBrowserResource] Deleting categories:', categoriesToDelete.map(c => c.Name));\n\n // Delete in reverse order (children first)\n for (const cat of categoriesToDelete.reverse()) {\n // First, move any dashboards in this category to uncategorized\n const dashboardsInCategory = this.dashboards.filter(d => d.CategoryID === cat.ID);\n for (const dashboard of dashboardsInCategory) {\n dashboard.CategoryID = null!;\n await dashboard.Save();\n }\n\n // Then delete the category\n const deleted = await cat.Delete();\n if (deleted) {\n const index = this.categories.findIndex(c => c.ID === cat.ID);\n if (index >= 0) {\n this.categories.splice(index, 1);\n }\n } else {\n console.error('[DashboardBrowserResource] Failed to delete category:', cat.Name, cat.LatestResult);\n }\n }\n\n // Refresh arrays\n this.categories = [...this.categories];\n this.dashboards = [...this.dashboards];\n } catch (err) {\n console.error('[DashboardBrowserResource] Exception deleting category:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle breadcrumb navigation event\n * Navigates back to list view with optional category selection\n */\n public onBreadcrumbNavigate(event: BreadcrumbNavigateEvent): void {\n console.log('[DashboardBrowserResource] Breadcrumb navigate:', event);\n\n // CategoryId is null for root, or a category ID string\n this.selectedCategoryId = event.CategoryId;\n this.backToList();\n this.updateUrlQueryParams();\n }\n\n // ========================================\n // Public Methods - Navigation\n // ========================================\n\n /**\n * Open a dashboard for viewing\n */\n public openDashboard(dashboard: MJDashboardEntity): void {\n this.selectedDashboard = dashboard;\n this.mode = 'view';\n\n // Compute permissions for the selected dashboard\n const md = new Metadata();\n this.selectedDashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n dashboard.ID,\n md.CurrentUser.ID\n );\n\n this.updateUrlQueryParams();\n this.cdr.detectChanges();\n }\n\n /**\n * Open a dashboard for editing\n */\n public editDashboard(dashboard: MJDashboardEntity): void {\n // Check if user has edit permission\n const md = new Metadata();\n const permissions = DashboardEngine.Instance.GetDashboardPermissions(\n dashboard.ID,\n md.CurrentUser.ID\n );\n\n if (!permissions.CanEdit) {\n console.warn('User does not have permission to edit this dashboard');\n return;\n }\n\n this.selectedDashboard = dashboard;\n this.selectedDashboardPermissions = permissions;\n this.mode = 'edit';\n\n // Initialize editing fields\n this.editingName = dashboard.Name;\n this.editingDescription = dashboard.Description || '';\n\n // Store originals for cancel\n this.originalName = dashboard.Name;\n this.originalDescription = dashboard.Description || '';\n this.originalConfig = dashboard.UIConfigDetails || '';\n\n this.cdr.detectChanges();\n }\n\n /**\n * Go back to list view\n */\n public backToList(): void {\n this.selectedDashboard = null;\n this.mode = 'list';\n this.updateUrlQueryParams();\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle edit mode for current dashboard\n */\n public toggleEditMode(): void {\n if (this.mode === 'view' && this.selectedDashboard) {\n this.editDashboard(this.selectedDashboard);\n } else if (this.mode === 'edit') {\n this.mode = 'view';\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Open the share dialog for the current dashboard\n */\n public openShareDialog(): void {\n if (!this.selectedDashboard) return;\n\n // Verify user has share permission\n if (!this.selectedDashboardPermissions.CanShare) {\n console.warn('User does not have permission to share this dashboard');\n return;\n }\n\n this.showShareDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Close the share dialog\n */\n public closeShareDialog(): void {\n this.showShareDialog = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle share dialog result\n */\n public onShareDialogResult(result: ShareDialogResult): void {\n this.showShareDialog = false;\n\n if (result.Action === 'save' && this.selectedDashboard) {\n // Recompute permissions after sharing changes\n const md = new Metadata();\n this.selectedDashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n this.selectedDashboard.ID,\n md.CurrentUser.ID\n );\n }\n\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Public Methods - Dashboard CRUD\n // ========================================\n\n /**\n * Create a new dashboard\n */\n public async createDashboard(categoryId?: string | null): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n const dashboard = await md.GetEntityObject<MJDashboardEntity>('MJ: Dashboards');\n\n dashboard.Name = 'New Dashboard';\n dashboard.Description = '';\n dashboard.UserID = md.CurrentUser.ID;\n dashboard.UIConfigDetails = JSON.stringify(createDefaultDashboardConfig());\n\n if (categoryId) {\n dashboard.CategoryID = categoryId;\n } else if (this.selectedCategoryId) {\n dashboard.CategoryID = this.selectedCategoryId;\n }\n\n const saved = await dashboard.Save();\n\n if (saved) {\n this.dashboards.unshift(dashboard);\n this.dashboards = [...this.dashboards];\n this.editDashboard(dashboard);\n } else {\n console.error('Failed to save dashboard:', dashboard.LatestResult);\n }\n } catch (err) {\n console.error('Failed to create dashboard:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Save the current dashboard\n */\n public async saveDashboard(): Promise<void> {\n if (!this.selectedDashboard) return;\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n this.selectedDashboard.Name = this.editingName;\n this.selectedDashboard.Description = this.editingDescription;\n\n if (this.dashboardViewer) {\n await this.dashboardViewer.save();\n }\n\n this.originalName = this.editingName;\n this.originalDescription = this.editingDescription;\n this.originalConfig = this.selectedDashboard.UIConfigDetails || '';\n\n // Update the dashboard in the list\n this.dashboards = [...this.dashboards];\n\n this.mode = 'view';\n } catch (err) {\n console.error('Failed to save dashboard:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Cancel editing and revert changes\n */\n public cancelEdit(): void {\n if (!this.selectedDashboard) {\n this.backToList();\n return;\n }\n\n this.selectedDashboard.Name = this.originalName;\n this.selectedDashboard.Description = this.originalDescription;\n this.selectedDashboard.UIConfigDetails = this.originalConfig;\n\n this.editingName = '';\n this.editingDescription = '';\n\n this.mode = 'view';\n this.cdr.detectChanges();\n }\n\n /**\n * Handle name input blur - validate name is not empty\n */\n public onNameBlur(): void {\n if (!this.editingName.trim()) {\n this.editingName = this.originalName || 'Untitled Dashboard';\n }\n }\n\n // ========================================\n // Public Methods - Part Management\n // ========================================\n\n /**\n * Open the Add Part dialog\n */\n public openAddPartDialog(): void {\n this.showAddPanelDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle panel interaction events from the viewer\n */\n public onPanelInteraction(event: PanelInteractionEvent): void {\n if (event.interactionType !== 'custom') return;\n\n const action = event.payload?.['action'];\n\n switch (action) {\n case 'add-panel-requested':\n this.openAddPartDialog();\n break;\n\n case 'configure-part-requested':\n this.openConfigDialog(event.panelId);\n break;\n\n case 'remove-part-requested':\n this.openRemoveConfirmDialog(\n event.panelId,\n event.payload?.['panelTitle'] as string || 'this part'\n );\n break;\n }\n }\n\n /**\n * Handle navigation events from panels\n */\n public onNavigationRequested(event: DashboardNavRequestEvent): void {\n const request = event.request;\n const openInNewTab = request.openInNewTab || false;\n\n switch (request.type) {\n case 'OpenEntityRecord': {\n // Navigate to entity record\n const compositeKey = new CompositeKey();\n compositeKey.SimpleLoadFromURLSegment(request.recordId);\n // If simple load didn't work (single ID without field name), create from ID field\n if (compositeKey.KeyValuePairs.length === 0) {\n compositeKey.LoadFromSingleKeyValuePair('ID', request.recordId);\n }\n this.navigationService.OpenEntityRecord(\n request.entityName,\n compositeKey,\n { forceNewTab: openInNewTab }\n );\n break;\n }\n case 'OpenDashboard': {\n // Navigate to another dashboard\n const targetDashboard = this.dashboards.find(d => d.ID === request.dashboardId);\n if (targetDashboard) {\n if (openInNewTab) {\n this.navigationService.OpenDashboard(\n targetDashboard.ID,\n targetDashboard.Name,\n { forceNewTab: true }\n );\n } else {\n this.openDashboard(targetDashboard);\n }\n }\n break;\n }\n case 'OpenQuery': {\n // Navigate to query viewer\n const md = new Metadata();\n const queryInfo = md.Queries.find(q => q.ID === request.queryId);\n if (queryInfo) {\n this.navigationService.OpenQuery(\n request.queryId,\n queryInfo.Name,\n { forceNewTab: openInNewTab }\n );\n }\n break;\n }\n case 'OpenNavItem': {\n // Navigate to a specific nav item within an application\n const appId = request.appName ? this.resolveAppId(request.appName) : undefined;\n this.navigationService.OpenNavItemByName(request.navItemName, undefined, appId, {\n queryParams: request.queryParams\n });\n break;\n }\n }\n }\n\n /**\n * Resolve an application name to its ID\n */\n private resolveAppId(appName: string): string | undefined {\n const md = new Metadata();\n const app = md.Applications.find(a => a.Name.toLowerCase() === appName.toLowerCase());\n return app?.ID;\n }\n\n /**\n * Handle add panel dialog result\n */\n public onPanelAdded(result: AddPanelResult): void {\n if (this.dashboardViewer) {\n this.dashboardViewer.addPanel(\n result.PartType.ID,\n result.Config,\n result.Title,\n result.Icon\n );\n }\n this.showAddPanelDialog = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle add panel dialog cancel\n */\n public onAddPanelCancelled(): void {\n this.showAddPanelDialog = false;\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Public Methods - Config Dialog\n // ========================================\n\n /**\n * Open the config dialog for a panel\n */\n public openConfigDialog(panelId: string): void {\n if (!this.dashboardViewer) return;\n\n const panel = this.dashboardViewer.getPanel(panelId);\n const partType = this.dashboardViewer.getPartTypeForPanel(panelId);\n\n if (!panel || !partType) {\n console.warn('Could not find panel or part type for config dialog');\n return;\n }\n\n this.configDialogPanel = panel;\n this.configDialogPartType = partType;\n this.configDialogClass = partType.ConfigDialogClass || '';\n this.showConfigDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle config dialog save\n */\n public onConfigDialogSaved(result: EditPartDialogResult): void {\n if (this.dashboardViewer && this.configDialogPanel) {\n this.dashboardViewer.updatePanelConfig(\n this.configDialogPanel.id,\n result.Config,\n result.Title,\n result.Icon\n );\n }\n this.closeConfigDialog();\n }\n\n /**\n * Handle config dialog cancel\n */\n public onConfigDialogCancelled(): void {\n this.closeConfigDialog();\n }\n\n /**\n * Close the config dialog\n */\n private closeConfigDialog(): void {\n this.showConfigDialog = false;\n this.configDialogPanel = null;\n this.configDialogPartType = null;\n this.configDialogClass = '';\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Public Methods - Remove Confirm Dialog\n // ========================================\n\n /**\n * Open the remove confirmation dialog\n */\n public openRemoveConfirmDialog(panelId: string, panelTitle: string): void {\n this.confirmPanelId = panelId;\n this.confirmPanelTitle = panelTitle;\n this.showConfirmDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle remove confirmation\n */\n public onRemoveConfirmed(): void {\n if (this.dashboardViewer && this.confirmPanelId) {\n this.dashboardViewer.confirmRemovePanel(this.confirmPanelId);\n }\n this.closeRemoveConfirmDialog();\n }\n\n /**\n * Handle remove cancel\n */\n public onRemoveCancelled(): void {\n this.closeRemoveConfirmDialog();\n }\n\n /**\n * Close the remove confirm dialog\n */\n private closeRemoveConfirmDialog(): void {\n this.showConfirmDialog = false;\n this.confirmPanelId = '';\n this.confirmPanelTitle = '';\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Private Methods - Data Loading\n // ========================================\n\n private async loadDashboards(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Use DashboardEngine for consistent cached data\n const engine = DashboardEngine.Instance;\n await engine.Config(false); // Wait for engine to load data\n\n const md = new Metadata();\n const currentUserId = md.CurrentUser.ID;\n\n // Get data from engine - sort dashboards by updated date, categories by name\n // Filter dashboards to only those accessible to the current user\n this.dashboards = [...engine.GetAccessibleDashboards(currentUserId)].sort((a, b) =>\n new Date(b.__mj_UpdatedAt).getTime() - new Date(a.__mj_UpdatedAt).getTime()\n );\n // Filter categories to only those owned by or shared with the current user\n this.categories = [...engine.GetAccessibleCategories(currentUserId)].sort((a, b) =>\n a.Name.localeCompare(b.Name)\n );\n\n // Build permissions map and effective category map for all dashboards\n this.dashboardPermissionsMap = new Map();\n this.effectiveCategoryMap = new Map();\n\n // Get category links for current user (from engine's cached data)\n const userCategoryLinks = engine.DashboardCategoryLinks.filter(\n link => link.UserID === currentUserId\n );\n\n for (const dashboard of this.dashboards) {\n const perms = engine.GetDashboardPermissions(dashboard.ID, currentUserId);\n this.dashboardPermissionsMap.set(dashboard.ID, perms);\n\n // For shared dashboards (not owned), determine effective category\n if (!perms.IsOwner) {\n // Look for a category link for this dashboard\n const categoryLink = userCategoryLinks.find(\n link => link.DashboardID === dashboard.ID\n );\n\n if (categoryLink) {\n // User has explicitly organized this shared dashboard\n this.effectiveCategoryMap.set(dashboard.ID, categoryLink.DashboardCategoryID);\n } else {\n // No link exists - show in root (null category)\n this.effectiveCategoryMap.set(dashboard.ID, null);\n }\n }\n // For owned dashboards, we don't add to effectiveCategoryMap\n // so the browser will use the dashboard's actual CategoryID\n }\n\n console.log('[DashboardBrowserResource] Loaded from DashboardEngine:', {\n dashboardCount: this.dashboards.length,\n categoryCount: this.categories.length,\n sharedDashboardsInEffectiveMap: this.effectiveCategoryMap.size,\n categories: this.categories.map(c => ({ id: c.ID, name: c.Name, parentId: c.ParentID }))\n });\n\n this.NotifyLoadComplete();\n } catch (err) {\n console.error('Failed to load dashboards:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ========================================\n // Private Methods - URL Query Params\n // ========================================\n\n private subscribeToQueryParams(): void {\n this.route.queryParams\n .pipe(takeUntil(this._destroy$))\n .subscribe(params => {\n const categoryId = params['category'] || null;\n const dashboardId = params['dashboard'] || null;\n\n // Handle category change\n if (categoryId !== this.selectedCategoryId) {\n this.selectedCategoryId = categoryId;\n }\n\n // Handle dashboard change (for browser back/forward)\n const currentDashboardId = this.selectedDashboard?.ID || null;\n if (dashboardId !== currentDashboardId) {\n if (dashboardId) {\n // Find and open the dashboard\n const dashboard = this.dashboards.find(d => d.ID === dashboardId);\n if (dashboard) {\n this.selectedDashboard = dashboard;\n this.mode = 'view';\n }\n } else {\n // Go back to list\n this.selectedDashboard = null;\n this.mode = 'list';\n }\n }\n\n this.cdr.detectChanges();\n });\n }\n\n /**\n * Update the URL query params for the current tab.\n * Uses NavigationService to update the tab configuration, which triggers\n * the shell's URL sync mechanism to update the browser URL properly\n * while respecting app-scoped routes.\n */\n private updateUrlQueryParams(): void {\n const queryParams: Record<string, string | null> = {};\n\n // Track category\n if (this.selectedCategoryId) {\n queryParams['category'] = this.selectedCategoryId;\n } else {\n queryParams['category'] = null;\n }\n\n // Track dashboard (for browser back/forward support)\n if (this.selectedDashboard) {\n queryParams['dashboard'] = this.selectedDashboard.ID;\n } else {\n queryParams['dashboard'] = null;\n }\n\n // Use NavigationService to update query params properly\n // This ensures the URL update respects app-scoped routes\n this.navigationService.UpdateActiveTabQueryParams(queryParams);\n }\n\n // ========================================\n // Private Methods - Category Helpers\n // ========================================\n\n /**\n * Get all child categories of a parent category recursively\n */\n private getChildCategoriesRecursive(parentId: string): MJDashboardCategoryEntity[] {\n const children: MJDashboardCategoryEntity[] = [];\n const directChildren = this.categories.filter(c => c.ParentID === parentId);\n\n for (const child of directChildren) {\n children.push(child);\n children.push(...this.getChildCategoriesRecursive(child.ID));\n }\n\n return children;\n }\n\n // ========================================\n // Private Methods - View Preference\n // ========================================\n\n private loadViewPreference(): void {\n // TODO: Load from User Settings entity\n const stored = localStorage.getItem('dashboard-browser-view-mode');\n if (stored === 'cards' || stored === 'list') {\n this.viewMode = stored;\n }\n }\n\n private saveViewPreference(mode: DashboardBrowserViewMode): void {\n // TODO: Save to User Settings entity\n localStorage.setItem('dashboard-browser-view-mode', mode);\n }\n}\n","<!-- Dashboard Browser Resource -->\n<div class=\"dashboard-browser-resource\">\n <!-- List Mode - Uses Generic DashboardBrowserComponent -->\n @if (mode === 'list') {\n <mj-dashboard-browser\n [Dashboards]=\"dashboards\"\n [Categories]=\"categories\"\n [SelectedCategoryId]=\"selectedCategoryId\"\n [ViewMode]=\"viewMode\"\n [IsLoading]=\"isLoading\"\n [ShowCreateButton]=\"true\"\n [AllowMultiSelect]=\"true\"\n [AllowDragDrop]=\"true\"\n [DashboardPermissions]=\"dashboardPermissionsMap\"\n [EffectiveCategoryMap]=\"effectiveCategoryMap\"\n (DashboardOpen)=\"onDashboardOpen($event)\"\n (DashboardEdit)=\"onDashboardEdit($event)\"\n (DashboardDelete)=\"onDashboardDelete($event)\"\n (DashboardMove)=\"onDashboardMove($event)\"\n (DashboardCreate)=\"onDashboardCreate($event)\"\n (CategoryCreate)=\"onCategoryCreate($event)\"\n (CategoryDelete)=\"onCategoryDelete($event)\"\n (CategoryChange)=\"onCategoryChange($event)\"\n (ViewPreferenceChange)=\"onViewPreferenceChange($event)\">\n </mj-dashboard-browser>\n }\n\n <!-- View/Edit Mode -->\n @if (mode === 'view' || mode === 'edit') {\n <!-- View Mode Toolbar - matches browser toolbar structure -->\n @if (mode === 'view') {\n <div class=\"viewer-toolbar\">\n <!-- Breadcrumb navigation (includes its own padding/styling) -->\n <mj-dashboard-breadcrumb\n [Categories]=\"categories\"\n [CurrentCategoryId]=\"selectedDashboard?.CategoryID || null\"\n [CurrentDashboard]=\"selectedDashboard\"\n [ShowDashboardName]=\"true\"\n [AllowDragDrop]=\"false\"\n Size=\"large\"\n RootIcon=\"fa-solid fa-gauge-high\"\n RootLabel=\"Dashboards\"\n (Navigate)=\"onBreadcrumbNavigate($event)\">\n </mj-dashboard-breadcrumb>\n <!-- Right-side Actions -->\n <div class=\"toolbar-actions\">\n <!-- Shared indicator for non-owned dashboards -->\n @if (!selectedDashboardPermissions.IsOwner && selectedDashboardPermissions.CanRead) {\n <span class=\"shared-indicator\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n Shared with you\n </span>\n }\n <button\n class=\"btn-icon\"\n title=\"Open in its own tab\"\n (click)=\"openInNewTab()\">\n <i class=\"fa-solid fa-up-right-from-square\"></i>\n </button>\n <!-- Share button - only shown if user can share -->\n @if (selectedDashboardPermissions.CanShare) {\n <button\n class=\"btn-icon\"\n title=\"Share Dashboard\"\n (click)=\"openShareDialog()\">\n <i class=\"fa-solid fa-user-plus\"></i>\n </button>\n }\n <!-- Edit button - only shown if user can edit -->\n @if (selectedDashboardPermissions.CanEdit) {\n <button\n class=\"btn-icon\"\n title=\"Edit Dashboard\"\n (click)=\"toggleEditMode()\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n }\n </div>\n </div>\n }\n <!-- Edit Mode Header - different layout -->\n @if (mode === 'edit') {\n <div class=\"viewer-header editing\">\n <div class=\"header-left\">\n <!-- Add Part button on the left -->\n <button\n class=\"btn-add-part\"\n (click)=\"openAddPartDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Part\n </button>\n <!-- Separator -->\n <div class=\"header-separator\"></div>\n <!-- Editable name/description -->\n <div class=\"dashboard-info-edit\">\n <input\n type=\"text\"\n class=\"dashboard-name-input\"\n [(ngModel)]=\"editingName\"\n placeholder=\"Dashboard name\"\n (blur)=\"onNameBlur()\">\n <input\n type=\"text\"\n class=\"dashboard-description-input\"\n [(ngModel)]=\"editingDescription\"\n placeholder=\"Add a description...\">\n </div>\n </div>\n <div class=\"header-right\">\n <!-- Save, Cancel buttons -->\n <button\n class=\"btn-primary\"\n (click)=\"saveDashboard()\">\n <i class=\"fa-solid fa-save\"></i>\n Save\n </button>\n <button\n class=\"btn-cancel\"\n (click)=\"cancelEdit()\">\n Cancel\n </button>\n </div>\n </div>\n }\n <!-- Dashboard Viewer -->\n <div class=\"viewer-content\">\n <mj-dashboard-viewer\n #dashboardViewer\n [dashboard]=\"selectedDashboard\"\n [isEditing]=\"mode === 'edit'\"\n [showToolbar]=\"false\"\n [showBreadcrumb]=\"false\"\n (panelInteraction)=\"onPanelInteraction($event)\"\n (navigationRequested)=\"onNavigationRequested($event)\">\n </mj-dashboard-viewer>\n </div>\n <!-- Add Panel Dialog -->\n @if (dashboardViewer) {\n <mj-add-panel-dialog\n [visible]=\"showAddPanelDialog\"\n [partTypes]=\"dashboardViewer.getPartTypes()\"\n (panelAdded)=\"onPanelAdded($event)\"\n (cancelled)=\"onAddPanelCancelled()\">\n </mj-add-panel-dialog>\n }\n <!-- Generic Edit Part Dialog - dynamically loads config panels via ClassFactory -->\n <mj-edit-part-dialog\n [Visible]=\"showConfigDialog\"\n [PartType]=\"configDialogPartType\"\n [Panel]=\"configDialogPanel\"\n [Config]=\"configDialogPanel?.config || null\"\n (Saved)=\"onConfigDialogSaved($event)\"\n (Cancelled)=\"onConfigDialogCancelled()\">\n </mj-edit-part-dialog>\n <!-- Remove Part Confirmation Dialog -->\n <mj-confirm-dialog\n [visible]=\"showConfirmDialog\"\n type=\"danger\"\n title=\"Remove Part\"\n [message]=\"'Are you sure you want to remove \\'' + confirmPanelTitle + '\\' from this dashboard?'\"\n confirmText=\"Remove\"\n cancelText=\"Cancel\"\n (confirmed)=\"onRemoveConfirmed()\"\n (cancelled)=\"onRemoveCancelled()\">\n </mj-confirm-dialog>\n <!-- Share Dashboard Dialog -->\n <mj-dashboard-share-dialog\n [Visible]=\"showShareDialog\"\n [Dashboard]=\"selectedDashboard\"\n (Result)=\"onShareDialogResult($event)\">\n </mj-dashboard-share-dialog>\n }\n</div>\n"]}
1
+ {"version":3,"file":"dashboard-browser-resource.component.js","sourceRoot":"","sources":["../../src/DashboardBrowser/dashboard-browser-resource.component.ts","../../src/DashboardBrowser/dashboard-browser-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ViewChild } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { Metadata, CompositeKey } from '@memberjunction/core';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { ResourceData, MJDashboardEntity, MJDashboardCategoryEntity, MJDashboardPartTypeEntity, DashboardEngine, DashboardUserPermissions, MJDashboardCategoryLinkEntity } from '@memberjunction/core-entities';\nimport { ShareDialogResult } from './dashboard-share-dialog.component';\nimport {\n DashboardViewerComponent,\n DashboardNavRequestEvent,\n PanelInteractionEvent,\n AddPanelResult,\n createDefaultDashboardConfig,\n DashboardPanel,\n EditPartDialogResult,\n // Browser event types from generic component\n DashboardOpenEvent,\n DashboardEditEvent,\n DashboardDeleteEvent,\n DashboardMoveEvent,\n DashboardCreateEvent,\n CategoryCreateEvent,\n CategoryDeleteEvent,\n CategoryChangeEvent,\n ViewPreferenceChangeEvent,\n DashboardBrowserViewMode,\n BreadcrumbNavigateEvent\n} from '@memberjunction/ng-dashboard-viewer';\n/**\n * Mode for the dashboard browser\n */\ntype BrowserMode = 'list' | 'view' | 'edit';\n\n/**\n * Resource component for browsing, creating, and editing dashboards.\n * Uses the generic DashboardBrowserComponent for list mode and handles\n * view/edit mode internally with routing integration.\n */\n@RegisterClass(BaseResourceComponent, 'DashboardBrowserResource')\n@Component({\n standalone: false,\n selector: 'mj-dashboard-browser-resource',\n templateUrl: './dashboard-browser-resource.component.html',\n styleUrls: ['./dashboard-browser-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DashboardBrowserResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n // ========================================\n // State\n // ========================================\n\n public mode: BrowserMode = 'list';\n public isLoading = false;\n public dashboards: MJDashboardEntity[] = [];\n public categories: MJDashboardCategoryEntity[] = [];\n public selectedDashboard: MJDashboardEntity | null = null;\n public selectedCategoryId: string | null = null;\n public viewMode: DashboardBrowserViewMode = 'cards';\n public showAddPanelDialog = false;\n\n // Config dialog state\n public showConfigDialog = false;\n public configDialogPanel: DashboardPanel | null = null;\n public configDialogPartType: MJDashboardPartTypeEntity | null = null;\n public configDialogClass: string = '';\n\n // Confirm dialog state\n public showConfirmDialog = false;\n public confirmPanelId: string = '';\n public confirmPanelTitle: string = '';\n\n // Share dialog state\n public showShareDialog = false;\n\n // Edit mode state for name/description\n public editingName = '';\n public editingDescription = '';\n private originalName = '';\n private originalDescription = '';\n private originalConfig = '';\n\n // Permission state for selected dashboard\n public selectedDashboardPermissions: DashboardUserPermissions = {\n DashboardID: '',\n CanRead: true,\n CanEdit: true,\n CanDelete: true,\n CanShare: true,\n IsOwner: true,\n PermissionSource: 'owner'\n };\n\n // Permission map for all dashboards (used by browser component)\n public dashboardPermissionsMap: Map<string, DashboardUserPermissions> = new Map();\n\n // Effective category map for shared dashboards (maps dashboard ID to effective category for display)\n public effectiveCategoryMap: Map<string, string | null> = new Map();\n\n private readonly _destroy$ = new Subject<void>();\n\n @ViewChild('dashboardViewer') dashboardViewer!: DashboardViewerComponent;\n\n // ========================================\n // Constructor\n // ========================================\n\n constructor(\n private cdr: ChangeDetectorRef,\n private route: ActivatedRoute,\n private navigationService: NavigationService\n ) {\n super();\n }\n\n // ========================================\n // Lifecycle\n // ========================================\n\n ngOnInit(): void {\n this.loadDashboards();\n this.subscribeToQueryParams();\n this.loadViewPreference();\n }\n\n ngOnDestroy(): void {\n this._destroy$.next();\n this._destroy$.complete();\n }\n\n // ========================================\n // BaseResourceComponent Implementation\n // ========================================\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Dashboards';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-gauge-high';\n }\n\n // ========================================\n // Event Handlers from Generic Browser\n // ========================================\n\n /**\n * Handle dashboard open request from generic browser\n */\n public onDashboardOpen(event: DashboardOpenEvent): void {\n if (event.OpenInNewTab) {\n // Open in a dedicated Explorer tab via NavigationService\n this.navigationService.OpenDashboard(\n event.Dashboard.ID,\n event.Dashboard.Name,\n { forceNewTab: true }\n );\n } else {\n // Open inline in the browser's view pane\n this.openDashboard(event.Dashboard);\n }\n }\n\n /**\n * Open the current dashboard in its own dedicated Explorer tab\n */\n public openInNewTab(): void {\n if (this.selectedDashboard) {\n this.navigationService.OpenDashboard(\n this.selectedDashboard.ID,\n this.selectedDashboard.Name,\n { forceNewTab: true }\n );\n }\n }\n\n /**\n * Handle dashboard edit request from generic browser\n */\n public onDashboardEdit(event: DashboardEditEvent): void {\n this.editDashboard(event.Dashboard);\n }\n\n /**\n * Handle dashboard delete request from generic browser\n */\n public async onDashboardDelete(event: DashboardDeleteEvent): Promise<void> {\n // The generic browser handles the confirmation dialog\n // We just need to perform the actual deletion\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n for (const dashboard of event.Dashboards) {\n const deleted = await dashboard.Delete();\n if (deleted) {\n const index = this.dashboards.findIndex(d => UUIDsEqual(d.ID, dashboard.ID));\n if (index >= 0) {\n this.dashboards.splice(index, 1);\n }\n }\n }\n\n // Create new array reference to trigger change detection\n this.dashboards = [...this.dashboards];\n } catch (err) {\n console.error('Failed to delete dashboards:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle dashboard move request from generic browser.\n * For owned dashboards: updates the dashboard's CategoryID directly.\n * For shared dashboards: creates/updates a DashboardCategoryLink to organize without modifying the original.\n */\n public async onDashboardMove(event: DashboardMoveEvent): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n const currentUserId = md.CurrentUser.ID;\n\n for (const dashboard of event.Dashboards) {\n const permissions = DashboardEngine.Instance.GetDashboardPermissions(dashboard.ID, currentUserId);\n\n if (permissions.IsOwner) {\n // Owner can modify the dashboard directly\n dashboard.CategoryID = event.TargetCategoryId;\n await dashboard.Save();\n } else {\n // Non-owner: create or update a category link instead\n await this.createOrUpdateCategoryLink(dashboard.ID, currentUserId, event.TargetCategoryId);\n\n // Update the effective category map immediately for UI refresh\n this.effectiveCategoryMap.set(dashboard.ID, event.TargetCategoryId);\n }\n }\n\n // Create new map reference to trigger change detection\n this.effectiveCategoryMap = new Map(this.effectiveCategoryMap);\n\n // Refresh the list\n this.dashboards = [...this.dashboards];\n\n // Navigate to the target category to follow the moved items\n this.selectedCategoryId = event.TargetCategoryId;\n this.updateUrlQueryParams();\n } catch (err) {\n console.error('Failed to move dashboards:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Creates or updates a DashboardCategoryLink for organizing a shared dashboard.\n * Ensures only one link exists per user/dashboard combination.\n * @param dashboardId - The ID of the shared dashboard\n * @param userId - The current user's ID\n * @param categoryId - The target category ID (null for root/uncategorized)\n */\n private async createOrUpdateCategoryLink(\n dashboardId: string,\n userId: string,\n categoryId: string | null\n ): Promise<void> {\n const md = new Metadata();\n\n // Check if a link already exists for this user/dashboard\n const existingLinks = DashboardEngine.Instance.DashboardCategoryLinks.filter(\n link => UUIDsEqual(link.DashboardID, dashboardId) && UUIDsEqual(link.UserID, userId)\n );\n\n let link: MJDashboardCategoryLinkEntity;\n\n if (existingLinks.length > 0) {\n // Update existing link\n link = existingLinks[0];\n link.DashboardCategoryID = categoryId;\n } else {\n // Create new link\n link = await md.GetEntityObject<MJDashboardCategoryLinkEntity>('MJ: Dashboard Category Links');\n link.DashboardID = dashboardId;\n link.UserID = userId;\n link.DashboardCategoryID = categoryId;\n }\n\n const saved = await link.Save();\n if (!saved) {\n console.error('Failed to save dashboard category link:', link.LatestResult);\n }\n }\n\n /**\n * Handle create dashboard request from generic browser\n */\n public async onDashboardCreate(event: DashboardCreateEvent): Promise<void> {\n await this.createDashboard(event.CategoryId);\n }\n\n /**\n * Handle category change from generic browser - update URL\n */\n public onCategoryChange(event: CategoryChangeEvent): void {\n this.selectedCategoryId = event.CategoryId;\n this.updateUrlQueryParams();\n }\n\n /**\n * Handle view preference change from generic browser - persist\n */\n public onViewPreferenceChange(event: ViewPreferenceChangeEvent): void {\n this.viewMode = event.ViewMode;\n this.saveViewPreference(event.ViewMode);\n }\n\n /**\n * Handle category create request from generic browser\n * Includes extensive logging for debugging category creation issues\n */\n public async onCategoryCreate(event: CategoryCreateEvent): Promise<void> {\n console.log('[DashboardBrowserResource] Category create requested:', {\n name: event.Name,\n parentCategoryId: event.ParentCategoryId\n });\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n console.log('[DashboardBrowserResource] Current user:', {\n userId: md.CurrentUser?.ID,\n userName: md.CurrentUser?.Name,\n email: md.CurrentUser?.Email\n });\n\n const category = await md.GetEntityObject<MJDashboardCategoryEntity>('MJ: Dashboard Categories');\n console.log('[DashboardBrowserResource] Created category entity object');\n\n // Set required fields\n category.Name = event.Name;\n category.UserID = md.CurrentUser.ID;\n\n if (event.ParentCategoryId) {\n category.ParentID = event.ParentCategoryId;\n }\n\n console.log('[DashboardBrowserResource] Category fields before save:', {\n name: category.Name,\n userId: category.UserID,\n parentId: category.ParentID,\n allFields: category.Fields.map(f => ({ name: f.Name, value: f.Value, dirty: f.Dirty }))\n });\n\n const saved = await category.Save();\n\n console.log('[DashboardBrowserResource] Save result:', {\n success: saved,\n latestResult: category.LatestResult,\n message: category.LatestResult?.Message,\n success2: category.LatestResult?.Success,\n id: category.ID\n });\n\n if (saved) {\n console.log('[DashboardBrowserResource] Category saved successfully, ID:', category.ID);\n // Add to local array - engine will self-update\n this.categories.push(category);\n this.categories = [...this.categories].sort((a, b) => a.Name.localeCompare(b.Name));\n } else {\n const errorMessage = category.LatestResult?.Message || 'Unknown error saving category';\n console.error('[DashboardBrowserResource] Failed to save category:', errorMessage);\n console.error('[DashboardBrowserResource] Full LatestResult:', JSON.stringify(category.LatestResult, null, 2));\n\n // Show toast or alert for user\n alert(`Failed to create category: ${errorMessage}`);\n }\n } catch (err) {\n console.error('[DashboardBrowserResource] Exception creating category:', err);\n alert(`Error creating category: ${err instanceof Error ? err.message : String(err)}`);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle category delete request from generic browser\n * Performs recursive deletion of category and all children\n */\n public async onCategoryDelete(event: CategoryDeleteEvent): Promise<void> {\n console.log('[DashboardBrowserResource] Category delete requested:', event.Category.Name);\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Get all child categories recursively\n const categoriesToDelete = this.getChildCategoriesRecursive(event.Category.ID);\n categoriesToDelete.push(event.Category);\n\n console.log('[DashboardBrowserResource] Deleting categories:', categoriesToDelete.map(c => c.Name));\n\n // Delete in reverse order (children first)\n for (const cat of categoriesToDelete.reverse()) {\n // First, move any dashboards in this category to uncategorized\n const dashboardsInCategory = this.dashboards.filter(d => UUIDsEqual(d.CategoryID, cat.ID));\n for (const dashboard of dashboardsInCategory) {\n dashboard.CategoryID = null!;\n await dashboard.Save();\n }\n\n // Then delete the category\n const deleted = await cat.Delete();\n if (deleted) {\n const index = this.categories.findIndex(c => UUIDsEqual(c.ID, cat.ID));\n if (index >= 0) {\n this.categories.splice(index, 1);\n }\n } else {\n console.error('[DashboardBrowserResource] Failed to delete category:', cat.Name, cat.LatestResult);\n }\n }\n\n // Refresh arrays\n this.categories = [...this.categories];\n this.dashboards = [...this.dashboards];\n } catch (err) {\n console.error('[DashboardBrowserResource] Exception deleting category:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle breadcrumb navigation event\n * Navigates back to list view with optional category selection\n */\n public onBreadcrumbNavigate(event: BreadcrumbNavigateEvent): void {\n console.log('[DashboardBrowserResource] Breadcrumb navigate:', event);\n\n // CategoryId is null for root, or a category ID string\n this.selectedCategoryId = event.CategoryId;\n this.backToList();\n this.updateUrlQueryParams();\n }\n\n // ========================================\n // Public Methods - Navigation\n // ========================================\n\n /**\n * Open a dashboard for viewing\n */\n public openDashboard(dashboard: MJDashboardEntity): void {\n this.selectedDashboard = dashboard;\n this.mode = 'view';\n\n // Compute permissions for the selected dashboard\n const md = new Metadata();\n this.selectedDashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n dashboard.ID,\n md.CurrentUser.ID\n );\n\n this.updateUrlQueryParams();\n this.cdr.detectChanges();\n }\n\n /**\n * Open a dashboard for editing\n */\n public editDashboard(dashboard: MJDashboardEntity): void {\n // Check if user has edit permission\n const md = new Metadata();\n const permissions = DashboardEngine.Instance.GetDashboardPermissions(\n dashboard.ID,\n md.CurrentUser.ID\n );\n\n if (!permissions.CanEdit) {\n console.warn('User does not have permission to edit this dashboard');\n return;\n }\n\n this.selectedDashboard = dashboard;\n this.selectedDashboardPermissions = permissions;\n this.mode = 'edit';\n\n // Initialize editing fields\n this.editingName = dashboard.Name;\n this.editingDescription = dashboard.Description || '';\n\n // Store originals for cancel\n this.originalName = dashboard.Name;\n this.originalDescription = dashboard.Description || '';\n this.originalConfig = dashboard.UIConfigDetails || '';\n\n this.cdr.detectChanges();\n }\n\n /**\n * Go back to list view\n */\n public backToList(): void {\n this.selectedDashboard = null;\n this.mode = 'list';\n this.updateUrlQueryParams();\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle edit mode for current dashboard\n */\n public toggleEditMode(): void {\n if (this.mode === 'view' && this.selectedDashboard) {\n this.editDashboard(this.selectedDashboard);\n } else if (this.mode === 'edit') {\n this.mode = 'view';\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Open the share dialog for the current dashboard\n */\n public openShareDialog(): void {\n if (!this.selectedDashboard) return;\n\n // Verify user has share permission\n if (!this.selectedDashboardPermissions.CanShare) {\n console.warn('User does not have permission to share this dashboard');\n return;\n }\n\n this.showShareDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Close the share dialog\n */\n public closeShareDialog(): void {\n this.showShareDialog = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle share dialog result\n */\n public onShareDialogResult(result: ShareDialogResult): void {\n this.showShareDialog = false;\n\n if (result.Action === 'save' && this.selectedDashboard) {\n // Recompute permissions after sharing changes\n const md = new Metadata();\n this.selectedDashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n this.selectedDashboard.ID,\n md.CurrentUser.ID\n );\n }\n\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Public Methods - Dashboard CRUD\n // ========================================\n\n /**\n * Create a new dashboard\n */\n public async createDashboard(categoryId?: string | null): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n const dashboard = await md.GetEntityObject<MJDashboardEntity>('MJ: Dashboards');\n\n dashboard.Name = 'New Dashboard';\n dashboard.Description = '';\n dashboard.UserID = md.CurrentUser.ID;\n dashboard.UIConfigDetails = JSON.stringify(createDefaultDashboardConfig());\n\n if (categoryId) {\n dashboard.CategoryID = categoryId;\n } else if (this.selectedCategoryId) {\n dashboard.CategoryID = this.selectedCategoryId;\n }\n\n const saved = await dashboard.Save();\n\n if (saved) {\n this.dashboards.unshift(dashboard);\n this.dashboards = [...this.dashboards];\n this.editDashboard(dashboard);\n } else {\n console.error('Failed to save dashboard:', dashboard.LatestResult);\n }\n } catch (err) {\n console.error('Failed to create dashboard:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Save the current dashboard\n */\n public async saveDashboard(): Promise<void> {\n if (!this.selectedDashboard) return;\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n this.selectedDashboard.Name = this.editingName;\n this.selectedDashboard.Description = this.editingDescription;\n\n if (this.dashboardViewer) {\n await this.dashboardViewer.save();\n }\n\n this.originalName = this.editingName;\n this.originalDescription = this.editingDescription;\n this.originalConfig = this.selectedDashboard.UIConfigDetails || '';\n\n // Update the dashboard in the list\n this.dashboards = [...this.dashboards];\n\n this.mode = 'view';\n } catch (err) {\n console.error('Failed to save dashboard:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Cancel editing and revert changes\n */\n public cancelEdit(): void {\n if (!this.selectedDashboard) {\n this.backToList();\n return;\n }\n\n this.selectedDashboard.Name = this.originalName;\n this.selectedDashboard.Description = this.originalDescription;\n this.selectedDashboard.UIConfigDetails = this.originalConfig;\n\n this.editingName = '';\n this.editingDescription = '';\n\n this.mode = 'view';\n this.cdr.detectChanges();\n }\n\n /**\n * Handle name input blur - validate name is not empty\n */\n public onNameBlur(): void {\n if (!this.editingName.trim()) {\n this.editingName = this.originalName || 'Untitled Dashboard';\n }\n }\n\n // ========================================\n // Public Methods - Part Management\n // ========================================\n\n /**\n * Open the Add Part dialog\n */\n public openAddPartDialog(): void {\n this.showAddPanelDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle panel interaction events from the viewer\n */\n public onPanelInteraction(event: PanelInteractionEvent): void {\n if (event.interactionType !== 'custom') return;\n\n const action = event.payload?.['action'];\n\n switch (action) {\n case 'add-panel-requested':\n this.openAddPartDialog();\n break;\n\n case 'configure-part-requested':\n this.openConfigDialog(event.panelId);\n break;\n\n case 'remove-part-requested':\n this.openRemoveConfirmDialog(\n event.panelId,\n event.payload?.['panelTitle'] as string || 'this part'\n );\n break;\n }\n }\n\n /**\n * Handle navigation events from panels\n */\n public onNavigationRequested(event: DashboardNavRequestEvent): void {\n const request = event.request;\n const openInNewTab = request.openInNewTab || false;\n\n switch (request.type) {\n case 'OpenEntityRecord': {\n // Navigate to entity record\n const compositeKey = new CompositeKey();\n compositeKey.SimpleLoadFromURLSegment(request.recordId);\n // If simple load didn't work (single ID without field name), create from ID field\n if (compositeKey.KeyValuePairs.length === 0) {\n compositeKey.LoadFromSingleKeyValuePair('ID', request.recordId);\n }\n this.navigationService.OpenEntityRecord(\n request.entityName,\n compositeKey,\n { forceNewTab: openInNewTab }\n );\n break;\n }\n case 'OpenDashboard': {\n // Navigate to another dashboard\n const targetDashboard = this.dashboards.find(d => UUIDsEqual(d.ID, request.dashboardId));\n if (targetDashboard) {\n if (openInNewTab) {\n this.navigationService.OpenDashboard(\n targetDashboard.ID,\n targetDashboard.Name,\n { forceNewTab: true }\n );\n } else {\n this.openDashboard(targetDashboard);\n }\n }\n break;\n }\n case 'OpenQuery': {\n // Navigate to query viewer\n const md = new Metadata();\n const queryInfo = md.Queries.find(q => UUIDsEqual(q.ID, request.queryId));\n if (queryInfo) {\n this.navigationService.OpenQuery(\n request.queryId,\n queryInfo.Name,\n { forceNewTab: openInNewTab }\n );\n }\n break;\n }\n case 'OpenNavItem': {\n // Navigate to a specific nav item within an application\n const appId = request.appName ? this.resolveAppId(request.appName) : undefined;\n this.navigationService.OpenNavItemByName(request.navItemName, undefined, appId, {\n queryParams: request.queryParams\n });\n break;\n }\n }\n }\n\n /**\n * Resolve an application name to its ID\n */\n private resolveAppId(appName: string): string | undefined {\n const md = new Metadata();\n const app = md.Applications.find(a => a.Name.toLowerCase() === appName.toLowerCase());\n return app?.ID;\n }\n\n /**\n * Handle add panel dialog result\n */\n public onPanelAdded(result: AddPanelResult): void {\n if (this.dashboardViewer) {\n this.dashboardViewer.addPanel(\n result.PartType.ID,\n result.Config,\n result.Title,\n result.Icon\n );\n }\n this.showAddPanelDialog = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle add panel dialog cancel\n */\n public onAddPanelCancelled(): void {\n this.showAddPanelDialog = false;\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Public Methods - Config Dialog\n // ========================================\n\n /**\n * Open the config dialog for a panel\n */\n public openConfigDialog(panelId: string): void {\n if (!this.dashboardViewer) return;\n\n const panel = this.dashboardViewer.getPanel(panelId);\n const partType = this.dashboardViewer.getPartTypeForPanel(panelId);\n\n if (!panel || !partType) {\n console.warn('Could not find panel or part type for config dialog');\n return;\n }\n\n this.configDialogPanel = panel;\n this.configDialogPartType = partType;\n this.configDialogClass = partType.ConfigDialogClass || '';\n this.showConfigDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle config dialog save\n */\n public onConfigDialogSaved(result: EditPartDialogResult): void {\n if (this.dashboardViewer && this.configDialogPanel) {\n this.dashboardViewer.updatePanelConfig(\n this.configDialogPanel.id,\n result.Config,\n result.Title,\n result.Icon\n );\n }\n this.closeConfigDialog();\n }\n\n /**\n * Handle config dialog cancel\n */\n public onConfigDialogCancelled(): void {\n this.closeConfigDialog();\n }\n\n /**\n * Close the config dialog\n */\n private closeConfigDialog(): void {\n this.showConfigDialog = false;\n this.configDialogPanel = null;\n this.configDialogPartType = null;\n this.configDialogClass = '';\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Public Methods - Remove Confirm Dialog\n // ========================================\n\n /**\n * Open the remove confirmation dialog\n */\n public openRemoveConfirmDialog(panelId: string, panelTitle: string): void {\n this.confirmPanelId = panelId;\n this.confirmPanelTitle = panelTitle;\n this.showConfirmDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle remove confirmation\n */\n public onRemoveConfirmed(): void {\n if (this.dashboardViewer && this.confirmPanelId) {\n this.dashboardViewer.confirmRemovePanel(this.confirmPanelId);\n }\n this.closeRemoveConfirmDialog();\n }\n\n /**\n * Handle remove cancel\n */\n public onRemoveCancelled(): void {\n this.closeRemoveConfirmDialog();\n }\n\n /**\n * Close the remove confirm dialog\n */\n private closeRemoveConfirmDialog(): void {\n this.showConfirmDialog = false;\n this.confirmPanelId = '';\n this.confirmPanelTitle = '';\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Private Methods - Data Loading\n // ========================================\n\n private async loadDashboards(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Use DashboardEngine for consistent cached data\n const engine = DashboardEngine.Instance;\n await engine.Config(false); // Wait for engine to load data\n\n const md = new Metadata();\n const currentUserId = md.CurrentUser.ID;\n\n // Get data from engine - sort dashboards by updated date, categories by name\n // Filter dashboards to only those accessible to the current user\n this.dashboards = [...engine.GetAccessibleDashboards(currentUserId)].sort((a, b) =>\n new Date(b.__mj_UpdatedAt).getTime() - new Date(a.__mj_UpdatedAt).getTime()\n );\n // Filter categories to only those owned by or shared with the current user\n this.categories = [...engine.GetAccessibleCategories(currentUserId)].sort((a, b) =>\n a.Name.localeCompare(b.Name)\n );\n\n // Build permissions map and effective category map for all dashboards\n this.dashboardPermissionsMap = new Map();\n this.effectiveCategoryMap = new Map();\n\n // Get category links for current user (from engine's cached data)\n const userCategoryLinks = engine.DashboardCategoryLinks.filter(\n link => UUIDsEqual(link.UserID, currentUserId)\n );\n\n for (const dashboard of this.dashboards) {\n const perms = engine.GetDashboardPermissions(dashboard.ID, currentUserId);\n this.dashboardPermissionsMap.set(dashboard.ID, perms);\n\n // For shared dashboards (not owned), determine effective category\n if (!perms.IsOwner) {\n // Look for a category link for this dashboard\n const categoryLink = userCategoryLinks.find(\n link => UUIDsEqual(link.DashboardID, dashboard.ID)\n );\n\n if (categoryLink) {\n // User has explicitly organized this shared dashboard\n this.effectiveCategoryMap.set(dashboard.ID, categoryLink.DashboardCategoryID);\n } else {\n // No link exists - show in root (null category)\n this.effectiveCategoryMap.set(dashboard.ID, null);\n }\n }\n // For owned dashboards, we don't add to effectiveCategoryMap\n // so the browser will use the dashboard's actual CategoryID\n }\n\n console.log('[DashboardBrowserResource] Loaded from DashboardEngine:', {\n dashboardCount: this.dashboards.length,\n categoryCount: this.categories.length,\n sharedDashboardsInEffectiveMap: this.effectiveCategoryMap.size,\n categories: this.categories.map(c => ({ id: c.ID, name: c.Name, parentId: c.ParentID }))\n });\n\n this.NotifyLoadComplete();\n } catch (err) {\n console.error('Failed to load dashboards:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ========================================\n // Private Methods - URL Query Params\n // ========================================\n\n private subscribeToQueryParams(): void {\n this.route.queryParams\n .pipe(takeUntil(this._destroy$))\n .subscribe(params => {\n const categoryId = params['category'] || null;\n const dashboardId = params['dashboard'] || null;\n\n // Handle category change\n if (categoryId !== this.selectedCategoryId) {\n this.selectedCategoryId = categoryId;\n }\n\n // Handle dashboard change (for browser back/forward)\n const currentDashboardId = this.selectedDashboard?.ID || null;\n if (dashboardId !== currentDashboardId) {\n if (dashboardId) {\n // Find and open the dashboard\n const dashboard = this.dashboards.find(d => UUIDsEqual(d.ID, dashboardId));\n if (dashboard) {\n this.selectedDashboard = dashboard;\n this.mode = 'view';\n }\n } else {\n // Go back to list\n this.selectedDashboard = null;\n this.mode = 'list';\n }\n }\n\n this.cdr.detectChanges();\n });\n }\n\n /**\n * Update the URL query params for the current tab.\n * Uses NavigationService to update the tab configuration, which triggers\n * the shell's URL sync mechanism to update the browser URL properly\n * while respecting app-scoped routes.\n */\n private updateUrlQueryParams(): void {\n const queryParams: Record<string, string | null> = {};\n\n // Track category\n if (this.selectedCategoryId) {\n queryParams['category'] = this.selectedCategoryId;\n } else {\n queryParams['category'] = null;\n }\n\n // Track dashboard (for browser back/forward support)\n if (this.selectedDashboard) {\n queryParams['dashboard'] = this.selectedDashboard.ID;\n } else {\n queryParams['dashboard'] = null;\n }\n\n // Use NavigationService to update query params properly\n // This ensures the URL update respects app-scoped routes\n this.navigationService.UpdateActiveTabQueryParams(queryParams);\n }\n\n // ========================================\n // Private Methods - Category Helpers\n // ========================================\n\n /**\n * Get all child categories of a parent category recursively\n */\n private getChildCategoriesRecursive(parentId: string): MJDashboardCategoryEntity[] {\n const children: MJDashboardCategoryEntity[] = [];\n const directChildren = this.categories.filter(c => UUIDsEqual(c.ParentID, parentId));\n\n for (const child of directChildren) {\n children.push(child);\n children.push(...this.getChildCategoriesRecursive(child.ID));\n }\n\n return children;\n }\n\n // ========================================\n // Private Methods - View Preference\n // ========================================\n\n private loadViewPreference(): void {\n // TODO: Load from User Settings entity\n const stored = localStorage.getItem('dashboard-browser-view-mode');\n if (stored === 'cards' || stored === 'list') {\n this.viewMode = stored;\n }\n }\n\n private saveViewPreference(mode: DashboardBrowserViewMode): void {\n // TODO: Save to User Settings entity\n localStorage.setItem('dashboard-browser-view-mode', mode);\n }\n}\n","<!-- Dashboard Browser Resource -->\n<div class=\"dashboard-browser-resource\">\n <!-- List Mode - Uses Generic DashboardBrowserComponent -->\n @if (mode === 'list') {\n <mj-dashboard-browser\n [Dashboards]=\"dashboards\"\n [Categories]=\"categories\"\n [SelectedCategoryId]=\"selectedCategoryId\"\n [ViewMode]=\"viewMode\"\n [IsLoading]=\"isLoading\"\n [ShowCreateButton]=\"true\"\n [AllowMultiSelect]=\"true\"\n [AllowDragDrop]=\"true\"\n [DashboardPermissions]=\"dashboardPermissionsMap\"\n [EffectiveCategoryMap]=\"effectiveCategoryMap\"\n (DashboardOpen)=\"onDashboardOpen($event)\"\n (DashboardEdit)=\"onDashboardEdit($event)\"\n (DashboardDelete)=\"onDashboardDelete($event)\"\n (DashboardMove)=\"onDashboardMove($event)\"\n (DashboardCreate)=\"onDashboardCreate($event)\"\n (CategoryCreate)=\"onCategoryCreate($event)\"\n (CategoryDelete)=\"onCategoryDelete($event)\"\n (CategoryChange)=\"onCategoryChange($event)\"\n (ViewPreferenceChange)=\"onViewPreferenceChange($event)\">\n </mj-dashboard-browser>\n }\n\n <!-- View/Edit Mode -->\n @if (mode === 'view' || mode === 'edit') {\n <!-- View Mode Toolbar - matches browser toolbar structure -->\n @if (mode === 'view') {\n <div class=\"viewer-toolbar\">\n <!-- Breadcrumb navigation (includes its own padding/styling) -->\n <mj-dashboard-breadcrumb\n [Categories]=\"categories\"\n [CurrentCategoryId]=\"selectedDashboard?.CategoryID || null\"\n [CurrentDashboard]=\"selectedDashboard\"\n [ShowDashboardName]=\"true\"\n [AllowDragDrop]=\"false\"\n Size=\"large\"\n RootIcon=\"fa-solid fa-gauge-high\"\n RootLabel=\"Dashboards\"\n (Navigate)=\"onBreadcrumbNavigate($event)\">\n </mj-dashboard-breadcrumb>\n <!-- Right-side Actions -->\n <div class=\"toolbar-actions\">\n <!-- Shared indicator for non-owned dashboards -->\n @if (!selectedDashboardPermissions.IsOwner && selectedDashboardPermissions.CanRead) {\n <span class=\"shared-indicator\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n Shared with you\n </span>\n }\n <button\n class=\"btn-icon\"\n title=\"Open in its own tab\"\n (click)=\"openInNewTab()\">\n <i class=\"fa-solid fa-up-right-from-square\"></i>\n </button>\n <!-- Share button - only shown if user can share -->\n @if (selectedDashboardPermissions.CanShare) {\n <button\n class=\"btn-icon\"\n title=\"Share Dashboard\"\n (click)=\"openShareDialog()\">\n <i class=\"fa-solid fa-user-plus\"></i>\n </button>\n }\n <!-- Edit button - only shown if user can edit -->\n @if (selectedDashboardPermissions.CanEdit) {\n <button\n class=\"btn-icon\"\n title=\"Edit Dashboard\"\n (click)=\"toggleEditMode()\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n }\n </div>\n </div>\n }\n <!-- Edit Mode Header - different layout -->\n @if (mode === 'edit') {\n <div class=\"viewer-header editing\">\n <div class=\"header-left\">\n <!-- Add Part button on the left -->\n <button\n class=\"btn-add-part\"\n (click)=\"openAddPartDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Part\n </button>\n <!-- Separator -->\n <div class=\"header-separator\"></div>\n <!-- Editable name/description -->\n <div class=\"dashboard-info-edit\">\n <input\n type=\"text\"\n class=\"dashboard-name-input\"\n [(ngModel)]=\"editingName\"\n placeholder=\"Dashboard name\"\n (blur)=\"onNameBlur()\">\n <input\n type=\"text\"\n class=\"dashboard-description-input\"\n [(ngModel)]=\"editingDescription\"\n placeholder=\"Add a description...\">\n </div>\n </div>\n <div class=\"header-right\">\n <!-- Save, Cancel buttons -->\n <button\n class=\"btn-primary\"\n (click)=\"saveDashboard()\">\n <i class=\"fa-solid fa-save\"></i>\n Save\n </button>\n <button\n class=\"btn-cancel\"\n (click)=\"cancelEdit()\">\n Cancel\n </button>\n </div>\n </div>\n }\n <!-- Dashboard Viewer -->\n <div class=\"viewer-content\">\n <mj-dashboard-viewer\n #dashboardViewer\n [dashboard]=\"selectedDashboard\"\n [isEditing]=\"mode === 'edit'\"\n [showToolbar]=\"false\"\n [showBreadcrumb]=\"false\"\n (panelInteraction)=\"onPanelInteraction($event)\"\n (navigationRequested)=\"onNavigationRequested($event)\">\n </mj-dashboard-viewer>\n </div>\n <!-- Add Panel Dialog -->\n @if (dashboardViewer) {\n <mj-add-panel-dialog\n [visible]=\"showAddPanelDialog\"\n [partTypes]=\"dashboardViewer.getPartTypes()\"\n (panelAdded)=\"onPanelAdded($event)\"\n (cancelled)=\"onAddPanelCancelled()\">\n </mj-add-panel-dialog>\n }\n <!-- Generic Edit Part Dialog - dynamically loads config panels via ClassFactory -->\n <mj-edit-part-dialog\n [Visible]=\"showConfigDialog\"\n [PartType]=\"configDialogPartType\"\n [Panel]=\"configDialogPanel\"\n [Config]=\"configDialogPanel?.config || null\"\n (Saved)=\"onConfigDialogSaved($event)\"\n (Cancelled)=\"onConfigDialogCancelled()\">\n </mj-edit-part-dialog>\n <!-- Remove Part Confirmation Dialog -->\n <mj-confirm-dialog\n [visible]=\"showConfirmDialog\"\n type=\"danger\"\n title=\"Remove Part\"\n [message]=\"'Are you sure you want to remove \\'' + confirmPanelTitle + '\\' from this dashboard?'\"\n confirmText=\"Remove\"\n cancelText=\"Cancel\"\n (confirmed)=\"onRemoveConfirmed()\"\n (cancelled)=\"onRemoveCancelled()\">\n </mj-confirm-dialog>\n <!-- Share Dashboard Dialog -->\n <mj-dashboard-share-dialog\n [Visible]=\"showShareDialog\"\n [Dashboard]=\"selectedDashboard\"\n (Result)=\"onShareDialogResult($event)\">\n </mj-dashboard-share-dialog>\n }\n</div>\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-share-dialog.component.d.ts","sourceRoot":"","sources":["../../src/DashboardBrowser/dashboard-share-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAqB,MAAM,eAAe,CAAC;AAEvI,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,EAAmB,YAAY,EAAE,MAAM,+BAA+B,CAAC;;AAE9H;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,qDAAqD;IACrD,UAAU,EAAE,2BAA2B,CAAC;IACxC,iCAAiC;IACjC,IAAI,EAAE,YAAY,CAAC;IACnB,0CAA0C;IAC1C,KAAK,EAAE,OAAO,CAAC;IACf,qDAAqD;IACrD,gBAAgB,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B,2CAA2C;IAC3C,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,mDAAmD;IACnD,SAAS,CAAC,EAAE,iBAAiB,CAAC;CACjC;AAED;;;GAGG;AACH,qBAOa,6BAA8B,YAAW,SAAS;IAuB/C,OAAO,CAAC,GAAG;IAtBd,OAAO,UAAS;IAChB,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAC1C,MAAM,kCAAyC;IAEzD,wCAAwC;IACjC,UAAU,EAAE,mBAAmB,EAAE,CAAM;IAE9C,0EAA0E;IACnE,cAAc,EAAE,YAAY,EAAE,CAAM;IAE3C,8BAA8B;IAC9B,OAAO,CAAC,QAAQ,CAAsB;IAEtC,oBAAoB;IACb,SAAS,UAAS;IAEzB,+BAA+B;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEnC,wCAAwC;IACjC,gBAAgB,SAAM;gBAET,GAAG,EAAE,iBAAiB;IAE1C,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAOzC;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;OAEG;YACW,QAAQ;IAmDtB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;OAEG;IACH,IAAW,sBAAsB,IAAI,YAAY,EAAE,CAYlD;IAED;;OAEG;IACH,IAAW,UAAU,IAAI,OAAO,CAE/B;IAED;;OAEG;IACU,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB5D;;OAEG;IACI,eAAe,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAaxD;;OAEG;IACI,UAAU,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAMnD;;OAEG;IACH,IAAW,YAAY,IAAI,mBAAmB,EAAE,CAE/C;IAED;;OAEG;IACH,IAAW,aAAa,IAAI,mBAAmB,EAAE,CAEhD;IAED;;OAEG;IACI,aAAa,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAQtD;;OAEG;IACI,eAAe,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IASxD;;OAEG;IACI,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAQvD;;OAEG;IACU,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IA4CpC;;OAEG;IACI,QAAQ,IAAI,IAAI;IAIvB;;OAEG;IACI,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM;yCAzSzC,6BAA6B;2CAA7B,6BAA6B;CAiTzC"}
1
+ {"version":3,"file":"dashboard-share-dialog.component.d.ts","sourceRoot":"","sources":["../../src/DashboardBrowser/dashboard-share-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAqB,MAAM,eAAe,CAAC;AAEvI,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,EAAmB,YAAY,EAAE,MAAM,+BAA+B,CAAC;;AAG9H;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,qDAAqD;IACrD,UAAU,EAAE,2BAA2B,CAAC;IACxC,iCAAiC;IACjC,IAAI,EAAE,YAAY,CAAC;IACnB,0CAA0C;IAC1C,KAAK,EAAE,OAAO,CAAC;IACf,qDAAqD;IACrD,gBAAgB,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B,2CAA2C;IAC3C,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,mDAAmD;IACnD,SAAS,CAAC,EAAE,iBAAiB,CAAC;CACjC;AAED;;;GAGG;AACH,qBAOa,6BAA8B,YAAW,SAAS;IAuB/C,OAAO,CAAC,GAAG;IAtBd,OAAO,UAAS;IAChB,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAC1C,MAAM,kCAAyC;IAEzD,wCAAwC;IACjC,UAAU,EAAE,mBAAmB,EAAE,CAAM;IAE9C,0EAA0E;IACnE,cAAc,EAAE,YAAY,EAAE,CAAM;IAE3C,8BAA8B;IAC9B,OAAO,CAAC,QAAQ,CAAsB;IAEtC,oBAAoB;IACb,SAAS,UAAS;IAEzB,+BAA+B;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEnC,wCAAwC;IACjC,gBAAgB,SAAM;gBAET,GAAG,EAAE,iBAAiB;IAE1C,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAOzC;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;OAEG;YACW,QAAQ;IAmDtB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;OAEG;IACH,IAAW,sBAAsB,IAAI,YAAY,EAAE,CAYlD;IAED;;OAEG;IACH,IAAW,UAAU,IAAI,OAAO,CAE/B;IAED;;OAEG;IACU,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB5D;;OAEG;IACI,eAAe,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAaxD;;OAEG;IACI,UAAU,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAMnD;;OAEG;IACH,IAAW,YAAY,IAAI,mBAAmB,EAAE,CAE/C;IAED;;OAEG;IACH,IAAW,aAAa,IAAI,mBAAmB,EAAE,CAEhD;IAED;;OAEG;IACI,aAAa,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAQtD;;OAEG;IACI,eAAe,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IASxD;;OAEG;IACI,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAQvD;;OAEG;IACU,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IA4CpC;;OAEG;IACI,QAAQ,IAAI,IAAI;IAIvB;;OAEG;IACI,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM;yCAzSzC,6BAA6B;2CAA7B,6BAA6B;CAiTzC"}
@@ -1,6 +1,7 @@
1
1
  import { Component, Input, Output, EventEmitter, ViewEncapsulation } from '@angular/core';
2
2
  import { Metadata, RunView } from '@memberjunction/core';
3
3
  import { DashboardEngine } from '@memberjunction/core-entities';
4
+ import { UUIDsEqual } from '@memberjunction/global';
4
5
  import * as i0 from "@angular/core";
5
6
  import * as i1 from "@angular/forms";
6
7
  import * as i2 from "@progress/kendo-angular-dialog";
@@ -326,7 +327,7 @@ export class DashboardShareDialogComponent {
326
327
  // Build user shares list
327
328
  this.UserShares = [];
328
329
  for (const permission of existingShares) {
329
- const user = this.allUsers.find(u => u.ID === permission.UserID);
330
+ const user = this.allUsers.find(u => UUIDsEqual(u.ID, permission.UserID));
330
331
  if (user) {
331
332
  this.UserShares.push({
332
333
  Permission: permission,
@@ -358,7 +359,7 @@ export class DashboardShareDialogComponent {
358
359
  .filter(s => !s.MarkedForRemoval)
359
360
  .map(s => s.User.ID));
360
361
  // Exclude dashboard owner and already shared users
361
- this.AvailableUsers = this.allUsers.filter(user => user.ID !== this.Dashboard.UserID && !sharedUserIds.has(user.ID));
362
+ this.AvailableUsers = this.allUsers.filter(user => !UUIDsEqual(user.ID, this.Dashboard.UserID) && !sharedUserIds.has(user.ID));
362
363
  }
363
364
  /**
364
365
  * Get filtered available users based on search
@@ -546,5 +547,5 @@ export class DashboardShareDialogComponent {
546
547
  }], Result: [{
547
548
  type: Output
548
549
  }] }); })();
549
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(DashboardShareDialogComponent, { className: "DashboardShareDialogComponent", filePath: "src/DashboardBrowser/dashboard-share-dialog.component.ts", lineNumber: 40 }); })();
550
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(DashboardShareDialogComponent, { className: "DashboardShareDialogComponent", filePath: "src/DashboardBrowser/dashboard-share-dialog.component.ts", lineNumber: 41 }); })();
550
551
  //# sourceMappingURL=dashboard-share-dialog.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-share-dialog.component.js","sourceRoot":"","sources":["../../src/DashboardBrowser/dashboard-share-dialog.component.ts","../../src/DashboardBrowser/dashboard-share-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef, ViewEncapsulation } from '@angular/core';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJDashboardEntity, MJDashboardPermissionEntity, DashboardEngine, MJUserEntity } from '@memberjunction/core-entities';\n\n/**\n * Represents a user share with their permissions\n */\nexport interface UserSharePermission {\n /** The permission entity (may be new or existing) */\n Permission: MJDashboardPermissionEntity;\n /** The user being shared with */\n User: MJUserEntity;\n /** Whether this is a newly added share */\n IsNew: boolean;\n /** Whether this share has been marked for removal */\n MarkedForRemoval: boolean;\n}\n\n/**\n * Result emitted when the dialog is closed\n */\nexport interface ShareDialogResult {\n /** The action taken: 'save' or 'cancel' */\n Action: 'save' | 'cancel';\n /** The dashboard that was shared (only on save) */\n Dashboard?: MJDashboardEntity;\n}\n\n/**\n * Dialog component for sharing dashboards with other users.\n * Allows setting granular permissions (CanRead, CanEdit, CanDelete, CanShare).\n */\n@Component({\n standalone: false,\n selector: 'mj-dashboard-share-dialog',\n templateUrl: './dashboard-share-dialog.component.html',\n styleUrls: ['./dashboard-share-dialog.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class DashboardShareDialogComponent implements OnChanges {\n @Input() Visible = false;\n @Input() Dashboard: MJDashboardEntity | null = null;\n @Output() Result = new EventEmitter<ShareDialogResult>();\n\n /** Current shares for this dashboard */\n public UserShares: UserSharePermission[] = [];\n\n /** All available users for sharing (excludes owner and already shared) */\n public AvailableUsers: MJUserEntity[] = [];\n\n /** All users in the system */\n private allUsers: MJUserEntity[] = [];\n\n /** Loading state */\n public IsLoading = false;\n\n /** Error message to display */\n public Error: string | null = null;\n\n /** Search filter for available users */\n public UserSearchFilter = '';\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['Visible'] && this.Visible && this.Dashboard) {\n this.resetDialog();\n this.loadData();\n }\n }\n\n /**\n * Reset dialog state\n */\n private resetDialog(): void {\n this.Error = null;\n this.IsLoading = false;\n this.UserShares = [];\n this.AvailableUsers = [];\n this.UserSearchFilter = '';\n }\n\n /**\n * Load existing shares and available users\n */\n private async loadData(): Promise<void> {\n if (!this.Dashboard) return;\n\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n const rv = new RunView();\n\n // Load all users\n const usersResult = await rv.RunView<MJUserEntity>({\n EntityName: 'MJ: Users',\n ExtraFilter: \"IsActive = 1\",\n OrderBy: 'Name',\n ResultType: 'entity_object'\n });\n\n if (usersResult.Success) {\n this.allUsers = usersResult.Results;\n }\n\n // Get existing shares from DashboardEngine\n const existingShares = DashboardEngine.Instance.GetDashboardShares(this.Dashboard.ID);\n\n // Build user shares list\n this.UserShares = [];\n for (const permission of existingShares) {\n const user = this.allUsers.find(u => u.ID === permission.UserID);\n if (user) {\n this.UserShares.push({\n Permission: permission,\n User: user,\n IsNew: false,\n MarkedForRemoval: false\n });\n }\n }\n\n // Update available users\n this.updateAvailableUsers();\n\n } catch (error) {\n console.error('Error loading share data:', error);\n this.Error = 'Failed to load sharing data. Please try again.';\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Update the list of available users (excludes owner and already shared)\n */\n private updateAvailableUsers(): void {\n if (!this.Dashboard) return;\n\n const sharedUserIds = new Set(\n this.UserShares\n .filter(s => !s.MarkedForRemoval)\n .map(s => s.User.ID)\n );\n\n // Exclude dashboard owner and already shared users\n this.AvailableUsers = this.allUsers.filter(user =>\n user.ID !== this.Dashboard!.UserID && !sharedUserIds.has(user.ID)\n );\n }\n\n /**\n * Get filtered available users based on search\n */\n public get FilteredAvailableUsers(): MJUserEntity[] {\n if (!this.UserSearchFilter.trim()) {\n return this.AvailableUsers.slice(0, 10); // Show first 10 by default\n }\n\n const filter = this.UserSearchFilter.toLowerCase();\n return this.AvailableUsers\n .filter(user =>\n user.Name.toLowerCase().includes(filter) ||\n (user.Email && user.Email.toLowerCase().includes(filter))\n )\n .slice(0, 10);\n }\n\n /**\n * Check if there are unsaved changes\n */\n public get HasChanges(): boolean {\n return this.UserShares.some(s => s.IsNew || s.MarkedForRemoval || s.Permission.Dirty);\n }\n\n /**\n * Add a user to the share list\n */\n public async addUserShare(user: MJUserEntity): Promise<void> {\n if (!this.Dashboard) return;\n\n const md = new Metadata();\n const permission = await md.GetEntityObject<MJDashboardPermissionEntity>('MJ: Dashboard Permissions');\n permission.NewRecord();\n permission.DashboardID = this.Dashboard.ID;\n permission.UserID = user.ID;\n permission.CanRead = true; // Default to read access\n permission.CanEdit = false;\n permission.CanDelete = false;\n permission.CanShare = false;\n\n this.UserShares.push({\n Permission: permission,\n User: user,\n IsNew: true,\n MarkedForRemoval: false\n });\n\n this.updateAvailableUsers();\n this.UserSearchFilter = '';\n this.cdr.detectChanges();\n }\n\n /**\n * Mark a share for removal\n */\n public removeUserShare(share: UserSharePermission): void {\n if (share.IsNew) {\n // If it's new, just remove from the array\n this.UserShares = this.UserShares.filter(s => s !== share);\n } else {\n // Otherwise mark for removal\n share.MarkedForRemoval = true;\n }\n\n this.updateAvailableUsers();\n this.cdr.detectChanges();\n }\n\n /**\n * Undo removal of a share\n */\n public undoRemove(share: UserSharePermission): void {\n share.MarkedForRemoval = false;\n this.updateAvailableUsers();\n this.cdr.detectChanges();\n }\n\n /**\n * Get shares that are not marked for removal\n */\n public get ActiveShares(): UserSharePermission[] {\n return this.UserShares.filter(s => !s.MarkedForRemoval);\n }\n\n /**\n * Get shares marked for removal\n */\n public get RemovedShares(): UserSharePermission[] {\n return this.UserShares.filter(s => s.MarkedForRemoval);\n }\n\n /**\n * Toggle CanEdit permission (also enables CanRead)\n */\n public toggleCanEdit(share: UserSharePermission): void {\n share.Permission.CanEdit = !share.Permission.CanEdit;\n if (share.Permission.CanEdit) {\n share.Permission.CanRead = true;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle CanDelete permission (also enables CanRead and CanEdit)\n */\n public toggleCanDelete(share: UserSharePermission): void {\n share.Permission.CanDelete = !share.Permission.CanDelete;\n if (share.Permission.CanDelete) {\n share.Permission.CanRead = true;\n share.Permission.CanEdit = true;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle CanShare permission (also enables CanRead)\n */\n public toggleCanShare(share: UserSharePermission): void {\n share.Permission.CanShare = !share.Permission.CanShare;\n if (share.Permission.CanShare) {\n share.Permission.CanRead = true;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Save all permission changes\n */\n public async onSave(): Promise<void> {\n if (!this.HasChanges) {\n this.onCancel();\n return;\n }\n\n this.IsLoading = true;\n this.Error = null;\n this.cdr.detectChanges();\n\n try {\n // Process removals first\n for (const share of this.UserShares.filter(s => s.MarkedForRemoval && !s.IsNew)) {\n const deleted = await share.Permission.Delete();\n if (!deleted) {\n throw new Error(`Failed to remove share for ${share.User.Name}`);\n }\n }\n\n // Process new and modified shares\n for (const share of this.UserShares.filter(s => !s.MarkedForRemoval && (s.IsNew || s.Permission.Dirty))) {\n const saved = await share.Permission.Save();\n if (!saved) {\n throw new Error(`Failed to save share for ${share.User.Name}: ${share.Permission.LatestResult?.Message}`);\n }\n }\n\n // Refresh the engine cache\n await DashboardEngine.Instance.Config(true);\n\n this.Result.emit({\n Action: 'save',\n Dashboard: this.Dashboard!\n });\n\n } catch (error) {\n console.error('Error saving shares:', error);\n this.Error = error instanceof Error ? error.message : 'Failed to save sharing settings.';\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Cancel and close the dialog\n */\n public onCancel(): void {\n this.Result.emit({ Action: 'cancel' });\n }\n\n /**\n * Get initials for a user (for avatar display)\n */\n public getUserInitials(user: MJUserEntity): string {\n const name = user.Name || user.Email || '?';\n const parts = name.split(' ');\n if (parts.length >= 2) {\n return (parts[0][0] + parts[1][0]).toUpperCase();\n }\n return name.substring(0, 2).toUpperCase();\n }\n}\n","@if (Visible) {\n <kendo-window\n [width]=\"560\"\n [minHeight]=\"200\"\n [resizable]=\"false\"\n [draggable]=\"true\"\n [keepContent]=\"true\"\n (close)=\"onCancel()\"\n class=\"mj-share-dialog-window\"\n kendoWindowContainer>\n <kendo-window-titlebar>\n <div class=\"share-dialog-header\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n <span>Share \"{{ Dashboard?.Name }}\"</span>\n </div>\n </kendo-window-titlebar>\n <div class=\"share-dialog-body\">\n <!-- Error Alert -->\n @if (Error) {\n <div class=\"share-alert share-alert-error\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>{{ Error }}</span>\n </div>\n }\n <!-- Add Users Section -->\n <div class=\"share-section\">\n <div class=\"share-search-box\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n placeholder=\"Add people by name or email...\"\n [(ngModel)]=\"UserSearchFilter\"\n [disabled]=\"IsLoading\">\n </div>\n <!-- Available Users Dropdown -->\n @if (FilteredAvailableUsers.length > 0) {\n <div class=\"share-user-dropdown\">\n @for (user of FilteredAvailableUsers; track user.ID) {\n <button type=\"button\" class=\"share-user-option\" (click)=\"addUserShare(user)\" [disabled]=\"IsLoading\">\n <span class=\"share-avatar\">{{ getUserInitials(user) }}</span>\n <span class=\"share-user-name\">{{ user.Name }}</span>\n @if (user.Email) {\n <span class=\"share-user-email\">{{ user.Email }}</span>\n }\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n </div>\n }\n @if (UserSearchFilter && FilteredAvailableUsers.length === 0) {\n <div class=\"share-no-results\">\n No users found matching \"{{ UserSearchFilter }}\"\n </div>\n }\n </div>\n <!-- People with Access -->\n <div class=\"share-section\">\n <div class=\"share-section-label\">People with access</div>\n <!-- Owner -->\n <div class=\"share-person share-owner\">\n <span class=\"share-avatar share-avatar-owner\">\n <i class=\"fa-solid fa-crown\"></i>\n </span>\n <div class=\"share-person-info\">\n <span class=\"share-person-name\">{{ Dashboard?.User || 'You' }}</span>\n <span class=\"share-person-role\">Owner</span>\n </div>\n </div>\n <!-- Shared Users -->\n @for (share of ActiveShares; track share.User.ID) {\n <div class=\"share-person\" [class.share-person-new]=\"share.IsNew\" [class.share-person-modified]=\"share.Permission.Dirty\">\n <span class=\"share-avatar\">{{ getUserInitials(share.User) }}</span>\n <div class=\"share-person-info\">\n <span class=\"share-person-name\">\n {{ share.User.Name }}\n @if (share.IsNew) {\n <span class=\"share-badge-new\">New</span>\n }\n </span>\n @if (share.User.Email) {\n <span class=\"share-person-email\">{{ share.User.Email }}</span>\n }\n </div>\n <div class=\"share-permissions\">\n <label class=\"share-perm\" title=\"Can view\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanRead\" disabled>\n <i class=\"fa-solid fa-eye\"></i>\n </label>\n <label class=\"share-perm\" title=\"Can edit\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanEdit\" (change)=\"toggleCanEdit(share)\">\n <i class=\"fa-solid fa-edit\"></i>\n </label>\n <label class=\"share-perm\" title=\"Can delete\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanDelete\" (change)=\"toggleCanDelete(share)\">\n <i class=\"fa-solid fa-trash\"></i>\n </label>\n <label class=\"share-perm\" title=\"Can share\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanShare\" (change)=\"toggleCanShare(share)\">\n <i class=\"fa-solid fa-share\"></i>\n </label>\n </div>\n <button type=\"button\" class=\"share-remove-btn\" (click)=\"removeUserShare(share)\" title=\"Remove\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n @if (ActiveShares.length === 0) {\n <div class=\"share-empty\">\n <i class=\"fa-solid fa-user-lock\"></i>\n <span>Not shared with anyone yet</span>\n </div>\n }\n <!-- Pending Removals -->\n @if (RemovedShares.length > 0) {\n <div class=\"share-removed-section\">\n @for (share of RemovedShares; track share.User.ID) {\n <div class=\"share-removed-item\">\n <span class=\"share-avatar share-avatar-removed\">{{ getUserInitials(share.User) }}</span>\n <span class=\"share-removed-name\">{{ share.User.Name }}</span>\n <button type=\"button\" class=\"share-undo-btn\" (click)=\"undoRemove(share)\">\n <i class=\"fa-solid fa-undo\"></i> Undo\n </button>\n </div>\n }\n </div>\n }\n </div>\n <!-- Footer -->\n <div class=\"share-footer\">\n @if (HasChanges) {\n <span class=\"share-changes-hint\">\n <i class=\"fa-solid fa-circle\"></i> Unsaved changes\n </span>\n }\n <div class=\"share-footer-actions\">\n <button type=\"button\" class=\"share-btn share-btn-secondary\" (click)=\"onCancel()\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"share-btn share-btn-primary\"\n (click)=\"onSave()\"\n [disabled]=\"!HasChanges || IsLoading\">\n @if (IsLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n Save\n }\n </button>\n </div>\n </div>\n </div>\n </kendo-window>\n}\n"]}
1
+ {"version":3,"file":"dashboard-share-dialog.component.js","sourceRoot":"","sources":["../../src/DashboardBrowser/dashboard-share-dialog.component.ts","../../src/DashboardBrowser/dashboard-share-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef, ViewEncapsulation } from '@angular/core';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJDashboardEntity, MJDashboardPermissionEntity, DashboardEngine, MJUserEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Represents a user share with their permissions\n */\nexport interface UserSharePermission {\n /** The permission entity (may be new or existing) */\n Permission: MJDashboardPermissionEntity;\n /** The user being shared with */\n User: MJUserEntity;\n /** Whether this is a newly added share */\n IsNew: boolean;\n /** Whether this share has been marked for removal */\n MarkedForRemoval: boolean;\n}\n\n/**\n * Result emitted when the dialog is closed\n */\nexport interface ShareDialogResult {\n /** The action taken: 'save' or 'cancel' */\n Action: 'save' | 'cancel';\n /** The dashboard that was shared (only on save) */\n Dashboard?: MJDashboardEntity;\n}\n\n/**\n * Dialog component for sharing dashboards with other users.\n * Allows setting granular permissions (CanRead, CanEdit, CanDelete, CanShare).\n */\n@Component({\n standalone: false,\n selector: 'mj-dashboard-share-dialog',\n templateUrl: './dashboard-share-dialog.component.html',\n styleUrls: ['./dashboard-share-dialog.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class DashboardShareDialogComponent implements OnChanges {\n @Input() Visible = false;\n @Input() Dashboard: MJDashboardEntity | null = null;\n @Output() Result = new EventEmitter<ShareDialogResult>();\n\n /** Current shares for this dashboard */\n public UserShares: UserSharePermission[] = [];\n\n /** All available users for sharing (excludes owner and already shared) */\n public AvailableUsers: MJUserEntity[] = [];\n\n /** All users in the system */\n private allUsers: MJUserEntity[] = [];\n\n /** Loading state */\n public IsLoading = false;\n\n /** Error message to display */\n public Error: string | null = null;\n\n /** Search filter for available users */\n public UserSearchFilter = '';\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['Visible'] && this.Visible && this.Dashboard) {\n this.resetDialog();\n this.loadData();\n }\n }\n\n /**\n * Reset dialog state\n */\n private resetDialog(): void {\n this.Error = null;\n this.IsLoading = false;\n this.UserShares = [];\n this.AvailableUsers = [];\n this.UserSearchFilter = '';\n }\n\n /**\n * Load existing shares and available users\n */\n private async loadData(): Promise<void> {\n if (!this.Dashboard) return;\n\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n const rv = new RunView();\n\n // Load all users\n const usersResult = await rv.RunView<MJUserEntity>({\n EntityName: 'MJ: Users',\n ExtraFilter: \"IsActive = 1\",\n OrderBy: 'Name',\n ResultType: 'entity_object'\n });\n\n if (usersResult.Success) {\n this.allUsers = usersResult.Results;\n }\n\n // Get existing shares from DashboardEngine\n const existingShares = DashboardEngine.Instance.GetDashboardShares(this.Dashboard.ID);\n\n // Build user shares list\n this.UserShares = [];\n for (const permission of existingShares) {\n const user = this.allUsers.find(u => UUIDsEqual(u.ID, permission.UserID));\n if (user) {\n this.UserShares.push({\n Permission: permission,\n User: user,\n IsNew: false,\n MarkedForRemoval: false\n });\n }\n }\n\n // Update available users\n this.updateAvailableUsers();\n\n } catch (error) {\n console.error('Error loading share data:', error);\n this.Error = 'Failed to load sharing data. Please try again.';\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Update the list of available users (excludes owner and already shared)\n */\n private updateAvailableUsers(): void {\n if (!this.Dashboard) return;\n\n const sharedUserIds = new Set(\n this.UserShares\n .filter(s => !s.MarkedForRemoval)\n .map(s => s.User.ID)\n );\n\n // Exclude dashboard owner and already shared users\n this.AvailableUsers = this.allUsers.filter(user =>\n !UUIDsEqual(user.ID, this.Dashboard!.UserID) && !sharedUserIds.has(user.ID)\n );\n }\n\n /**\n * Get filtered available users based on search\n */\n public get FilteredAvailableUsers(): MJUserEntity[] {\n if (!this.UserSearchFilter.trim()) {\n return this.AvailableUsers.slice(0, 10); // Show first 10 by default\n }\n\n const filter = this.UserSearchFilter.toLowerCase();\n return this.AvailableUsers\n .filter(user =>\n user.Name.toLowerCase().includes(filter) ||\n (user.Email && user.Email.toLowerCase().includes(filter))\n )\n .slice(0, 10);\n }\n\n /**\n * Check if there are unsaved changes\n */\n public get HasChanges(): boolean {\n return this.UserShares.some(s => s.IsNew || s.MarkedForRemoval || s.Permission.Dirty);\n }\n\n /**\n * Add a user to the share list\n */\n public async addUserShare(user: MJUserEntity): Promise<void> {\n if (!this.Dashboard) return;\n\n const md = new Metadata();\n const permission = await md.GetEntityObject<MJDashboardPermissionEntity>('MJ: Dashboard Permissions');\n permission.NewRecord();\n permission.DashboardID = this.Dashboard.ID;\n permission.UserID = user.ID;\n permission.CanRead = true; // Default to read access\n permission.CanEdit = false;\n permission.CanDelete = false;\n permission.CanShare = false;\n\n this.UserShares.push({\n Permission: permission,\n User: user,\n IsNew: true,\n MarkedForRemoval: false\n });\n\n this.updateAvailableUsers();\n this.UserSearchFilter = '';\n this.cdr.detectChanges();\n }\n\n /**\n * Mark a share for removal\n */\n public removeUserShare(share: UserSharePermission): void {\n if (share.IsNew) {\n // If it's new, just remove from the array\n this.UserShares = this.UserShares.filter(s => s !== share);\n } else {\n // Otherwise mark for removal\n share.MarkedForRemoval = true;\n }\n\n this.updateAvailableUsers();\n this.cdr.detectChanges();\n }\n\n /**\n * Undo removal of a share\n */\n public undoRemove(share: UserSharePermission): void {\n share.MarkedForRemoval = false;\n this.updateAvailableUsers();\n this.cdr.detectChanges();\n }\n\n /**\n * Get shares that are not marked for removal\n */\n public get ActiveShares(): UserSharePermission[] {\n return this.UserShares.filter(s => !s.MarkedForRemoval);\n }\n\n /**\n * Get shares marked for removal\n */\n public get RemovedShares(): UserSharePermission[] {\n return this.UserShares.filter(s => s.MarkedForRemoval);\n }\n\n /**\n * Toggle CanEdit permission (also enables CanRead)\n */\n public toggleCanEdit(share: UserSharePermission): void {\n share.Permission.CanEdit = !share.Permission.CanEdit;\n if (share.Permission.CanEdit) {\n share.Permission.CanRead = true;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle CanDelete permission (also enables CanRead and CanEdit)\n */\n public toggleCanDelete(share: UserSharePermission): void {\n share.Permission.CanDelete = !share.Permission.CanDelete;\n if (share.Permission.CanDelete) {\n share.Permission.CanRead = true;\n share.Permission.CanEdit = true;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle CanShare permission (also enables CanRead)\n */\n public toggleCanShare(share: UserSharePermission): void {\n share.Permission.CanShare = !share.Permission.CanShare;\n if (share.Permission.CanShare) {\n share.Permission.CanRead = true;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Save all permission changes\n */\n public async onSave(): Promise<void> {\n if (!this.HasChanges) {\n this.onCancel();\n return;\n }\n\n this.IsLoading = true;\n this.Error = null;\n this.cdr.detectChanges();\n\n try {\n // Process removals first\n for (const share of this.UserShares.filter(s => s.MarkedForRemoval && !s.IsNew)) {\n const deleted = await share.Permission.Delete();\n if (!deleted) {\n throw new Error(`Failed to remove share for ${share.User.Name}`);\n }\n }\n\n // Process new and modified shares\n for (const share of this.UserShares.filter(s => !s.MarkedForRemoval && (s.IsNew || s.Permission.Dirty))) {\n const saved = await share.Permission.Save();\n if (!saved) {\n throw new Error(`Failed to save share for ${share.User.Name}: ${share.Permission.LatestResult?.Message}`);\n }\n }\n\n // Refresh the engine cache\n await DashboardEngine.Instance.Config(true);\n\n this.Result.emit({\n Action: 'save',\n Dashboard: this.Dashboard!\n });\n\n } catch (error) {\n console.error('Error saving shares:', error);\n this.Error = error instanceof Error ? error.message : 'Failed to save sharing settings.';\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Cancel and close the dialog\n */\n public onCancel(): void {\n this.Result.emit({ Action: 'cancel' });\n }\n\n /**\n * Get initials for a user (for avatar display)\n */\n public getUserInitials(user: MJUserEntity): string {\n const name = user.Name || user.Email || '?';\n const parts = name.split(' ');\n if (parts.length >= 2) {\n return (parts[0][0] + parts[1][0]).toUpperCase();\n }\n return name.substring(0, 2).toUpperCase();\n }\n}\n","@if (Visible) {\n <kendo-window\n [width]=\"560\"\n [minHeight]=\"200\"\n [resizable]=\"false\"\n [draggable]=\"true\"\n [keepContent]=\"true\"\n (close)=\"onCancel()\"\n class=\"mj-share-dialog-window\"\n kendoWindowContainer>\n <kendo-window-titlebar>\n <div class=\"share-dialog-header\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n <span>Share \"{{ Dashboard?.Name }}\"</span>\n </div>\n </kendo-window-titlebar>\n <div class=\"share-dialog-body\">\n <!-- Error Alert -->\n @if (Error) {\n <div class=\"share-alert share-alert-error\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>{{ Error }}</span>\n </div>\n }\n <!-- Add Users Section -->\n <div class=\"share-section\">\n <div class=\"share-search-box\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n placeholder=\"Add people by name or email...\"\n [(ngModel)]=\"UserSearchFilter\"\n [disabled]=\"IsLoading\">\n </div>\n <!-- Available Users Dropdown -->\n @if (FilteredAvailableUsers.length > 0) {\n <div class=\"share-user-dropdown\">\n @for (user of FilteredAvailableUsers; track user.ID) {\n <button type=\"button\" class=\"share-user-option\" (click)=\"addUserShare(user)\" [disabled]=\"IsLoading\">\n <span class=\"share-avatar\">{{ getUserInitials(user) }}</span>\n <span class=\"share-user-name\">{{ user.Name }}</span>\n @if (user.Email) {\n <span class=\"share-user-email\">{{ user.Email }}</span>\n }\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n </div>\n }\n @if (UserSearchFilter && FilteredAvailableUsers.length === 0) {\n <div class=\"share-no-results\">\n No users found matching \"{{ UserSearchFilter }}\"\n </div>\n }\n </div>\n <!-- People with Access -->\n <div class=\"share-section\">\n <div class=\"share-section-label\">People with access</div>\n <!-- Owner -->\n <div class=\"share-person share-owner\">\n <span class=\"share-avatar share-avatar-owner\">\n <i class=\"fa-solid fa-crown\"></i>\n </span>\n <div class=\"share-person-info\">\n <span class=\"share-person-name\">{{ Dashboard?.User || 'You' }}</span>\n <span class=\"share-person-role\">Owner</span>\n </div>\n </div>\n <!-- Shared Users -->\n @for (share of ActiveShares; track share.User.ID) {\n <div class=\"share-person\" [class.share-person-new]=\"share.IsNew\" [class.share-person-modified]=\"share.Permission.Dirty\">\n <span class=\"share-avatar\">{{ getUserInitials(share.User) }}</span>\n <div class=\"share-person-info\">\n <span class=\"share-person-name\">\n {{ share.User.Name }}\n @if (share.IsNew) {\n <span class=\"share-badge-new\">New</span>\n }\n </span>\n @if (share.User.Email) {\n <span class=\"share-person-email\">{{ share.User.Email }}</span>\n }\n </div>\n <div class=\"share-permissions\">\n <label class=\"share-perm\" title=\"Can view\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanRead\" disabled>\n <i class=\"fa-solid fa-eye\"></i>\n </label>\n <label class=\"share-perm\" title=\"Can edit\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanEdit\" (change)=\"toggleCanEdit(share)\">\n <i class=\"fa-solid fa-edit\"></i>\n </label>\n <label class=\"share-perm\" title=\"Can delete\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanDelete\" (change)=\"toggleCanDelete(share)\">\n <i class=\"fa-solid fa-trash\"></i>\n </label>\n <label class=\"share-perm\" title=\"Can share\">\n <input type=\"checkbox\" [checked]=\"share.Permission.CanShare\" (change)=\"toggleCanShare(share)\">\n <i class=\"fa-solid fa-share\"></i>\n </label>\n </div>\n <button type=\"button\" class=\"share-remove-btn\" (click)=\"removeUserShare(share)\" title=\"Remove\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n @if (ActiveShares.length === 0) {\n <div class=\"share-empty\">\n <i class=\"fa-solid fa-user-lock\"></i>\n <span>Not shared with anyone yet</span>\n </div>\n }\n <!-- Pending Removals -->\n @if (RemovedShares.length > 0) {\n <div class=\"share-removed-section\">\n @for (share of RemovedShares; track share.User.ID) {\n <div class=\"share-removed-item\">\n <span class=\"share-avatar share-avatar-removed\">{{ getUserInitials(share.User) }}</span>\n <span class=\"share-removed-name\">{{ share.User.Name }}</span>\n <button type=\"button\" class=\"share-undo-btn\" (click)=\"undoRemove(share)\">\n <i class=\"fa-solid fa-undo\"></i> Undo\n </button>\n </div>\n }\n </div>\n }\n </div>\n <!-- Footer -->\n <div class=\"share-footer\">\n @if (HasChanges) {\n <span class=\"share-changes-hint\">\n <i class=\"fa-solid fa-circle\"></i> Unsaved changes\n </span>\n }\n <div class=\"share-footer-actions\">\n <button type=\"button\" class=\"share-btn share-btn-secondary\" (click)=\"onCancel()\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"share-btn share-btn-primary\"\n (click)=\"onSave()\"\n [disabled]=\"!HasChanges || IsLoading\">\n @if (IsLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n Save\n }\n </button>\n </div>\n </div>\n </div>\n </kendo-window>\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"view-selector.component.d.ts","sourceRoot":"","sources":["../../../../src/DataExplorer/components/view-selector/view-selector.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"view-selector.component.d.ts","sourceRoot":"","sources":["../../../../src/DataExplorer/components/view-selector/view-selector.component.ts"],"names":[],"mappings":"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"}