@memberjunction/ng-dashboards 5.30.0 → 5.31.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.
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +4 -4
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts +2 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +8 -6
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +2 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +6 -5
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +2 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +6 -5
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +2 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +6 -5
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts +2 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +7 -4
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +3 -2
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.js +10 -6
- package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +2 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +6 -5
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +2 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +6 -5
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +55 -52
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +15 -15
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +4 -3
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +2 -2
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +2 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +10 -8
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +2 -2
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts +2 -1
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js +13 -10
- package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +1181 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -0
- package/dist/AI/components/tags/tags-resource.component.js +7487 -0
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +25 -21
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/AI/index.d.ts +1 -0
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +5 -0
- package/dist/AI/index.js.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js +12 -4
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.d.ts +3 -2
- package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +5 -4
- package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.d.ts +2 -1
- package/dist/APIKeys/api-key-create-dialog.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.js +5 -5
- package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.d.ts +3 -2
- package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js +11 -10
- package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-list.component.d.ts +2 -1
- package/dist/APIKeys/api-key-list.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-list.component.js +6 -5
- package/dist/APIKeys/api-key-list.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +4 -4
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.d.ts +3 -2
- package/dist/APIKeys/api-scopes-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.js +8 -6
- package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
- package/dist/APIKeys/api-usage-panel.component.d.ts +3 -2
- package/dist/APIKeys/api-usage-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-usage-panel.component.js +10 -8
- package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
- package/dist/Actions/components/actions-list-view.component.d.ts +2 -1
- package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-list-view.component.js +6 -5
- package/dist/Actions/components/actions-list-view.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +2 -2
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.d.ts +2 -1
- package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +6 -5
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +1 -1
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.d.ts +2 -1
- package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.js +6 -4
- package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-action-panel.component.d.ts +2 -1
- package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/new-action-panel.component.js +7 -5
- package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.d.ts +2 -1
- package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.js +7 -5
- package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +4 -4
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +1 -1
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +1 -1
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +3 -3
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +1 -1
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +3 -3
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +5 -4
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +2 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +6 -4
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +11 -2
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +61 -27
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +4 -2
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +19 -11
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts +4 -2
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +11 -3
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +10 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.js +18 -9
- package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts +11 -1
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -1
- package/dist/ComponentStudio/services/component-studio-state.service.js +23 -3
- package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
- package/dist/ComponentStudio/services/component-version.service.d.ts +6 -1
- package/dist/ComponentStudio/services/component-version.service.d.ts.map +1 -1
- package/dist/ComponentStudio/services/component-version.service.js +16 -6
- package/dist/ComponentStudio/services/component-version.service.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.js +1 -1
- package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +13 -13
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-adapter.d.ts +4 -0
- package/dist/DashboardBrowser/dashboard-share-adapter.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-adapter.js +5 -2
- package/dist/DashboardBrowser/dashboard-share-adapter.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +3 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js +9 -4
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +3 -2
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +7 -6
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +3 -2
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +6 -5
- package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +10 -9
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.d.ts +6 -1
- package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.js +15 -5
- package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
- package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.d.ts +64 -0
- package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.js +400 -0
- package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.d.ts +42 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.js +232 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.d.ts +14 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.js +38 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.d.ts +24 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.js +77 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.d.ts +88 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.js +404 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.d.ts +12 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.js +116 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +55 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +204 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts +61 -0
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/entity-list.component.js +485 -0
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/modify/database-modify.component.d.ts +52 -0
- package/dist/DatabaseDesigner/components/modify/database-modify.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/modify/database-modify.component.js +320 -0
- package/dist/DatabaseDesigner/components/modify/database-modify.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.d.ts +79 -0
- package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.js +378 -0
- package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.d.ts +85 -0
- package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.js +429 -0
- package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.d.ts +58 -0
- package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.js +333 -0
- package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.d.ts +36 -0
- package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.js +345 -0
- package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.d.ts +13 -0
- package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.js +81 -0
- package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.js.map +1 -0
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +30 -0
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -0
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +131 -0
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -0
- package/dist/DatabaseDesigner/database-designer-erd.d.ts +19 -0
- package/dist/DatabaseDesigner/database-designer-erd.d.ts.map +1 -0
- package/dist/DatabaseDesigner/database-designer-erd.js +84 -0
- package/dist/DatabaseDesigner/database-designer-erd.js.map +1 -0
- package/dist/DatabaseDesigner/database-designer.types.d.ts +167 -0
- package/dist/DatabaseDesigner/database-designer.types.d.ts.map +1 -0
- package/dist/DatabaseDesigner/database-designer.types.js +26 -0
- package/dist/DatabaseDesigner/database-designer.types.js.map +1 -0
- package/dist/DatabaseDesigner/services/database-designer.engine.d.ts +94 -0
- package/dist/DatabaseDesigner/services/database-designer.engine.d.ts.map +1 -0
- package/dist/DatabaseDesigner/services/database-designer.engine.js +392 -0
- package/dist/DatabaseDesigner/services/database-designer.engine.js.map +1 -0
- package/dist/DatabaseDesigner/services/database-designer.service.d.ts +78 -0
- package/dist/DatabaseDesigner/services/database-designer.service.d.ts.map +1 -0
- package/dist/DatabaseDesigner/services/database-designer.service.js +273 -0
- package/dist/DatabaseDesigner/services/database-designer.service.js.map +1 -0
- package/dist/DatabaseDesigner/services/entity-wizard-state.service.d.ts +79 -0
- package/dist/DatabaseDesigner/services/entity-wizard-state.service.d.ts.map +1 -0
- package/dist/DatabaseDesigner/services/entity-wizard-state.service.js +204 -0
- package/dist/DatabaseDesigner/services/entity-wizard-state.service.js.map +1 -0
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +2 -2
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/action-pin-config-dialog.component.d.ts +2 -1
- package/dist/Home/action-pin-config-dialog.component.d.ts.map +1 -1
- package/dist/Home/action-pin-config-dialog.component.js +6 -4
- package/dist/Home/action-pin-config-dialog.component.js.map +1 -1
- package/dist/Home/action-pin-runner-dialog.component.d.ts +2 -1
- package/dist/Home/action-pin-runner-dialog.component.d.ts.map +1 -1
- package/dist/Home/action-pin-runner-dialog.component.js +5 -4
- package/dist/Home/action-pin-runner-dialog.component.js.map +1 -1
- package/dist/Home/home-application.d.ts.map +1 -1
- package/dist/Home/home-application.js +10 -12
- package/dist/Home/home-application.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +3 -3
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +1 -0
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +11 -10
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +2 -2
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +1 -0
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +1 -0
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +5 -4
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/services/integration-data.service.d.ts +5 -1
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +27 -19
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +6 -6
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +8 -6
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +6 -6
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +3 -3
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +6 -6
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +4 -4
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +6 -6
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +11 -10
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/services/list-set-operations.service.d.ts +5 -0
- package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
- package/dist/Lists/services/list-set-operations.service.js +11 -3
- package/dist/Lists/services/list-set-operations.service.js.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.d.ts +2 -1
- package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js +8 -6
- package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.d.ts +2 -1
- package/dist/MCP/components/mcp-server-dialog.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +7 -5
- package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +12 -12
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/Permissions/permissions-shared.d.ts +3 -3
- package/dist/Permissions/permissions-shared.d.ts.map +1 -1
- package/dist/Permissions/permissions-shared.js +5 -5
- package/dist/Permissions/permissions-shared.js.map +1 -1
- package/dist/Permissions/resource-access-resource.component.js +1 -1
- package/dist/Permissions/resource-access-resource.component.js.map +1 -1
- package/dist/Permissions/user-access-resource.component.js +1 -2
- package/dist/Permissions/user-access-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +1 -0
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +5 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.js +21 -13
- package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +2 -2
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +2 -1
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +9 -7
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/services/testing-instrumentation.service.d.ts +6 -1
- package/dist/Testing/services/testing-instrumentation.service.d.ts.map +1 -1
- package/dist/Testing/services/testing-instrumentation.service.js +21 -11
- package/dist/Testing/services/testing-instrumentation.service.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +3 -1
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +15 -11
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +5 -5
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +1 -2
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +3 -3
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +35 -34
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +6 -0
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/module.d.ts +13 -12
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +7 -0
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +3 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -1
- package/dist/public-api.js.map +1 -1
- package/dist/shared/entity-field-display.d.ts +4 -3
- package/dist/shared/entity-field-display.d.ts.map +1 -1
- package/dist/shared/entity-field-display.js +9 -9
- package/dist/shared/entity-field-display.js.map +1 -1
- package/package.json +52 -51
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials-dashboard.component.js","sourceRoot":"","sources":["../../src/Credentials/credentials-dashboard.component.ts","../../src/Credentials/credentials-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, AfterViewInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { RunView } from '@memberjunction/core';\n\ninterface CredentialsDashboardState {\n activeTab: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-credentials-dashboard',\n templateUrl: './credentials-dashboard.component.html',\n styleUrls: ['./credentials-dashboard.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\n@RegisterClass(BaseDashboard, 'CredentialsDashboard')\nexport class CredentialsDashboardComponent extends BaseDashboard implements AfterViewInit, OnDestroy {\n public isLoading = false;\n public activeTab = 'overview';\n public selectedIndex = 0;\n\n // Counts for badges\n public credentialCount = 0;\n public typeCount = 0;\n\n // Track visited tabs for lazy loading\n private visitedTabs = new Set<string>();\n\n // Navigation items\n public navigationItems: string[] = ['overview', 'credentials', 'types', 'categories', 'audit'];\n\n public tabLabels: Record<string, string> = {\n 'overview': 'Overview',\n 'credentials': 'Credentials',\n 'types': 'Credential Types',\n 'categories': 'Categories',\n 'audit': 'Audit Trail'\n };\n\n private stateChangeSubject = new Subject<CredentialsDashboardState>();\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n this.setupStateManagement();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return \"Credentials\";\n }\n\n ngAfterViewInit(): void {\n this.visitedTabs.add(this.activeTab);\n this.loadCounts();\n this.emitStateChange();\n this.cdr.detectChanges();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.stateChangeSubject.complete();\n }\n\n private async loadCounts(): Promise<void> {\n try {\n const rv = new RunView();\n\n // Load credential count\n const credResult = await rv.RunView({\n EntityName: 'MJ: Credentials',\n ExtraFilter: 'IsActive = 1',\n ResultType: 'count_only'\n });\n if (credResult.Success) {\n this.credentialCount = credResult.RowCount;\n }\n\n // Load type count\n const typeResult = await rv.RunView({\n EntityName: 'MJ: Credential Types',\n ResultType: 'count_only'\n });\n if (typeResult.Success) {\n this.typeCount = typeResult.RowCount;\n }\n\n this.cdr.markForCheck();\n } catch (error) {\n console.error('Error loading counts:', error);\n }\n }\n\n public onTabChange(tabId: string): void {\n this.activeTab = tabId;\n const index = this.navigationItems.indexOf(tabId);\n\n this.selectedIndex = index >= 0 ? index : 0;\n\n setTimeout(() => {\n SharedService.Instance.InvokeManualResize();\n }, 100);\n\n this.visitedTabs.add(tabId);\n this.emitStateChange();\n this.cdr.markForCheck();\n }\n\n public hasVisited(tabId: string): boolean {\n return this.visitedTabs.has(tabId);\n }\n\n private setupStateManagement(): void {\n this.stateChangeSubject.pipe(\n debounceTime(50)\n ).subscribe(state => {\n this.UserStateChanged.emit(state);\n });\n }\n\n private emitStateChange(): void {\n const state: CredentialsDashboardState = {\n activeTab: this.activeTab\n };\n\n this.stateChangeSubject.next(state);\n }\n\n public loadUserState(state: Partial<CredentialsDashboardState>): void {\n if (state.activeTab) {\n this.activeTab = state.activeTab;\n const index = this.navigationItems.indexOf(state.activeTab);\n this.selectedIndex = index >= 0 ? index : 0;\n this.visitedTabs.add(state.activeTab);\n }\n\n this.cdr.markForCheck();\n }\n\n initDashboard(): void {\n try {\n this.isLoading = true;\n } catch (error) {\n console.error('Error initializing Credentials dashboard:', error);\n this.Error.emit(new Error('Failed to initialize Credentials dashboard. Please try again.'));\n } finally {\n this.isLoading = false;\n }\n }\n\n loadData(): void {\n if (this.Config?.userState) {\n setTimeout(() => {\n if (this.Config?.userState) {\n this.loadUserState(this.Config.userState);\n }\n }, 0);\n }\n\n this.NotifyLoadComplete();\n }\n\n public getCurrentTabLabel(): string {\n return this.tabLabels[this.activeTab] || 'Credential Management';\n }\n}\n","<div class=\"credentials-dashboard-container\">\n <div class=\"dashboard-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-key\"></i>\n <span>Credential Management</span>\n </div>\n <div class=\"header-actions\">\n <div class=\"security-badge\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span>Encrypted</span>\n </div>\n <span class=\"tab-label\">{{getCurrentTabLabel()}}</span>\n </div>\n </div>\n\n <div class=\"dashboard-content\">\n <div class=\"sidebar\">\n <div class=\"sidebar-section\">\n <div class=\"sidebar-section-title\">Dashboard</div>\n </div>\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'overview'\" (click)=\"onTabChange('overview')\">\n <i class=\"fa-solid fa-chart-pie\"></i>\n <span>Overview</span>\n </div>\n\n <div class=\"sidebar-section\">\n <div class=\"sidebar-section-title\">Management</div>\n </div>\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'credentials'\" (click)=\"onTabChange('credentials')\">\n <i class=\"fa-solid fa-key\"></i>\n <span>Credentials</span>\n @if (credentialCount > 0) {\n <span class=\"badge\">{{credentialCount}}</span>\n }\n </div>\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'types'\" (click)=\"onTabChange('types')\">\n <i class=\"fa-solid fa-cubes\"></i>\n <span>Types</span>\n @if (typeCount > 0) {\n <span class=\"badge\">{{typeCount}}</span>\n }\n </div>\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'categories'\" (click)=\"onTabChange('categories')\">\n <i class=\"fa-solid fa-folder-tree\"></i>\n <span>Categories</span>\n </div>\n\n <div class=\"sidebar-section\">\n <div class=\"sidebar-section-title\">Security</div>\n </div>\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'audit'\" (click)=\"onTabChange('audit')\">\n <i class=\"fa-solid fa-clipboard-list\"></i>\n <span>Audit Trail</span>\n </div>\n </div>\n\n <div class=\"main-content\">\n <div class=\"tab-container\">\n @switch (activeTab) {\n <!-- Overview Tab -->\n @case ('overview') {\n <div class=\"tab-content\">\n <mj-credentials-overview-resource></mj-credentials-overview-resource>\n </div>\n }\n <!-- Credentials Tab -->\n @case ('credentials') {\n <div class=\"tab-content\">\n <mj-credentials-list-resource></mj-credentials-list-resource>\n </div>\n }\n <!-- Types Tab -->\n @case ('types') {\n <div class=\"tab-content\">\n <mj-credentials-types-resource></mj-credentials-types-resource>\n </div>\n }\n <!-- Categories Tab -->\n @case ('categories') {\n <div class=\"tab-content\">\n <mj-credentials-categories-resource></mj-credentials-categories-resource>\n </div>\n }\n <!-- Audit Trail Tab -->\n @case ('audit') {\n <div class=\"tab-content\">\n <mj-credentials-audit-resource></mj-credentials-audit-resource>\n </div>\n }\n }\n </div>\n </div>\n </div>\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"credentials-dashboard.component.js","sourceRoot":"","sources":["../../src/Credentials/credentials-dashboard.component.ts","../../src/Credentials/credentials-dashboard.component.html"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAA+C,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAChH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;;;;;;;;ICyBrC,gCAAoB;IAAA,YAAmB;IAAA,iBAAO;;;IAA1B,cAAmB;IAAnB,4CAAmB;;;IAOvC,gCAAoB;IAAA,YAAa;IAAA,iBAAO;;;IAApB,cAAa;IAAb,sCAAa;;;IAsB/B,+BAAyB;IACvB,mDAAqE;IACvE,iBAAM;;;IAIN,+BAAyB;IACvB,+CAA6D;IAC/D,iBAAM;;;IAIN,+BAAyB;IACvB,gDAA+D;IACjE,iBAAM;;;IAIN,+BAAyB;IACvB,qDAAyE;IAC3E,iBAAM;;;IAIN,+BAAyB;IACvB,gDAA+D;IACjE,iBAAM;;ADlEX,IAAM,6BAA6B,GAAnC,MAAM,6BAA8B,SAAQ,aAAa;IAyBxC;IAxBb,SAAS,GAAG,KAAK,CAAC;IAClB,SAAS,GAAG,UAAU,CAAC;IACvB,aAAa,GAAG,CAAC,CAAC;IAEzB,oBAAoB;IACb,eAAe,GAAG,CAAC,CAAC;IACpB,SAAS,GAAG,CAAC,CAAC;IAErB,sCAAsC;IAC9B,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IAExC,mBAAmB;IACZ,eAAe,GAAa,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAExF,SAAS,GAA2B;QACvC,UAAU,EAAE,UAAU;QACtB,aAAa,EAAE,aAAa;QAC5B,OAAO,EAAE,kBAAkB;QAC3B,YAAY,EAAE,YAAY;QAC1B,OAAO,EAAE,aAAa;KACzB,CAAC;IAEM,kBAAkB,GAAG,IAAI,OAAO,EAA6B,CAAC;IAEtE,YAAoB,GAAsB;QACtC,KAAK,EAAE,CAAC;QADQ,QAAG,GAAH,GAAG,CAAmB;QAEtC,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QAC3C,OAAO,aAAa,CAAC;IACzB,CAAC;IAED,eAAe;QACX,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,WAAW;QACP,KAAK,CAAC,WAAW,EAAE,CAAC;QACpB,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC;IACvC,CAAC;IAEO,KAAK,CAAC,UAAU;QACpB,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAE5D,wBAAwB;YACxB,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC;gBAChC,UAAU,EAAE,iBAAiB;gBAC7B,WAAW,EAAE,cAAc;gBAC3B,UAAU,EAAE,YAAY;aAC3B,CAAC,CAAC;YACH,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACrB,IAAI,CAAC,eAAe,GAAG,UAAU,CAAC,QAAQ,CAAC;YAC/C,CAAC;YAED,kBAAkB;YAClB,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC;gBAChC,UAAU,EAAE,sBAAsB;gBAClC,UAAU,EAAE,YAAY;aAC3B,CAAC,CAAC;YACH,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACrB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC;YACzC,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;IACL,CAAC;IAEM,WAAW,CAAC,KAAa;QAC5B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAElD,IAAI,CAAC,aAAa,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5C,UAAU,CAAC,GAAG,EAAE;YACZ,aAAa,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QAChD,CAAC,EAAE,GAAG,CAAC,CAAC;QAER,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEM,UAAU,CAAC,KAAa;QAC3B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAEO,oBAAoB;QACxB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CACxB,YAAY,CAAC,EAAE,CAAC,CACnB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YAChB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,eAAe;QACnB,MAAM,KAAK,GAA8B;YACrC,SAAS,EAAE,IAAI,CAAC,SAAS;SAC5B,CAAC;QAEF,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAEM,aAAa,CAAC,KAAyC;QAC1D,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAClB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;YACjC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC5D,IAAI,CAAC,aAAa,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,aAAa;QACT,IAAI,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC,CAAC;YAClE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC,CAAC;QAChG,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAC3B,CAAC;IACL,CAAC;IAED,QAAQ;QACJ,IAAI,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;YACzB,UAAU,CAAC,GAAG,EAAE;gBACZ,IAAI,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;oBACzB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC9C,CAAC;YACL,CAAC,EAAE,CAAC,CAAC,CAAC;QACV,CAAC;QAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAEM,kBAAkB;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,uBAAuB,CAAC;IACrE,CAAC;uHAlJQ,6BAA6B;6DAA7B,6BAA6B;YCnBtC,AADF,AADF,8BAA6C,aACb,aACF;YACxB,uBAA+B;YAC/B,4BAAM;YAAA,qCAAqB;YAC7B,AAD6B,iBAAO,EAC9B;YAEJ,AADF,8BAA4B,aACE;YAC1B,uBAAyC;YACzC,4BAAM;YAAA,0BAAS;YACjB,AADiB,iBAAO,EAClB;YACN,gCAAwB;YAAA,aAAwB;YAEpD,AADE,AADkD,iBAAO,EACnD,EACF;YAKA,AADF,AADF,AADF,+BAA+B,cACR,eACU,eACQ;YAAA,0BAAS;YAC9C,AAD8C,iBAAM,EAC9C;YACN,gCAAoG;YAAlC,wGAAS,gBAAY,UAAU,CAAC,IAAC;YACjG,yBAAqC;YACrC,6BAAM;YAAA,yBAAQ;YAChB,AADgB,iBAAO,EACjB;YAGJ,AADF,gCAA6B,eACQ;YAAA,2BAAU;YAC/C,AAD+C,iBAAM,EAC/C;YACN,gCAA0G;YAArC,wGAAS,gBAAY,aAAa,CAAC,IAAC;YACvG,wBAA+B;YAC/B,6BAAM;YAAA,4BAAW;YAAA,iBAAO;YACxB,mGAA2B;YAG7B,iBAAM;YACN,gCAA8F;YAA/B,wGAAS,gBAAY,OAAO,CAAC,IAAC;YAC3F,yBAAiC;YACjC,6BAAM;YAAA,sBAAK;YAAA,iBAAO;YAClB,mGAAqB;YAGvB,iBAAM;YACN,gCAAwG;YAApC,wGAAS,gBAAY,YAAY,CAAC,IAAC;YACrG,yBAAuC;YACvC,6BAAM;YAAA,2BAAU;YAClB,AADkB,iBAAO,EACnB;YAGJ,AADF,gCAA6B,eACQ;YAAA,yBAAQ;YAC7C,AAD6C,iBAAM,EAC7C;YACN,gCAA8F;YAA/B,wGAAS,gBAAY,OAAO,CAAC,IAAC;YAC3F,yBAA0C;YAC1C,6BAAM;YAAA,4BAAW;YAErB,AADE,AADmB,iBAAO,EACpB,EACF;YAGJ,AADF,gCAA0B,eACG;YA2BvB,AANA,AANA,AANA,AANA,2FAAoB,qEAMG,qEAMN,qEAMK,qEAML;YAS3B,AADE,AADE,AADE,iBAAM,EACF,EACF,EACF;;;YAlFwB,gBAAwB;YAAxB,8CAAwB;YAS1B,eAA2C;YAA3C,wDAA2C;YAQ3C,eAA8C;YAA9C,2DAA8C;YAGlE,eAEC;YAFD,mDAEC;YAEmB,cAAwC;YAAxC,qDAAwC;YAG5D,eAEC;YAFD,6CAEC;YAEmB,cAA6C;YAA7C,0DAA6C;YAQ7C,eAAwC;YAAxC,qDAAwC;YAQ5D,eA+BC;YA/BD,+CAAA,UAAU,oBAAV,aAAa,oBAAb,OAAO,oBAAP,YAAY,oBAAZ,OAAO,WA+BN;;;ADpEI,6BAA6B;IADzC,aAAa,CAAC,aAAa,EAAE,sBAAsB,CAAC;GACxC,6BAA6B,CAmJzC;;iFAnJY,6BAA6B;cARzC,SAAS;6BACI,KAAK,YACL,0BAA0B,mBAGnB,uBAAuB,CAAC,MAAM;;kFAGtC,6BAA6B","sourcesContent":["import { Component, AfterViewInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { RunView } from '@memberjunction/core';\n\ninterface CredentialsDashboardState {\n activeTab: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-credentials-dashboard',\n templateUrl: './credentials-dashboard.component.html',\n styleUrls: ['./credentials-dashboard.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\n@RegisterClass(BaseDashboard, 'CredentialsDashboard')\nexport class CredentialsDashboardComponent extends BaseDashboard implements AfterViewInit, OnDestroy {\n public isLoading = false;\n public activeTab = 'overview';\n public selectedIndex = 0;\n\n // Counts for badges\n public credentialCount = 0;\n public typeCount = 0;\n\n // Track visited tabs for lazy loading\n private visitedTabs = new Set<string>();\n\n // Navigation items\n public navigationItems: string[] = ['overview', 'credentials', 'types', 'categories', 'audit'];\n\n public tabLabels: Record<string, string> = {\n 'overview': 'Overview',\n 'credentials': 'Credentials',\n 'types': 'Credential Types',\n 'categories': 'Categories',\n 'audit': 'Audit Trail'\n };\n\n private stateChangeSubject = new Subject<CredentialsDashboardState>();\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n this.setupStateManagement();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return \"Credentials\";\n }\n\n ngAfterViewInit(): void {\n this.visitedTabs.add(this.activeTab);\n this.loadCounts();\n this.emitStateChange();\n this.cdr.detectChanges();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.stateChangeSubject.complete();\n }\n\n private async loadCounts(): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n // Load credential count\n const credResult = await rv.RunView({\n EntityName: 'MJ: Credentials',\n ExtraFilter: 'IsActive = 1',\n ResultType: 'count_only'\n });\n if (credResult.Success) {\n this.credentialCount = credResult.RowCount;\n }\n\n // Load type count\n const typeResult = await rv.RunView({\n EntityName: 'MJ: Credential Types',\n ResultType: 'count_only'\n });\n if (typeResult.Success) {\n this.typeCount = typeResult.RowCount;\n }\n\n this.cdr.markForCheck();\n } catch (error) {\n console.error('Error loading counts:', error);\n }\n }\n\n public onTabChange(tabId: string): void {\n this.activeTab = tabId;\n const index = this.navigationItems.indexOf(tabId);\n\n this.selectedIndex = index >= 0 ? index : 0;\n\n setTimeout(() => {\n SharedService.Instance.InvokeManualResize();\n }, 100);\n\n this.visitedTabs.add(tabId);\n this.emitStateChange();\n this.cdr.markForCheck();\n }\n\n public hasVisited(tabId: string): boolean {\n return this.visitedTabs.has(tabId);\n }\n\n private setupStateManagement(): void {\n this.stateChangeSubject.pipe(\n debounceTime(50)\n ).subscribe(state => {\n this.UserStateChanged.emit(state);\n });\n }\n\n private emitStateChange(): void {\n const state: CredentialsDashboardState = {\n activeTab: this.activeTab\n };\n\n this.stateChangeSubject.next(state);\n }\n\n public loadUserState(state: Partial<CredentialsDashboardState>): void {\n if (state.activeTab) {\n this.activeTab = state.activeTab;\n const index = this.navigationItems.indexOf(state.activeTab);\n this.selectedIndex = index >= 0 ? index : 0;\n this.visitedTabs.add(state.activeTab);\n }\n\n this.cdr.markForCheck();\n }\n\n initDashboard(): void {\n try {\n this.isLoading = true;\n } catch (error) {\n console.error('Error initializing Credentials dashboard:', error);\n this.Error.emit(new Error('Failed to initialize Credentials dashboard. Please try again.'));\n } finally {\n this.isLoading = false;\n }\n }\n\n loadData(): void {\n if (this.Config?.userState) {\n setTimeout(() => {\n if (this.Config?.userState) {\n this.loadUserState(this.Config.userState);\n }\n }, 0);\n }\n\n this.NotifyLoadComplete();\n }\n\n public getCurrentTabLabel(): string {\n return this.tabLabels[this.activeTab] || 'Credential Management';\n }\n}\n","<div class=\"credentials-dashboard-container\">\n <div class=\"dashboard-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-key\"></i>\n <span>Credential Management</span>\n </div>\n <div class=\"header-actions\">\n <div class=\"security-badge\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span>Encrypted</span>\n </div>\n <span class=\"tab-label\">{{getCurrentTabLabel()}}</span>\n </div>\n </div>\n\n <div class=\"dashboard-content\">\n <div class=\"sidebar\">\n <div class=\"sidebar-section\">\n <div class=\"sidebar-section-title\">Dashboard</div>\n </div>\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'overview'\" (click)=\"onTabChange('overview')\">\n <i class=\"fa-solid fa-chart-pie\"></i>\n <span>Overview</span>\n </div>\n\n <div class=\"sidebar-section\">\n <div class=\"sidebar-section-title\">Management</div>\n </div>\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'credentials'\" (click)=\"onTabChange('credentials')\">\n <i class=\"fa-solid fa-key\"></i>\n <span>Credentials</span>\n @if (credentialCount > 0) {\n <span class=\"badge\">{{credentialCount}}</span>\n }\n </div>\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'types'\" (click)=\"onTabChange('types')\">\n <i class=\"fa-solid fa-cubes\"></i>\n <span>Types</span>\n @if (typeCount > 0) {\n <span class=\"badge\">{{typeCount}}</span>\n }\n </div>\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'categories'\" (click)=\"onTabChange('categories')\">\n <i class=\"fa-solid fa-folder-tree\"></i>\n <span>Categories</span>\n </div>\n\n <div class=\"sidebar-section\">\n <div class=\"sidebar-section-title\">Security</div>\n </div>\n <div class=\"nav-item\" [class.selected]=\"activeTab === 'audit'\" (click)=\"onTabChange('audit')\">\n <i class=\"fa-solid fa-clipboard-list\"></i>\n <span>Audit Trail</span>\n </div>\n </div>\n\n <div class=\"main-content\">\n <div class=\"tab-container\">\n @switch (activeTab) {\n <!-- Overview Tab -->\n @case ('overview') {\n <div class=\"tab-content\">\n <mj-credentials-overview-resource></mj-credentials-overview-resource>\n </div>\n }\n <!-- Credentials Tab -->\n @case ('credentials') {\n <div class=\"tab-content\">\n <mj-credentials-list-resource></mj-credentials-list-resource>\n </div>\n }\n <!-- Types Tab -->\n @case ('types') {\n <div class=\"tab-content\">\n <mj-credentials-types-resource></mj-credentials-types-resource>\n </div>\n }\n <!-- Categories Tab -->\n @case ('categories') {\n <div class=\"tab-content\">\n <mj-credentials-categories-resource></mj-credentials-categories-resource>\n </div>\n }\n <!-- Audit Trail Tab -->\n @case ('audit') {\n <div class=\"tab-content\">\n <mj-credentials-audit-resource></mj-credentials-audit-resource>\n </div>\n }\n }\n </div>\n </div>\n </div>\n</div>\n"]}
|
|
@@ -8,7 +8,7 @@ import { Component, ChangeDetectionStrategy, ViewChild } from '@angular/core';
|
|
|
8
8
|
import { Subject } from 'rxjs';
|
|
9
9
|
import { takeUntil } from 'rxjs/operators';
|
|
10
10
|
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
11
|
-
import {
|
|
11
|
+
import { CompositeKey } from '@memberjunction/core';
|
|
12
12
|
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
13
13
|
import { DashboardEngine } from '@memberjunction/core-entities';
|
|
14
14
|
import { createDefaultDashboardConfig } from '@memberjunction/ng-dashboard-viewer';
|
|
@@ -272,7 +272,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
272
272
|
this.cdr.detectChanges();
|
|
273
273
|
if (event.Dashboards.length === 0)
|
|
274
274
|
return;
|
|
275
|
-
const md =
|
|
275
|
+
const md = this.ProviderToUse;
|
|
276
276
|
const tg = await md.CreateTransactionGroup();
|
|
277
277
|
for (const dashboard of event.Dashboards) {
|
|
278
278
|
dashboard.TransactionGroup = tg;
|
|
@@ -305,7 +305,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
305
305
|
this.cdr.detectChanges();
|
|
306
306
|
if (event.Dashboards.length === 0)
|
|
307
307
|
return;
|
|
308
|
-
const md =
|
|
308
|
+
const md = this.ProviderToUse;
|
|
309
309
|
const currentUserId = md.CurrentUser.ID;
|
|
310
310
|
const tg = await md.CreateTransactionGroup();
|
|
311
311
|
const sharedDashboardIds = [];
|
|
@@ -390,7 +390,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
390
390
|
try {
|
|
391
391
|
this.isLoading = true;
|
|
392
392
|
this.cdr.detectChanges();
|
|
393
|
-
const md =
|
|
393
|
+
const md = this.ProviderToUse;
|
|
394
394
|
console.debug('[DashboardBrowserResource] Current user:', {
|
|
395
395
|
userId: md.CurrentUser?.ID,
|
|
396
396
|
userName: md.CurrentUser?.Name,
|
|
@@ -460,7 +460,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
460
460
|
const categoryIds = new Set(categoriesToDelete.map(c => c.ID));
|
|
461
461
|
const dashboardsToUncategorize = this.dashboards.filter(d => d.CategoryID && categoryIds.has(d.CategoryID));
|
|
462
462
|
// Queue dashboard uncategorize saves first, then category deletes — single atomic transaction
|
|
463
|
-
const md =
|
|
463
|
+
const md = this.ProviderToUse;
|
|
464
464
|
const tg = await md.CreateTransactionGroup();
|
|
465
465
|
for (const dashboard of dashboardsToUncategorize) {
|
|
466
466
|
dashboard.CategoryID = null;
|
|
@@ -508,7 +508,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
508
508
|
this.selectedDashboard = dashboard;
|
|
509
509
|
this.mode = 'view';
|
|
510
510
|
// Compute permissions for the selected dashboard
|
|
511
|
-
const md =
|
|
511
|
+
const md = this.ProviderToUse;
|
|
512
512
|
this.selectedDashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(dashboard.ID, md.CurrentUser.ID);
|
|
513
513
|
this.updateUrlQueryParams();
|
|
514
514
|
this.NotifyDisplayNameChanged(dashboard.Name || 'Dashboard');
|
|
@@ -519,7 +519,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
519
519
|
*/
|
|
520
520
|
editDashboard(dashboard) {
|
|
521
521
|
// Check if user has edit permission
|
|
522
|
-
const md =
|
|
522
|
+
const md = this.ProviderToUse;
|
|
523
523
|
const permissions = DashboardEngine.Instance.GetDashboardPermissions(dashboard.ID, md.CurrentUser.ID);
|
|
524
524
|
if (!permissions.CanEdit) {
|
|
525
525
|
console.warn('User does not have permission to edit this dashboard');
|
|
@@ -587,7 +587,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
587
587
|
this.showShareDialog = false;
|
|
588
588
|
if (result.Action === 'save' && this.selectedDashboard) {
|
|
589
589
|
// Recompute permissions after sharing changes
|
|
590
|
-
const md =
|
|
590
|
+
const md = this.ProviderToUse;
|
|
591
591
|
this.selectedDashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(this.selectedDashboard.ID, md.CurrentUser.ID);
|
|
592
592
|
}
|
|
593
593
|
this.cdr.detectChanges();
|
|
@@ -602,7 +602,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
602
602
|
try {
|
|
603
603
|
this.isLoading = true;
|
|
604
604
|
this.cdr.detectChanges();
|
|
605
|
-
const md =
|
|
605
|
+
const md = this.ProviderToUse;
|
|
606
606
|
const dashboard = await md.GetEntityObject('MJ: Dashboards');
|
|
607
607
|
dashboard.Name = 'New Dashboard';
|
|
608
608
|
dashboard.Description = '';
|
|
@@ -727,7 +727,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
727
727
|
compositeKey.SimpleLoadFromURLSegment(request.recordId);
|
|
728
728
|
// If simple load didn't work (single ID without field name), look up actual PK field
|
|
729
729
|
if (compositeKey.KeyValuePairs.length === 0) {
|
|
730
|
-
const md =
|
|
730
|
+
const md = this.ProviderToUse;
|
|
731
731
|
const entity = md.Entities.find(e => e.Name === request.entityName);
|
|
732
732
|
const pkFieldName = entity?.FirstPrimaryKey?.Name || 'ID';
|
|
733
733
|
compositeKey.LoadFromSingleKeyValuePair(pkFieldName, request.recordId);
|
|
@@ -750,7 +750,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
750
750
|
}
|
|
751
751
|
case 'OpenQuery': {
|
|
752
752
|
// Navigate to query viewer
|
|
753
|
-
const md =
|
|
753
|
+
const md = this.ProviderToUse;
|
|
754
754
|
const queryInfo = md.Queries.find(q => UUIDsEqual(q.ID, request.queryId));
|
|
755
755
|
if (queryInfo) {
|
|
756
756
|
this.navigationService.OpenQuery(request.queryId, queryInfo.Name, { forceNewTab: openInNewTab });
|
|
@@ -771,7 +771,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
771
771
|
* Resolve an application name to its ID
|
|
772
772
|
*/
|
|
773
773
|
resolveAppId(appName) {
|
|
774
|
-
const md =
|
|
774
|
+
const md = this.ProviderToUse;
|
|
775
775
|
const app = md.Applications.find(a => a.Name.toLowerCase() === appName.toLowerCase());
|
|
776
776
|
return app?.ID;
|
|
777
777
|
}
|
|
@@ -884,7 +884,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
884
884
|
// Use DashboardEngine for consistent cached data
|
|
885
885
|
const engine = DashboardEngine.Instance;
|
|
886
886
|
await engine.Config(false); // Wait for engine to load data
|
|
887
|
-
const md =
|
|
887
|
+
const md = this.ProviderToUse;
|
|
888
888
|
const currentUserId = md.CurrentUser.ID;
|
|
889
889
|
// Get data from engine - sort dashboards by updated date, categories by name
|
|
890
890
|
// Filter dashboards to only those accessible to the current user
|
|
@@ -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 , 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 super();\n }\n\n // ========================================\n // Lifecycle\n // ========================================\n\n ngOnInit(): void {\n super.ngOnInit();\n this.loadDashboards();\n this.subscribeToQueryParams();\n this.loadViewPreference();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\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 atomically\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n if (event.Dashboards.length === 0) return;\n\n const md = new Metadata();\n const tg = await md.CreateTransactionGroup();\n for (const dashboard of event.Dashboards) {\n dashboard.TransactionGroup = tg;\n await dashboard.Delete();\n }\n\n if (await tg.Submit()) {\n const deletedIds = new Set(event.Dashboards.map(d => d.ID));\n this.dashboards = this.dashboards.filter(d => !deletedIds.has(d.ID));\n } else {\n console.error('Failed to delete dashboards — all changes rolled back');\n }\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 if (event.Dashboards.length === 0) return;\n\n const md = new Metadata();\n const currentUserId = md.CurrentUser.ID;\n const tg = await md.CreateTransactionGroup();\n const sharedDashboardIds: string[] = [];\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 dashboard.TransactionGroup = tg;\n await dashboard.Save();\n } else {\n // Non-owner: create or update a category link instead\n const existingLinks = DashboardEngine.Instance.DashboardCategoryLinks.filter(\n link => UUIDsEqual(link.DashboardID, dashboard.ID) && UUIDsEqual(link.UserID, currentUserId)\n );\n\n let link: MJDashboardCategoryLinkEntity;\n if (existingLinks.length > 0) {\n link = existingLinks[0];\n link.DashboardCategoryID = event.TargetCategoryId;\n } else {\n link = await md.GetEntityObject<MJDashboardCategoryLinkEntity>('MJ: Dashboard Category Links');\n link.DashboardID = dashboard.ID;\n link.UserID = currentUserId;\n link.DashboardCategoryID = event.TargetCategoryId;\n }\n link.TransactionGroup = tg;\n await link.Save();\n\n sharedDashboardIds.push(dashboard.ID);\n }\n }\n\n if (await tg.Submit()) {\n // Update the effective category map for the shared dashboards now that the server confirmed\n for (const id of sharedDashboardIds) {\n this.effectiveCategoryMap.set(id, event.TargetCategoryId);\n }\n this.effectiveCategoryMap = new Map(this.effectiveCategoryMap);\n this.dashboards = [...this.dashboards];\n this.selectedCategoryId = event.TargetCategoryId;\n this.updateUrlQueryParams();\n } else {\n console.error('Failed to move dashboards — all changes rolled back');\n }\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 * 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.debug('[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.debug('[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.debug('[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.debug('[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.debug('[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.debug('[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.debug('[DashboardBrowserResource] Category delete requested:', event.Category.Name);\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Get all categories in child-first order so parent FKs are satisfied as we delete.\n // getChildCategoriesRecursive returns pre-order (parent before its descendants);\n // reversing that list gives a valid leaves-first order, then we append the root last.\n const descendants = this.getChildCategoriesRecursive(event.Category.ID);\n descendants.reverse();\n const categoriesToDelete = [...descendants, event.Category];\n\n console.debug('[DashboardBrowserResource] Deleting categories:', categoriesToDelete.map(c => c.Name));\n\n const categoryIds = new Set(categoriesToDelete.map(c => c.ID));\n const dashboardsToUncategorize = this.dashboards.filter(d =>\n d.CategoryID && categoryIds.has(d.CategoryID)\n );\n\n // Queue dashboard uncategorize saves first, then category deletes — single atomic transaction\n const md = new Metadata();\n const tg = await md.CreateTransactionGroup();\n\n for (const dashboard of dashboardsToUncategorize) {\n dashboard.CategoryID = null!;\n dashboard.TransactionGroup = tg;\n await dashboard.Save();\n }\n\n for (const cat of categoriesToDelete) {\n cat.TransactionGroup = tg;\n await cat.Delete();\n }\n\n if (await tg.Submit()) {\n this.categories = this.categories.filter(c => !categoryIds.has(c.ID));\n this.dashboards = [...this.dashboards];\n } else {\n console.error('[DashboardBrowserResource] Failed to delete categories — all changes rolled back');\n }\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.debug('[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.NotifyDisplayNameChanged(dashboard.Name || 'Dashboard');\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.NotifyDisplayNameChanged('Dashboards');\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), look up actual PK field\n if (compositeKey.KeyValuePairs.length === 0) {\n const md = new Metadata();\n const entity = md.Entities.find(e => e.Name === request.entityName);\n const pkFieldName = entity?.FirstPrimaryKey?.Name || 'ID';\n compositeKey.LoadFromSingleKeyValuePair(pkFieldName, 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.debug('[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 // After dashboards are loaded, check for deep-link from configuration\n // (e.g., pin navigation passes dashboard ID via queryParams in config)\n this.applyConfigurationState();\n\n // Also watch for late-arriving query params from pin navigation\n this.watchForLateQueryParams();\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 * Apply initial state from resource configuration (handles pin navigation\n * and other deep-link scenarios where ActivatedRoute may not fire).\n */\n private applyConfigurationState(): void {\n const config = this.Data?.Configuration;\n if (!config) return;\n\n const qp = config['queryParams'] as Record<string, string> | undefined;\n const dashboardId = qp?.['dashboard'] || config['dashboard'] as string;\n const categoryId = qp?.['category'] || config['category'] as string;\n\n if (categoryId && categoryId !== this.selectedCategoryId) {\n this.selectedCategoryId = categoryId;\n }\n\n if (dashboardId && !this.selectedDashboard) {\n const dashboard = this.dashboards.find(d => UUIDsEqual(d.ID, dashboardId));\n if (dashboard) {\n this.openDashboard(dashboard);\n }\n }\n }\n\n /**\n * Check for late-arriving query params (e.g., from pin navigation where\n * UpdateActiveTabQueryParams runs after the component has already loaded).\n * Polls briefly for queryParams to appear in the URL.\n */\n private watchForLateQueryParams(): void {\n // Check every 200ms for up to 3 seconds for queryParams to appear\n // AND for dashboards to be loaded (both conditions must be met)\n let attempts = 0;\n const interval = setInterval(() => {\n attempts++;\n if (attempts > 15 || this.selectedDashboard) {\n clearInterval(interval);\n return;\n }\n // Re-check the URL directly since ActivatedRoute may not fire\n const url = window.location.href;\n const dashboardMatch = url.match(/[?&]dashboard=([^&]+)/);\n if (dashboardMatch && !this.selectedDashboard && this.dashboards.length > 0) {\n const dashboardId = decodeURIComponent(dashboardMatch[1]);\n const dashboard = this.dashboards.find(d => UUIDsEqual(d.ID, dashboardId));\n if (dashboard) {\n this.openDashboard(dashboard);\n this.cdr.detectChanges();\n clearInterval(interval);\n }\n }\n }, 200);\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
|
+
{"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 super();\n }\n\n // ========================================\n // Lifecycle\n // ========================================\n\n ngOnInit(): void {\n super.ngOnInit();\n this.loadDashboards();\n this.subscribeToQueryParams();\n this.loadViewPreference();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\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 atomically\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n if (event.Dashboards.length === 0) return;\n\n const md = this.ProviderToUse;\n const tg = await md.CreateTransactionGroup();\n for (const dashboard of event.Dashboards) {\n dashboard.TransactionGroup = tg;\n await dashboard.Delete();\n }\n\n if (await tg.Submit()) {\n const deletedIds = new Set(event.Dashboards.map(d => d.ID));\n this.dashboards = this.dashboards.filter(d => !deletedIds.has(d.ID));\n } else {\n console.error('Failed to delete dashboards — all changes rolled back');\n }\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 if (event.Dashboards.length === 0) return;\n\n const md = this.ProviderToUse;\n const currentUserId = md.CurrentUser.ID;\n const tg = await md.CreateTransactionGroup();\n const sharedDashboardIds: string[] = [];\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 dashboard.TransactionGroup = tg;\n await dashboard.Save();\n } else {\n // Non-owner: create or update a category link instead\n const existingLinks = DashboardEngine.Instance.DashboardCategoryLinks.filter(\n link => UUIDsEqual(link.DashboardID, dashboard.ID) && UUIDsEqual(link.UserID, currentUserId)\n );\n\n let link: MJDashboardCategoryLinkEntity;\n if (existingLinks.length > 0) {\n link = existingLinks[0];\n link.DashboardCategoryID = event.TargetCategoryId;\n } else {\n link = await md.GetEntityObject<MJDashboardCategoryLinkEntity>('MJ: Dashboard Category Links');\n link.DashboardID = dashboard.ID;\n link.UserID = currentUserId;\n link.DashboardCategoryID = event.TargetCategoryId;\n }\n link.TransactionGroup = tg;\n await link.Save();\n\n sharedDashboardIds.push(dashboard.ID);\n }\n }\n\n if (await tg.Submit()) {\n // Update the effective category map for the shared dashboards now that the server confirmed\n for (const id of sharedDashboardIds) {\n this.effectiveCategoryMap.set(id, event.TargetCategoryId);\n }\n this.effectiveCategoryMap = new Map(this.effectiveCategoryMap);\n this.dashboards = [...this.dashboards];\n this.selectedCategoryId = event.TargetCategoryId;\n this.updateUrlQueryParams();\n } else {\n console.error('Failed to move dashboards — all changes rolled back');\n }\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 * 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.debug('[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 = this.ProviderToUse;\n console.debug('[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.debug('[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.debug('[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.debug('[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.debug('[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.debug('[DashboardBrowserResource] Category delete requested:', event.Category.Name);\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Get all categories in child-first order so parent FKs are satisfied as we delete.\n // getChildCategoriesRecursive returns pre-order (parent before its descendants);\n // reversing that list gives a valid leaves-first order, then we append the root last.\n const descendants = this.getChildCategoriesRecursive(event.Category.ID);\n descendants.reverse();\n const categoriesToDelete = [...descendants, event.Category];\n\n console.debug('[DashboardBrowserResource] Deleting categories:', categoriesToDelete.map(c => c.Name));\n\n const categoryIds = new Set(categoriesToDelete.map(c => c.ID));\n const dashboardsToUncategorize = this.dashboards.filter(d =>\n d.CategoryID && categoryIds.has(d.CategoryID)\n );\n\n // Queue dashboard uncategorize saves first, then category deletes — single atomic transaction\n const md = this.ProviderToUse;\n const tg = await md.CreateTransactionGroup();\n\n for (const dashboard of dashboardsToUncategorize) {\n dashboard.CategoryID = null!;\n dashboard.TransactionGroup = tg;\n await dashboard.Save();\n }\n\n for (const cat of categoriesToDelete) {\n cat.TransactionGroup = tg;\n await cat.Delete();\n }\n\n if (await tg.Submit()) {\n this.categories = this.categories.filter(c => !categoryIds.has(c.ID));\n this.dashboards = [...this.dashboards];\n } else {\n console.error('[DashboardBrowserResource] Failed to delete categories — all changes rolled back');\n }\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.debug('[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 = this.ProviderToUse;\n this.selectedDashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n dashboard.ID,\n md.CurrentUser.ID\n );\n\n this.updateUrlQueryParams();\n this.NotifyDisplayNameChanged(dashboard.Name || 'Dashboard');\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 = this.ProviderToUse;\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.NotifyDisplayNameChanged('Dashboards');\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 = this.ProviderToUse;\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 = this.ProviderToUse;\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), look up actual PK field\n if (compositeKey.KeyValuePairs.length === 0) {\n const md = this.ProviderToUse;\n const entity = md.Entities.find(e => e.Name === request.entityName);\n const pkFieldName = entity?.FirstPrimaryKey?.Name || 'ID';\n compositeKey.LoadFromSingleKeyValuePair(pkFieldName, 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 = this.ProviderToUse;\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 = this.ProviderToUse;\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 = this.ProviderToUse;\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.debug('[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 // After dashboards are loaded, check for deep-link from configuration\n // (e.g., pin navigation passes dashboard ID via queryParams in config)\n this.applyConfigurationState();\n\n // Also watch for late-arriving query params from pin navigation\n this.watchForLateQueryParams();\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 * Apply initial state from resource configuration (handles pin navigation\n * and other deep-link scenarios where ActivatedRoute may not fire).\n */\n private applyConfigurationState(): void {\n const config = this.Data?.Configuration;\n if (!config) return;\n\n const qp = config['queryParams'] as Record<string, string> | undefined;\n const dashboardId = qp?.['dashboard'] || config['dashboard'] as string;\n const categoryId = qp?.['category'] || config['category'] as string;\n\n if (categoryId && categoryId !== this.selectedCategoryId) {\n this.selectedCategoryId = categoryId;\n }\n\n if (dashboardId && !this.selectedDashboard) {\n const dashboard = this.dashboards.find(d => UUIDsEqual(d.ID, dashboardId));\n if (dashboard) {\n this.openDashboard(dashboard);\n }\n }\n }\n\n /**\n * Check for late-arriving query params (e.g., from pin navigation where\n * UpdateActiveTabQueryParams runs after the component has already loaded).\n * Polls briefly for queryParams to appear in the URL.\n */\n private watchForLateQueryParams(): void {\n // Check every 200ms for up to 3 seconds for queryParams to appear\n // AND for dashboards to be loaded (both conditions must be met)\n let attempts = 0;\n const interval = setInterval(() => {\n attempts++;\n if (attempts > 15 || this.selectedDashboard) {\n clearInterval(interval);\n return;\n }\n // Re-check the URL directly since ActivatedRoute may not fire\n const url = window.location.href;\n const dashboardMatch = url.match(/[?&]dashboard=([^&]+)/);\n if (dashboardMatch && !this.selectedDashboard && this.dashboards.length > 0) {\n const dashboardId = decodeURIComponent(dashboardMatch[1]);\n const dashboard = this.dashboards.find(d => UUIDsEqual(d.ID, dashboardId));\n if (dashboard) {\n this.openDashboard(dashboard);\n this.cdr.detectChanges();\n clearInterval(interval);\n }\n }\n }, 200);\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,3 +1,4 @@
|
|
|
1
|
+
import { IMetadataProvider } from '@memberjunction/core';
|
|
1
2
|
import { MJUserEntity } from '@memberjunction/core-entities';
|
|
2
3
|
import { ResourceShareAdapter, ResourceShareContext, ResourceSharePermissionModel } from '@memberjunction/ng-resource-permissions';
|
|
3
4
|
/**
|
|
@@ -13,6 +14,9 @@ import { ResourceShareAdapter, ResourceShareContext, ResourceSharePermissionMode
|
|
|
13
14
|
* consumers see the new grants immediately.
|
|
14
15
|
*/
|
|
15
16
|
export declare class DashboardShareAdapter implements ResourceShareAdapter {
|
|
17
|
+
private _provider;
|
|
18
|
+
get Provider(): IMetadataProvider;
|
|
19
|
+
set Provider(value: IMetadataProvider | null);
|
|
16
20
|
LoadShares(context: ResourceShareContext): Promise<ResourceSharePermissionModel[]>;
|
|
17
21
|
CreateShare(context: ResourceShareContext, user: MJUserEntity): Promise<ResourceSharePermissionModel>;
|
|
18
22
|
SyncLevelToEntity(row: ResourceSharePermissionModel): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-share-adapter.d.ts","sourceRoot":"","sources":["../../src/DashboardBrowser/dashboard-share-adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dashboard-share-adapter.d.ts","sourceRoot":"","sources":["../../src/DashboardBrowser/dashboard-share-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAY,MAAM,sBAAsB,CAAC;AAEnE,OAAO,EAAgD,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC3G,OAAO,EACH,oBAAoB,EACpB,oBAAoB,EAEpB,4BAA4B,EAC/B,MAAM,yCAAyC,CAAC;AAEjD;;;;;;;;;;;GAWG;AACH,qBAAa,qBAAsB,YAAW,oBAAoB;IAC9D,OAAO,CAAC,SAAS,CAAkC;IACnD,IAAW,QAAQ,IAAI,iBAAiB,CAAgD;IACxF,IAAW,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,EAA6B;IAE1E,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,4BAA4B,EAAE,CAAC;IAmBlF,WAAW,CAAC,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,4BAA4B,CAAC;IAoB3G,iBAAiB,CAAC,GAAG,EAAE,4BAA4B,GAAG,IAAI;IAIpD,SAAS,CAAC,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D,yEAAyE;IACzE,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI;IAO9E,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,sBAAsB;CAuBjC"}
|