@memberjunction/ng-dashboards 5.38.0 → 5.40.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/README.md +14 -7
- package/dist/AI/components/agents/agent-configuration.component.js +199 -198
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +20 -17
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +15 -0
- 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 +166 -58
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -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 +2 -1
- 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 +1 -0
- 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 +55 -36
- 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 +9 -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 +158 -117
- 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 +1 -0
- 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 +22 -8
- 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 +217 -860
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1717 -7802
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts +56 -0
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js +423 -0
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts +70 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js +308 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts +29 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +186 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts +69 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js +278 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts +73 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js +393 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts +122 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js +908 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts +87 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js +475 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts +29 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js +208 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts +21 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js +70 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +333 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +2125 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts +61 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.js +78 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.format.d.ts +58 -0
- package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.format.js +260 -0
- package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.types.d.ts +319 -0
- package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.types.js +6 -0
- package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts +103 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.js +571 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +77 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.js +519 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts +107 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.js +719 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +131 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +813 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +177 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1465 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +78 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.js +492 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts +397 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js +3490 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +56 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.js +271 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +3 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +306 -290
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +1 -1
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +209 -208
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +130 -128
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +61 -61
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +17 -17
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +1 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +578 -538
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +3 -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 +331 -303
- package/dist/AI/components/vectors/vector-management-resource.component.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 +14 -2
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/AI/services/cache-metrics.d.ts +50 -0
- package/dist/AI/services/cache-metrics.d.ts.map +1 -0
- package/dist/AI/services/cache-metrics.js +43 -0
- package/dist/AI/services/cache-metrics.js.map +1 -0
- package/dist/APIKeys/api-applications-panel.component.js +2 -2
- package/dist/APIKeys/api-key-create-dialog.component.js +2 -2
- package/dist/APIKeys/api-key-edit-panel.component.js +2 -2
- package/dist/APIKeys/api-keys-resource.component.js +132 -131
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +141 -141
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +15 -15
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -5
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +139 -212
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +2 -2
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +2 -2
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +2 -2
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +2 -2
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +54 -49
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts +6 -0
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +72 -50
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +103 -102
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +52 -51
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +39 -38
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts +6 -0
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +92 -89
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +136 -135
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +155 -152
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +119 -118
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +129 -128
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +107 -106
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +31 -340
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +468 -1958
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.js +10 -0
- package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +115 -114
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +5 -6
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +4 -5
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/DevTools/app-state-inspector.component.js +18 -17
- package/dist/DevTools/app-state-inspector.component.js.map +1 -1
- package/dist/DevTools/class-registry.component.js +88 -85
- package/dist/DevTools/class-registry.component.js.map +1 -1
- package/dist/DevTools/event-monitor.component.js +155 -150
- package/dist/DevTools/event-monitor.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +245 -243
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/DevTools/layout-inspector.component.js +18 -17
- package/dist/DevTools/layout-inspector.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -19
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +2 -2
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +236 -229
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +390 -389
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +2 -2
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +14 -11
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +27 -2
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +244 -119
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +293 -291
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +62 -61
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts +65 -0
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js +176 -0
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js.map +1 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts +81 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js +308 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js.map +1 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts +85 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js +362 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/index.d.ts +3 -0
- package/dist/KnowledgeHub/index.d.ts.map +1 -1
- package/dist/KnowledgeHub/index.js +3 -0
- package/dist/KnowledgeHub/index.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +6 -2
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +525 -566
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +135 -134
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +199 -198
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
- package/dist/MCP/mcp-dashboard.component.js +443 -438
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +146 -147
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +76 -75
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +97 -96
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +24 -22
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +2 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.js +1 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +14 -4
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +436 -427
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +1 -1
- package/dist/Testing/components/testing-runs.component.js +116 -115
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +6 -7
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +173 -172
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.d.ts +6 -0
- package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +116 -92
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +57 -35
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +80 -1
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +1 -1
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +7 -1
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/data-explorer-dashboards.module.d.ts +12 -14
- package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
- package/dist/data-explorer-dashboards.module.js +5 -14
- package/dist/data-explorer-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +3 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -0
- package/dist/public-api.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +4 -5
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +7 -5
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +57 -54
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts +0 -79
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts.map +0 -1
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +0 -195
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +0 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +0 -226
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +0 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +0 -861
- package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +0 -1
|
@@ -19,36 +19,41 @@ function ApplicationRolesResourceComponent_Conditional_1_Template(rf, ctx) { if
|
|
|
19
19
|
i0.ɵɵelement(1, "mj-stat-badge", 7);
|
|
20
20
|
i0.ɵɵelementEnd();
|
|
21
21
|
} }
|
|
22
|
-
function ApplicationRolesResourceComponent_Conditional_4_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
23
|
-
i0.ɵɵelement(0, "i", 11);
|
|
24
|
-
i0.ɵɵtext(1, " Saving... ");
|
|
25
|
-
} }
|
|
26
22
|
function ApplicationRolesResourceComponent_Conditional_4_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
27
23
|
i0.ɵɵelement(0, "i", 12);
|
|
28
|
-
i0.ɵɵ
|
|
24
|
+
i0.ɵɵelementStart(1, "span", 10);
|
|
25
|
+
i0.ɵɵtext(2, "Saving...");
|
|
26
|
+
i0.ɵɵelementEnd();
|
|
27
|
+
} }
|
|
28
|
+
function ApplicationRolesResourceComponent_Conditional_4_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
29
|
+
i0.ɵɵelement(0, "i", 13);
|
|
30
|
+
i0.ɵɵelementStart(1, "span", 10);
|
|
31
|
+
i0.ɵɵtext(2, "Save Changes");
|
|
32
|
+
i0.ɵɵelementEnd();
|
|
29
33
|
} }
|
|
30
34
|
function ApplicationRolesResourceComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
31
35
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
32
36
|
i0.ɵɵelementStart(0, "button", 8);
|
|
33
37
|
i0.ɵɵlistener("click", function ApplicationRolesResourceComponent_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.DiscardChanges()); });
|
|
34
38
|
i0.ɵɵelement(1, "i", 9);
|
|
35
|
-
i0.ɵɵ
|
|
36
|
-
i0.ɵɵ
|
|
37
|
-
i0.ɵɵ
|
|
38
|
-
i0.ɵɵ
|
|
39
|
-
i0.ɵɵ
|
|
39
|
+
i0.ɵɵelementStart(2, "span", 10);
|
|
40
|
+
i0.ɵɵtext(3, "Discard");
|
|
41
|
+
i0.ɵɵelementEnd()();
|
|
42
|
+
i0.ɵɵelementStart(4, "button", 11);
|
|
43
|
+
i0.ɵɵlistener("click", function ApplicationRolesResourceComponent_Conditional_4_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SaveChanges()); });
|
|
44
|
+
i0.ɵɵconditionalCreate(5, ApplicationRolesResourceComponent_Conditional_4_Conditional_5_Template, 3, 0)(6, ApplicationRolesResourceComponent_Conditional_4_Conditional_6_Template, 3, 0);
|
|
40
45
|
i0.ɵɵelementEnd();
|
|
41
46
|
} if (rf & 2) {
|
|
42
47
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
43
48
|
i0.ɵɵproperty("disabled", ctx_r1.IsSaving);
|
|
44
|
-
i0.ɵɵadvance(
|
|
49
|
+
i0.ɵɵadvance(4);
|
|
45
50
|
i0.ɵɵproperty("disabled", ctx_r1.IsSaving);
|
|
46
51
|
i0.ɵɵadvance();
|
|
47
|
-
i0.ɵɵconditional(ctx_r1.IsSaving ?
|
|
52
|
+
i0.ɵɵconditional(ctx_r1.IsSaving ? 5 : 6);
|
|
48
53
|
} }
|
|
49
54
|
function ApplicationRolesResourceComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
50
55
|
i0.ɵɵelementStart(0, "div", 4);
|
|
51
|
-
i0.ɵɵelement(1, "i",
|
|
56
|
+
i0.ɵɵelement(1, "i", 14);
|
|
52
57
|
i0.ɵɵtext(2);
|
|
53
58
|
i0.ɵɵelementEnd();
|
|
54
59
|
} if (rf & 2) {
|
|
@@ -58,7 +63,7 @@ function ApplicationRolesResourceComponent_Conditional_6_Template(rf, ctx) { if
|
|
|
58
63
|
} }
|
|
59
64
|
function ApplicationRolesResourceComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
60
65
|
i0.ɵɵelementStart(0, "div", 5);
|
|
61
|
-
i0.ɵɵelement(1, "i",
|
|
66
|
+
i0.ɵɵelement(1, "i", 15);
|
|
62
67
|
i0.ɵɵtext(2);
|
|
63
68
|
i0.ɵɵelementEnd();
|
|
64
69
|
} if (rf & 2) {
|
|
@@ -70,26 +75,26 @@ function ApplicationRolesResourceComponent_Conditional_8_Template(rf, ctx) { if
|
|
|
70
75
|
i0.ɵɵelement(0, "mj-loading", 6);
|
|
71
76
|
} }
|
|
72
77
|
function ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Conditional_1_For_13_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
73
|
-
i0.ɵɵelementStart(0, "span",
|
|
78
|
+
i0.ɵɵelementStart(0, "span", 40);
|
|
74
79
|
i0.ɵɵtext(1, "new");
|
|
75
80
|
i0.ɵɵelementEnd();
|
|
76
81
|
} }
|
|
77
82
|
function ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Conditional_1_For_13_Template(rf, ctx) { if (rf & 1) {
|
|
78
83
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
79
|
-
i0.ɵɵelementStart(0, "tr")(1, "td",
|
|
80
|
-
i0.ɵɵelement(2, "i",
|
|
84
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 34);
|
|
85
|
+
i0.ɵɵelement(2, "i", 39);
|
|
81
86
|
i0.ɵɵtext(3);
|
|
82
|
-
i0.ɵɵconditionalCreate(4, ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Conditional_1_For_13_Conditional_4_Template, 2, 0, "span",
|
|
87
|
+
i0.ɵɵconditionalCreate(4, ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Conditional_1_For_13_Conditional_4_Template, 2, 0, "span", 40);
|
|
83
88
|
i0.ɵɵelementEnd();
|
|
84
|
-
i0.ɵɵelementStart(5, "td",
|
|
89
|
+
i0.ɵɵelementStart(5, "td", 35)(6, "input", 41);
|
|
85
90
|
i0.ɵɵlistener("change", function ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Conditional_1_For_13_Template_input_change_6_listener() { const row_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.ToggleCanAccess(row_r7)); });
|
|
86
91
|
i0.ɵɵelementEnd()();
|
|
87
|
-
i0.ɵɵelementStart(7, "td",
|
|
92
|
+
i0.ɵɵelementStart(7, "td", 36)(8, "input", 41);
|
|
88
93
|
i0.ɵɵlistener("change", function ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Conditional_1_For_13_Template_input_change_8_listener() { const row_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.ToggleCanAdmin(row_r7)); });
|
|
89
94
|
i0.ɵɵelementEnd()();
|
|
90
|
-
i0.ɵɵelementStart(9, "td",
|
|
95
|
+
i0.ɵɵelementStart(9, "td", 37)(10, "button", 42);
|
|
91
96
|
i0.ɵɵlistener("click", function ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Conditional_1_For_13_Template_button_click_10_listener() { const row_r7 = i0.ɵɵrestoreView(_r6).$implicit; const group_r4 = i0.ɵɵnextContext(3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.RemoveRole(group_r4, row_r7)); });
|
|
92
|
-
i0.ɵɵelement(11, "i",
|
|
97
|
+
i0.ɵɵelement(11, "i", 43);
|
|
93
98
|
i0.ɵɵelementEnd()()();
|
|
94
99
|
} if (rf & 2) {
|
|
95
100
|
const row_r7 = ctx.$implicit;
|
|
@@ -104,20 +109,20 @@ function ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Con
|
|
|
104
109
|
i0.ɵɵproperty("checked", row_r7.CanAdmin);
|
|
105
110
|
} }
|
|
106
111
|
function ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
107
|
-
i0.ɵɵelementStart(0, "table",
|
|
112
|
+
i0.ɵɵelementStart(0, "table", 26)(1, "thead")(2, "tr")(3, "th", 34);
|
|
108
113
|
i0.ɵɵtext(4, "Role");
|
|
109
114
|
i0.ɵɵelementEnd();
|
|
110
|
-
i0.ɵɵelementStart(5, "th",
|
|
115
|
+
i0.ɵɵelementStart(5, "th", 35);
|
|
111
116
|
i0.ɵɵtext(6, "Can Access");
|
|
112
117
|
i0.ɵɵelementEnd();
|
|
113
|
-
i0.ɵɵelementStart(7, "th",
|
|
118
|
+
i0.ɵɵelementStart(7, "th", 36);
|
|
114
119
|
i0.ɵɵtext(8, "Can Admin");
|
|
115
120
|
i0.ɵɵelementEnd();
|
|
116
|
-
i0.ɵɵelementStart(9, "th",
|
|
121
|
+
i0.ɵɵelementStart(9, "th", 37);
|
|
117
122
|
i0.ɵɵtext(10, "Actions");
|
|
118
123
|
i0.ɵɵelementEnd()()();
|
|
119
124
|
i0.ɵɵelementStart(11, "tbody");
|
|
120
|
-
i0.ɵɵrepeaterCreate(12, ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Conditional_1_For_13_Template, 12, 8, "tr",
|
|
125
|
+
i0.ɵɵrepeaterCreate(12, ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Conditional_1_For_13_Template, 12, 8, "tr", 38, i0.ɵɵcomponentInstance().TrackByRoleRow, true);
|
|
121
126
|
i0.ɵɵelementEnd()();
|
|
122
127
|
} if (rf & 2) {
|
|
123
128
|
const group_r4 = i0.ɵɵnextContext(2).$implicit;
|
|
@@ -125,13 +130,13 @@ function ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Con
|
|
|
125
130
|
i0.ɵɵrepeater(group_r4.Roles);
|
|
126
131
|
} }
|
|
127
132
|
function ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
128
|
-
i0.ɵɵelementStart(0, "div",
|
|
129
|
-
i0.ɵɵelement(1, "i",
|
|
133
|
+
i0.ɵɵelementStart(0, "div", 27);
|
|
134
|
+
i0.ɵɵelement(1, "i", 44);
|
|
130
135
|
i0.ɵɵtext(2, " No role restrictions \u2014 all authenticated users can access this application. ");
|
|
131
136
|
i0.ɵɵelementEnd();
|
|
132
137
|
} }
|
|
133
138
|
function ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
134
|
-
i0.ɵɵelementStart(0, "option",
|
|
139
|
+
i0.ɵɵelementStart(0, "option", 31);
|
|
135
140
|
i0.ɵɵtext(1);
|
|
136
141
|
i0.ɵɵelementEnd();
|
|
137
142
|
} if (rf & 2) {
|
|
@@ -142,18 +147,18 @@ function ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_For
|
|
|
142
147
|
} }
|
|
143
148
|
function ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
144
149
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
145
|
-
i0.ɵɵelementStart(0, "div",
|
|
146
|
-
i0.ɵɵconditionalCreate(1, ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Conditional_1_Template, 14, 0, "table",
|
|
147
|
-
i0.ɵɵelementStart(3, "div",
|
|
150
|
+
i0.ɵɵelementStart(0, "div", 25);
|
|
151
|
+
i0.ɵɵconditionalCreate(1, ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Conditional_1_Template, 14, 0, "table", 26)(2, ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Conditional_2_Template, 3, 0, "div", 27);
|
|
152
|
+
i0.ɵɵelementStart(3, "div", 28)(4, "select", 29);
|
|
148
153
|
i0.ɵɵlistener("change", function ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Template_select_change_4_listener($event) { i0.ɵɵrestoreView(_r5); const group_r4 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnAddRoleSelect(group_r4, $event.target.value)); });
|
|
149
|
-
i0.ɵɵelementStart(5, "option",
|
|
154
|
+
i0.ɵɵelementStart(5, "option", 30);
|
|
150
155
|
i0.ɵɵtext(6, "Select a role to add...");
|
|
151
156
|
i0.ɵɵelementEnd();
|
|
152
|
-
i0.ɵɵrepeaterCreate(7, ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_For_8_Template, 2, 2, "option",
|
|
157
|
+
i0.ɵɵrepeaterCreate(7, ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_For_8_Template, 2, 2, "option", 31, _forTrack0);
|
|
153
158
|
i0.ɵɵelementEnd();
|
|
154
|
-
i0.ɵɵelementStart(9, "button",
|
|
159
|
+
i0.ɵɵelementStart(9, "button", 32);
|
|
155
160
|
i0.ɵɵlistener("click", function ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r5); const group_r4 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.AddRole(group_r4)); });
|
|
156
|
-
i0.ɵɵelement(10, "i",
|
|
161
|
+
i0.ɵɵelement(10, "i", 33);
|
|
157
162
|
i0.ɵɵtext(11, " Add Role ");
|
|
158
163
|
i0.ɵɵelementEnd()()();
|
|
159
164
|
} if (rf & 2) {
|
|
@@ -170,17 +175,17 @@ function ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Tem
|
|
|
170
175
|
} }
|
|
171
176
|
function ApplicationRolesResourceComponent_Conditional_9_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
172
177
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
173
|
-
i0.ɵɵelementStart(0, "div",
|
|
178
|
+
i0.ɵɵelementStart(0, "div", 19)(1, "div", 20);
|
|
174
179
|
i0.ɵɵlistener("click", function ApplicationRolesResourceComponent_Conditional_9_For_4_Template_div_click_1_listener() { const group_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ToggleGroup(group_r4)); });
|
|
175
|
-
i0.ɵɵelementStart(2, "div",
|
|
176
|
-
i0.ɵɵelement(3, "i",
|
|
177
|
-
i0.ɵɵelementStart(4, "span",
|
|
180
|
+
i0.ɵɵelementStart(2, "div", 21);
|
|
181
|
+
i0.ɵɵelement(3, "i", 22);
|
|
182
|
+
i0.ɵɵelementStart(4, "span", 23);
|
|
178
183
|
i0.ɵɵtext(5);
|
|
179
184
|
i0.ɵɵelementEnd();
|
|
180
|
-
i0.ɵɵelementStart(6, "span",
|
|
185
|
+
i0.ɵɵelementStart(6, "span", 24);
|
|
181
186
|
i0.ɵɵtext(7);
|
|
182
187
|
i0.ɵɵelementEnd()()();
|
|
183
|
-
i0.ɵɵconditionalCreate(8, ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Template, 12, 3, "div",
|
|
188
|
+
i0.ɵɵconditionalCreate(8, ApplicationRolesResourceComponent_Conditional_9_For_4_Conditional_8_Template, 12, 3, "div", 25);
|
|
184
189
|
i0.ɵɵelementEnd();
|
|
185
190
|
} if (rf & 2) {
|
|
186
191
|
const group_r4 = ctx.$implicit;
|
|
@@ -198,11 +203,11 @@ function ApplicationRolesResourceComponent_Conditional_9_For_4_Template(rf, ctx)
|
|
|
198
203
|
i0.ɵɵconditional(group_r4.Expanded ? 8 : -1);
|
|
199
204
|
} }
|
|
200
205
|
function ApplicationRolesResourceComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
201
|
-
i0.ɵɵelementStart(0, "p",
|
|
206
|
+
i0.ɵɵelementStart(0, "p", 16);
|
|
202
207
|
i0.ɵɵtext(1, " Configure which roles can access each application. Applications with no role assignments are open to all users (backwards compatible). ");
|
|
203
208
|
i0.ɵɵelementEnd();
|
|
204
|
-
i0.ɵɵelementStart(2, "div",
|
|
205
|
-
i0.ɵɵrepeaterCreate(3, ApplicationRolesResourceComponent_Conditional_9_For_4_Template, 9, 10, "div",
|
|
209
|
+
i0.ɵɵelementStart(2, "div", 17);
|
|
210
|
+
i0.ɵɵrepeaterCreate(3, ApplicationRolesResourceComponent_Conditional_9_For_4_Template, 9, 10, "div", 18, i0.ɵɵcomponentInstance().TrackByAppId, true);
|
|
206
211
|
i0.ɵɵelementEnd();
|
|
207
212
|
} if (rf & 2) {
|
|
208
213
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -486,13 +491,13 @@ let ApplicationRolesResourceComponent = class ApplicationRolesResourceComponent
|
|
|
486
491
|
this.SelectedRoleIdToAdd.set(group.ApplicationID, roleId);
|
|
487
492
|
}
|
|
488
493
|
static ɵfac = function ApplicationRolesResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ApplicationRolesResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
489
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ApplicationRolesResourceComponent, selectors: [["mj-application-roles-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 10, vars: 8, consts: [["Role", "toolbar", "AriaLabel", "Application roles actions", "Title", "Application Roles", "Subtitle", "Assign roles per application"], ["meta", ""], ["actions", ""], [3, "Clicked", "Loading", "Disabled"], [1, "message", "error-message"], [1, "message", "success-message"], ["text", "Loading application roles..."], ["Icon", "fa-solid fa-circle-exclamation", "Label", "Unsaved changes", "Variant", "warning"], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "click", "disabled"], [1, "fa-solid", "fa-rotate-left"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-floppy-disk"], [1, "fa-solid", "fa-circle-exclamation"], [1, "fa-solid", "fa-circle-check"], [1, "description"], [1, "app-groups"], [1, "app-group", 3, "expanded", "has-roles"], [1, "app-group"], [1, "app-group-header", 3, "click"], [1, "app-header-left"], [1, "fa-solid", 3, "ngClass"], [1, "app-name"], [1, "role-count-badge"], [1, "app-group-content"], [1, "roles-table"], [1, "no-roles-message"], [1, "add-role-row"], [1, "mj-input", "add-role-select", 3, "change", "value"], ["value", "", "disabled", ""], [3, "value"], ["mjButton", "", "variant", "secondary", 3, "click", "disabled"], [1, "fa-solid", "fa-plus"], [1, "col-role"], [1, "col-access"], [1, "col-admin"], [1, "col-actions"], [3, "dirty", "new-row"], [1, "fa-solid", "fa-shield-halved", "role-icon"], [1, "new-badge"], ["type", "checkbox", 1, "mj-checkbox", 3, "change", "checked"], ["title", "Remove role assignment", 1, "remove-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "fa-solid", "fa-unlock"]], template: function ApplicationRolesResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
494
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ApplicationRolesResourceComponent, selectors: [["mj-application-roles-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 10, vars: 8, consts: [["Role", "toolbar", "AriaLabel", "Application roles actions", "Title", "Application Roles", "Subtitle", "Assign roles per application"], ["meta", ""], ["actions", ""], [3, "Clicked", "Loading", "Disabled"], [1, "message", "error-message"], [1, "message", "success-message"], ["text", "Loading application roles..."], ["Icon", "fa-solid fa-circle-exclamation", "Label", "Unsaved changes", "Variant", "warning"], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "click", "disabled"], [1, "fa-solid", "fa-rotate-left"], [1, "mj-action-label"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-floppy-disk"], [1, "fa-solid", "fa-circle-exclamation"], [1, "fa-solid", "fa-circle-check"], [1, "description"], [1, "app-groups"], [1, "app-group", 3, "expanded", "has-roles"], [1, "app-group"], [1, "app-group-header", 3, "click"], [1, "app-header-left"], [1, "fa-solid", 3, "ngClass"], [1, "app-name"], [1, "role-count-badge"], [1, "app-group-content"], [1, "roles-table"], [1, "no-roles-message"], [1, "add-role-row"], [1, "mj-input", "add-role-select", 3, "change", "value"], ["value", "", "disabled", ""], [3, "value"], ["mjButton", "", "variant", "secondary", 3, "click", "disabled"], [1, "fa-solid", "fa-plus"], [1, "col-role"], [1, "col-access"], [1, "col-admin"], [1, "col-actions"], [3, "dirty", "new-row"], [1, "fa-solid", "fa-shield-halved", "role-icon"], [1, "new-badge"], ["type", "checkbox", 1, "mj-checkbox", 3, "change", "checked"], ["title", "Remove role assignment", 1, "remove-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "fa-solid", "fa-unlock"]], template: function ApplicationRolesResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
490
495
|
i0.ɵɵelementStart(0, "mj-page-header-interior", 0);
|
|
491
496
|
i0.ɵɵconditionalCreate(1, ApplicationRolesResourceComponent_Conditional_1_Template, 2, 0, "div", 1);
|
|
492
497
|
i0.ɵɵelementStart(2, "div", 2)(3, "mj-refresh-button", 3);
|
|
493
498
|
i0.ɵɵlistener("Clicked", function ApplicationRolesResourceComponent_Template_mj_refresh_button_Clicked_3_listener() { return ctx.loadData(); });
|
|
494
499
|
i0.ɵɵelementEnd();
|
|
495
|
-
i0.ɵɵconditionalCreate(4, ApplicationRolesResourceComponent_Conditional_4_Template,
|
|
500
|
+
i0.ɵɵconditionalCreate(4, ApplicationRolesResourceComponent_Conditional_4_Template, 7, 3);
|
|
496
501
|
i0.ɵɵelementEnd()();
|
|
497
502
|
i0.ɵɵelementStart(5, "mj-page-body-interior");
|
|
498
503
|
i0.ɵɵconditionalCreate(6, ApplicationRolesResourceComponent_Conditional_6_Template, 3, 1, "div", 4);
|
|
@@ -523,7 +528,7 @@ ApplicationRolesResourceComponent = __decorate([
|
|
|
523
528
|
export { ApplicationRolesResourceComponent };
|
|
524
529
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ApplicationRolesResourceComponent, [{
|
|
525
530
|
type: Component,
|
|
526
|
-
args: [{ standalone: false, selector: 'mj-application-roles-resource', template: "<!--\n Interior chrome \u2014 see Section 10 of explorer-chrome-conventions. Role=\"toolbar\"\n because this is an action band, not a search/filter region.\n-->\n<mj-page-header-interior\n Role=\"toolbar\"\n AriaLabel=\"Application roles actions\"\n Title=\"Application Roles\"\n Subtitle=\"Assign roles per application\">\n @if (HasUnsavedChanges) {\n <div meta>\n <mj-stat-badge\n Icon=\"fa-solid fa-circle-exclamation\"\n Label=\"Unsaved changes\"\n Variant=\"warning\">\n </mj-stat-badge>\n </div>\n }\n <div actions>\n <!-- Order: secondary buttons (Refresh, Discard) \u2192 primary CTA (Save) rightmost,\n per chrome conventions \u00A72 [actions]. -->\n <mj-refresh-button [Loading]=\"IsLoading\" [Disabled]=\"IsSaving\" (Clicked)=\"loadData()\"></mj-refresh-button>\n @if (HasUnsavedChanges) {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"DiscardChanges()\" [disabled]=\"IsSaving\">\n <i class=\"fa-solid fa-rotate-left\"></i> Discard\n </button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"SaveChanges()\" [disabled]=\"IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-floppy-disk\"></i> Save Changes\n }\n </button>\n }\n </div>\n</mj-page-header-interior>\n\n<!-- Scrollable Content \u2014 owned by <mj-page-body-interior>. -->\n <mj-page-body-interior>\n <!-- Status Messages -->\n @if (ErrorMessage) {\n <div class=\"message error-message\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ ErrorMessage }}\n </div>\n }\n @if (SuccessMessage) {\n <div class=\"message success-message\">\n <i class=\"fa-solid fa-circle-check\"></i>\n {{ SuccessMessage }}\n </div>\n }\n\n <!-- Loading State -->\n @if (IsLoading) {\n <mj-loading text=\"Loading application roles...\"></mj-loading>\n }\n\n <!-- Main Content -->\n @if (!IsLoading) {\n <p class=\"description\">\n Configure which roles can access each application. Applications with no role assignments are open to all users (backwards compatible).\n </p>\n\n <div class=\"app-groups\">\n @for (group of ApplicationGroups; track TrackByAppId($index, group)) {\n <div class=\"app-group\" [class.expanded]=\"group.Expanded\" [class.has-roles]=\"group.Roles.length > 0\">\n <!-- Application Header Row -->\n <div class=\"app-group-header\" (click)=\"ToggleGroup(group)\">\n <div class=\"app-header-left\">\n <i class=\"fa-solid\" [ngClass]=\"group.Expanded ? 'fa-chevron-down' : 'fa-chevron-right'\"></i>\n <span class=\"app-name\">{{ group.ApplicationName }}</span>\n <span class=\"role-count-badge\" [class.open-access]=\"group.Roles.length === 0\">\n {{ GetRoleCountLabel(group) }}\n </span>\n </div>\n </div>\n\n <!-- Expanded Content -->\n @if (group.Expanded) {\n <div class=\"app-group-content\">\n <!-- Existing Role Assignments -->\n @if (group.Roles.length > 0) {\n <table class=\"roles-table\">\n <thead>\n <tr>\n <th class=\"col-role\">Role</th>\n <th class=\"col-access\">Can Access</th>\n <th class=\"col-admin\">Can Admin</th>\n <th class=\"col-actions\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (row of group.Roles; track TrackByRoleRow($index, row)) {\n <tr [class.dirty]=\"row.IsDirty\" [class.new-row]=\"row.IsNew\">\n <td class=\"col-role\">\n <i class=\"fa-solid fa-shield-halved role-icon\"></i>\n {{ row.RoleName }}\n @if (row.IsNew) {\n <span class=\"new-badge\">new</span>\n }\n </td>\n <td class=\"col-access\">\n <input type=\"checkbox\"\n class=\"mj-checkbox\"\n [checked]=\"row.CanAccess\"\n (change)=\"ToggleCanAccess(row)\">\n </td>\n <td class=\"col-admin\">\n <input type=\"checkbox\"\n class=\"mj-checkbox\"\n [checked]=\"row.CanAdmin\"\n (change)=\"ToggleCanAdmin(row)\">\n </td>\n <td class=\"col-actions\">\n <button class=\"remove-btn\" (click)=\"RemoveRole(group, row)\" title=\"Remove role assignment\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n } @else {\n <div class=\"no-roles-message\">\n <i class=\"fa-solid fa-unlock\"></i>\n No role restrictions \u2014 all authenticated users can access this application.\n </div>\n }\n\n <!-- Add Role -->\n <div class=\"add-role-row\">\n <select class=\"mj-input add-role-select\"\n [value]=\"SelectedRoleIdToAdd.get(group.ApplicationID) || ''\"\n (change)=\"OnAddRoleSelect(group, $any($event.target).value)\">\n <option value=\"\" disabled>Select a role to add...</option>\n @for (role of GetUnassignedRoles(group); track role.ID) {\n <option [value]=\"role.ID\">{{ role.Name }}</option>\n }\n </select>\n <button mjButton\n variant=\"secondary\"\n (click)=\"AddRole(group)\"\n [disabled]=\"!SelectedRoleIdToAdd.get(group.ApplicationID)\">\n <i class=\"fa-solid fa-plus\"></i> Add Role\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </mj-page-body-interior>\n", styles: ["/* :host is flex-column / 100% height via mj-left-nav-content's ::ng-deep\n sizing. Interior chrome lives in <mj-page-header-interior> \u2014 see Section 10\n of explorer-chrome-conventions. */\n:host {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n background: var(--mj-bg-page);\n}\n\n/* Scrollable Content */\n.scrollable-content {\n flex: 1;\n overflow-y: auto;\n padding: var(--mj-space-6);\n}\n\n/* Messages */\n.message {\n padding: 10px 14px;\n border-radius: 6px;\n margin-bottom: 16px;\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n}\n\n.error-message {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n}\n\n.success-message {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n border: 1px solid var(--mj-status-success-border);\n}\n\n/* Description */\n.description {\n color: var(--mj-text-secondary);\n font-size: 14px;\n margin-bottom: 20px;\n line-height: 1.5;\n}\n\n/* Application Groups */\n.app-groups {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.app-group {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n\n.app-group.expanded {\n border-color: var(--mj-border-strong);\n}\n\n.app-group-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n cursor: pointer;\n user-select: none;\n background: var(--mj-bg-surface-card);\n transition: background 0.15s;\n}\n\n.app-group-header:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.app-header-left {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.app-header-left > i {\n font-size: 12px;\n color: var(--mj-text-muted);\n width: 14px;\n text-align: center;\n}\n\n.app-name {\n font-weight: 600;\n font-size: 15px;\n color: var(--mj-text-primary);\n}\n\n.role-count-badge {\n font-size: 12px;\n padding: 2px 8px;\n border-radius: 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.role-count-badge.open-access {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n/* Expanded Content */\n.app-group-content {\n padding: 16px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n/* Table */\n.roles-table {\n width: 100%;\n border-collapse: collapse;\n margin-bottom: 12px;\n}\n\n.roles-table th {\n text-align: left;\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.roles-table td {\n padding: 10px 12px;\n font-size: 14px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.roles-table tr:last-child td {\n border-bottom: none;\n}\n\n.roles-table tr.dirty td {\n background: color-mix(in srgb, var(--mj-status-warning) 6%, var(--mj-bg-surface));\n}\n\n.roles-table tr.new-row td {\n background: color-mix(in srgb, var(--mj-status-success) 6%, var(--mj-bg-surface));\n}\n\n.col-role {\n width: 40%;\n}\n\n.col-access,\n.col-admin {\n width: 20%;\n text-align: center;\n}\n\n.col-actions {\n width: 20%;\n text-align: center;\n}\n\n.roles-table th.col-access,\n.roles-table th.col-admin,\n.roles-table th.col-actions {\n text-align: center;\n}\n\n.role-icon {\n color: var(--mj-text-muted);\n margin-right: 6px;\n}\n\n.new-badge {\n font-size: 10px;\n padding: 1px 6px;\n border-radius: 8px;\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n margin-left: 6px;\n text-transform: uppercase;\n font-weight: 600;\n}\n\n.remove-btn {\n border: none;\n background: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.15s;\n}\n\n.remove-btn:hover {\n color: var(--mj-status-error);\n background: var(--mj-status-error-bg);\n}\n\n/* No Roles Message */\n.no-roles-message {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n margin-bottom: 12px;\n}\n\n.no-roles-message i {\n color: var(--mj-status-success);\n}\n\n/* Add Role Row */\n.add-role-row {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n\n.add-role-select {\n flex: 1;\n max-width: 300px;\n padding: 6px 10px;\n font-size: 14px;\n}\n"] }]
|
|
531
|
+
args: [{ standalone: false, selector: 'mj-application-roles-resource', template: "<!--\n Interior chrome \u2014 see Section 10 of explorer-chrome-conventions. Role=\"toolbar\"\n because this is an action band, not a search/filter region.\n-->\n<mj-page-header-interior\n Role=\"toolbar\"\n AriaLabel=\"Application roles actions\"\n Title=\"Application Roles\"\n Subtitle=\"Assign roles per application\">\n @if (HasUnsavedChanges) {\n <div meta>\n <mj-stat-badge\n Icon=\"fa-solid fa-circle-exclamation\"\n Label=\"Unsaved changes\"\n Variant=\"warning\">\n </mj-stat-badge>\n </div>\n }\n <div actions>\n <!-- Order: secondary buttons (Refresh, Discard) \u2192 primary CTA (Save) rightmost,\n per chrome conventions \u00A72 [actions]. -->\n <mj-refresh-button [Loading]=\"IsLoading\" [Disabled]=\"IsSaving\" (Clicked)=\"loadData()\"></mj-refresh-button>\n @if (HasUnsavedChanges) {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"DiscardChanges()\" [disabled]=\"IsSaving\">\n <i class=\"fa-solid fa-rotate-left\"></i> <span class=\"mj-action-label\">Discard</span>\n </button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"SaveChanges()\" [disabled]=\"IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> <span class=\"mj-action-label\">Saving...</span>\n } @else {\n <i class=\"fa-solid fa-floppy-disk\"></i> <span class=\"mj-action-label\">Save Changes</span>\n }\n </button>\n }\n </div>\n</mj-page-header-interior>\n\n<!-- Scrollable Content \u2014 owned by <mj-page-body-interior>. -->\n <mj-page-body-interior>\n <!-- Status Messages -->\n @if (ErrorMessage) {\n <div class=\"message error-message\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ ErrorMessage }}\n </div>\n }\n @if (SuccessMessage) {\n <div class=\"message success-message\">\n <i class=\"fa-solid fa-circle-check\"></i>\n {{ SuccessMessage }}\n </div>\n }\n\n <!-- Loading State -->\n @if (IsLoading) {\n <mj-loading text=\"Loading application roles...\"></mj-loading>\n }\n\n <!-- Main Content -->\n @if (!IsLoading) {\n <p class=\"description\">\n Configure which roles can access each application. Applications with no role assignments are open to all users (backwards compatible).\n </p>\n\n <div class=\"app-groups\">\n @for (group of ApplicationGroups; track TrackByAppId($index, group)) {\n <div class=\"app-group\" [class.expanded]=\"group.Expanded\" [class.has-roles]=\"group.Roles.length > 0\">\n <!-- Application Header Row -->\n <div class=\"app-group-header\" (click)=\"ToggleGroup(group)\">\n <div class=\"app-header-left\">\n <i class=\"fa-solid\" [ngClass]=\"group.Expanded ? 'fa-chevron-down' : 'fa-chevron-right'\"></i>\n <span class=\"app-name\">{{ group.ApplicationName }}</span>\n <span class=\"role-count-badge\" [class.open-access]=\"group.Roles.length === 0\">\n {{ GetRoleCountLabel(group) }}\n </span>\n </div>\n </div>\n\n <!-- Expanded Content -->\n @if (group.Expanded) {\n <div class=\"app-group-content\">\n <!-- Existing Role Assignments -->\n @if (group.Roles.length > 0) {\n <table class=\"roles-table\">\n <thead>\n <tr>\n <th class=\"col-role\">Role</th>\n <th class=\"col-access\">Can Access</th>\n <th class=\"col-admin\">Can Admin</th>\n <th class=\"col-actions\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (row of group.Roles; track TrackByRoleRow($index, row)) {\n <tr [class.dirty]=\"row.IsDirty\" [class.new-row]=\"row.IsNew\">\n <td class=\"col-role\">\n <i class=\"fa-solid fa-shield-halved role-icon\"></i>\n {{ row.RoleName }}\n @if (row.IsNew) {\n <span class=\"new-badge\">new</span>\n }\n </td>\n <td class=\"col-access\">\n <input type=\"checkbox\"\n class=\"mj-checkbox\"\n [checked]=\"row.CanAccess\"\n (change)=\"ToggleCanAccess(row)\">\n </td>\n <td class=\"col-admin\">\n <input type=\"checkbox\"\n class=\"mj-checkbox\"\n [checked]=\"row.CanAdmin\"\n (change)=\"ToggleCanAdmin(row)\">\n </td>\n <td class=\"col-actions\">\n <button class=\"remove-btn\" (click)=\"RemoveRole(group, row)\" title=\"Remove role assignment\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n } @else {\n <div class=\"no-roles-message\">\n <i class=\"fa-solid fa-unlock\"></i>\n No role restrictions \u2014 all authenticated users can access this application.\n </div>\n }\n\n <!-- Add Role -->\n <div class=\"add-role-row\">\n <select class=\"mj-input add-role-select\"\n [value]=\"SelectedRoleIdToAdd.get(group.ApplicationID) || ''\"\n (change)=\"OnAddRoleSelect(group, $any($event.target).value)\">\n <option value=\"\" disabled>Select a role to add...</option>\n @for (role of GetUnassignedRoles(group); track role.ID) {\n <option [value]=\"role.ID\">{{ role.Name }}</option>\n }\n </select>\n <button mjButton\n variant=\"secondary\"\n (click)=\"AddRole(group)\"\n [disabled]=\"!SelectedRoleIdToAdd.get(group.ApplicationID)\">\n <i class=\"fa-solid fa-plus\"></i> Add Role\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </mj-page-body-interior>\n", styles: ["/* :host is flex-column / 100% height via mj-left-nav-content's ::ng-deep\n sizing. Interior chrome lives in <mj-page-header-interior> \u2014 see Section 10\n of explorer-chrome-conventions. */\n:host {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n background: var(--mj-bg-page);\n}\n\n/* Scrollable Content */\n.scrollable-content {\n flex: 1;\n overflow-y: auto;\n padding: var(--mj-space-6);\n}\n\n/* Messages */\n.message {\n padding: 10px 14px;\n border-radius: 6px;\n margin-bottom: 16px;\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n}\n\n.error-message {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n}\n\n.success-message {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n border: 1px solid var(--mj-status-success-border);\n}\n\n/* Description */\n.description {\n color: var(--mj-text-secondary);\n font-size: 14px;\n margin-bottom: 20px;\n line-height: 1.5;\n}\n\n/* Application Groups */\n.app-groups {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.app-group {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n\n.app-group.expanded {\n border-color: var(--mj-border-strong);\n}\n\n.app-group-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n cursor: pointer;\n user-select: none;\n background: var(--mj-bg-surface-card);\n transition: background 0.15s;\n}\n\n.app-group-header:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.app-header-left {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.app-header-left > i {\n font-size: 12px;\n color: var(--mj-text-muted);\n width: 14px;\n text-align: center;\n}\n\n.app-name {\n font-weight: 600;\n font-size: 15px;\n color: var(--mj-text-primary);\n}\n\n.role-count-badge {\n font-size: 12px;\n padding: 2px 8px;\n border-radius: 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.role-count-badge.open-access {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text);\n}\n\n/* Expanded Content */\n.app-group-content {\n padding: 16px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n/* Table */\n.roles-table {\n width: 100%;\n border-collapse: collapse;\n margin-bottom: 12px;\n}\n\n.roles-table th {\n text-align: left;\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.roles-table td {\n padding: 10px 12px;\n font-size: 14px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.roles-table tr:last-child td {\n border-bottom: none;\n}\n\n.roles-table tr.dirty td {\n background: color-mix(in srgb, var(--mj-status-warning) 6%, var(--mj-bg-surface));\n}\n\n.roles-table tr.new-row td {\n background: color-mix(in srgb, var(--mj-status-success) 6%, var(--mj-bg-surface));\n}\n\n.col-role {\n width: 40%;\n}\n\n.col-access,\n.col-admin {\n width: 20%;\n text-align: center;\n}\n\n.col-actions {\n width: 20%;\n text-align: center;\n}\n\n.roles-table th.col-access,\n.roles-table th.col-admin,\n.roles-table th.col-actions {\n text-align: center;\n}\n\n.role-icon {\n color: var(--mj-text-muted);\n margin-right: 6px;\n}\n\n.new-badge {\n font-size: 10px;\n padding: 1px 6px;\n border-radius: 8px;\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n margin-left: 6px;\n text-transform: uppercase;\n font-weight: 600;\n}\n\n.remove-btn {\n border: none;\n background: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.15s;\n}\n\n.remove-btn:hover {\n color: var(--mj-status-error);\n background: var(--mj-status-error-bg);\n}\n\n/* No Roles Message */\n.no-roles-message {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n margin-bottom: 12px;\n}\n\n.no-roles-message i {\n color: var(--mj-status-success);\n}\n\n/* Add Role Row */\n.add-role-row {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n\n.add-role-select {\n flex: 1;\n max-width: 300px;\n padding: 6px 10px;\n font-size: 14px;\n}\n"] }]
|
|
527
532
|
}], () => [{ type: i0.ChangeDetectorRef }], null); })();
|
|
528
533
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ApplicationRolesResourceComponent, { className: "ApplicationRolesResourceComponent", filePath: "src/ApplicationRoles/application-roles-resource.component.ts", lineNumber: 43 }); })();
|
|
529
534
|
/** Tree-shaking prevention */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application-roles-resource.component.js","sourceRoot":"","sources":["../../src/ApplicationRoles/application-roles-resource.component.ts","../../src/ApplicationRoles/application-roles-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { CompositeKey, Metadata, RunView } from '@memberjunction/core';\nimport { ResourceData } from '@memberjunction/core-entities';\n\n/**\n * Represents an application's role assignment for display in the grid.\n */\ninterface ApplicationRoleRow {\n ID: string;\n ApplicationID: string;\n ApplicationName: string;\n RoleID: string;\n RoleName: string;\n CanAccess: boolean;\n CanAdmin: boolean;\n IsDirty: boolean;\n IsNew: boolean;\n}\n\n/**\n * Represents an application with its role assignments grouped.\n */\ninterface ApplicationGroup {\n ApplicationID: string;\n ApplicationName: string;\n Roles: ApplicationRoleRow[];\n Expanded: boolean;\n}\n\n/**\n * Admin dashboard for managing Application Role assignments.\n * Shows which roles can access and administer each application.\n */\n@RegisterClass(BaseResourceComponent, 'ApplicationRolesResource')\n@Component({\n standalone: false,\n selector: 'mj-application-roles-resource',\n templateUrl: './application-roles-resource.component.html',\n styleUrls: ['./application-roles-resource.component.css']\n})\nexport class ApplicationRolesResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n ApplicationGroups: ApplicationGroup[] = [];\n AvailableRoles: { ID: string; Name: string }[] = [];\n IsLoading = true;\n IsSaving = false;\n HasUnsavedChanges = false;\n ErrorMessage: string | null = null;\n SuccessMessage: string | null = null;\n\n // For the \"Add Role\" dropdown per application\n SelectedRoleIdToAdd: Map<string, string> = new Map();\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n override async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'App Roles';\n }\n\n override async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-user-shield';\n }\n\n override async ngOnInit(): Promise<void> {\n super.ngOnInit();\n await this.loadData();\n this.NotifyLoadComplete();\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n /**\n * Load all application role data and available roles.\n */\n async loadData(): Promise<void> {\n this.IsLoading = true;\n this.ErrorMessage = null;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n // Load available roles from metadata\n this.AvailableRoles = md.Roles.map(r => ({ ID: r.ID, Name: r.Name }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n\n // Load existing ApplicationRole records\n const result = await rv.RunView<{ ID: string; ApplicationID: string; Application: string; RoleID: string; Role: string; CanAccess: boolean; CanAdmin: boolean }>({\n EntityName: 'MJ: Application Roles',\n ResultType: 'simple',\n });\n\n if (!result.Success) {\n this.ErrorMessage = result.ErrorMessage || 'Failed to load application roles.';\n this.IsLoading = false;\n this.cdr.detectChanges();\n return;\n }\n\n // Build grouped structure\n const appMap = new Map<string, ApplicationGroup>();\n\n // Seed all applications so we can show apps without any role records\n for (const app of md.Applications) {\n appMap.set(app.ID, {\n ApplicationID: app.ID,\n ApplicationName: app.Name,\n Roles: [],\n Expanded: false,\n });\n }\n\n // Populate role assignments\n for (const record of result.Results) {\n const group = appMap.get(record.ApplicationID);\n if (group) {\n group.Roles.push({\n ID: record.ID,\n ApplicationID: record.ApplicationID,\n ApplicationName: group.ApplicationName,\n RoleID: record.RoleID,\n RoleName: record.Role || '',\n CanAccess: record.CanAccess,\n CanAdmin: record.CanAdmin,\n IsDirty: false,\n IsNew: false,\n });\n }\n }\n\n // Sort roles within each group\n for (const group of appMap.values()) {\n group.Roles.sort((a, b) => a.RoleName.localeCompare(b.RoleName));\n }\n\n this.ApplicationGroups = Array.from(appMap.values())\n .sort((a, b) => a.ApplicationName.localeCompare(b.ApplicationName));\n } catch (e) {\n this.ErrorMessage = `Error loading data: ${e instanceof Error ? e.message : String(e)}`;\n }\n\n this.IsLoading = false;\n this.HasUnsavedChanges = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle the expanded/collapsed state of an application group.\n */\n ToggleGroup(group: ApplicationGroup): void {\n group.Expanded = !group.Expanded;\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle CanAccess for a specific role assignment.\n */\n ToggleCanAccess(row: ApplicationRoleRow): void {\n row.CanAccess = !row.CanAccess;\n row.IsDirty = true;\n this.HasUnsavedChanges = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle CanAdmin for a specific role assignment.\n */\n ToggleCanAdmin(row: ApplicationRoleRow): void {\n row.CanAdmin = !row.CanAdmin;\n row.IsDirty = true;\n this.HasUnsavedChanges = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Get roles not yet assigned to a specific application (for the \"Add Role\" dropdown).\n */\n GetUnassignedRoles(group: ApplicationGroup): { ID: string; Name: string }[] {\n const assignedRoleIds = new Set(group.Roles.map(r => r.RoleID.toLowerCase()));\n return this.AvailableRoles.filter(r => !assignedRoleIds.has(r.ID.toLowerCase()));\n }\n\n /**\n * Add a new role assignment to an application group.\n */\n AddRole(group: ApplicationGroup): void {\n const roleId = this.SelectedRoleIdToAdd.get(group.ApplicationID);\n if (!roleId) return;\n\n const role = this.AvailableRoles.find(r => UUIDsEqual(r.ID, roleId));\n if (!role) return;\n\n group.Roles.push({\n ID: '',\n ApplicationID: group.ApplicationID,\n ApplicationName: group.ApplicationName,\n RoleID: role.ID,\n RoleName: role.Name,\n CanAccess: true,\n CanAdmin: false,\n IsDirty: true,\n IsNew: true,\n });\n\n group.Roles.sort((a, b) => a.RoleName.localeCompare(b.RoleName));\n this.SelectedRoleIdToAdd.delete(group.ApplicationID);\n this.HasUnsavedChanges = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Remove a role assignment (marks for deletion on save; removes immediately if new).\n */\n RemoveRole(group: ApplicationGroup, row: ApplicationRoleRow): void {\n const idx = group.Roles.indexOf(row);\n if (idx >= 0) {\n group.Roles.splice(idx, 1);\n }\n // If not new, we need to delete it on save — track via dirty state\n if (!row.IsNew) {\n this._pendingDeletes.push(row.ID);\n }\n this.HasUnsavedChanges = true;\n this.cdr.detectChanges();\n }\n\n private _pendingDeletes: string[] = [];\n\n /**\n * Save all unsaved changes (new records, modified records, deleted records).\n */\n async SaveChanges(): Promise<void> {\n this.IsSaving = true;\n this.ErrorMessage = null;\n this.SuccessMessage = null;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n\n // Process deletes\n for (const deleteId of this._pendingDeletes) {\n const entity = await md.GetEntityObject('MJ: Application Roles');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: deleteId }]));\n const deleteResult = await entity.Delete();\n if (!deleteResult) {\n this.ErrorMessage = `Failed to delete role assignment: ${entity.LatestResult?.Message || 'Unknown error'}`;\n this.IsSaving = false;\n this.cdr.detectChanges();\n return;\n }\n }\n\n // Process new and modified records\n for (const group of this.ApplicationGroups) {\n for (const row of group.Roles) {\n if (!row.IsDirty) continue;\n\n if (row.IsNew) {\n const entity = await md.GetEntityObject('MJ: Application Roles');\n entity.NewRecord();\n entity.Set('ApplicationID', row.ApplicationID);\n entity.Set('RoleID', row.RoleID);\n entity.Set('CanAccess', row.CanAccess);\n entity.Set('CanAdmin', row.CanAdmin);\n const saveResult = await entity.Save();\n if (!saveResult) {\n this.ErrorMessage = `Failed to save new role assignment for ${row.RoleName}: ${entity.LatestResult?.Message || 'Unknown error'}`;\n this.IsSaving = false;\n this.cdr.detectChanges();\n return;\n }\n row.ID = entity.Get('ID');\n } else {\n const entity = await md.GetEntityObject('MJ: Application Roles');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: row.ID }]));\n entity.Set('CanAccess', row.CanAccess);\n entity.Set('CanAdmin', row.CanAdmin);\n const saveResult = await entity.Save();\n if (!saveResult) {\n this.ErrorMessage = `Failed to update role assignment for ${row.RoleName}: ${entity.LatestResult?.Message || 'Unknown error'}`;\n this.IsSaving = false;\n this.cdr.detectChanges();\n return;\n }\n }\n\n row.IsDirty = false;\n row.IsNew = false;\n }\n }\n\n this._pendingDeletes = [];\n this.HasUnsavedChanges = false;\n this.SuccessMessage = 'All changes saved successfully.';\n } catch (e) {\n this.ErrorMessage = `Error saving: ${e instanceof Error ? e.message : String(e)}`;\n }\n\n this.IsSaving = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Discard all unsaved changes and reload data.\n */\n async DiscardChanges(): Promise<void> {\n this._pendingDeletes = [];\n await this.loadData();\n }\n\n /**\n * Track by function for application groups.\n */\n TrackByAppId(_index: number, group: ApplicationGroup): string {\n return group.ApplicationID;\n }\n\n /**\n * Track by function for role rows.\n */\n TrackByRoleRow(_index: number, row: ApplicationRoleRow): string {\n return row.IsNew ? `new-${row.RoleID}` : row.ID;\n }\n\n /**\n * Get the role count label for an application.\n */\n GetRoleCountLabel(group: ApplicationGroup): string {\n if (group.Roles.length === 0) return 'Open Access (no role restrictions)';\n return `${group.Roles.length} role${group.Roles.length === 1 ? '' : 's'} assigned`;\n }\n\n /**\n * Handle dropdown selection for adding roles.\n */\n OnAddRoleSelect(group: ApplicationGroup, roleId: string): void {\n this.SelectedRoleIdToAdd.set(group.ApplicationID, roleId);\n }\n}\n\n/** Tree-shaking prevention */\nexport function LoadApplicationRolesResource(): void {\n // Prevents tree-shaking\n}\n","<!--\n Interior chrome — see Section 10 of explorer-chrome-conventions. Role=\"toolbar\"\n because this is an action band, not a search/filter region.\n-->\n<mj-page-header-interior\n Role=\"toolbar\"\n AriaLabel=\"Application roles actions\"\n Title=\"Application Roles\"\n Subtitle=\"Assign roles per application\">\n @if (HasUnsavedChanges) {\n <div meta>\n <mj-stat-badge\n Icon=\"fa-solid fa-circle-exclamation\"\n Label=\"Unsaved changes\"\n Variant=\"warning\">\n </mj-stat-badge>\n </div>\n }\n <div actions>\n <!-- Order: secondary buttons (Refresh, Discard) → primary CTA (Save) rightmost,\n per chrome conventions §2 [actions]. -->\n <mj-refresh-button [Loading]=\"IsLoading\" [Disabled]=\"IsSaving\" (Clicked)=\"loadData()\"></mj-refresh-button>\n @if (HasUnsavedChanges) {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"DiscardChanges()\" [disabled]=\"IsSaving\">\n <i class=\"fa-solid fa-rotate-left\"></i> Discard\n </button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"SaveChanges()\" [disabled]=\"IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-floppy-disk\"></i> Save Changes\n }\n </button>\n }\n </div>\n</mj-page-header-interior>\n\n<!-- Scrollable Content — owned by <mj-page-body-interior>. -->\n <mj-page-body-interior>\n <!-- Status Messages -->\n @if (ErrorMessage) {\n <div class=\"message error-message\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ ErrorMessage }}\n </div>\n }\n @if (SuccessMessage) {\n <div class=\"message success-message\">\n <i class=\"fa-solid fa-circle-check\"></i>\n {{ SuccessMessage }}\n </div>\n }\n\n <!-- Loading State -->\n @if (IsLoading) {\n <mj-loading text=\"Loading application roles...\"></mj-loading>\n }\n\n <!-- Main Content -->\n @if (!IsLoading) {\n <p class=\"description\">\n Configure which roles can access each application. Applications with no role assignments are open to all users (backwards compatible).\n </p>\n\n <div class=\"app-groups\">\n @for (group of ApplicationGroups; track TrackByAppId($index, group)) {\n <div class=\"app-group\" [class.expanded]=\"group.Expanded\" [class.has-roles]=\"group.Roles.length > 0\">\n <!-- Application Header Row -->\n <div class=\"app-group-header\" (click)=\"ToggleGroup(group)\">\n <div class=\"app-header-left\">\n <i class=\"fa-solid\" [ngClass]=\"group.Expanded ? 'fa-chevron-down' : 'fa-chevron-right'\"></i>\n <span class=\"app-name\">{{ group.ApplicationName }}</span>\n <span class=\"role-count-badge\" [class.open-access]=\"group.Roles.length === 0\">\n {{ GetRoleCountLabel(group) }}\n </span>\n </div>\n </div>\n\n <!-- Expanded Content -->\n @if (group.Expanded) {\n <div class=\"app-group-content\">\n <!-- Existing Role Assignments -->\n @if (group.Roles.length > 0) {\n <table class=\"roles-table\">\n <thead>\n <tr>\n <th class=\"col-role\">Role</th>\n <th class=\"col-access\">Can Access</th>\n <th class=\"col-admin\">Can Admin</th>\n <th class=\"col-actions\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (row of group.Roles; track TrackByRoleRow($index, row)) {\n <tr [class.dirty]=\"row.IsDirty\" [class.new-row]=\"row.IsNew\">\n <td class=\"col-role\">\n <i class=\"fa-solid fa-shield-halved role-icon\"></i>\n {{ row.RoleName }}\n @if (row.IsNew) {\n <span class=\"new-badge\">new</span>\n }\n </td>\n <td class=\"col-access\">\n <input type=\"checkbox\"\n class=\"mj-checkbox\"\n [checked]=\"row.CanAccess\"\n (change)=\"ToggleCanAccess(row)\">\n </td>\n <td class=\"col-admin\">\n <input type=\"checkbox\"\n class=\"mj-checkbox\"\n [checked]=\"row.CanAdmin\"\n (change)=\"ToggleCanAdmin(row)\">\n </td>\n <td class=\"col-actions\">\n <button class=\"remove-btn\" (click)=\"RemoveRole(group, row)\" title=\"Remove role assignment\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n } @else {\n <div class=\"no-roles-message\">\n <i class=\"fa-solid fa-unlock\"></i>\n No role restrictions — all authenticated users can access this application.\n </div>\n }\n\n <!-- Add Role -->\n <div class=\"add-role-row\">\n <select class=\"mj-input add-role-select\"\n [value]=\"SelectedRoleIdToAdd.get(group.ApplicationID) || ''\"\n (change)=\"OnAddRoleSelect(group, $any($event.target).value)\">\n <option value=\"\" disabled>Select a role to add...</option>\n @for (role of GetUnassignedRoles(group); track role.ID) {\n <option [value]=\"role.ID\">{{ role.Name }}</option>\n }\n </select>\n <button mjButton\n variant=\"secondary\"\n (click)=\"AddRole(group)\"\n [disabled]=\"!SelectedRoleIdToAdd.get(group.ApplicationID)\">\n <i class=\"fa-solid fa-plus\"></i> Add Role\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </mj-page-body-interior>\n"]}
|
|
1
|
+
{"version":3,"file":"application-roles-resource.component.js","sourceRoot":"","sources":["../../src/ApplicationRoles/application-roles-resource.component.ts","../../src/ApplicationRoles/application-roles-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { CompositeKey, Metadata, RunView } from '@memberjunction/core';\nimport { ResourceData } from '@memberjunction/core-entities';\n\n/**\n * Represents an application's role assignment for display in the grid.\n */\ninterface ApplicationRoleRow {\n ID: string;\n ApplicationID: string;\n ApplicationName: string;\n RoleID: string;\n RoleName: string;\n CanAccess: boolean;\n CanAdmin: boolean;\n IsDirty: boolean;\n IsNew: boolean;\n}\n\n/**\n * Represents an application with its role assignments grouped.\n */\ninterface ApplicationGroup {\n ApplicationID: string;\n ApplicationName: string;\n Roles: ApplicationRoleRow[];\n Expanded: boolean;\n}\n\n/**\n * Admin dashboard for managing Application Role assignments.\n * Shows which roles can access and administer each application.\n */\n@RegisterClass(BaseResourceComponent, 'ApplicationRolesResource')\n@Component({\n standalone: false,\n selector: 'mj-application-roles-resource',\n templateUrl: './application-roles-resource.component.html',\n styleUrls: ['./application-roles-resource.component.css']\n})\nexport class ApplicationRolesResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n ApplicationGroups: ApplicationGroup[] = [];\n AvailableRoles: { ID: string; Name: string }[] = [];\n IsLoading = true;\n IsSaving = false;\n HasUnsavedChanges = false;\n ErrorMessage: string | null = null;\n SuccessMessage: string | null = null;\n\n // For the \"Add Role\" dropdown per application\n SelectedRoleIdToAdd: Map<string, string> = new Map();\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n override async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'App Roles';\n }\n\n override async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-user-shield';\n }\n\n override async ngOnInit(): Promise<void> {\n super.ngOnInit();\n await this.loadData();\n this.NotifyLoadComplete();\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n /**\n * Load all application role data and available roles.\n */\n async loadData(): Promise<void> {\n this.IsLoading = true;\n this.ErrorMessage = null;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n // Load available roles from metadata\n this.AvailableRoles = md.Roles.map(r => ({ ID: r.ID, Name: r.Name }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n\n // Load existing ApplicationRole records\n const result = await rv.RunView<{ ID: string; ApplicationID: string; Application: string; RoleID: string; Role: string; CanAccess: boolean; CanAdmin: boolean }>({\n EntityName: 'MJ: Application Roles',\n ResultType: 'simple',\n });\n\n if (!result.Success) {\n this.ErrorMessage = result.ErrorMessage || 'Failed to load application roles.';\n this.IsLoading = false;\n this.cdr.detectChanges();\n return;\n }\n\n // Build grouped structure\n const appMap = new Map<string, ApplicationGroup>();\n\n // Seed all applications so we can show apps without any role records\n for (const app of md.Applications) {\n appMap.set(app.ID, {\n ApplicationID: app.ID,\n ApplicationName: app.Name,\n Roles: [],\n Expanded: false,\n });\n }\n\n // Populate role assignments\n for (const record of result.Results) {\n const group = appMap.get(record.ApplicationID);\n if (group) {\n group.Roles.push({\n ID: record.ID,\n ApplicationID: record.ApplicationID,\n ApplicationName: group.ApplicationName,\n RoleID: record.RoleID,\n RoleName: record.Role || '',\n CanAccess: record.CanAccess,\n CanAdmin: record.CanAdmin,\n IsDirty: false,\n IsNew: false,\n });\n }\n }\n\n // Sort roles within each group\n for (const group of appMap.values()) {\n group.Roles.sort((a, b) => a.RoleName.localeCompare(b.RoleName));\n }\n\n this.ApplicationGroups = Array.from(appMap.values())\n .sort((a, b) => a.ApplicationName.localeCompare(b.ApplicationName));\n } catch (e) {\n this.ErrorMessage = `Error loading data: ${e instanceof Error ? e.message : String(e)}`;\n }\n\n this.IsLoading = false;\n this.HasUnsavedChanges = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle the expanded/collapsed state of an application group.\n */\n ToggleGroup(group: ApplicationGroup): void {\n group.Expanded = !group.Expanded;\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle CanAccess for a specific role assignment.\n */\n ToggleCanAccess(row: ApplicationRoleRow): void {\n row.CanAccess = !row.CanAccess;\n row.IsDirty = true;\n this.HasUnsavedChanges = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle CanAdmin for a specific role assignment.\n */\n ToggleCanAdmin(row: ApplicationRoleRow): void {\n row.CanAdmin = !row.CanAdmin;\n row.IsDirty = true;\n this.HasUnsavedChanges = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Get roles not yet assigned to a specific application (for the \"Add Role\" dropdown).\n */\n GetUnassignedRoles(group: ApplicationGroup): { ID: string; Name: string }[] {\n const assignedRoleIds = new Set(group.Roles.map(r => r.RoleID.toLowerCase()));\n return this.AvailableRoles.filter(r => !assignedRoleIds.has(r.ID.toLowerCase()));\n }\n\n /**\n * Add a new role assignment to an application group.\n */\n AddRole(group: ApplicationGroup): void {\n const roleId = this.SelectedRoleIdToAdd.get(group.ApplicationID);\n if (!roleId) return;\n\n const role = this.AvailableRoles.find(r => UUIDsEqual(r.ID, roleId));\n if (!role) return;\n\n group.Roles.push({\n ID: '',\n ApplicationID: group.ApplicationID,\n ApplicationName: group.ApplicationName,\n RoleID: role.ID,\n RoleName: role.Name,\n CanAccess: true,\n CanAdmin: false,\n IsDirty: true,\n IsNew: true,\n });\n\n group.Roles.sort((a, b) => a.RoleName.localeCompare(b.RoleName));\n this.SelectedRoleIdToAdd.delete(group.ApplicationID);\n this.HasUnsavedChanges = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Remove a role assignment (marks for deletion on save; removes immediately if new).\n */\n RemoveRole(group: ApplicationGroup, row: ApplicationRoleRow): void {\n const idx = group.Roles.indexOf(row);\n if (idx >= 0) {\n group.Roles.splice(idx, 1);\n }\n // If not new, we need to delete it on save — track via dirty state\n if (!row.IsNew) {\n this._pendingDeletes.push(row.ID);\n }\n this.HasUnsavedChanges = true;\n this.cdr.detectChanges();\n }\n\n private _pendingDeletes: string[] = [];\n\n /**\n * Save all unsaved changes (new records, modified records, deleted records).\n */\n async SaveChanges(): Promise<void> {\n this.IsSaving = true;\n this.ErrorMessage = null;\n this.SuccessMessage = null;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n\n // Process deletes\n for (const deleteId of this._pendingDeletes) {\n const entity = await md.GetEntityObject('MJ: Application Roles');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: deleteId }]));\n const deleteResult = await entity.Delete();\n if (!deleteResult) {\n this.ErrorMessage = `Failed to delete role assignment: ${entity.LatestResult?.Message || 'Unknown error'}`;\n this.IsSaving = false;\n this.cdr.detectChanges();\n return;\n }\n }\n\n // Process new and modified records\n for (const group of this.ApplicationGroups) {\n for (const row of group.Roles) {\n if (!row.IsDirty) continue;\n\n if (row.IsNew) {\n const entity = await md.GetEntityObject('MJ: Application Roles');\n entity.NewRecord();\n entity.Set('ApplicationID', row.ApplicationID);\n entity.Set('RoleID', row.RoleID);\n entity.Set('CanAccess', row.CanAccess);\n entity.Set('CanAdmin', row.CanAdmin);\n const saveResult = await entity.Save();\n if (!saveResult) {\n this.ErrorMessage = `Failed to save new role assignment for ${row.RoleName}: ${entity.LatestResult?.Message || 'Unknown error'}`;\n this.IsSaving = false;\n this.cdr.detectChanges();\n return;\n }\n row.ID = entity.Get('ID');\n } else {\n const entity = await md.GetEntityObject('MJ: Application Roles');\n await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: row.ID }]));\n entity.Set('CanAccess', row.CanAccess);\n entity.Set('CanAdmin', row.CanAdmin);\n const saveResult = await entity.Save();\n if (!saveResult) {\n this.ErrorMessage = `Failed to update role assignment for ${row.RoleName}: ${entity.LatestResult?.Message || 'Unknown error'}`;\n this.IsSaving = false;\n this.cdr.detectChanges();\n return;\n }\n }\n\n row.IsDirty = false;\n row.IsNew = false;\n }\n }\n\n this._pendingDeletes = [];\n this.HasUnsavedChanges = false;\n this.SuccessMessage = 'All changes saved successfully.';\n } catch (e) {\n this.ErrorMessage = `Error saving: ${e instanceof Error ? e.message : String(e)}`;\n }\n\n this.IsSaving = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Discard all unsaved changes and reload data.\n */\n async DiscardChanges(): Promise<void> {\n this._pendingDeletes = [];\n await this.loadData();\n }\n\n /**\n * Track by function for application groups.\n */\n TrackByAppId(_index: number, group: ApplicationGroup): string {\n return group.ApplicationID;\n }\n\n /**\n * Track by function for role rows.\n */\n TrackByRoleRow(_index: number, row: ApplicationRoleRow): string {\n return row.IsNew ? `new-${row.RoleID}` : row.ID;\n }\n\n /**\n * Get the role count label for an application.\n */\n GetRoleCountLabel(group: ApplicationGroup): string {\n if (group.Roles.length === 0) return 'Open Access (no role restrictions)';\n return `${group.Roles.length} role${group.Roles.length === 1 ? '' : 's'} assigned`;\n }\n\n /**\n * Handle dropdown selection for adding roles.\n */\n OnAddRoleSelect(group: ApplicationGroup, roleId: string): void {\n this.SelectedRoleIdToAdd.set(group.ApplicationID, roleId);\n }\n}\n\n/** Tree-shaking prevention */\nexport function LoadApplicationRolesResource(): void {\n // Prevents tree-shaking\n}\n","<!--\n Interior chrome — see Section 10 of explorer-chrome-conventions. Role=\"toolbar\"\n because this is an action band, not a search/filter region.\n-->\n<mj-page-header-interior\n Role=\"toolbar\"\n AriaLabel=\"Application roles actions\"\n Title=\"Application Roles\"\n Subtitle=\"Assign roles per application\">\n @if (HasUnsavedChanges) {\n <div meta>\n <mj-stat-badge\n Icon=\"fa-solid fa-circle-exclamation\"\n Label=\"Unsaved changes\"\n Variant=\"warning\">\n </mj-stat-badge>\n </div>\n }\n <div actions>\n <!-- Order: secondary buttons (Refresh, Discard) → primary CTA (Save) rightmost,\n per chrome conventions §2 [actions]. -->\n <mj-refresh-button [Loading]=\"IsLoading\" [Disabled]=\"IsSaving\" (Clicked)=\"loadData()\"></mj-refresh-button>\n @if (HasUnsavedChanges) {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"DiscardChanges()\" [disabled]=\"IsSaving\">\n <i class=\"fa-solid fa-rotate-left\"></i> <span class=\"mj-action-label\">Discard</span>\n </button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"SaveChanges()\" [disabled]=\"IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> <span class=\"mj-action-label\">Saving...</span>\n } @else {\n <i class=\"fa-solid fa-floppy-disk\"></i> <span class=\"mj-action-label\">Save Changes</span>\n }\n </button>\n }\n </div>\n</mj-page-header-interior>\n\n<!-- Scrollable Content — owned by <mj-page-body-interior>. -->\n <mj-page-body-interior>\n <!-- Status Messages -->\n @if (ErrorMessage) {\n <div class=\"message error-message\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ ErrorMessage }}\n </div>\n }\n @if (SuccessMessage) {\n <div class=\"message success-message\">\n <i class=\"fa-solid fa-circle-check\"></i>\n {{ SuccessMessage }}\n </div>\n }\n\n <!-- Loading State -->\n @if (IsLoading) {\n <mj-loading text=\"Loading application roles...\"></mj-loading>\n }\n\n <!-- Main Content -->\n @if (!IsLoading) {\n <p class=\"description\">\n Configure which roles can access each application. Applications with no role assignments are open to all users (backwards compatible).\n </p>\n\n <div class=\"app-groups\">\n @for (group of ApplicationGroups; track TrackByAppId($index, group)) {\n <div class=\"app-group\" [class.expanded]=\"group.Expanded\" [class.has-roles]=\"group.Roles.length > 0\">\n <!-- Application Header Row -->\n <div class=\"app-group-header\" (click)=\"ToggleGroup(group)\">\n <div class=\"app-header-left\">\n <i class=\"fa-solid\" [ngClass]=\"group.Expanded ? 'fa-chevron-down' : 'fa-chevron-right'\"></i>\n <span class=\"app-name\">{{ group.ApplicationName }}</span>\n <span class=\"role-count-badge\" [class.open-access]=\"group.Roles.length === 0\">\n {{ GetRoleCountLabel(group) }}\n </span>\n </div>\n </div>\n\n <!-- Expanded Content -->\n @if (group.Expanded) {\n <div class=\"app-group-content\">\n <!-- Existing Role Assignments -->\n @if (group.Roles.length > 0) {\n <table class=\"roles-table\">\n <thead>\n <tr>\n <th class=\"col-role\">Role</th>\n <th class=\"col-access\">Can Access</th>\n <th class=\"col-admin\">Can Admin</th>\n <th class=\"col-actions\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (row of group.Roles; track TrackByRoleRow($index, row)) {\n <tr [class.dirty]=\"row.IsDirty\" [class.new-row]=\"row.IsNew\">\n <td class=\"col-role\">\n <i class=\"fa-solid fa-shield-halved role-icon\"></i>\n {{ row.RoleName }}\n @if (row.IsNew) {\n <span class=\"new-badge\">new</span>\n }\n </td>\n <td class=\"col-access\">\n <input type=\"checkbox\"\n class=\"mj-checkbox\"\n [checked]=\"row.CanAccess\"\n (change)=\"ToggleCanAccess(row)\">\n </td>\n <td class=\"col-admin\">\n <input type=\"checkbox\"\n class=\"mj-checkbox\"\n [checked]=\"row.CanAdmin\"\n (change)=\"ToggleCanAdmin(row)\">\n </td>\n <td class=\"col-actions\">\n <button class=\"remove-btn\" (click)=\"RemoveRole(group, row)\" title=\"Remove role assignment\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n } @else {\n <div class=\"no-roles-message\">\n <i class=\"fa-solid fa-unlock\"></i>\n No role restrictions — all authenticated users can access this application.\n </div>\n }\n\n <!-- Add Role -->\n <div class=\"add-role-row\">\n <select class=\"mj-input add-role-select\"\n [value]=\"SelectedRoleIdToAdd.get(group.ApplicationID) || ''\"\n (change)=\"OnAddRoleSelect(group, $any($event.target).value)\">\n <option value=\"\" disabled>Select a role to add...</option>\n @for (role of GetUnassignedRoles(group); track role.ID) {\n <option [value]=\"role.ID\">{{ role.Name }}</option>\n }\n </select>\n <button mjButton\n variant=\"secondary\"\n (click)=\"AddRole(group)\"\n [disabled]=\"!SelectedRoleIdToAdd.get(group.ApplicationID)\">\n <i class=\"fa-solid fa-plus\"></i> Add Role\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </mj-page-body-interior>\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';
|
|
2
2
|
import { ResourceData, MJCommunicationLogEntity } from '@memberjunction/core-entities';
|
|
3
3
|
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
4
|
+
import { FilterFieldConfig } from '@memberjunction/ng-ui-components';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
export declare class CommunicationLogsResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {
|
|
6
7
|
private cdr;
|
|
@@ -15,6 +16,11 @@ export declare class CommunicationLogsResourceComponent extends BaseResourceComp
|
|
|
15
16
|
loadData(): Promise<void>;
|
|
16
17
|
onSearchValue(value: string): void;
|
|
17
18
|
onStatusFilter(status: string): void;
|
|
19
|
+
get filterFields(): FilterFieldConfig[];
|
|
20
|
+
get filterValues(): Record<string, unknown>;
|
|
21
|
+
get ActiveFilterCount(): number;
|
|
22
|
+
onFilterValuesChange(values: Record<string, unknown>): void;
|
|
23
|
+
resetFilters(): void;
|
|
18
24
|
getStatusClass(status: string): string;
|
|
19
25
|
getStatusIcon(status: string): string;
|
|
20
26
|
getProviderIcon(name: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"communication-logs-resource.component.d.ts","sourceRoot":"","sources":["../../src/Communication/communication-logs-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC
|
|
1
|
+
{"version":3,"file":"communication-logs-resource.component.d.ts","sourceRoot":"","sources":["../../src/Communication/communication-logs-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;;AACrE,qBAoMa,kCAAmC,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS;IAO1F,OAAO,CAAC,GAAG;IANhB,IAAI,EAAE,wBAAwB,EAAE,CAAM;IACtC,YAAY,EAAE,wBAAwB,EAAE,CAAM;IAC9C,SAAS,UAAS;IAClB,YAAY,SAAM;IACzB,OAAO,CAAC,UAAU,CAAM;gBAEJ,GAAG,EAAE,iBAAiB;IAIpC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,WAAW,IAAI,IAAI;IAIN,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB/B,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKlC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAO3C,IAAW,YAAY,IAAI,iBAAiB,EAAE,CAY7C;IAED,IAAW,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEjD;IAED,IAAW,iBAAiB,IAAI,MAAM,CAErC;IAEM,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI3D,YAAY,IAAI,IAAI;IAIpB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAStC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IASrC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAUrC,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAU7C,OAAO,CAAC,WAAW;IAoBb,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAtJtD,kCAAkC;2CAAlC,kCAAkC;CAyJ9C"}
|