@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lists-my-lists-resource.component.js","sourceRoot":"","sources":["../../../src/Lists/components/lists-my-lists-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, ChangeDetectorRef, OnDestroy, ElementRef, HostListener } from '@angular/core';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { MJListEntity, MJListCategoryEntity, MJListDetailEntity } from '@memberjunction/core-entities';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { TabService } from '@memberjunction/ng-base-application';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\ninterface ListViewModel {\n list: MJListEntity;\n itemCount: number;\n entityName: string;\n}\n\ninterface CategoryNode {\n category: MJListCategoryEntity | null;\n lists: ListViewModel[];\n children: CategoryNode[];\n isExpanded: boolean;\n}\n\n@RegisterClass(BaseResourceComponent, 'ListsMyListsResource')\n@Component({\n standalone: false,\n selector: 'mj-lists-my-lists-resource',\n template: `\n <mj-page-layout>\n <mj-page-header\n Title=\"My Lists\"\n Icon=\"fa-solid fa-list-check\"\n Subtitle=\"Lists you've created or have access to\">\n <div meta>\n <mj-stat-badge [Count]=\"filteredLists.length\" [Total]=\"allLists.length\" Label=\"lists\"></mj-stat-badge>\n </div>\n <div actions>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createNewList()\">\n <i class=\"fa-solid fa-plus\"></i> New List\n </button>\n </div>\n <div toolbar>\n <mj-page-search\n Placeholder=\"Search lists...\"\n [Value]=\"searchTerm\"\n (ValueChange)=\"onSearchChange($event)\">\n </mj-page-search>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading lists...\" size=\"medium\"></mj-loading>\n </div>\n }\n \n <!-- Empty State -->\n @if (!isLoading && filteredLists.length === 0 && !searchTerm) {\n <div class=\"empty-state\">\n <div class=\"empty-state-icon-wrapper\">\n <div class=\"icon-bg\"></div>\n <i class=\"fa-solid fa-list-check\"></i>\n </div>\n <h3>No Lists Yet</h3>\n <p>Lists help you organize and track groups of records across your data.</p>\n <div class=\"empty-state-features\">\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Group records from any entity</span>\n </div>\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Organize with categories</span>\n </div>\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Quick access from any view</span>\n </div>\n </div>\n <button class=\"btn-create-large\" (click)=\"createNewList()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Your First List\n </button>\n </div>\n }\n \n <!-- No Results State -->\n @if (!isLoading && filteredLists.length === 0 && searchTerm) {\n <div class=\"empty-state search-empty\">\n <div class=\"empty-state-icon-wrapper search\">\n <i class=\"fa-solid fa-search\"></i>\n </div>\n <h3>No Results Found</h3>\n <p>No lists match \"<strong>{{searchTerm}}</strong>\"</p>\n <p class=\"empty-hint\">Try a different search term or clear your search.</p>\n <button class=\"btn-clear\" (click)=\"clearSearch()\">Clear Search</button>\n </div>\n }\n \n <!-- Lists Grid -->\n @if (!isLoading && filteredLists.length > 0) {\n <div class=\"lists-content\">\n <!-- View Toggle -->\n <div class=\"view-controls\">\n <button\n class=\"view-toggle\"\n [class.active]=\"viewMode === 'grid'\"\n (click)=\"viewMode = 'grid'\"\n title=\"Grid view\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button\n class=\"view-toggle\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"viewMode = 'list'\"\n title=\"List view\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n <span class=\"list-count\">{{filteredLists.length}} list{{filteredLists.length !== 1 ? 's' : ''}}</span>\n </div>\n <!-- Category Tree View -->\n @if (viewMode === 'list') {\n <div class=\"category-tree\">\n @for (node of categoryTree; track node) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { node: node, depth: 0 }\"></ng-container>\n }\n </div>\n }\n <!-- Grid View -->\n @if (viewMode === 'grid') {\n <div class=\"lists-grid\" role=\"list\" aria-label=\"My Lists\">\n @for (item of filteredLists; track item) {\n <div\n class=\"list-card\"\n (click)=\"openList(item.list)\"\n (keydown.enter)=\"openList(item.list)\"\n (keydown.space)=\"openList(item.list); $event.preventDefault()\"\n tabindex=\"0\"\n role=\"listitem\"\n [attr.aria-label]=\"item.list.Name + ' - ' + item.entityName + ' - ' + item.itemCount + ' items'\">\n <div class=\"card-header\">\n <div class=\"card-icon\" [style.background-color]=\"getEntityColor(item.list.Entity)\" aria-hidden=\"true\">\n <i [class]=\"getEntityIcon(item.list.Entity)\"></i>\n </div>\n <div class=\"card-menu\">\n <button class=\"menu-btn\" (click)=\"openListMenu($event, item.list)\" [attr.aria-label]=\"'More options for ' + item.list.Name\">\n <i class=\"fa-solid fa-ellipsis-v\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"card-body\">\n <h3 class=\"card-title\">{{item.list.Name}}</h3>\n @if (item.list.Description) {\n <p class=\"card-description\">{{item.list.Description}}</p>\n }\n <div class=\"card-meta\">\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-database\"></i>\n {{item.entityName}}\n </span>\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-hashtag\"></i>\n {{item.itemCount}} item{{item.itemCount !== 1 ? 's' : ''}}\n </span>\n </div>\n </div>\n <div class=\"card-footer\">\n @if (item.list.CategoryID) {\n <span class=\"category-tag\">\n <i class=\"fa-solid fa-folder\"></i>\n {{getCategoryName(item.list.CategoryID)}}\n </span>\n }\n <span class=\"date-info\">Updated {{formatDate(item.list.__mj_UpdatedAt)}}</span>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n \n <!-- Category Node Template -->\n <ng-template #categoryNodeTemplate let-node=\"node\" let-depth=\"depth\">\n <div class=\"category-section\" [style.margin-left.px]=\"depth * 20\">\n <!-- Category Header -->\n @if (node.category) {\n <div\n class=\"category-header\"\n (click)=\"toggleCategory(node)\">\n <i [class]=\"node.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n <i class=\"fa-solid fa-folder\" [class.fa-folder-open]=\"node.isExpanded\"></i>\n <span class=\"category-name\">{{node.category.Name}}</span>\n <span class=\"category-count\">{{getListCountInCategory(node)}}</span>\n </div>\n }\n \n <!-- Uncategorized Header -->\n @if (!node.category && node.lists.length > 0) {\n <div\n class=\"category-header uncategorized\"\n (click)=\"toggleCategory(node)\">\n <i [class]=\"node.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n <i class=\"fa-solid fa-inbox\"></i>\n <span class=\"category-name\">Uncategorized</span>\n <span class=\"category-count\">{{node.lists.length}}</span>\n </div>\n }\n \n <!-- Lists in this category -->\n @if (node.isExpanded) {\n <div class=\"category-lists\" role=\"list\">\n @for (item of node.lists; track item) {\n <div\n class=\"list-row\"\n (click)=\"openList(item.list)\"\n (keydown.enter)=\"openList(item.list)\"\n (keydown.space)=\"openList(item.list); $event.preventDefault()\"\n tabindex=\"0\"\n role=\"listitem\"\n [attr.aria-label]=\"item.list.Name + ' - ' + item.entityName + ' - ' + item.itemCount + ' items'\">\n <div class=\"list-icon\" [style.background-color]=\"getEntityColor(item.list.Entity)\" aria-hidden=\"true\">\n <i [class]=\"getEntityIcon(item.list.Entity)\"></i>\n </div>\n <div class=\"list-info\">\n <span class=\"list-name\">{{item.list.Name}}</span>\n <span class=\"list-meta\">{{item.entityName}} · {{item.itemCount}} items</span>\n </div>\n <div class=\"list-actions\">\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"openListMenu($event, item.list)\" [attr.aria-label]=\"'More options for ' + item.list.Name\">\n <i class=\"fa-solid fa-ellipsis-v\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n \n <!-- Child categories -->\n @if (node.isExpanded) {\n @for (child of node.children; track child) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { node: child, depth: depth + 1 }\"></ng-container>\n }\n }\n </div>\n </ng-template>\n \n <!-- Context Menu (native) -->\n @if (showContextMenu) {\n <div class=\"context-menu-overlay\" (click)=\"closeContextMenu()\"></div>\n }\n @if (showContextMenu) {\n <div class=\"context-menu\" [style.top.px]=\"contextMenuY\" [style.left.px]=\"contextMenuX\">\n <button class=\"menu-item\" (click)=\"editList()\">\n <i class=\"fa-solid fa-pen\"></i>\n Edit\n </button>\n <button class=\"menu-item\" (click)=\"duplicateList()\">\n <i class=\"fa-solid fa-copy\"></i>\n Duplicate\n </button>\n <div class=\"menu-divider\"></div>\n <button class=\"menu-item danger\" (click)=\"confirmDeleteList()\">\n <i class=\"fa-solid fa-trash\"></i>\n Delete\n </button>\n </div>\n }\n \n <!-- Create/Edit List Dialog (native modal) -->\n @if (showCreateDialog) {\n <div class=\"modal-overlay\" (click)=\"closeCreateDialog()\"></div>\n }\n @if (showCreateDialog) {\n <div class=\"modal-dialog\">\n <div class=\"modal-header\">\n <h3>{{editingList ? 'Edit List' : 'Create New List'}}</h3>\n <button class=\"modal-close\" (click)=\"closeCreateDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"form-group\">\n <label>Name *</label>\n <input\n type=\"text\"\n [(ngModel)]=\"newListName\"\n placeholder=\"Enter list name\"\n class=\"form-input\" />\n </div>\n <div class=\"form-group\">\n <label>Description</label>\n <textarea\n [(ngModel)]=\"newListDescription\"\n placeholder=\"Optional description\"\n class=\"form-input\"\n rows=\"3\"></textarea>\n </div>\n <div class=\"form-group\">\n <label>Entity *</label>\n <div class=\"custom-select-wrapper\">\n <input\n #entityInput\n type=\"text\"\n [(ngModel)]=\"entitySearchTerm\"\n (ngModelChange)=\"filterEntities($event)\"\n (focus)=\"openEntityDropdown(entityInput)\"\n placeholder=\"Search and select an entity\"\n class=\"form-input\"\n [disabled]=\"!!editingList\" />\n </div>\n </div>\n <div class=\"form-group\">\n <label>Category</label>\n <select [(ngModel)]=\"selectedCategoryId\" class=\"form-input\">\n <option [ngValue]=\"null\">No category</option>\n @for (cat of flatCategories; track cat) {\n <option [ngValue]=\"cat.ID\">{{cat.displayName}}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn-primary\"\n (click)=\"saveList()\"\n [disabled]=\"!newListName || !selectedEntityId || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isSaving ? 'Saving...' : (editingList ? 'Save' : 'Create')}}\n </button>\n <button class=\"btn-secondary\" (click)=\"closeCreateDialog()\" [disabled]=\"isSaving\">Cancel</button>\n </div>\n </div>\n }\n \n <!-- Delete Confirmation Dialog -->\n @if (showDeleteConfirm) {\n <div class=\"modal-overlay\" (click)=\"cancelDelete()\"></div>\n }\n @if (showDeleteConfirm) {\n <div class=\"modal-dialog confirm-dialog\">\n <div class=\"modal-header\">\n <h3>Delete List</h3>\n <button class=\"modal-close\" (click)=\"cancelDelete()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <p>Are you sure you want to delete \"<strong>{{deleteListName}}</strong>\"?</p>\n <p class=\"warning-text\">This will also remove all items in the list.</p>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn-danger\" (click)=\"deleteList()\">\n @if (isDeleting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isDeleting ? 'Deleting...' : 'Delete'}}\n </button>\n <button class=\"btn-secondary\" (click)=\"cancelDelete()\">Cancel</button>\n </div>\n </div>\n }\n \n <!-- Entity Dropdown Portal (fixed positioning) -->\n @if (showEntityDropdown && !editingList) {\n <div\n class=\"entity-dropdown-portal\"\n [style.top.px]=\"entityDropdownPosition.top\"\n [style.left.px]=\"entityDropdownPosition.left\"\n [style.width.px]=\"entityDropdownPosition.width\"\n [class.dropdown-above]=\"entityDropdownPosition.openAbove\">\n <div class=\"entity-dropdown-content\" [class.open-above]=\"entityDropdownPosition.openAbove\">\n @for (entity of filteredEntities; track entity) {\n <div\n class=\"dropdown-item\"\n (mousedown)=\"selectEntity(entity); $event.preventDefault()\">\n {{entity.Name}}\n </div>\n }\n @if (filteredEntities.length === 0) {\n <div class=\"dropdown-empty\">\n No entities found\n </div>\n }\n </div>\n </div>\n }\n </mj-page-body>\n </mj-page-layout>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n /* Loading */\n .loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n }\n\n /* Empty State */\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n padding: 48px 40px;\n text-align: center;\n max-width: 480px;\n margin: 0 auto;\n }\n\n .empty-state-icon-wrapper {\n position: relative;\n margin-bottom: 24px;\n }\n\n .empty-state-icon-wrapper .icon-bg {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 120px;\n height: 120px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .empty-state-icon-wrapper > i {\n position: relative;\n font-size: 56px;\n color: var(--mj-brand-primary);\n z-index: 1;\n }\n\n .empty-state-icon-wrapper.search > i {\n font-size: 48px;\n color: var(--mj-text-disabled);\n }\n\n .empty-state h3 {\n margin: 0 0 12px;\n font-size: 22px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .empty-state p {\n margin: 0 0 8px;\n color: var(--mj-text-secondary);\n font-size: 15px;\n line-height: 1.5;\n }\n\n .empty-state p:last-of-type {\n margin-bottom: 24px;\n }\n\n .empty-hint {\n color: var(--mj-text-muted) !important;\n font-size: 13px !important;\n }\n\n .empty-state-features {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 28px;\n text-align: left;\n }\n\n .feature-item {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n }\n\n .feature-item i {\n font-size: 14px !important;\n color: var(--mj-status-success) !important;\n }\n\n .search-empty .empty-state-icon-wrapper {\n margin-bottom: 20px;\n }\n\n .btn-create-large {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 28px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 8px;\n font-size: 15px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n\n .btn-create-large:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n }\n\n .btn-clear {\n padding: 10px 20px;\n background: var(--mj-bg-surface-sunken);\n border: none;\n border-radius: 6px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n }\n\n .btn-clear:hover {\n background: var(--mj-border-default);\n }\n\n /* Content */\n .lists-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px 24px;\n }\n\n .view-controls {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 16px;\n }\n\n .view-toggle {\n padding: 8px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .view-toggle:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .view-toggle.active {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .list-count {\n margin-left: auto;\n color: var(--mj-text-muted);\n font-size: 14px;\n }\n\n /* Grid View */\n .lists-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n }\n\n .list-card {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n cursor: pointer;\n transition: transform 0.2s, box-shadow 0.2s, outline 0.1s;\n outline: 2px solid transparent;\n }\n\n .list-card:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-md);\n }\n\n .list-card:focus {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .list-card:focus:not(:focus-visible) {\n outline: none;\n }\n\n .list-card:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 16px 16px 0;\n }\n\n .card-icon {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 18px;\n }\n\n .menu-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .menu-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .card-body {\n padding: 12px 16px;\n }\n\n .card-title {\n margin: 0 0 4px;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .card-description {\n margin: 0 0 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .card-meta {\n display: flex;\n gap: 16px;\n }\n\n .meta-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .card-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .category-tag {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n padding: 2px 8px;\n border-radius: 4px;\n }\n\n .date-info {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n /* Category Tree */\n .category-tree {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .category-section {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .category-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .category-header:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .category-header i:first-child {\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .category-header .fa-folder,\n .category-header .fa-folder-open {\n color: var(--mj-status-warning);\n }\n\n .category-header.uncategorized .fa-inbox {\n color: var(--mj-text-muted);\n }\n\n .category-name {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .category-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n .category-lists {\n border-top: 1px solid var(--mj-border-default);\n }\n\n .list-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px 12px 40px;\n cursor: pointer;\n transition: background 0.2s;\n outline: none;\n }\n\n .list-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .list-row:focus-visible {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n }\n\n .list-icon {\n width: 32px;\n height: 32px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .list-info {\n flex: 1;\n min-width: 0;\n }\n\n .list-name {\n display: block;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-meta {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .list-actions {\n display: flex;\n gap: 4px;\n }\n\n .action-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n opacity: 0;\n transition: opacity 0.2s;\n }\n\n .list-row:hover .action-btn {\n opacity: 1;\n }\n\n .action-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Context Menu (native) */\n .context-menu-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n }\n\n .context-menu {\n position: fixed;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-md);\n min-width: 160px;\n padding: 4px 0;\n z-index: 1000;\n }\n\n .menu-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 16px;\n background: none;\n border: none;\n text-align: left;\n font-size: 14px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .menu-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .menu-item.danger {\n color: var(--mj-status-error);\n }\n\n .menu-item.danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n }\n\n .menu-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }\n\n /* Modal Styles */\n .modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n }\n\n .modal-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-lg);\n width: 500px;\n max-width: 90vw;\n max-height: 90vh;\n overflow: hidden;\n z-index: 1001;\n }\n\n .confirm-dialog {\n width: 400px;\n }\n\n .modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .modal-close {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .modal-close:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .modal-body {\n padding: 20px;\n max-height: 60vh;\n overflow-y: auto;\n }\n\n .modal-body p {\n margin: 0 0 8px;\n color: var(--mj-text-primary);\n }\n\n .warning-text {\n color: var(--mj-status-error) !important;\n font-size: 13px;\n }\n\n .modal-footer {\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-secondary {\n padding: 10px 20px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-danger {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-danger:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-status-error) 85%, black);\n }\n\n /* Form Styles */\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group:last-child {\n margin-bottom: 0;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .form-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.2s, box-shadow 0.2s;\n box-sizing: border-box;\n }\n\n .form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .form-input:disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n textarea.form-input {\n resize: vertical;\n min-height: 80px;\n }\n\n select.form-input {\n cursor: pointer;\n }\n\n .custom-select-wrapper {\n position: relative;\n }\n\n /* Portal Dropdown - Fixed positioning to escape modal z-index */\n .entity-dropdown-portal {\n position: fixed;\n z-index: 10002; /* Above modal (1001) */\n }\n\n .entity-dropdown-content {\n max-height: 200px;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: var(--mj-shadow-md);\n }\n\n .entity-dropdown-content.open-above {\n position: absolute;\n bottom: 0;\n }\n\n .dropdown-item {\n padding: 10px 12px;\n cursor: pointer;\n transition: background 0.15s;\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .dropdown-item:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .dropdown-item:first-child {\n border-radius: 6px 6px 0 0;\n }\n\n .dropdown-item:last-child {\n border-radius: 0 0 6px 6px;\n }\n\n .dropdown-empty {\n padding: 10px 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .lists-header {\n flex-direction: column;\n gap: 16px;\n align-items: stretch;\n }\n\n .header-actions {\n flex-direction: column;\n }\n\n .search-box input {\n width: 100%;\n }\n\n .btn-create {\n width: 100%;\n justify-content: center;\n }\n\n .lists-grid {\n grid-template-columns: 1fr;\n }\n\n .modal-dialog {\n width: 95vw;\n }\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ListsMyListsResource extends BaseResourceComponent implements OnDestroy {\n protected override destroy$ = new Subject<void>();\n\n isLoading = true;\n searchTerm = '';\n viewMode: 'grid' | 'list' = 'grid';\n\n allLists: ListViewModel[] = [];\n filteredLists: ListViewModel[] = [];\n categories: MJListCategoryEntity[] = [];\n categoryTree: CategoryNode[] = [];\n flatCategories: Array<{ ID: string | null; displayName: string }> = [];\n availableEntities: Array<{ ID: string; Name: string }> = [];\n filteredEntities: Array<{ ID: string; Name: string }> = [];\n\n // Context menu\n showContextMenu = false;\n contextMenuX = 0;\n contextMenuY = 0;\n selectedContextList: MJListEntity | null = null;\n\n // Create/Edit dialog\n showCreateDialog = false;\n editingList: MJListEntity | null = null;\n newListName = '';\n newListDescription = '';\n selectedEntityId = '';\n selectedCategoryId: string | null = null;\n entitySearchTerm = '';\n showEntityDropdown = false;\n entityDropdownPosition = { top: 0, left: 0, width: 0, openAbove: false };\n\n // Delete confirmation\n showDeleteConfirm = false;\n deleteListName = '';\n listToDelete: MJListEntity | null = null;\n\n // Operation states\n isSaving = false;\n isDeleting = false;\n\n private categoryMap: Map<string, MJListCategoryEntity> = new Map();\n private entityColorMap: Map<string, string> = new Map();\n private entityIconMap: Map<string, string> = new Map();\n\n constructor(\n private cdr: ChangeDetectorRef,\n private tabService: TabService,\n private notificationService: MJNotificationService,\n private elementRef: ElementRef\n ) {\n super();\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent) {\n // Close entity dropdown when clicking outside the input or dropdown\n if (this.showEntityDropdown) {\n const target = event.target as HTMLElement;\n if (!target.closest('.custom-select-wrapper') && !target.closest('.entity-dropdown-portal')) {\n this.showEntityDropdown = false;\n }\n }\n }\n\n @HostListener('document:keydown.escape')\n onEscapeKey() {\n if (this.showContextMenu) {\n this.closeContextMenu();\n }\n if (this.showCreateDialog) {\n this.closeCreateDialog();\n }\n if (this.showDeleteConfirm) {\n this.cancelDelete();\n }\n }\n\n async ngOnInit() {\n super.ngOnInit();\n await this.loadData();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy() {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async loadData() {\n this.isLoading = true;\n\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const userId = md.CurrentUser?.ID;\n\n if (!userId) {\n console.error('No current user');\n return;\n }\n\n // Load lists, categories, and item counts in parallel\n const [listsResult, categoriesResult, detailsResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Lists',\n ExtraFilter: `UserID = '${userId}'`,\n OrderBy: 'Name',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: List Categories',\n OrderBy: 'Name',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID IN (SELECT ID FROM __mj.List WHERE UserID = '${userId}')`,\n ResultType: 'simple'\n }\n ]);\n\n if (!listsResult.Success || !categoriesResult.Success) {\n console.error('Failed to load lists data');\n return;\n }\n\n const lists = listsResult.Results as MJListEntity[];\n this.categories = categoriesResult.Results as MJListCategoryEntity[];\n const details = detailsResult.Results as Array<{ ListID: string }>;\n\n // Build category map\n this.categoryMap.clear();\n for (const cat of this.categories) {\n this.categoryMap.set(cat.ID, cat);\n }\n\n // Count items per list\n const itemCounts = new Map<string, number>();\n for (const detail of details) {\n const count = itemCounts.get(detail.ListID) || 0;\n itemCounts.set(detail.ListID, count + 1);\n }\n\n // Build entity info\n const entities = md.Entities;\n for (const entity of entities) {\n this.entityColorMap.set(entity.Name, this.generateEntityColor(entity.Name));\n this.entityIconMap.set(entity.Name, entity.Icon || 'fa-solid fa-table');\n }\n\n // Build list view models\n this.allLists = lists.map(list => ({\n list,\n itemCount: itemCounts.get(list.ID) || 0,\n entityName: list.Entity || 'Unknown'\n }));\n\n // Build available entities for dropdown\n this.availableEntities = entities\n .filter(e => e.IncludeInAPI)\n .map(e => ({ ID: e.ID, Name: e.Name }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n this.filteredEntities = [...this.availableEntities];\n\n // Build flat categories for dropdown\n this.flatCategories = this.buildFlatCategories(this.categories);\n\n this.applyFilter();\n this.buildCategoryTree();\n } catch (error) {\n console.error('Error loading lists:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private buildFlatCategories(categories: MJListCategoryEntity[]): Array<{ ID: string; displayName: string }> {\n const result: Array<{ ID: string; displayName: string }> = [];\n const topLevel = categories.filter(c => !c.ParentID);\n\n const processCategory = (cat: MJListCategoryEntity, level: number) => {\n const indent = '\\u00A0\\u00A0'.repeat(level);\n result.push({ ID: cat.ID, displayName: `${indent}${cat.Name}` });\n\n const children = categories.filter(c => UUIDsEqual(c.ParentID, cat.ID));\n for (const child of children) {\n processCategory(child, level + 1);\n }\n };\n\n for (const cat of topLevel) {\n processCategory(cat, 0);\n }\n\n return result;\n }\n\n private buildCategoryTree() {\n const rootNodes: CategoryNode[] = [];\n const categoryNodes = new Map<string, CategoryNode>();\n\n // Create nodes for all categories\n for (const cat of this.categories) {\n categoryNodes.set(cat.ID, {\n category: cat,\n lists: [],\n children: [],\n isExpanded: true\n });\n }\n\n // Build tree structure\n for (const cat of this.categories) {\n const node = categoryNodes.get(cat.ID)!;\n if (cat.ParentID && categoryNodes.has(cat.ParentID)) {\n categoryNodes.get(cat.ParentID)!.children.push(node);\n } else {\n rootNodes.push(node);\n }\n }\n\n // Assign lists to categories\n const uncategorizedLists: ListViewModel[] = [];\n for (const item of this.filteredLists) {\n if (item.list.CategoryID && categoryNodes.has(item.list.CategoryID)) {\n categoryNodes.get(item.list.CategoryID)!.lists.push(item);\n } else {\n uncategorizedLists.push(item);\n }\n }\n\n // Add uncategorized node if there are uncategorized lists\n if (uncategorizedLists.length > 0) {\n rootNodes.unshift({\n category: null,\n lists: uncategorizedLists,\n children: [],\n isExpanded: true\n });\n }\n\n this.categoryTree = rootNodes;\n }\n\n onSearchChange(_term: string) {\n this.applyFilter();\n this.buildCategoryTree();\n }\n\n clearSearch() {\n this.searchTerm = '';\n this.applyFilter();\n this.buildCategoryTree();\n }\n\n private applyFilter() {\n if (!this.searchTerm) {\n this.filteredLists = [...this.allLists];\n } else {\n const term = this.searchTerm.toLowerCase();\n this.filteredLists = this.allLists.filter(item =>\n item.list.Name.toLowerCase().includes(term) ||\n (item.list.Description && item.list.Description.toLowerCase().includes(term)) ||\n item.entityName.toLowerCase().includes(term)\n );\n }\n }\n\n toggleCategory(node: CategoryNode) {\n node.isExpanded = !node.isExpanded;\n }\n\n getListCountInCategory(node: CategoryNode): number {\n let count = node.lists.length;\n for (const child of node.children) {\n count += this.getListCountInCategory(child);\n }\n return count;\n }\n\n getCategoryName(categoryId: string): string {\n return this.categoryMap.get(categoryId)?.Name || 'Unknown';\n }\n\n getEntityColor(entityName: string): string {\n return this.entityColorMap.get(entityName) || '#607D8B';\n }\n\n getEntityIcon(entityName: string): string {\n return this.entityIconMap.get(entityName) || 'fa-solid fa-table';\n }\n\n private generateEntityColor(entityName: string): string {\n let hash = 0;\n for (let i = 0; i < entityName.length; i++) {\n hash = entityName.charCodeAt(i) + ((hash << 5) - hash);\n }\n const colors = [\n '#2196F3', '#4CAF50', '#FF9800', '#9C27B0', '#F44336',\n '#00BCD4', '#795548', '#607D8B', '#E91E63', '#3F51B5'\n ];\n return colors[Math.abs(hash) % colors.length];\n }\n\n formatDate(date: Date): string {\n if (!date) return '';\n const now = new Date();\n const d = new Date(date);\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) return 'today';\n if (diffDays === 1) return 'yesterday';\n if (diffDays < 7) return `${diffDays} days ago`;\n if (diffDays < 30) return `${Math.floor(diffDays / 7)} weeks ago`;\n return d.toLocaleDateString();\n }\n\n openList(list: MJListEntity) {\n const appId = this.Data?.Configuration?.applicationId || '';\n this.tabService.OpenList(list.ID, list.Name, appId);\n }\n\n openListMenu(event: Event, list: MJListEntity) {\n event.stopPropagation();\n const mouseEvent = event as MouseEvent;\n this.selectedContextList = list;\n this.contextMenuX = mouseEvent.clientX;\n this.contextMenuY = mouseEvent.clientY;\n this.showContextMenu = true;\n }\n\n closeContextMenu() {\n this.showContextMenu = false;\n this.selectedContextList = null;\n }\n\n createNewList() {\n this.editingList = null;\n this.newListName = '';\n this.newListDescription = '';\n this.selectedEntityId = '';\n this.entitySearchTerm = '';\n this.selectedCategoryId = null;\n this.showEntityDropdown = false;\n this.showCreateDialog = true;\n }\n\n editList() {\n if (!this.selectedContextList) return;\n\n this.editingList = this.selectedContextList;\n this.newListName = this.selectedContextList.Name;\n this.newListDescription = this.selectedContextList.Description || '';\n this.selectedEntityId = this.selectedContextList.EntityID;\n this.entitySearchTerm = this.selectedContextList.Entity || '';\n this.selectedCategoryId = this.selectedContextList.CategoryID || null;\n this.showCreateDialog = true;\n this.closeContextMenu();\n }\n\n selectEntity(entity: { ID: string; Name: string }) {\n this.selectedEntityId = entity.ID;\n this.entitySearchTerm = entity.Name;\n this.showEntityDropdown = false;\n }\n\n filterEntities(term: string) {\n const lowerTerm = term.toLowerCase();\n this.filteredEntities = this.availableEntities.filter(e =>\n e.Name.toLowerCase().includes(lowerTerm)\n );\n // Ensure dropdown is visible while typing\n if (!this.showEntityDropdown && term) {\n this.showEntityDropdown = true;\n }\n // Clear selection when user modifies the search text\n this.selectedEntityId = '';\n }\n\n openEntityDropdown(inputElement: HTMLInputElement) {\n const rect = inputElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const dropdownHeight = 200; // estimated max height\n const spaceBelow = viewportHeight - rect.bottom;\n const openAbove = spaceBelow < dropdownHeight && rect.top > dropdownHeight;\n\n this.entityDropdownPosition = {\n top: openAbove ? rect.top - dropdownHeight : rect.bottom,\n left: rect.left,\n width: rect.width,\n openAbove\n };\n this.showEntityDropdown = true;\n this.filteredEntities = [...this.availableEntities];\n }\n\n closeEntityDropdown() {\n this.showEntityDropdown = false;\n }\n\n async duplicateList() {\n if (!this.selectedContextList) return;\n\n const listToDuplicate = this.selectedContextList;\n this.closeContextMenu();\n\n this.isLoading = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n const newList = await md.GetEntityObject<MJListEntity>('MJ: Lists');\n newList.Name = `${listToDuplicate.Name} (Copy)`;\n newList.Description = listToDuplicate.Description;\n newList.EntityID = listToDuplicate.EntityID;\n newList.CategoryID = listToDuplicate.CategoryID;\n newList.UserID = md.CurrentUser!.ID;\n\n const listSaved = await newList.Save();\n if (!listSaved) {\n this.notificationService.CreateSimpleNotification('Failed to duplicate list', 'error', 4000);\n return;\n }\n\n const itemsResult = await rv.RunView<MJListDetailEntity>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID = '${listToDuplicate.ID}'`,\n ResultType: 'entity_object'\n });\n\n if (itemsResult.Success && itemsResult.Results.length > 0) {\n let copiedCount = 0;\n for (const item of itemsResult.Results) {\n const newItem = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details');\n newItem.ListID = newList.ID;\n newItem.RecordID = item.RecordID;\n newItem.Sequence = item.Sequence;\n const itemSaved = await newItem.Save();\n if (itemSaved) copiedCount++;\n }\n this.notificationService.CreateSimpleNotification(\n `List duplicated with ${copiedCount} item${copiedCount !== 1 ? 's' : ''}`,\n 'success',\n 3000\n );\n } else {\n this.notificationService.CreateSimpleNotification('List duplicated successfully', 'success', 3000);\n }\n\n await this.loadData();\n } catch (error) {\n console.error('Error duplicating list:', error);\n this.notificationService.CreateSimpleNotification('Error duplicating list. Please try again.', 'error', 4000);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n confirmDeleteList() {\n if (!this.selectedContextList) return;\n this.listToDelete = this.selectedContextList;\n this.deleteListName = this.selectedContextList.Name;\n this.showDeleteConfirm = true;\n this.closeContextMenu();\n }\n\n cancelDelete() {\n this.showDeleteConfirm = false;\n this.listToDelete = null;\n this.deleteListName = '';\n }\n\n async deleteList() {\n if (!this.listToDelete) return;\n\n const listToDelete = this.listToDelete;\n const listName = listToDelete.Name;\n\n this.isDeleting = true;\n this.cdr.detectChanges();\n\n try {\n const deleted = await listToDelete.Delete();\n if (deleted) {\n this.notificationService.CreateSimpleNotification(`\"${listName}\" deleted`, 'success', 3000);\n } else {\n // Get the detailed error message from LatestResult\n const errorMessage = listToDelete.LatestResult?.Message || 'Unknown error occurred';\n console.error('Failed to delete list:', listToDelete.LatestResult);\n this.notificationService.CreateSimpleNotification(`Failed to delete list: ${errorMessage}`, 'error', 6000);\n }\n this.cancelDelete();\n await this.loadData();\n } catch (error) {\n console.error('Error deleting list:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error deleting list: ${errorMessage}`, 'error', 6000);\n } finally {\n this.isDeleting = false;\n this.cdr.detectChanges();\n }\n }\n\n closeCreateDialog() {\n this.showCreateDialog = false;\n this.editingList = null;\n this.showEntityDropdown = false;\n }\n\n async saveList() {\n this.isSaving = true;\n this.cdr.detectChanges();\n\n const isEditing = !!this.editingList;\n const listName = this.newListName;\n\n try {\n const md = this.ProviderToUse;\n let list: MJListEntity;\n\n if (this.editingList) {\n list = this.editingList;\n } else {\n list = await md.GetEntityObject<MJListEntity>('MJ: Lists');\n list.UserID = md.CurrentUser!.ID;\n list.EntityID = this.selectedEntityId;\n }\n\n list.Name = this.newListName;\n list.Description = this.newListDescription || null;\n list.CategoryID = this.selectedCategoryId || null;\n\n const saved = await list.Save();\n if (saved) {\n this.notificationService.CreateSimpleNotification(\n isEditing ? `\"${listName}\" updated` : `\"${listName}\" created`,\n 'success',\n 3000\n );\n this.closeCreateDialog();\n await this.loadData();\n } else {\n // Get the detailed error message from LatestResult\n const errorMessage = list.LatestResult?.Message || 'Unknown error occurred';\n const action = isEditing ? 'update' : 'create';\n console.error(`Failed to ${action} list:`, list.LatestResult);\n this.notificationService.CreateSimpleNotification(\n `Failed to ${action} list: ${errorMessage}`,\n 'error',\n 6000\n );\n }\n } catch (error) {\n console.error('Error saving list:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error saving list: ${errorMessage}`, 'error', 6000);\n } finally {\n this.isSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'My Lists';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-list-check';\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"lists-my-lists-resource.component.js","sourceRoot":"","sources":["../../../src/Lists/components/lists-my-lists-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, ChangeDetectorRef, OnDestroy, ElementRef, HostListener } from '@angular/core';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { MJListEntity, MJListCategoryEntity, MJListDetailEntity } from '@memberjunction/core-entities';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { TabService } from '@memberjunction/ng-base-application';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\ninterface ListViewModel {\n list: MJListEntity;\n itemCount: number;\n entityName: string;\n}\n\ninterface CategoryNode {\n category: MJListCategoryEntity | null;\n lists: ListViewModel[];\n children: CategoryNode[];\n isExpanded: boolean;\n}\n\n@RegisterClass(BaseResourceComponent, 'ListsMyListsResource')\n@Component({\n standalone: false,\n selector: 'mj-lists-my-lists-resource',\n template: `\n <mj-page-layout>\n <mj-page-header\n Title=\"My Lists\"\n Icon=\"fa-solid fa-list-check\"\n Subtitle=\"Lists you've created or have access to\">\n <div meta>\n <mj-stat-badge [Count]=\"filteredLists.length\" [Total]=\"allLists.length\" Label=\"lists\"></mj-stat-badge>\n </div>\n <div actions>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createNewList()\">\n <i class=\"fa-solid fa-plus\"></i> <span class=\"action-btn-label\">New List</span>\n </button>\n </div>\n <div toolbar>\n <mj-page-search\n Placeholder=\"Search lists...\"\n [Value]=\"searchTerm\"\n (ValueChange)=\"onSearchChange($event)\">\n </mj-page-search>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading lists...\" size=\"medium\"></mj-loading>\n </div>\n }\n \n <!-- Empty State -->\n @if (!isLoading && filteredLists.length === 0 && !searchTerm) {\n <div class=\"empty-state\">\n <div class=\"empty-state-icon-wrapper\">\n <div class=\"icon-bg\"></div>\n <i class=\"fa-solid fa-list-check\"></i>\n </div>\n <h3>No Lists Yet</h3>\n <p>Lists help you organize and track groups of records across your data.</p>\n <div class=\"empty-state-features\">\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Group records from any entity</span>\n </div>\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Organize with categories</span>\n </div>\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Quick access from any view</span>\n </div>\n </div>\n <button class=\"btn-create-large\" (click)=\"createNewList()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Your First List\n </button>\n </div>\n }\n \n <!-- No Results State -->\n @if (!isLoading && filteredLists.length === 0 && searchTerm) {\n <div class=\"empty-state search-empty\">\n <div class=\"empty-state-icon-wrapper search\">\n <i class=\"fa-solid fa-search\"></i>\n </div>\n <h3>No Results Found</h3>\n <p>No lists match \"<strong>{{searchTerm}}</strong>\"</p>\n <p class=\"empty-hint\">Try a different search term or clear your search.</p>\n <button class=\"btn-clear\" (click)=\"clearSearch()\">Clear Search</button>\n </div>\n }\n \n <!-- Lists Grid -->\n @if (!isLoading && filteredLists.length > 0) {\n <div class=\"lists-content\">\n <!-- View Toggle -->\n <div class=\"view-controls\">\n <button\n class=\"view-toggle\"\n [class.active]=\"viewMode === 'grid'\"\n (click)=\"viewMode = 'grid'\"\n title=\"Grid view\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button\n class=\"view-toggle\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"viewMode = 'list'\"\n title=\"List view\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n <span class=\"list-count\">{{filteredLists.length}} list{{filteredLists.length !== 1 ? 's' : ''}}</span>\n </div>\n <!-- Category Tree View -->\n @if (viewMode === 'list') {\n <div class=\"category-tree\">\n @for (node of categoryTree; track node) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { node: node, depth: 0 }\"></ng-container>\n }\n </div>\n }\n <!-- Grid View -->\n @if (viewMode === 'grid') {\n <div class=\"lists-grid\" role=\"list\" aria-label=\"My Lists\">\n @for (item of filteredLists; track item) {\n <div\n class=\"list-card\"\n (click)=\"openList(item.list)\"\n (keydown.enter)=\"openList(item.list)\"\n (keydown.space)=\"openList(item.list); $event.preventDefault()\"\n tabindex=\"0\"\n role=\"listitem\"\n [attr.aria-label]=\"item.list.Name + ' - ' + item.entityName + ' - ' + item.itemCount + ' items'\">\n <div class=\"card-header\">\n <div class=\"card-icon\" [style.background-color]=\"getEntityColor(item.list.Entity)\" aria-hidden=\"true\">\n <i [class]=\"getEntityIcon(item.list.Entity)\"></i>\n </div>\n <div class=\"card-menu\">\n <button class=\"menu-btn\" (click)=\"openListMenu($event, item.list)\" [attr.aria-label]=\"'More options for ' + item.list.Name\">\n <i class=\"fa-solid fa-ellipsis-v\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"card-body\">\n <h3 class=\"card-title\">{{item.list.Name}}</h3>\n @if (item.list.Description) {\n <p class=\"card-description\">{{item.list.Description}}</p>\n }\n <div class=\"card-meta\">\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-database\"></i>\n {{item.entityName}}\n </span>\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-hashtag\"></i>\n {{item.itemCount}} item{{item.itemCount !== 1 ? 's' : ''}}\n </span>\n </div>\n </div>\n <div class=\"card-footer\">\n @if (item.list.CategoryID) {\n <span class=\"category-tag\">\n <i class=\"fa-solid fa-folder\"></i>\n {{getCategoryName(item.list.CategoryID)}}\n </span>\n }\n <span class=\"date-info\">Updated {{formatDate(item.list.__mj_UpdatedAt)}}</span>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n \n <!-- Category Node Template -->\n <ng-template #categoryNodeTemplate let-node=\"node\" let-depth=\"depth\">\n <div class=\"category-section\" [style.margin-left.px]=\"depth * 20\">\n <!-- Category Header -->\n @if (node.category) {\n <div\n class=\"category-header\"\n (click)=\"toggleCategory(node)\">\n <i [class]=\"node.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n <i class=\"fa-solid fa-folder\" [class.fa-folder-open]=\"node.isExpanded\"></i>\n <span class=\"category-name\">{{node.category.Name}}</span>\n <span class=\"category-count\">{{getListCountInCategory(node)}}</span>\n </div>\n }\n \n <!-- Uncategorized Header -->\n @if (!node.category && node.lists.length > 0) {\n <div\n class=\"category-header uncategorized\"\n (click)=\"toggleCategory(node)\">\n <i [class]=\"node.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n <i class=\"fa-solid fa-inbox\"></i>\n <span class=\"category-name\">Uncategorized</span>\n <span class=\"category-count\">{{node.lists.length}}</span>\n </div>\n }\n \n <!-- Lists in this category -->\n @if (node.isExpanded) {\n <div class=\"category-lists\" role=\"list\">\n @for (item of node.lists; track item) {\n <div\n class=\"list-row\"\n (click)=\"openList(item.list)\"\n (keydown.enter)=\"openList(item.list)\"\n (keydown.space)=\"openList(item.list); $event.preventDefault()\"\n tabindex=\"0\"\n role=\"listitem\"\n [attr.aria-label]=\"item.list.Name + ' - ' + item.entityName + ' - ' + item.itemCount + ' items'\">\n <div class=\"list-icon\" [style.background-color]=\"getEntityColor(item.list.Entity)\" aria-hidden=\"true\">\n <i [class]=\"getEntityIcon(item.list.Entity)\"></i>\n </div>\n <div class=\"list-info\">\n <span class=\"list-name\">{{item.list.Name}}</span>\n <span class=\"list-meta\">{{item.entityName}} · {{item.itemCount}} items</span>\n </div>\n <div class=\"list-actions\">\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"openListMenu($event, item.list)\" [attr.aria-label]=\"'More options for ' + item.list.Name\">\n <i class=\"fa-solid fa-ellipsis-v\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n \n <!-- Child categories -->\n @if (node.isExpanded) {\n @for (child of node.children; track child) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { node: child, depth: depth + 1 }\"></ng-container>\n }\n }\n </div>\n </ng-template>\n \n <!-- Context Menu (native) -->\n @if (showContextMenu) {\n <div class=\"context-menu-overlay\" (click)=\"closeContextMenu()\"></div>\n }\n @if (showContextMenu) {\n <div class=\"context-menu\" [style.top.px]=\"contextMenuY\" [style.left.px]=\"contextMenuX\">\n <button class=\"menu-item\" (click)=\"editList()\">\n <i class=\"fa-solid fa-pen\"></i>\n Edit\n </button>\n <button class=\"menu-item\" (click)=\"duplicateList()\">\n <i class=\"fa-solid fa-copy\"></i>\n Duplicate\n </button>\n <div class=\"menu-divider\"></div>\n <button class=\"menu-item danger\" (click)=\"confirmDeleteList()\">\n <i class=\"fa-solid fa-trash\"></i>\n Delete\n </button>\n </div>\n }\n \n <!-- Create/Edit List Dialog (native modal) -->\n @if (showCreateDialog) {\n <div class=\"modal-overlay\" (click)=\"closeCreateDialog()\"></div>\n }\n @if (showCreateDialog) {\n <div class=\"modal-dialog\">\n <div class=\"modal-header\">\n <h3>{{editingList ? 'Edit List' : 'Create New List'}}</h3>\n <button class=\"modal-close\" (click)=\"closeCreateDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"form-group\">\n <label>Name *</label>\n <input\n type=\"text\"\n [(ngModel)]=\"newListName\"\n placeholder=\"Enter list name\"\n class=\"form-input\" />\n </div>\n <div class=\"form-group\">\n <label>Description</label>\n <textarea\n [(ngModel)]=\"newListDescription\"\n placeholder=\"Optional description\"\n class=\"form-input\"\n rows=\"3\"></textarea>\n </div>\n <div class=\"form-group\">\n <label>Entity *</label>\n <div class=\"custom-select-wrapper\">\n <input\n #entityInput\n type=\"text\"\n [(ngModel)]=\"entitySearchTerm\"\n (ngModelChange)=\"filterEntities($event)\"\n (focus)=\"openEntityDropdown(entityInput)\"\n placeholder=\"Search and select an entity\"\n class=\"form-input\"\n [disabled]=\"!!editingList\" />\n </div>\n </div>\n <div class=\"form-group\">\n <label>Category</label>\n <select [(ngModel)]=\"selectedCategoryId\" class=\"form-input\">\n <option [ngValue]=\"null\">No category</option>\n @for (cat of flatCategories; track cat) {\n <option [ngValue]=\"cat.ID\">{{cat.displayName}}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn-primary\"\n (click)=\"saveList()\"\n [disabled]=\"!newListName || !selectedEntityId || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isSaving ? 'Saving...' : (editingList ? 'Save' : 'Create')}}\n </button>\n <button class=\"btn-secondary\" (click)=\"closeCreateDialog()\" [disabled]=\"isSaving\">Cancel</button>\n </div>\n </div>\n }\n \n <!-- Delete Confirmation Dialog -->\n @if (showDeleteConfirm) {\n <div class=\"modal-overlay\" (click)=\"cancelDelete()\"></div>\n }\n @if (showDeleteConfirm) {\n <div class=\"modal-dialog confirm-dialog\">\n <div class=\"modal-header\">\n <h3>Delete List</h3>\n <button class=\"modal-close\" (click)=\"cancelDelete()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <p>Are you sure you want to delete \"<strong>{{deleteListName}}</strong>\"?</p>\n <p class=\"warning-text\">This will also remove all items in the list.</p>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn-danger\" (click)=\"deleteList()\">\n @if (isDeleting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isDeleting ? 'Deleting...' : 'Delete'}}\n </button>\n <button class=\"btn-secondary\" (click)=\"cancelDelete()\">Cancel</button>\n </div>\n </div>\n }\n \n <!-- Entity Dropdown Portal (fixed positioning) -->\n @if (showEntityDropdown && !editingList) {\n <div\n class=\"entity-dropdown-portal\"\n [style.top.px]=\"entityDropdownPosition.top\"\n [style.left.px]=\"entityDropdownPosition.left\"\n [style.width.px]=\"entityDropdownPosition.width\"\n [class.dropdown-above]=\"entityDropdownPosition.openAbove\">\n <div class=\"entity-dropdown-content\" [class.open-above]=\"entityDropdownPosition.openAbove\">\n @for (entity of filteredEntities; track entity) {\n <div\n class=\"dropdown-item\"\n (mousedown)=\"selectEntity(entity); $event.preventDefault()\">\n {{entity.Name}}\n </div>\n }\n @if (filteredEntities.length === 0) {\n <div class=\"dropdown-empty\">\n No entities found\n </div>\n }\n </div>\n </div>\n }\n </mj-page-body>\n </mj-page-layout>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n /* Loading */\n .loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n }\n\n /* Empty State */\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n padding: 48px 40px;\n text-align: center;\n max-width: 480px;\n margin: 0 auto;\n }\n\n .empty-state-icon-wrapper {\n position: relative;\n margin-bottom: 24px;\n }\n\n .empty-state-icon-wrapper .icon-bg {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 120px;\n height: 120px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .empty-state-icon-wrapper > i {\n position: relative;\n font-size: 56px;\n color: var(--mj-brand-primary);\n z-index: 1;\n }\n\n .empty-state-icon-wrapper.search > i {\n font-size: 48px;\n color: var(--mj-text-disabled);\n }\n\n .empty-state h3 {\n margin: 0 0 12px;\n font-size: 22px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .empty-state p {\n margin: 0 0 8px;\n color: var(--mj-text-secondary);\n font-size: 15px;\n line-height: 1.5;\n }\n\n .empty-state p:last-of-type {\n margin-bottom: 24px;\n }\n\n .empty-hint {\n color: var(--mj-text-muted) !important;\n font-size: 13px !important;\n }\n\n .empty-state-features {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 28px;\n text-align: left;\n }\n\n .feature-item {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n }\n\n .feature-item i {\n font-size: 14px !important;\n color: var(--mj-status-success) !important;\n }\n\n .search-empty .empty-state-icon-wrapper {\n margin-bottom: 20px;\n }\n\n .btn-create-large {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 28px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 8px;\n font-size: 15px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n\n .btn-create-large:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n }\n\n .btn-clear {\n padding: 10px 20px;\n background: var(--mj-bg-surface-sunken);\n border: none;\n border-radius: 6px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n }\n\n .btn-clear:hover {\n background: var(--mj-border-default);\n }\n\n /* Content */\n .lists-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px 24px;\n }\n\n .view-controls {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 16px;\n }\n\n .view-toggle {\n padding: 8px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .view-toggle:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .view-toggle.active {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .list-count {\n margin-left: auto;\n color: var(--mj-text-muted);\n font-size: 14px;\n }\n\n /* Grid View */\n .lists-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n }\n\n .list-card {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n cursor: pointer;\n transition: transform 0.2s, box-shadow 0.2s, outline 0.1s;\n outline: 2px solid transparent;\n }\n\n .list-card:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-md);\n }\n\n .list-card:focus {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .list-card:focus:not(:focus-visible) {\n outline: none;\n }\n\n .list-card:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 16px 16px 0;\n }\n\n .card-icon {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 18px;\n }\n\n .menu-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .menu-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .card-body {\n padding: 12px 16px;\n }\n\n .card-title {\n margin: 0 0 4px;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .card-description {\n margin: 0 0 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .card-meta {\n display: flex;\n gap: 16px;\n }\n\n .meta-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .card-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .category-tag {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n padding: 2px 8px;\n border-radius: 4px;\n }\n\n .date-info {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n /* Category Tree */\n .category-tree {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .category-section {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .category-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .category-header:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .category-header i:first-child {\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .category-header .fa-folder,\n .category-header .fa-folder-open {\n color: var(--mj-status-warning);\n }\n\n .category-header.uncategorized .fa-inbox {\n color: var(--mj-text-muted);\n }\n\n .category-name {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .category-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n .category-lists {\n border-top: 1px solid var(--mj-border-default);\n }\n\n .list-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px 12px 40px;\n cursor: pointer;\n transition: background 0.2s;\n outline: none;\n }\n\n .list-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .list-row:focus-visible {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n }\n\n .list-icon {\n width: 32px;\n height: 32px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .list-info {\n flex: 1;\n min-width: 0;\n }\n\n .list-name {\n display: block;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-meta {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .list-actions {\n display: flex;\n gap: 4px;\n }\n\n .action-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n opacity: 0;\n transition: opacity 0.2s;\n }\n\n .list-row:hover .action-btn {\n opacity: 1;\n }\n\n .action-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Context Menu (native) */\n .context-menu-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n }\n\n .context-menu {\n position: fixed;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-md);\n min-width: 160px;\n padding: 4px 0;\n z-index: 1000;\n }\n\n .menu-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 16px;\n background: none;\n border: none;\n text-align: left;\n font-size: 14px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .menu-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .menu-item.danger {\n color: var(--mj-status-error);\n }\n\n .menu-item.danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n }\n\n .menu-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }\n\n /* Modal Styles */\n .modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n }\n\n .modal-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-lg);\n width: 500px;\n max-width: 90vw;\n max-height: 90vh;\n overflow: hidden;\n z-index: 1001;\n }\n\n .confirm-dialog {\n width: 400px;\n }\n\n .modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .modal-close {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .modal-close:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .modal-body {\n padding: 20px;\n max-height: 60vh;\n overflow-y: auto;\n }\n\n .modal-body p {\n margin: 0 0 8px;\n color: var(--mj-text-primary);\n }\n\n .warning-text {\n color: var(--mj-status-error) !important;\n font-size: 13px;\n }\n\n .modal-footer {\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-secondary {\n padding: 10px 20px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-danger {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-danger:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-status-error) 85%, black);\n }\n\n /* Form Styles */\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group:last-child {\n margin-bottom: 0;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .form-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.2s, box-shadow 0.2s;\n box-sizing: border-box;\n }\n\n .form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .form-input:disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n textarea.form-input {\n resize: vertical;\n min-height: 80px;\n }\n\n select.form-input {\n cursor: pointer;\n }\n\n .custom-select-wrapper {\n position: relative;\n }\n\n /* Portal Dropdown - Fixed positioning to escape modal z-index */\n .entity-dropdown-portal {\n position: fixed;\n z-index: 10002; /* Above modal (1001) */\n }\n\n .entity-dropdown-content {\n max-height: 200px;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: var(--mj-shadow-md);\n }\n\n .entity-dropdown-content.open-above {\n position: absolute;\n bottom: 0;\n }\n\n .dropdown-item {\n padding: 10px 12px;\n cursor: pointer;\n transition: background 0.15s;\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .dropdown-item:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .dropdown-item:first-child {\n border-radius: 6px 6px 0 0;\n }\n\n .dropdown-item:last-child {\n border-radius: 0 0 6px 6px;\n }\n\n .dropdown-empty {\n padding: 10px 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .lists-header {\n flex-direction: column;\n gap: 16px;\n align-items: stretch;\n }\n\n .header-actions {\n flex-direction: column;\n }\n\n .search-box input {\n width: 100%;\n }\n\n .btn-create {\n width: 100%;\n justify-content: center;\n }\n\n .lists-grid {\n grid-template-columns: 1fr;\n }\n\n .modal-dialog {\n width: 95vw;\n }\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ListsMyListsResource extends BaseResourceComponent implements OnDestroy {\n protected override destroy$ = new Subject<void>();\n\n isLoading = true;\n searchTerm = '';\n viewMode: 'grid' | 'list' = 'grid';\n\n allLists: ListViewModel[] = [];\n filteredLists: ListViewModel[] = [];\n categories: MJListCategoryEntity[] = [];\n categoryTree: CategoryNode[] = [];\n flatCategories: Array<{ ID: string | null; displayName: string }> = [];\n availableEntities: Array<{ ID: string; Name: string }> = [];\n filteredEntities: Array<{ ID: string; Name: string }> = [];\n\n // Context menu\n showContextMenu = false;\n contextMenuX = 0;\n contextMenuY = 0;\n selectedContextList: MJListEntity | null = null;\n\n // Create/Edit dialog\n showCreateDialog = false;\n editingList: MJListEntity | null = null;\n newListName = '';\n newListDescription = '';\n selectedEntityId = '';\n selectedCategoryId: string | null = null;\n entitySearchTerm = '';\n showEntityDropdown = false;\n entityDropdownPosition = { top: 0, left: 0, width: 0, openAbove: false };\n\n // Delete confirmation\n showDeleteConfirm = false;\n deleteListName = '';\n listToDelete: MJListEntity | null = null;\n\n // Operation states\n isSaving = false;\n isDeleting = false;\n\n private categoryMap: Map<string, MJListCategoryEntity> = new Map();\n private entityColorMap: Map<string, string> = new Map();\n private entityIconMap: Map<string, string> = new Map();\n\n constructor(\n private cdr: ChangeDetectorRef,\n private tabService: TabService,\n private notificationService: MJNotificationService,\n private elementRef: ElementRef\n ) {\n super();\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent) {\n // Close entity dropdown when clicking outside the input or dropdown\n if (this.showEntityDropdown) {\n const target = event.target as HTMLElement;\n if (!target.closest('.custom-select-wrapper') && !target.closest('.entity-dropdown-portal')) {\n this.showEntityDropdown = false;\n }\n }\n }\n\n @HostListener('document:keydown.escape')\n onEscapeKey() {\n if (this.showContextMenu) {\n this.closeContextMenu();\n }\n if (this.showCreateDialog) {\n this.closeCreateDialog();\n }\n if (this.showDeleteConfirm) {\n this.cancelDelete();\n }\n }\n\n async ngOnInit() {\n super.ngOnInit();\n await this.loadData();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy() {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async loadData() {\n this.isLoading = true;\n\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const userId = md.CurrentUser?.ID;\n\n if (!userId) {\n console.error('No current user');\n return;\n }\n\n // Load lists, categories, and item counts in parallel\n const [listsResult, categoriesResult, detailsResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Lists',\n ExtraFilter: `UserID = '${userId}'`,\n OrderBy: 'Name',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: List Categories',\n OrderBy: 'Name',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID IN (SELECT ID FROM __mj.List WHERE UserID = '${userId}')`,\n ResultType: 'simple'\n }\n ]);\n\n if (!listsResult.Success || !categoriesResult.Success) {\n console.error('Failed to load lists data');\n return;\n }\n\n const lists = listsResult.Results as MJListEntity[];\n this.categories = categoriesResult.Results as MJListCategoryEntity[];\n const details = detailsResult.Results as Array<{ ListID: string }>;\n\n // Build category map\n this.categoryMap.clear();\n for (const cat of this.categories) {\n this.categoryMap.set(cat.ID, cat);\n }\n\n // Count items per list\n const itemCounts = new Map<string, number>();\n for (const detail of details) {\n const count = itemCounts.get(detail.ListID) || 0;\n itemCounts.set(detail.ListID, count + 1);\n }\n\n // Build entity info\n const entities = md.Entities;\n for (const entity of entities) {\n this.entityColorMap.set(entity.Name, this.generateEntityColor(entity.Name));\n this.entityIconMap.set(entity.Name, entity.Icon || 'fa-solid fa-table');\n }\n\n // Build list view models\n this.allLists = lists.map(list => ({\n list,\n itemCount: itemCounts.get(list.ID) || 0,\n entityName: list.Entity || 'Unknown'\n }));\n\n // Build available entities for dropdown\n this.availableEntities = entities\n .filter(e => e.IncludeInAPI)\n .map(e => ({ ID: e.ID, Name: e.Name }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n this.filteredEntities = [...this.availableEntities];\n\n // Build flat categories for dropdown\n this.flatCategories = this.buildFlatCategories(this.categories);\n\n this.applyFilter();\n this.buildCategoryTree();\n } catch (error) {\n console.error('Error loading lists:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private buildFlatCategories(categories: MJListCategoryEntity[]): Array<{ ID: string; displayName: string }> {\n const result: Array<{ ID: string; displayName: string }> = [];\n const topLevel = categories.filter(c => !c.ParentID);\n\n const processCategory = (cat: MJListCategoryEntity, level: number) => {\n const indent = '\\u00A0\\u00A0'.repeat(level);\n result.push({ ID: cat.ID, displayName: `${indent}${cat.Name}` });\n\n const children = categories.filter(c => UUIDsEqual(c.ParentID, cat.ID));\n for (const child of children) {\n processCategory(child, level + 1);\n }\n };\n\n for (const cat of topLevel) {\n processCategory(cat, 0);\n }\n\n return result;\n }\n\n private buildCategoryTree() {\n const rootNodes: CategoryNode[] = [];\n const categoryNodes = new Map<string, CategoryNode>();\n\n // Create nodes for all categories\n for (const cat of this.categories) {\n categoryNodes.set(cat.ID, {\n category: cat,\n lists: [],\n children: [],\n isExpanded: true\n });\n }\n\n // Build tree structure\n for (const cat of this.categories) {\n const node = categoryNodes.get(cat.ID)!;\n if (cat.ParentID && categoryNodes.has(cat.ParentID)) {\n categoryNodes.get(cat.ParentID)!.children.push(node);\n } else {\n rootNodes.push(node);\n }\n }\n\n // Assign lists to categories\n const uncategorizedLists: ListViewModel[] = [];\n for (const item of this.filteredLists) {\n if (item.list.CategoryID && categoryNodes.has(item.list.CategoryID)) {\n categoryNodes.get(item.list.CategoryID)!.lists.push(item);\n } else {\n uncategorizedLists.push(item);\n }\n }\n\n // Add uncategorized node if there are uncategorized lists\n if (uncategorizedLists.length > 0) {\n rootNodes.unshift({\n category: null,\n lists: uncategorizedLists,\n children: [],\n isExpanded: true\n });\n }\n\n this.categoryTree = rootNodes;\n }\n\n onSearchChange(_term: string) {\n this.applyFilter();\n this.buildCategoryTree();\n }\n\n clearSearch() {\n this.searchTerm = '';\n this.applyFilter();\n this.buildCategoryTree();\n }\n\n private applyFilter() {\n if (!this.searchTerm) {\n this.filteredLists = [...this.allLists];\n } else {\n const term = this.searchTerm.toLowerCase();\n this.filteredLists = this.allLists.filter(item =>\n item.list.Name.toLowerCase().includes(term) ||\n (item.list.Description && item.list.Description.toLowerCase().includes(term)) ||\n item.entityName.toLowerCase().includes(term)\n );\n }\n }\n\n toggleCategory(node: CategoryNode) {\n node.isExpanded = !node.isExpanded;\n }\n\n getListCountInCategory(node: CategoryNode): number {\n let count = node.lists.length;\n for (const child of node.children) {\n count += this.getListCountInCategory(child);\n }\n return count;\n }\n\n getCategoryName(categoryId: string): string {\n return this.categoryMap.get(categoryId)?.Name || 'Unknown';\n }\n\n getEntityColor(entityName: string): string {\n return this.entityColorMap.get(entityName) || '#607D8B';\n }\n\n getEntityIcon(entityName: string): string {\n return this.entityIconMap.get(entityName) || 'fa-solid fa-table';\n }\n\n private generateEntityColor(entityName: string): string {\n let hash = 0;\n for (let i = 0; i < entityName.length; i++) {\n hash = entityName.charCodeAt(i) + ((hash << 5) - hash);\n }\n const colors = [\n '#2196F3', '#4CAF50', '#FF9800', '#9C27B0', '#F44336',\n '#00BCD4', '#795548', '#607D8B', '#E91E63', '#3F51B5'\n ];\n return colors[Math.abs(hash) % colors.length];\n }\n\n formatDate(date: Date): string {\n if (!date) return '';\n const now = new Date();\n const d = new Date(date);\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) return 'today';\n if (diffDays === 1) return 'yesterday';\n if (diffDays < 7) return `${diffDays} days ago`;\n if (diffDays < 30) return `${Math.floor(diffDays / 7)} weeks ago`;\n return d.toLocaleDateString();\n }\n\n openList(list: MJListEntity) {\n const appId = this.Data?.Configuration?.applicationId || '';\n this.tabService.OpenList(list.ID, list.Name, appId);\n }\n\n openListMenu(event: Event, list: MJListEntity) {\n event.stopPropagation();\n const mouseEvent = event as MouseEvent;\n this.selectedContextList = list;\n this.contextMenuX = mouseEvent.clientX;\n this.contextMenuY = mouseEvent.clientY;\n this.showContextMenu = true;\n }\n\n closeContextMenu() {\n this.showContextMenu = false;\n this.selectedContextList = null;\n }\n\n createNewList() {\n this.editingList = null;\n this.newListName = '';\n this.newListDescription = '';\n this.selectedEntityId = '';\n this.entitySearchTerm = '';\n this.selectedCategoryId = null;\n this.showEntityDropdown = false;\n this.showCreateDialog = true;\n }\n\n editList() {\n if (!this.selectedContextList) return;\n\n this.editingList = this.selectedContextList;\n this.newListName = this.selectedContextList.Name;\n this.newListDescription = this.selectedContextList.Description || '';\n this.selectedEntityId = this.selectedContextList.EntityID;\n this.entitySearchTerm = this.selectedContextList.Entity || '';\n this.selectedCategoryId = this.selectedContextList.CategoryID || null;\n this.showCreateDialog = true;\n this.closeContextMenu();\n }\n\n selectEntity(entity: { ID: string; Name: string }) {\n this.selectedEntityId = entity.ID;\n this.entitySearchTerm = entity.Name;\n this.showEntityDropdown = false;\n }\n\n filterEntities(term: string) {\n const lowerTerm = term.toLowerCase();\n this.filteredEntities = this.availableEntities.filter(e =>\n e.Name.toLowerCase().includes(lowerTerm)\n );\n // Ensure dropdown is visible while typing\n if (!this.showEntityDropdown && term) {\n this.showEntityDropdown = true;\n }\n // Clear selection when user modifies the search text\n this.selectedEntityId = '';\n }\n\n openEntityDropdown(inputElement: HTMLInputElement) {\n const rect = inputElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const dropdownHeight = 200; // estimated max height\n const spaceBelow = viewportHeight - rect.bottom;\n const openAbove = spaceBelow < dropdownHeight && rect.top > dropdownHeight;\n\n this.entityDropdownPosition = {\n top: openAbove ? rect.top - dropdownHeight : rect.bottom,\n left: rect.left,\n width: rect.width,\n openAbove\n };\n this.showEntityDropdown = true;\n this.filteredEntities = [...this.availableEntities];\n }\n\n closeEntityDropdown() {\n this.showEntityDropdown = false;\n }\n\n async duplicateList() {\n if (!this.selectedContextList) return;\n\n const listToDuplicate = this.selectedContextList;\n this.closeContextMenu();\n\n this.isLoading = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n const newList = await md.GetEntityObject<MJListEntity>('MJ: Lists');\n newList.Name = `${listToDuplicate.Name} (Copy)`;\n newList.Description = listToDuplicate.Description;\n newList.EntityID = listToDuplicate.EntityID;\n newList.CategoryID = listToDuplicate.CategoryID;\n newList.UserID = md.CurrentUser!.ID;\n\n const listSaved = await newList.Save();\n if (!listSaved) {\n this.notificationService.CreateSimpleNotification('Failed to duplicate list', 'error', 4000);\n return;\n }\n\n const itemsResult = await rv.RunView<MJListDetailEntity>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID = '${listToDuplicate.ID}'`,\n ResultType: 'entity_object'\n });\n\n if (itemsResult.Success && itemsResult.Results.length > 0) {\n let copiedCount = 0;\n for (const item of itemsResult.Results) {\n const newItem = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details');\n newItem.ListID = newList.ID;\n newItem.RecordID = item.RecordID;\n newItem.Sequence = item.Sequence;\n const itemSaved = await newItem.Save();\n if (itemSaved) copiedCount++;\n }\n this.notificationService.CreateSimpleNotification(\n `List duplicated with ${copiedCount} item${copiedCount !== 1 ? 's' : ''}`,\n 'success',\n 3000\n );\n } else {\n this.notificationService.CreateSimpleNotification('List duplicated successfully', 'success', 3000);\n }\n\n await this.loadData();\n } catch (error) {\n console.error('Error duplicating list:', error);\n this.notificationService.CreateSimpleNotification('Error duplicating list. Please try again.', 'error', 4000);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n confirmDeleteList() {\n if (!this.selectedContextList) return;\n this.listToDelete = this.selectedContextList;\n this.deleteListName = this.selectedContextList.Name;\n this.showDeleteConfirm = true;\n this.closeContextMenu();\n }\n\n cancelDelete() {\n this.showDeleteConfirm = false;\n this.listToDelete = null;\n this.deleteListName = '';\n }\n\n async deleteList() {\n if (!this.listToDelete) return;\n\n const listToDelete = this.listToDelete;\n const listName = listToDelete.Name;\n\n this.isDeleting = true;\n this.cdr.detectChanges();\n\n try {\n const deleted = await listToDelete.Delete();\n if (deleted) {\n this.notificationService.CreateSimpleNotification(`\"${listName}\" deleted`, 'success', 3000);\n } else {\n // Get the detailed error message from LatestResult\n const errorMessage = listToDelete.LatestResult?.Message || 'Unknown error occurred';\n console.error('Failed to delete list:', listToDelete.LatestResult);\n this.notificationService.CreateSimpleNotification(`Failed to delete list: ${errorMessage}`, 'error', 6000);\n }\n this.cancelDelete();\n await this.loadData();\n } catch (error) {\n console.error('Error deleting list:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error deleting list: ${errorMessage}`, 'error', 6000);\n } finally {\n this.isDeleting = false;\n this.cdr.detectChanges();\n }\n }\n\n closeCreateDialog() {\n this.showCreateDialog = false;\n this.editingList = null;\n this.showEntityDropdown = false;\n }\n\n async saveList() {\n this.isSaving = true;\n this.cdr.detectChanges();\n\n const isEditing = !!this.editingList;\n const listName = this.newListName;\n\n try {\n const md = this.ProviderToUse;\n let list: MJListEntity;\n\n if (this.editingList) {\n list = this.editingList;\n } else {\n list = await md.GetEntityObject<MJListEntity>('MJ: Lists');\n list.UserID = md.CurrentUser!.ID;\n list.EntityID = this.selectedEntityId;\n }\n\n list.Name = this.newListName;\n list.Description = this.newListDescription || null;\n list.CategoryID = this.selectedCategoryId || null;\n\n const saved = await list.Save();\n if (saved) {\n this.notificationService.CreateSimpleNotification(\n isEditing ? `\"${listName}\" updated` : `\"${listName}\" created`,\n 'success',\n 3000\n );\n this.closeCreateDialog();\n await this.loadData();\n } else {\n // Get the detailed error message from LatestResult\n const errorMessage = list.LatestResult?.Message || 'Unknown error occurred';\n const action = isEditing ? 'update' : 'create';\n console.error(`Failed to ${action} list:`, list.LatestResult);\n this.notificationService.CreateSimpleNotification(\n `Failed to ${action} list: ${errorMessage}`,\n 'error',\n 6000\n );\n }\n } catch (error) {\n console.error('Error saving list:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error saving list: ${errorMessage}`, 'error', 6000);\n } finally {\n this.isSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'My Lists';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-list-check';\n }\n}\n"]}
|
|
@@ -545,11 +545,11 @@ export class MCPServerDialogComponent extends BaseAngularComponent {
|
|
|
545
545
|
i0.ɵɵconditionalCreate(0, MCPServerDialogComponent_Conditional_0_Template, 72, 42, "mj-dialog", 1);
|
|
546
546
|
} if (rf & 2) {
|
|
547
547
|
i0.ɵɵconditional(ctx.visible ? 0 : -1);
|
|
548
|
-
} }, dependencies: [i1.ɵNgNoValidate, i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgControlStatusGroup, i1.NgModel, i1.FormGroupDirective, i1.FormControlName, i2.MJButtonDirective, i2.MJDialogComponent, i2.MJDialogActionsComponent, i2.MJDropdownComponent, i2.MJNumericInputComponent], styles: [".server-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.error-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-error);\n border-radius: 6px;\n color: var(--mj-status-error);\n font-size: 14px;\n}\n\n.form-section[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n}\n\n.form-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 16px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.form-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.form-group[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.form-group[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.form-group[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.form-group[_ngcontent-%COMP%] label[_ngcontent-%COMP%] .required[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.form-group[_ngcontent-%COMP%] input[_ngcontent-%COMP%], \n.form-group[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.form-group[_ngcontent-%COMP%] .hint[_ngcontent-%COMP%] {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: var(--mj-text-disabled);\n}\n\n.form-group[_ngcontent-%COMP%] .error-text[_ngcontent-%COMP%] {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: var(--mj-status-error);\n}\n\n.form-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n}\n\n.form-group.half[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.transport-option[_ngcontent-%COMP%], \n.auth-option[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n padding: 4px 0;\n}\n\n.transport-label[_ngcontent-%COMP%], \n.auth-label[_ngcontent-%COMP%] {\n font-weight: 500;\n font-size: 14px;\n}\n\n.transport-desc[_ngcontent-%COMP%], \n.auth-desc[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n.oauth-section[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.oauth-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n.oauth-client-section[_ngcontent-%COMP%] {\n margin-top: 20px;\n padding-top: 16px;\n border-top: 1px dashed var(--mj-border-strong);\n}\n\n.oauth-client-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.section-hint[_ngcontent-%COMP%] {\n margin: 0 0 16px 0;\n font-size: 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n}
|
|
548
|
+
} }, dependencies: [i1.ɵNgNoValidate, i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgControlStatusGroup, i1.NgModel, i1.FormGroupDirective, i1.FormControlName, i2.MJButtonDirective, i2.MJDialogComponent, i2.MJDialogActionsComponent, i2.MJDropdownComponent, i2.MJNumericInputComponent], styles: [".server-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.error-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-error);\n border-radius: 6px;\n color: var(--mj-status-error);\n font-size: 14px;\n}\n\n.form-section[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n}\n\n.form-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 16px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.form-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.form-group[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.form-group[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.form-group[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.form-group[_ngcontent-%COMP%] label[_ngcontent-%COMP%] .required[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.form-group[_ngcontent-%COMP%] input[_ngcontent-%COMP%], \n.form-group[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.form-group[_ngcontent-%COMP%] .hint[_ngcontent-%COMP%] {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: var(--mj-text-disabled);\n}\n\n.form-group[_ngcontent-%COMP%] .error-text[_ngcontent-%COMP%] {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: var(--mj-status-error);\n}\n\n.form-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n}\n\n.form-group.half[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.transport-option[_ngcontent-%COMP%], \n.auth-option[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n padding: 4px 0;\n}\n\n.transport-label[_ngcontent-%COMP%], \n.auth-label[_ngcontent-%COMP%] {\n font-weight: 500;\n font-size: 14px;\n}\n\n.transport-desc[_ngcontent-%COMP%], \n.auth-desc[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n.oauth-section[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.oauth-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n.oauth-client-section[_ngcontent-%COMP%] {\n margin-top: 20px;\n padding-top: 16px;\n border-top: 1px dashed var(--mj-border-strong);\n}\n\n.oauth-client-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.section-hint[_ngcontent-%COMP%] {\n margin: 0 0 16px 0;\n font-size: 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n}"] });
|
|
549
549
|
}
|
|
550
550
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MCPServerDialogComponent, [{
|
|
551
551
|
type: Component,
|
|
552
|
-
args: [{ standalone: false, selector: 'mj-mcp-server-dialog', template: "@if (visible) {\n <mj-dialog\n [Visible]=\"true\"\n [Title]=\"DialogTitle\"\n (Close)=\"cancel()\"\n [Width]=\"600\">\n <form [formGroup]=\"serverForm\" class=\"server-form\">\n <!-- Error Message -->\n @if (ErrorMessage) {\n <div class=\"error-banner\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ ErrorMessage }}\n </div>\n }\n <!-- Basic Info Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-info-circle\"></i> Basic Information</h3>\n <div class=\"form-group\">\n <label for=\"name\">Name <span class=\"required\">*</span></label>\n <input class=\"mj-input\"\n id=\"name\"\n formControlName=\"Name\"\n placeholder=\"e.g., GitHub MCP Server\" />\n @if (hasError('Name', 'required')) {\n <span class=\"error-text\">Name is required</span>\n }\n </div>\n <div class=\"form-group\">\n <label for=\"description\">Description</label>\n <textarea class=\"mj-textarea\"\n id=\"description\"\n formControlName=\"Description\"\n placeholder=\"Optional description of this server\"\n [rows]=\"3\"></textarea>\n </div>\n <div class=\"form-group\">\n <label for=\"status\">Status</label>\n <mj-dropdown\n [Data]=\"['Active', 'Inactive']\"\n [ngModelOptions]=\"{standalone: true}\" [ngModel]=\"serverForm.get('Status')?.value\"\n (ValueChange)=\"serverForm.get('Status')?.setValue($any($event))\">\n </mj-dropdown>\n </div>\n </div>\n <!-- Transport Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-network-wired\"></i> Transport Configuration</h3>\n <div class=\"form-group\">\n <label for=\"transportType\">Transport Type <span class=\"required\">*</span></label>\n <mj-dropdown\n [Data]=\"transportTypes\"\n TextField=\"label\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModelOptions]=\"{standalone: true}\" [ngModel]=\"serverForm.get('TransportType')?.value\"\n (ValueChange)=\"serverForm.get('TransportType')?.setValue($any($event)); onTransportTypeChange()\">\n <ng-template #mjDropdownItem let-dataItem>\n <div class=\"transport-option\">\n <span class=\"transport-label\">{{ dataItem.label }}</span>\n <span class=\"transport-desc\">{{ dataItem.description }}</span>\n </div>\n </ng-template>\n </mj-dropdown>\n </div>\n @if (RequiresURL) {\n <div class=\"form-group\">\n <label for=\"serverUrl\">Server URL <span class=\"required\">*</span></label>\n <input class=\"mj-input\"\n id=\"serverUrl\"\n formControlName=\"ServerURL\"\n placeholder=\"https://api.example.com/mcp\" />\n @if (hasError('ServerURL', 'required')) {\n <span class=\"error-text\">Server URL is required for this transport type</span>\n }\n </div>\n }\n @if (RequiresCommand) {\n <div class=\"form-group\">\n <label for=\"command\">Command <span class=\"required\">*</span></label>\n <input class=\"mj-input\"\n id=\"command\"\n formControlName=\"Command\"\n placeholder=\"e.g., npx or /usr/local/bin/mcp-server\" />\n @if (hasError('Command', 'required')) {\n <span class=\"error-text\">Command is required for Stdio transport</span>\n }\n </div>\n <div class=\"form-group\">\n <label for=\"commandArgs\">Command Arguments (JSON array)</label>\n <input class=\"mj-input\"\n id=\"commandArgs\"\n formControlName=\"CommandArgs\"\n placeholder='[\"arg1\", \"arg2\"]' />\n <span class=\"hint\">JSON array of command line arguments</span>\n </div>\n }\n </div>\n <!-- Authentication Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-shield-halved\"></i> Authentication</h3>\n <div class=\"form-group\">\n <label for=\"authType\">Default Auth Type</label>\n <mj-dropdown\n [Data]=\"authTypes\"\n TextField=\"label\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModelOptions]=\"{standalone: true}\" [ngModel]=\"serverForm.get('DefaultAuthType')?.value\"\n (ValueChange)=\"serverForm.get('DefaultAuthType')?.setValue($any($event)); onAuthTypeChange()\">\n <ng-template #mjDropdownItem let-dataItem>\n <div class=\"auth-option\">\n <span class=\"auth-label\">{{ dataItem.label }}</span>\n <span class=\"auth-desc\">{{ dataItem.description }}</span>\n </div>\n </ng-template>\n </mj-dropdown>\n </div>\n </div>\n <!-- OAuth 2.0 Configuration Section -->\n @if (IsOAuth2) {\n <div class=\"form-section oauth-section\">\n <h3><i class=\"fa-solid fa-key\"></i> OAuth 2.0 Configuration</h3>\n <div class=\"form-group\">\n <label for=\"oauthIssuerUrl\">OAuth Issuer URL <span class=\"required\">*</span></label>\n <input class=\"mj-input\"\n id=\"oauthIssuerUrl\"\n formControlName=\"OAuthIssuerURL\"\n placeholder=\"https://auth.example.com\" />\n @if (hasError('OAuthIssuerURL', 'required')) {\n <span class=\"error-text\">OAuth Issuer URL is required for OAuth 2.0 authentication</span>\n }\n <span class=\"hint\">The authorization server's issuer URL (e.g., https://login.microsoftonline.com/tenant-id or https://your-domain.auth0.com)</span>\n </div>\n <div class=\"form-group\">\n <label for=\"oauthScopes\">OAuth Scopes</label>\n <input class=\"mj-input\"\n id=\"oauthScopes\"\n formControlName=\"OAuthScopes\"\n placeholder=\"openid profile email\" />\n <span class=\"hint\">Space-separated list of OAuth scopes to request</span>\n </div>\n <div class=\"form-group\">\n <label for=\"oauthCacheTtl\">Metadata Cache TTL (minutes)</label>\n <mj-numeric-input\n [Min]=\"5\"\n Placeholder=\"1440\"\n [ngModelOptions]=\"{standalone: true}\" [ngModel]=\"serverForm.get('OAuthMetadataCacheTTLMinutes')?.value\"\n (ngModelChange)=\"serverForm.get('OAuthMetadataCacheTTLMinutes')?.setValue($event)\">\n </mj-numeric-input>\n <span class=\"hint\">How long to cache OAuth metadata (default: 1440 minutes = 24 hours)</span>\n </div>\n <div class=\"oauth-client-section\">\n <h4>Pre-configured Client (Optional)</h4>\n <p class=\"section-hint\">Leave blank to use Dynamic Client Registration (DCR). If the auth server doesn't support DCR, configure your client credentials here.</p>\n <div class=\"form-group\">\n <label for=\"oauthClientId\">Client ID</label>\n <input class=\"mj-input\"\n id=\"oauthClientId\"\n formControlName=\"OAuthClientID\"\n placeholder=\"your-client-id\" />\n </div>\n <div class=\"form-group\">\n <label for=\"oauthClientSecret\">Client Secret</label>\n <input class=\"mj-input\"\n id=\"oauthClientSecret\"\n formControlName=\"OAuthClientSecretEncrypted\"\n type=\"password\"\n placeholder=\"your-client-secret\" />\n <span class=\"hint\">The secret will be encrypted before storage</span>\n </div>\n </div>\n </div>\n }\n <!-- Rate Limiting Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-gauge-high\"></i> Rate Limiting</h3>\n <div class=\"form-row\">\n <div class=\"form-group half\">\n <label for=\"rateLimitMinute\">Requests per Minute</label>\n <mj-numeric-input\n [Min]=\"0\"\n Placeholder=\"No limit\"\n [ngModelOptions]=\"{standalone: true}\" [ngModel]=\"serverForm.get('RateLimitPerMinute')?.value\"\n (ngModelChange)=\"serverForm.get('RateLimitPerMinute')?.setValue($event)\">\n </mj-numeric-input>\n </div>\n <div class=\"form-group half\">\n <label for=\"rateLimitHour\">Requests per Hour</label>\n <mj-numeric-input\n [Min]=\"0\"\n Placeholder=\"No limit\"\n [ngModelOptions]=\"{standalone: true}\" [ngModel]=\"serverForm.get('RateLimitPerHour')?.value\"\n (ngModelChange)=\"serverForm.get('RateLimitPerHour')?.setValue($event)\">\n </mj-numeric-input>\n </div>\n </div>\n <div class=\"form-group\">\n <label for=\"requestTimeout\">Request Timeout (ms)</label>\n <mj-numeric-input\n [Min]=\"1000\"\n [Max]=\"600000\"\n [Step]=\"1000\"\n [ngModelOptions]=\"{standalone: true}\" [ngModel]=\"serverForm.get('RequestTimeoutMs')?.value\"\n (ngModelChange)=\"serverForm.get('RequestTimeoutMs')?.setValue($event)\">\n </mj-numeric-input>\n <span class=\"hint\">Timeout for individual tool calls (1000-600000ms)</span>\n </div>\n </div>\n </form>\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"save()\" [disabled]=\"IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{ IsEditMode ? 'Update' : 'Create' }}\n </button>\n <button mjButton (click)=\"cancel()\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n", styles: [".server-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.error-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-error);\n border-radius: 6px;\n color: var(--mj-status-error);\n font-size: 14px;\n}\n\n.form-section {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n}\n\n.form-section h3 {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 16px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.form-section h3 i {\n color: var(--mj-brand-primary);\n}\n\n.form-group {\n margin-bottom: 16px;\n}\n\n.form-group:last-child {\n margin-bottom: 0;\n}\n\n.form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.form-group label .required {\n color: var(--mj-status-error);\n}\n\n.form-group input,\n.form-group textarea {\n width: 100%;\n}\n\n.form-group .hint {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: var(--mj-text-disabled);\n}\n\n.form-group .error-text {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: var(--mj-status-error);\n}\n\n.form-row {\n display: flex;\n gap: 16px;\n}\n\n.form-group.half {\n flex: 1;\n}\n\n.transport-option,\n.auth-option {\n display: flex;\n flex-direction: column;\n padding: 4px 0;\n}\n\n.transport-label,\n.auth-label {\n font-weight: 500;\n font-size: 14px;\n}\n\n.transport-desc,\n.auth-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* OAuth Section Styles */\n.oauth-section {\n background-color: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.oauth-section h3 i {\n color: var(--mj-status-warning);\n}\n\n.oauth-client-section {\n margin-top: 20px;\n padding-top: 16px;\n border-top: 1px dashed var(--mj-border-strong);\n}\n\n.oauth-client-section h4 {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.section-hint {\n margin: 0 0 16px 0;\n font-size: 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n/* Kendo overrides */\n:host ::ng-deep .k-dialog-actions {\n padding: 16px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n:host ::ng-deep .k-dialog-content {\n padding: 20px;\n max-height: 70vh;\n overflow-y: auto;\n}\n\n:host ::ng-deep .k-textbox,\n:host ::ng-deep .k-textarea,\n:host ::ng-deep .k-numerictextbox,\n:host ::ng-deep .k-dropdownlist {\n width: 100%;\n}\n"] }]
|
|
552
|
+
args: [{ standalone: false, selector: 'mj-mcp-server-dialog', template: "@if (visible) {\n <mj-dialog\n [Visible]=\"true\"\n [Title]=\"DialogTitle\"\n (Close)=\"cancel()\"\n [Width]=\"600\">\n <form [formGroup]=\"serverForm\" class=\"server-form\">\n <!-- Error Message -->\n @if (ErrorMessage) {\n <div class=\"error-banner\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ ErrorMessage }}\n </div>\n }\n <!-- Basic Info Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-info-circle\"></i> Basic Information</h3>\n <div class=\"form-group\">\n <label for=\"name\">Name <span class=\"required\">*</span></label>\n <input class=\"mj-input\"\n id=\"name\"\n formControlName=\"Name\"\n placeholder=\"e.g., GitHub MCP Server\" />\n @if (hasError('Name', 'required')) {\n <span class=\"error-text\">Name is required</span>\n }\n </div>\n <div class=\"form-group\">\n <label for=\"description\">Description</label>\n <textarea class=\"mj-textarea\"\n id=\"description\"\n formControlName=\"Description\"\n placeholder=\"Optional description of this server\"\n [rows]=\"3\"></textarea>\n </div>\n <div class=\"form-group\">\n <label for=\"status\">Status</label>\n <mj-dropdown\n [Data]=\"['Active', 'Inactive']\"\n [ngModelOptions]=\"{standalone: true}\" [ngModel]=\"serverForm.get('Status')?.value\"\n (ValueChange)=\"serverForm.get('Status')?.setValue($any($event))\">\n </mj-dropdown>\n </div>\n </div>\n <!-- Transport Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-network-wired\"></i> Transport Configuration</h3>\n <div class=\"form-group\">\n <label for=\"transportType\">Transport Type <span class=\"required\">*</span></label>\n <mj-dropdown\n [Data]=\"transportTypes\"\n TextField=\"label\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModelOptions]=\"{standalone: true}\" [ngModel]=\"serverForm.get('TransportType')?.value\"\n (ValueChange)=\"serverForm.get('TransportType')?.setValue($any($event)); onTransportTypeChange()\">\n <ng-template #mjDropdownItem let-dataItem>\n <div class=\"transport-option\">\n <span class=\"transport-label\">{{ dataItem.label }}</span>\n <span class=\"transport-desc\">{{ dataItem.description }}</span>\n </div>\n </ng-template>\n </mj-dropdown>\n </div>\n @if (RequiresURL) {\n <div class=\"form-group\">\n <label for=\"serverUrl\">Server URL <span class=\"required\">*</span></label>\n <input class=\"mj-input\"\n id=\"serverUrl\"\n formControlName=\"ServerURL\"\n placeholder=\"https://api.example.com/mcp\" />\n @if (hasError('ServerURL', 'required')) {\n <span class=\"error-text\">Server URL is required for this transport type</span>\n }\n </div>\n }\n @if (RequiresCommand) {\n <div class=\"form-group\">\n <label for=\"command\">Command <span class=\"required\">*</span></label>\n <input class=\"mj-input\"\n id=\"command\"\n formControlName=\"Command\"\n placeholder=\"e.g., npx or /usr/local/bin/mcp-server\" />\n @if (hasError('Command', 'required')) {\n <span class=\"error-text\">Command is required for Stdio transport</span>\n }\n </div>\n <div class=\"form-group\">\n <label for=\"commandArgs\">Command Arguments (JSON array)</label>\n <input class=\"mj-input\"\n id=\"commandArgs\"\n formControlName=\"CommandArgs\"\n placeholder='[\"arg1\", \"arg2\"]' />\n <span class=\"hint\">JSON array of command line arguments</span>\n </div>\n }\n </div>\n <!-- Authentication Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-shield-halved\"></i> Authentication</h3>\n <div class=\"form-group\">\n <label for=\"authType\">Default Auth Type</label>\n <mj-dropdown\n [Data]=\"authTypes\"\n TextField=\"label\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModelOptions]=\"{standalone: true}\" [ngModel]=\"serverForm.get('DefaultAuthType')?.value\"\n (ValueChange)=\"serverForm.get('DefaultAuthType')?.setValue($any($event)); onAuthTypeChange()\">\n <ng-template #mjDropdownItem let-dataItem>\n <div class=\"auth-option\">\n <span class=\"auth-label\">{{ dataItem.label }}</span>\n <span class=\"auth-desc\">{{ dataItem.description }}</span>\n </div>\n </ng-template>\n </mj-dropdown>\n </div>\n </div>\n <!-- OAuth 2.0 Configuration Section -->\n @if (IsOAuth2) {\n <div class=\"form-section oauth-section\">\n <h3><i class=\"fa-solid fa-key\"></i> OAuth 2.0 Configuration</h3>\n <div class=\"form-group\">\n <label for=\"oauthIssuerUrl\">OAuth Issuer URL <span class=\"required\">*</span></label>\n <input class=\"mj-input\"\n id=\"oauthIssuerUrl\"\n formControlName=\"OAuthIssuerURL\"\n placeholder=\"https://auth.example.com\" />\n @if (hasError('OAuthIssuerURL', 'required')) {\n <span class=\"error-text\">OAuth Issuer URL is required for OAuth 2.0 authentication</span>\n }\n <span class=\"hint\">The authorization server's issuer URL (e.g., https://login.microsoftonline.com/tenant-id or https://your-domain.auth0.com)</span>\n </div>\n <div class=\"form-group\">\n <label for=\"oauthScopes\">OAuth Scopes</label>\n <input class=\"mj-input\"\n id=\"oauthScopes\"\n formControlName=\"OAuthScopes\"\n placeholder=\"openid profile email\" />\n <span class=\"hint\">Space-separated list of OAuth scopes to request</span>\n </div>\n <div class=\"form-group\">\n <label for=\"oauthCacheTtl\">Metadata Cache TTL (minutes)</label>\n <mj-numeric-input\n [Min]=\"5\"\n Placeholder=\"1440\"\n [ngModelOptions]=\"{standalone: true}\" [ngModel]=\"serverForm.get('OAuthMetadataCacheTTLMinutes')?.value\"\n (ngModelChange)=\"serverForm.get('OAuthMetadataCacheTTLMinutes')?.setValue($event)\">\n </mj-numeric-input>\n <span class=\"hint\">How long to cache OAuth metadata (default: 1440 minutes = 24 hours)</span>\n </div>\n <div class=\"oauth-client-section\">\n <h4>Pre-configured Client (Optional)</h4>\n <p class=\"section-hint\">Leave blank to use Dynamic Client Registration (DCR). If the auth server doesn't support DCR, configure your client credentials here.</p>\n <div class=\"form-group\">\n <label for=\"oauthClientId\">Client ID</label>\n <input class=\"mj-input\"\n id=\"oauthClientId\"\n formControlName=\"OAuthClientID\"\n placeholder=\"your-client-id\" />\n </div>\n <div class=\"form-group\">\n <label for=\"oauthClientSecret\">Client Secret</label>\n <input class=\"mj-input\"\n id=\"oauthClientSecret\"\n formControlName=\"OAuthClientSecretEncrypted\"\n type=\"password\"\n placeholder=\"your-client-secret\" />\n <span class=\"hint\">The secret will be encrypted before storage</span>\n </div>\n </div>\n </div>\n }\n <!-- Rate Limiting Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-gauge-high\"></i> Rate Limiting</h3>\n <div class=\"form-row\">\n <div class=\"form-group half\">\n <label for=\"rateLimitMinute\">Requests per Minute</label>\n <mj-numeric-input\n [Min]=\"0\"\n Placeholder=\"No limit\"\n [ngModelOptions]=\"{standalone: true}\" [ngModel]=\"serverForm.get('RateLimitPerMinute')?.value\"\n (ngModelChange)=\"serverForm.get('RateLimitPerMinute')?.setValue($event)\">\n </mj-numeric-input>\n </div>\n <div class=\"form-group half\">\n <label for=\"rateLimitHour\">Requests per Hour</label>\n <mj-numeric-input\n [Min]=\"0\"\n Placeholder=\"No limit\"\n [ngModelOptions]=\"{standalone: true}\" [ngModel]=\"serverForm.get('RateLimitPerHour')?.value\"\n (ngModelChange)=\"serverForm.get('RateLimitPerHour')?.setValue($event)\">\n </mj-numeric-input>\n </div>\n </div>\n <div class=\"form-group\">\n <label for=\"requestTimeout\">Request Timeout (ms)</label>\n <mj-numeric-input\n [Min]=\"1000\"\n [Max]=\"600000\"\n [Step]=\"1000\"\n [ngModelOptions]=\"{standalone: true}\" [ngModel]=\"serverForm.get('RequestTimeoutMs')?.value\"\n (ngModelChange)=\"serverForm.get('RequestTimeoutMs')?.setValue($event)\">\n </mj-numeric-input>\n <span class=\"hint\">Timeout for individual tool calls (1000-600000ms)</span>\n </div>\n </div>\n </form>\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"save()\" [disabled]=\"IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{ IsEditMode ? 'Update' : 'Create' }}\n </button>\n <button mjButton (click)=\"cancel()\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n", styles: [".server-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.error-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-error);\n border-radius: 6px;\n color: var(--mj-status-error);\n font-size: 14px;\n}\n\n.form-section {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n}\n\n.form-section h3 {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 16px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.form-section h3 i {\n color: var(--mj-brand-primary);\n}\n\n.form-group {\n margin-bottom: 16px;\n}\n\n.form-group:last-child {\n margin-bottom: 0;\n}\n\n.form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.form-group label .required {\n color: var(--mj-status-error);\n}\n\n.form-group input,\n.form-group textarea {\n width: 100%;\n}\n\n.form-group .hint {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: var(--mj-text-disabled);\n}\n\n.form-group .error-text {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: var(--mj-status-error);\n}\n\n.form-row {\n display: flex;\n gap: 16px;\n}\n\n.form-group.half {\n flex: 1;\n}\n\n.transport-option,\n.auth-option {\n display: flex;\n flex-direction: column;\n padding: 4px 0;\n}\n\n.transport-label,\n.auth-label {\n font-weight: 500;\n font-size: 14px;\n}\n\n.transport-desc,\n.auth-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* OAuth Section Styles */\n.oauth-section {\n background-color: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.oauth-section h3 i {\n color: var(--mj-status-warning);\n}\n\n.oauth-client-section {\n margin-top: 20px;\n padding-top: 16px;\n border-top: 1px dashed var(--mj-border-strong);\n}\n\n.oauth-client-section h4 {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.section-hint {\n margin: 0 0 16px 0;\n font-size: 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n}\n"] }]
|
|
553
553
|
}], () => [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }], { server: [{
|
|
554
554
|
type: Input
|
|
555
555
|
}], visible: [{
|