@memberjunction/ng-dashboards 5.24.0 → 5.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/agents/agent-configuration.component.d.ts +15 -33
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +233 -493
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts +2 -2
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +7 -7
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +43 -6
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1135 -864
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +4 -3
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts +4 -5
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +14 -15
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.d.ts +4 -4
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
- package/dist/AI/components/models/model-management.component.js +5 -5
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts +4 -4
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +5 -5
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts +2 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +1 -0
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.d.ts +2 -3
- package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +9 -11
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +44 -8
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +648 -384
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts +2 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +2 -0
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +4 -5
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +11 -12
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/code-management.component.d.ts +2 -3
- package/dist/Actions/components/code-management.component.d.ts.map +1 -1
- package/dist/Actions/components/code-management.component.js +4 -6
- package/dist/Actions/components/code-management.component.js.map +1 -1
- package/dist/Actions/components/entity-integration.component.d.ts +2 -3
- package/dist/Actions/components/entity-integration.component.d.ts.map +1 -1
- package/dist/Actions/components/entity-integration.component.js +4 -6
- package/dist/Actions/components/entity-integration.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +4 -5
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +10 -11
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +13 -12
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +39 -66
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.d.ts +2 -3
- package/dist/Actions/components/scheduled-actions.component.d.ts.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.js +4 -6
- package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
- package/dist/Actions/components/security-permissions.component.d.ts +2 -3
- package/dist/Actions/components/security-permissions.component.d.ts.map +1 -1
- package/dist/Actions/components/security-permissions.component.js +4 -6
- package/dist/Actions/components/security-permissions.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.d.ts +112 -0
- package/dist/ApplicationRoles/application-roles-resource.component.d.ts.map +1 -0
- package/dist/ApplicationRoles/application-roles-resource.component.js +532 -0
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -0
- package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
- package/dist/Communication/communication-dashboard.component.js +1 -0
- package/dist/Communication/communication-dashboard.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +4 -1
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +4 -1
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +4 -1
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +4 -1
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +4 -1
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +2 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +2 -0
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts +2 -3
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +10 -11
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +2 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +2 -0
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts +4 -4
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +8 -9
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +2 -3
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +11 -12
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.d.ts.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.js +1 -0
- package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +2 -3
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +9 -10
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +2 -2
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +23 -15
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +167 -213
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +68 -32
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +453 -420
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.d.ts +10 -3
- package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.js +35 -11
- package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.d.ts +12 -3
- package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.js +5 -1
- package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +4 -4
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +4 -5
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +1 -0
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +2 -0
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +1 -0
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +2 -0
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +2 -0
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +2 -0
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +4 -3
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +4 -3
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +1 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +13 -3
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +220 -138
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +4 -3
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +1 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/index.d.ts +0 -1
- package/dist/KnowledgeHub/index.d.ts.map +1 -1
- package/dist/KnowledgeHub/index.js +0 -1
- package/dist/KnowledgeHub/index.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +2 -0
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +2 -0
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +2 -0
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +2 -0
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +7 -28
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +25 -107
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
- package/dist/MCP/mcp-resource.component.js +1 -0
- package/dist/MCP/mcp-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +10 -23
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +41 -103
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.js +1 -0
- package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js +1 -0
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.js +1 -0
- package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +1 -0
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +4 -4
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +9 -10
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.js +2 -0
- package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +2 -0
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.js +2 -0
- package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.js +2 -0
- package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +2 -0
- package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +2 -1
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +1 -0
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.d.ts +4 -4
- package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +9 -10
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.d.ts +2 -1
- package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +2 -0
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts +4 -4
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +10 -11
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.d.ts +2 -1
- package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +2 -0
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +19 -19
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +4 -5
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +19 -18
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +8 -0
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/data-explorer-dashboards.module.d.ts +2 -1
- package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
- package/dist/data-explorer-dashboards.module.js +7 -3
- package/dist/data-explorer-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +1 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +2 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +49 -48
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +0 -166
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +0 -1
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +0 -991
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lists-categories-resource.component.js","sourceRoot":"","sources":["../../../src/Lists/components/lists-categories-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, ChangeDetectorRef, OnDestroy } from '@angular/core';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData, MJListCategoryEntity, MJListEntity } from '@memberjunction/core-entities';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\ninterface CategoryViewModel {\n category: MJListCategoryEntity;\n listCount: number;\n childCount: number;\n depth: number;\n isExpanded: boolean;\n}\n\n@RegisterClass(BaseResourceComponent, 'ListsCategoriesResource')\n@Component({\n standalone: false,\n selector: 'mj-lists-categories-resource',\n template: `\n <div class=\"lists-categories-container\">\n <!-- Header -->\n <div class=\"categories-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-tags\"></i>\n <h2>List Categories</h2>\n </div>\n <div class=\"header-actions\">\n <button class=\"btn-create\" (click)=\"createCategory()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New Category</span>\n </button>\n </div>\n </div>\n \n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading categories...\" size=\"medium\"></mj-loading>\n </div>\n }\n \n <!-- Empty State -->\n @if (!isLoading && categoryViewModels.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-state-icon-wrapper\">\n <div class=\"icon-bg\"></div>\n <i class=\"fa-solid fa-folder-tree\"></i>\n </div>\n <h3>No Categories Yet</h3>\n <p>Categories help you organize lists into logical groups.</p>\n <div class=\"empty-state-features\">\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Create hierarchical folder structures</span>\n </div>\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Quickly find related lists</span>\n </div>\n </div>\n <button class=\"btn-create-large\" (click)=\"createCategory()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Your First Category\n </button>\n </div>\n }\n \n <!-- Categories Content -->\n @if (!isLoading && categoryViewModels.length > 0) {\n <div class=\"categories-content\">\n <div class=\"categories-layout\">\n <!-- Category Tree -->\n <div class=\"category-tree-panel\">\n <div class=\"panel-header\">\n <h3>Categories</h3>\n <span class=\"count-badge\">{{categories.length}}</span>\n </div>\n <div class=\"tree-content\" role=\"tree\" aria-label=\"Category tree\">\n @for (vm of getTopLevelCategories(); track vm) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { vm: vm }\"></ng-container>\n }\n </div>\n </div>\n <!-- Category Details -->\n @if (selectedCategory) {\n <div class=\"category-detail-panel\">\n <div class=\"panel-header\">\n <h3>Category Details</h3>\n <div class=\"panel-actions\">\n <button class=\"icon-btn\" (click)=\"editCategory()\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button class=\"icon-btn danger\" (click)=\"deleteCategory()\" title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <div class=\"detail-content\">\n <div class=\"detail-field\">\n <label>Name</label>\n <span class=\"field-value\">{{selectedCategory.Name}}</span>\n </div>\n @if (selectedCategory.Description) {\n <div class=\"detail-field\">\n <label>Description</label>\n <span class=\"field-value\">{{selectedCategory.Description}}</span>\n </div>\n }\n <div class=\"detail-field\">\n <label>Parent Category</label>\n <span class=\"field-value\">\n {{getParentCategoryName(selectedCategory) || '(Top Level)'}}\n </span>\n </div>\n <div class=\"detail-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-value\">{{getSelectedCategoryListCount()}}</span>\n <span class=\"stat-label\">Lists</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-value\">{{getSelectedCategoryChildCount()}}</span>\n <span class=\"stat-label\">Subcategories</span>\n </div>\n </div>\n <!-- Lists in this category -->\n @if (selectedCategoryLists.length > 0) {\n <div class=\"category-lists\">\n <h4>Lists in this category</h4>\n <div class=\"mini-list\">\n @for (list of selectedCategoryLists; track list) {\n <div class=\"mini-list-item\">\n <i class=\"fa-solid fa-list\"></i>\n <span>{{list.Name}}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- No Selection State -->\n @if (!selectedCategory) {\n <div class=\"category-detail-panel empty\">\n <div class=\"no-selection\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n <p>Select a category to view details</p>\n </div>\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Category Node Template -->\n <ng-template #categoryNodeTemplate let-vm=\"vm\">\n <div class=\"category-node\" [style.padding-left.px]=\"vm.depth * 20\">\n <div\n class=\"node-content\"\n [class.selected]=\"IsCategorySelected(vm.category)\"\n (click)=\"selectCategory(vm.category)\"\n (keydown.enter)=\"selectCategory(vm.category)\"\n (keydown.space)=\"selectCategory(vm.category); $event.preventDefault()\"\n (keydown.arrowRight)=\"expandNode($event, vm)\"\n (keydown.arrowLeft)=\"collapseNode($event, vm)\"\n tabindex=\"0\"\n role=\"treeitem\"\n [attr.aria-expanded]=\"hasChildren(vm.category) ? vm.isExpanded : null\"\n [attr.aria-selected]=\"IsCategorySelected(vm.category)\"\n [attr.aria-label]=\"vm.category.Name + ' - ' + vm.listCount + ' lists'\">\n @if (hasChildren(vm.category)) {\n <button\n class=\"expand-btn\"\n (click)=\"toggleExpand($event, vm)\"\n tabindex=\"-1\"\n aria-hidden=\"true\">\n <i [class]=\"vm.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n </button>\n }\n @if (!hasChildren(vm.category)) {\n <span class=\"expand-placeholder\"></span>\n }\n <i class=\"fa-solid fa-folder\" [class.fa-folder-open]=\"vm.isExpanded\" aria-hidden=\"true\"></i>\n <span class=\"node-name\">{{vm.category.Name}}</span>\n <span class=\"node-count\" aria-hidden=\"true\">{{vm.listCount}}</span>\n </div>\n @if (vm.isExpanded && hasChildren(vm.category)) {\n <div class=\"node-children\" role=\"group\">\n @for (childVm of getChildCategories(vm.category); track childVm) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { vm: childVm }\"></ng-container>\n }\n </div>\n }\n </div>\n </ng-template>\n \n <!-- Create/Edit Dialog -->\n @if (showDialog) {\n <div class=\"modal-overlay\" (click)=\"closeDialog()\">\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>{{editingCategory ? 'Edit Category' : 'Create Category'}}</h3>\n <button class=\"modal-close\" (click)=\"closeDialog()\" [disabled]=\"isSaving\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"category-form\">\n <div class=\"form-group\">\n <label>Name *</label>\n <input\n type=\"text\"\n [(ngModel)]=\"dialogName\"\n placeholder=\"Enter category name\"\n class=\"form-input\" />\n </div>\n <div class=\"form-group\">\n <label>Description</label>\n <textarea\n [(ngModel)]=\"dialogDescription\"\n placeholder=\"Optional description\"\n class=\"form-input\"\n rows=\"3\"></textarea>\n </div>\n <div class=\"form-group\">\n <label>Parent Category</label>\n <select\n [(ngModel)]=\"dialogParentId\"\n class=\"form-input\">\n @for (parent of availableParents; track parent) {\n <option [ngValue]=\"parent.ID\">{{parent.displayName}}</option>\n }\n </select>\n </div>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn-primary\"\n (click)=\"saveCategory()\"\n [disabled]=\"!dialogName || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isSaving ? 'Saving...' : (editingCategory ? 'Save' : 'Create')}}\n </button>\n <button class=\"btn-secondary\" (click)=\"closeDialog()\" [disabled]=\"isSaving\">Cancel</button>\n </div>\n </div>\n </div>\n }\n \n <!-- Delete Confirmation Dialog -->\n @if (showDeleteConfirm) {\n <div class=\"modal-overlay\" (click)=\"cancelDelete()\">\n <div class=\"modal-dialog modal-sm\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header danger\">\n <h3>Delete Category</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>{{deleteConfirmMessage}}</p>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn-danger\" (click)=\"confirmDelete()\">\n Delete\n </button>\n <button class=\"btn-secondary\" (click)=\"cancelDelete()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .lists-categories-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n overflow: hidden;\n }\n\n /* Header */\n .categories-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n }\n\n .header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .header-title i {\n font-size: 24px;\n color: var(--mj-brand-primary);\n }\n\n .header-title h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .btn-create {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\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-create:hover {\n background: var(--mj-brand-primary-hover);\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: 420px;\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: 100px;\n height: 100px;\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: 48px;\n color: var(--mj-brand-primary);\n z-index: 1;\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-features {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin: 16px 0 24px;\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 .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 /* Content Layout */\n .categories-content {\n flex: 1;\n padding: 16px 24px;\n overflow: hidden;\n }\n\n .categories-layout {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n height: 100%;\n }\n\n .category-tree-panel,\n .category-detail-panel {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .panel-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .count-badge {\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 .panel-actions {\n display: flex;\n gap: 4px;\n }\n\n .icon-btn {\n background: none;\n border: none;\n padding: 6px 8px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s;\n }\n\n .icon-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n }\n\n .icon-btn.danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n /* Tree Content */\n .tree-content {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n }\n\n .category-node {\n user-select: none;\n }\n\n .node-content {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .node-content:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .node-content:focus {\n outline: none;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .node-content:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: -2px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .node-content.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .node-content.selected:focus-visible {\n outline: 2px solid var(--mj-brand-primary-hover);\n }\n\n .expand-btn {\n background: none;\n border: none;\n padding: 2px;\n color: var(--mj-text-muted);\n cursor: pointer;\n width: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .expand-btn:hover {\n color: var(--mj-text-secondary);\n }\n\n .expand-placeholder {\n width: 20px;\n }\n\n .node-content .fa-folder,\n .node-content .fa-folder-open {\n color: var(--mj-status-warning);\n }\n\n .node-name {\n flex: 1;\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .node-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 1px 6px;\n border-radius: 8px;\n }\n\n /* Detail Panel */\n .detail-content {\n flex: 1;\n padding: 16px;\n overflow-y: auto;\n }\n\n .detail-field {\n margin-bottom: 16px;\n }\n\n .detail-field label {\n display: block;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 4px;\n }\n\n .field-value {\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .detail-stats {\n display: flex;\n gap: 24px;\n margin: 24px 0;\n padding: 16px;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n }\n\n .stat-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n .stat-value {\n font-size: 24px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n }\n\n .stat-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .category-lists h4 {\n margin: 0 0 12px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n }\n\n .mini-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .mini-list-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface);\n border-radius: 4px;\n font-size: 13px;\n color: var(--mj-text-primary);\n }\n\n .mini-list-item i {\n color: var(--mj-text-muted);\n }\n\n /* No Selection */\n .category-detail-panel.empty {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .no-selection {\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .no-selection i {\n font-size: 32px;\n margin-bottom: 12px;\n }\n\n .no-selection p {\n margin: 0;\n }\n\n /* Form */\n .category-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .form-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .form-group label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .form-input {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-size: 14px;\n }\n\n .form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\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 display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: fadeIn 0.15s ease-out;\n }\n\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n .modal-dialog {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-lg);\n width: 450px;\n max-width: 90vw;\n max-height: 90vh;\n display: flex;\n flex-direction: column;\n animation: slideIn 0.2s ease-out;\n }\n\n .modal-dialog.modal-sm {\n width: 400px;\n }\n\n @keyframes slideIn {\n from { transform: translateY(-20px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\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.danger {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-bottom-color: color-mix(in srgb, var(--mj-status-error) 30%, transparent);\n }\n\n .modal-header.danger h3 {\n color: var(--mj-status-error);\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 transition: all 0.15s;\n }\n\n .modal-close:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n }\n\n .modal-close:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .modal-body {\n padding: 20px;\n overflow-y: auto;\n }\n\n .modal-body p {\n margin: 0;\n color: var(--mj-text-secondary);\n line-height: 1.6;\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-secondary {\n padding: 8px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n color: var(--mj-text-secondary);\n font-size: 14px;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n }\n\n .btn-secondary:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--mj-brand-primary);\n border: none;\n border-radius: 6px;\n color: var(--mj-text-inverse);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .btn-danger {\n padding: 8px 16px;\n background: var(--mj-status-error);\n border: none;\n border-radius: 6px;\n color: var(--mj-text-inverse);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .btn-danger:hover {\n background: var(--mj-status-error);\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .categories-layout {\n grid-template-columns: 1fr;\n }\n\n .category-detail-panel.empty {\n display: none;\n }\n\n .modal-dialog {\n width: 95vw;\n }\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ListsCategoriesResource extends BaseResourceComponent implements OnDestroy {\n private destroy$ = new Subject<void>();\n\n isLoading = true;\n categories: MJListCategoryEntity[] = [];\n categoryViewModels: CategoryViewModel[] = [];\n selectedCategory: MJListCategoryEntity | null = null;\n selectedCategoryLists: MJListEntity[] = [];\n\n // Dialog\n showDialog = false;\n editingCategory: MJListCategoryEntity | null = null;\n dialogName = '';\n dialogDescription = '';\n dialogParentId: string | null = null;\n availableParents: Array<{ ID: string | null; displayName: string }> = [];\n\n // Operation states\n isSaving = false;\n\n // Delete confirmation dialog\n showDeleteConfirm = false;\n deleteConfirmMessage = '';\n private categoryToDelete: MJListCategoryEntity | null = null;\n\n private listsByCategoryId: Map<string, MJListEntity[]> = new Map();\n private categoryMap: Map<string, MJListCategoryEntity> = new Map();\n\n constructor(\n private cdr: ChangeDetectorRef,\n private notificationService: MJNotificationService\n ) {\n super();\n }\n\n async ngOnInit() {\n await this.loadData();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async loadData() {\n this.isLoading = true;\n\n try {\n const md = new Metadata();\n const rv = new RunView();\n const userId = md.CurrentUser?.ID;\n\n const [categoriesResult, listsResult] = await rv.RunViews([\n {\n EntityName: 'MJ: List Categories',\n OrderBy: 'Name',\n ResultType: 'entity_object',\n CacheLocal: true // Categories rarely change, cache for performance\n },\n {\n EntityName: 'MJ: Lists',\n ExtraFilter: userId ? `UserID = '${userId}'` : '',\n ResultType: 'entity_object'\n }\n ]);\n\n if (!categoriesResult.Success) {\n console.error('Failed to load categories');\n return;\n }\n\n this.categories = categoriesResult.Results as MJListCategoryEntity[];\n const lists = listsResult.Results as MJListEntity[];\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 // Group lists by category\n this.listsByCategoryId.clear();\n for (const list of lists) {\n if (list.CategoryID) {\n const existing = this.listsByCategoryId.get(list.CategoryID) || [];\n existing.push(list);\n this.listsByCategoryId.set(list.CategoryID, existing);\n }\n }\n\n // Build view models\n this.buildCategoryViewModels();\n this.buildAvailableParents();\n } catch (error) {\n console.error('Error loading categories:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private buildCategoryViewModels() {\n this.categoryViewModels = [];\n\n const buildVm = (category: MJListCategoryEntity, depth: number): CategoryViewModel => {\n const lists = this.listsByCategoryId.get(category.ID) || [];\n const children = this.categories.filter(c => UUIDsEqual(c.ParentID, category.ID));\n\n return {\n category,\n listCount: lists.length,\n childCount: children.length,\n depth,\n isExpanded: true\n };\n };\n\n const processCategory = (category: MJListCategoryEntity, depth: number) => {\n this.categoryViewModels.push(buildVm(category, depth));\n const children = this.categories.filter(c => UUIDsEqual(c.ParentID, category.ID));\n for (const child of children) {\n processCategory(child, depth + 1);\n }\n };\n\n const topLevel = this.categories.filter(c => !c.ParentID);\n for (const cat of topLevel) {\n processCategory(cat, 0);\n }\n }\n\n private buildAvailableParents() {\n this.availableParents = [{ ID: null, displayName: '(Top Level)' }];\n\n const addCategory = (cat: MJListCategoryEntity, prefix: string) => {\n // Exclude the editing category and its descendants\n if (this.editingCategory && this.isDescendantOf(cat, this.editingCategory)) {\n return;\n }\n this.availableParents.push({ ID: cat.ID, displayName: prefix + cat.Name });\n const children = this.categories.filter(c => UUIDsEqual(c.ParentID, cat.ID));\n for (const child of children) {\n addCategory(child, prefix + '\\u00A0\\u00A0');\n }\n };\n\n const topLevel = this.categories.filter(c => !c.ParentID);\n for (const cat of topLevel) {\n if (!UUIDsEqual(this.editingCategory?.ID, cat.ID)) {\n addCategory(cat, '');\n }\n }\n }\n\n private isDescendantOf(category: MJListCategoryEntity, ancestor: MJListCategoryEntity): boolean {\n if (UUIDsEqual(category.ID, ancestor.ID)) return true;\n if (!category.ParentID) return false;\n const parent = this.categoryMap.get(category.ParentID);\n return parent ? this.isDescendantOf(parent, ancestor) : false;\n }\n\n getTopLevelCategories(): CategoryViewModel[] {\n return this.categoryViewModels.filter(vm => !vm.category.ParentID);\n }\n\n getChildCategories(parent: MJListCategoryEntity): CategoryViewModel[] {\n return this.categoryViewModels.filter(vm => UUIDsEqual(vm.category.ParentID, parent.ID));\n }\n\n hasChildren(category: MJListCategoryEntity): boolean {\n return this.categories.some(c => UUIDsEqual(c.ParentID, category.ID));\n }\n\n toggleExpand(event: Event, vm: CategoryViewModel) {\n event.stopPropagation();\n vm.isExpanded = !vm.isExpanded;\n }\n\n expandNode(event: Event, vm: CategoryViewModel) {\n event.preventDefault();\n if (this.hasChildren(vm.category) && !vm.isExpanded) {\n vm.isExpanded = true;\n }\n }\n\n collapseNode(event: Event, vm: CategoryViewModel) {\n event.preventDefault();\n if (vm.isExpanded) {\n vm.isExpanded = false;\n }\n }\n\n IsCategorySelected(category: MJListCategoryEntity): boolean {\n return UUIDsEqual(this.selectedCategory?.ID, category.ID);\n }\n\n selectCategory(category: MJListCategoryEntity) {\n this.selectedCategory = category;\n this.selectedCategoryLists = this.listsByCategoryId.get(category.ID) || [];\n }\n\n getParentCategoryName(category: MJListCategoryEntity): string | null {\n if (!category.ParentID) return null;\n return this.categoryMap.get(category.ParentID)?.Name || null;\n }\n\n getSelectedCategoryListCount(): number {\n if (!this.selectedCategory) return 0;\n return this.listsByCategoryId.get(this.selectedCategory.ID)?.length || 0;\n }\n\n getSelectedCategoryChildCount(): number {\n if (!this.selectedCategory) return 0;\n return this.categories.filter(c => UUIDsEqual(c.ParentID, this.selectedCategory!.ID)).length\n }\n\n createCategory() {\n this.editingCategory = null;\n this.dialogName = '';\n this.dialogDescription = '';\n this.dialogParentId = null;\n this.buildAvailableParents();\n this.showDialog = true;\n }\n\n editCategory() {\n if (!this.selectedCategory) return;\n this.editingCategory = this.selectedCategory;\n this.dialogName = this.selectedCategory.Name;\n this.dialogDescription = this.selectedCategory.Description || '';\n this.dialogParentId = this.selectedCategory.ParentID || null;\n this.buildAvailableParents();\n this.showDialog = true;\n }\n\n deleteCategory() {\n if (!this.selectedCategory) return;\n\n this.categoryToDelete = this.selectedCategory;\n const categoryName = this.categoryToDelete.Name;\n const listsInCategory = this.listsByCategoryId.get(this.categoryToDelete.ID) || [];\n const childCategories = this.categories.filter(c => UUIDsEqual(c.ParentID, this.categoryToDelete!.ID));\n\n let message = `Are you sure you want to delete \"${categoryName}\"?`;\n if (listsInCategory.length > 0) {\n message += ` ${listsInCategory.length} list(s) will be uncategorized.`;\n }\n if (childCategories.length > 0) {\n message += ` ${childCategories.length} subcategory(ies) will become top-level.`;\n }\n\n this.deleteConfirmMessage = message;\n this.showDeleteConfirm = true;\n }\n\n cancelDelete() {\n this.showDeleteConfirm = false;\n this.categoryToDelete = null;\n this.deleteConfirmMessage = '';\n }\n\n async confirmDelete() {\n if (!this.categoryToDelete) return;\n\n const categoryName = this.categoryToDelete.Name;\n const categoryToDelete = this.categoryToDelete;\n this.showDeleteConfirm = false;\n this.isLoading = true;\n this.cdr.detectChanges();\n\n try {\n const deleted = await categoryToDelete.Delete();\n if (deleted) {\n this.notificationService.CreateSimpleNotification(`\"${categoryName}\" deleted`, 'success', 3000);\n } else {\n // Get the detailed error message from LatestResult\n const errorMessage = categoryToDelete.LatestResult?.Message || 'Unknown error occurred';\n console.error('Failed to delete category:', categoryToDelete.LatestResult);\n this.notificationService.CreateSimpleNotification(`Failed to delete category: ${errorMessage}`, 'error', 6000);\n }\n this.selectedCategory = null;\n this.categoryToDelete = null;\n await this.loadData();\n } catch (error) {\n console.error('Error deleting category:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error deleting category: ${errorMessage}`, 'error', 6000);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n closeDialog() {\n this.showDialog = false;\n this.editingCategory = null;\n }\n\n async saveCategory() {\n this.isSaving = true;\n this.cdr.detectChanges();\n\n const isEditing = !!this.editingCategory;\n const categoryName = this.dialogName;\n\n try {\n const md = new Metadata();\n let category: MJListCategoryEntity;\n\n if (this.editingCategory) {\n category = this.editingCategory;\n } else {\n category = await md.GetEntityObject<MJListCategoryEntity>('MJ: List Categories');\n category.UserID = md.CurrentUser!.ID;\n }\n\n category.Name = this.dialogName;\n category.Description = this.dialogDescription || null;\n category.ParentID = this.dialogParentId || null;\n\n const saved = await category.Save();\n if (saved) {\n this.notificationService.CreateSimpleNotification(\n isEditing ? `\"${categoryName}\" updated` : `\"${categoryName}\" created`,\n 'success',\n 3000\n );\n this.closeDialog();\n await this.loadData();\n\n // Re-select the saved category\n if (isEditing) {\n this.selectedCategory = category;\n this.selectedCategoryLists = this.listsByCategoryId.get(category.ID) || [];\n }\n } else {\n // Get the detailed error message from LatestResult\n const errorMessage = category.LatestResult?.Message || 'Unknown error occurred';\n const action = isEditing ? 'update' : 'create';\n console.error(`Failed to ${action} category:`, category.LatestResult);\n this.notificationService.CreateSimpleNotification(\n `Failed to ${action} category: ${errorMessage}`,\n 'error',\n 6000\n );\n }\n } catch (error) {\n console.error('Error saving category:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error saving category: ${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 'Categories';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-tags';\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"lists-categories-resource.component.js","sourceRoot":"","sources":["../../../src/Lists/components/lists-categories-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, ChangeDetectorRef, OnDestroy } from '@angular/core';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData, MJListCategoryEntity, MJListEntity } from '@memberjunction/core-entities';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\ninterface CategoryViewModel {\n category: MJListCategoryEntity;\n listCount: number;\n childCount: number;\n depth: number;\n isExpanded: boolean;\n}\n\n@RegisterClass(BaseResourceComponent, 'ListsCategoriesResource')\n@Component({\n standalone: false,\n selector: 'mj-lists-categories-resource',\n template: `\n <div class=\"lists-categories-container\">\n <!-- Header -->\n <div class=\"categories-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-tags\"></i>\n <h2>List Categories</h2>\n </div>\n <div class=\"header-actions\">\n <button class=\"btn-create\" (click)=\"createCategory()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New Category</span>\n </button>\n </div>\n </div>\n \n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading categories...\" size=\"medium\"></mj-loading>\n </div>\n }\n \n <!-- Empty State -->\n @if (!isLoading && categoryViewModels.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-state-icon-wrapper\">\n <div class=\"icon-bg\"></div>\n <i class=\"fa-solid fa-folder-tree\"></i>\n </div>\n <h3>No Categories Yet</h3>\n <p>Categories help you organize lists into logical groups.</p>\n <div class=\"empty-state-features\">\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Create hierarchical folder structures</span>\n </div>\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Quickly find related lists</span>\n </div>\n </div>\n <button class=\"btn-create-large\" (click)=\"createCategory()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Your First Category\n </button>\n </div>\n }\n \n <!-- Categories Content -->\n @if (!isLoading && categoryViewModels.length > 0) {\n <div class=\"categories-content\">\n <div class=\"categories-layout\">\n <!-- Category Tree -->\n <div class=\"category-tree-panel\">\n <div class=\"panel-header\">\n <h3>Categories</h3>\n <span class=\"count-badge\">{{categories.length}}</span>\n </div>\n <div class=\"tree-content\" role=\"tree\" aria-label=\"Category tree\">\n @for (vm of getTopLevelCategories(); track vm) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { vm: vm }\"></ng-container>\n }\n </div>\n </div>\n <!-- Category Details -->\n @if (selectedCategory) {\n <div class=\"category-detail-panel\">\n <div class=\"panel-header\">\n <h3>Category Details</h3>\n <div class=\"panel-actions\">\n <button class=\"icon-btn\" (click)=\"editCategory()\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button class=\"icon-btn danger\" (click)=\"deleteCategory()\" title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <div class=\"detail-content\">\n <div class=\"detail-field\">\n <label>Name</label>\n <span class=\"field-value\">{{selectedCategory.Name}}</span>\n </div>\n @if (selectedCategory.Description) {\n <div class=\"detail-field\">\n <label>Description</label>\n <span class=\"field-value\">{{selectedCategory.Description}}</span>\n </div>\n }\n <div class=\"detail-field\">\n <label>Parent Category</label>\n <span class=\"field-value\">\n {{getParentCategoryName(selectedCategory) || '(Top Level)'}}\n </span>\n </div>\n <div class=\"detail-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-value\">{{getSelectedCategoryListCount()}}</span>\n <span class=\"stat-label\">Lists</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-value\">{{getSelectedCategoryChildCount()}}</span>\n <span class=\"stat-label\">Subcategories</span>\n </div>\n </div>\n <!-- Lists in this category -->\n @if (selectedCategoryLists.length > 0) {\n <div class=\"category-lists\">\n <h4>Lists in this category</h4>\n <div class=\"mini-list\">\n @for (list of selectedCategoryLists; track list) {\n <div class=\"mini-list-item\">\n <i class=\"fa-solid fa-list\"></i>\n <span>{{list.Name}}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- No Selection State -->\n @if (!selectedCategory) {\n <div class=\"category-detail-panel empty\">\n <div class=\"no-selection\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n <p>Select a category to view details</p>\n </div>\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Category Node Template -->\n <ng-template #categoryNodeTemplate let-vm=\"vm\">\n <div class=\"category-node\" [style.padding-left.px]=\"vm.depth * 20\">\n <div\n class=\"node-content\"\n [class.selected]=\"IsCategorySelected(vm.category)\"\n (click)=\"selectCategory(vm.category)\"\n (keydown.enter)=\"selectCategory(vm.category)\"\n (keydown.space)=\"selectCategory(vm.category); $event.preventDefault()\"\n (keydown.arrowRight)=\"expandNode($event, vm)\"\n (keydown.arrowLeft)=\"collapseNode($event, vm)\"\n tabindex=\"0\"\n role=\"treeitem\"\n [attr.aria-expanded]=\"hasChildren(vm.category) ? vm.isExpanded : null\"\n [attr.aria-selected]=\"IsCategorySelected(vm.category)\"\n [attr.aria-label]=\"vm.category.Name + ' - ' + vm.listCount + ' lists'\">\n @if (hasChildren(vm.category)) {\n <button\n class=\"expand-btn\"\n (click)=\"toggleExpand($event, vm)\"\n tabindex=\"-1\"\n aria-hidden=\"true\">\n <i [class]=\"vm.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n </button>\n }\n @if (!hasChildren(vm.category)) {\n <span class=\"expand-placeholder\"></span>\n }\n <i class=\"fa-solid fa-folder\" [class.fa-folder-open]=\"vm.isExpanded\" aria-hidden=\"true\"></i>\n <span class=\"node-name\">{{vm.category.Name}}</span>\n <span class=\"node-count\" aria-hidden=\"true\">{{vm.listCount}}</span>\n </div>\n @if (vm.isExpanded && hasChildren(vm.category)) {\n <div class=\"node-children\" role=\"group\">\n @for (childVm of getChildCategories(vm.category); track childVm) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { vm: childVm }\"></ng-container>\n }\n </div>\n }\n </div>\n </ng-template>\n \n <!-- Create/Edit Dialog -->\n @if (showDialog) {\n <div class=\"modal-overlay\" (click)=\"closeDialog()\">\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>{{editingCategory ? 'Edit Category' : 'Create Category'}}</h3>\n <button class=\"modal-close\" (click)=\"closeDialog()\" [disabled]=\"isSaving\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"category-form\">\n <div class=\"form-group\">\n <label>Name *</label>\n <input\n type=\"text\"\n [(ngModel)]=\"dialogName\"\n placeholder=\"Enter category name\"\n class=\"form-input\" />\n </div>\n <div class=\"form-group\">\n <label>Description</label>\n <textarea\n [(ngModel)]=\"dialogDescription\"\n placeholder=\"Optional description\"\n class=\"form-input\"\n rows=\"3\"></textarea>\n </div>\n <div class=\"form-group\">\n <label>Parent Category</label>\n <select\n [(ngModel)]=\"dialogParentId\"\n class=\"form-input\">\n @for (parent of availableParents; track parent) {\n <option [ngValue]=\"parent.ID\">{{parent.displayName}}</option>\n }\n </select>\n </div>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn-primary\"\n (click)=\"saveCategory()\"\n [disabled]=\"!dialogName || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isSaving ? 'Saving...' : (editingCategory ? 'Save' : 'Create')}}\n </button>\n <button class=\"btn-secondary\" (click)=\"closeDialog()\" [disabled]=\"isSaving\">Cancel</button>\n </div>\n </div>\n </div>\n }\n \n <!-- Delete Confirmation Dialog -->\n @if (showDeleteConfirm) {\n <div class=\"modal-overlay\" (click)=\"cancelDelete()\">\n <div class=\"modal-dialog modal-sm\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header danger\">\n <h3>Delete Category</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>{{deleteConfirmMessage}}</p>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn-danger\" (click)=\"confirmDelete()\">\n Delete\n </button>\n <button class=\"btn-secondary\" (click)=\"cancelDelete()\">Cancel</button>\n </div>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .lists-categories-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n overflow: hidden;\n }\n\n /* Header */\n .categories-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n }\n\n .header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .header-title i {\n font-size: 24px;\n color: var(--mj-brand-primary);\n }\n\n .header-title h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .btn-create {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\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-create:hover {\n background: var(--mj-brand-primary-hover);\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: 420px;\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: 100px;\n height: 100px;\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: 48px;\n color: var(--mj-brand-primary);\n z-index: 1;\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-features {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin: 16px 0 24px;\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 .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 /* Content Layout */\n .categories-content {\n flex: 1;\n padding: 16px 24px;\n overflow: hidden;\n }\n\n .categories-layout {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n height: 100%;\n }\n\n .category-tree-panel,\n .category-detail-panel {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .panel-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .count-badge {\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 .panel-actions {\n display: flex;\n gap: 4px;\n }\n\n .icon-btn {\n background: none;\n border: none;\n padding: 6px 8px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s;\n }\n\n .icon-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n }\n\n .icon-btn.danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n /* Tree Content */\n .tree-content {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n }\n\n .category-node {\n user-select: none;\n }\n\n .node-content {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .node-content:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .node-content:focus {\n outline: none;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .node-content:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: -2px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .node-content.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .node-content.selected:focus-visible {\n outline: 2px solid var(--mj-brand-primary-hover);\n }\n\n .expand-btn {\n background: none;\n border: none;\n padding: 2px;\n color: var(--mj-text-muted);\n cursor: pointer;\n width: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .expand-btn:hover {\n color: var(--mj-text-secondary);\n }\n\n .expand-placeholder {\n width: 20px;\n }\n\n .node-content .fa-folder,\n .node-content .fa-folder-open {\n color: var(--mj-status-warning);\n }\n\n .node-name {\n flex: 1;\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .node-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 1px 6px;\n border-radius: 8px;\n }\n\n /* Detail Panel */\n .detail-content {\n flex: 1;\n padding: 16px;\n overflow-y: auto;\n }\n\n .detail-field {\n margin-bottom: 16px;\n }\n\n .detail-field label {\n display: block;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 4px;\n }\n\n .field-value {\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .detail-stats {\n display: flex;\n gap: 24px;\n margin: 24px 0;\n padding: 16px;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n }\n\n .stat-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n .stat-value {\n font-size: 24px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n }\n\n .stat-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .category-lists h4 {\n margin: 0 0 12px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n }\n\n .mini-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .mini-list-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface);\n border-radius: 4px;\n font-size: 13px;\n color: var(--mj-text-primary);\n }\n\n .mini-list-item i {\n color: var(--mj-text-muted);\n }\n\n /* No Selection */\n .category-detail-panel.empty {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .no-selection {\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .no-selection i {\n font-size: 32px;\n margin-bottom: 12px;\n }\n\n .no-selection p {\n margin: 0;\n }\n\n /* Form */\n .category-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .form-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .form-group label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .form-input {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-size: 14px;\n }\n\n .form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\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 display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: fadeIn 0.15s ease-out;\n }\n\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n .modal-dialog {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-lg);\n width: 450px;\n max-width: 90vw;\n max-height: 90vh;\n display: flex;\n flex-direction: column;\n animation: slideIn 0.2s ease-out;\n }\n\n .modal-dialog.modal-sm {\n width: 400px;\n }\n\n @keyframes slideIn {\n from { transform: translateY(-20px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\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.danger {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-bottom-color: color-mix(in srgb, var(--mj-status-error) 30%, transparent);\n }\n\n .modal-header.danger h3 {\n color: var(--mj-status-error);\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 transition: all 0.15s;\n }\n\n .modal-close:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n }\n\n .modal-close:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .modal-body {\n padding: 20px;\n overflow-y: auto;\n }\n\n .modal-body p {\n margin: 0;\n color: var(--mj-text-secondary);\n line-height: 1.6;\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-secondary {\n padding: 8px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n color: var(--mj-text-secondary);\n font-size: 14px;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n }\n\n .btn-secondary:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--mj-brand-primary);\n border: none;\n border-radius: 6px;\n color: var(--mj-text-inverse);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .btn-danger {\n padding: 8px 16px;\n background: var(--mj-status-error);\n border: none;\n border-radius: 6px;\n color: var(--mj-text-inverse);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .btn-danger:hover {\n background: var(--mj-status-error);\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .categories-layout {\n grid-template-columns: 1fr;\n }\n\n .category-detail-panel.empty {\n display: none;\n }\n\n .modal-dialog {\n width: 95vw;\n }\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ListsCategoriesResource extends BaseResourceComponent implements OnDestroy {\n protected override destroy$ = new Subject<void>();\n\n isLoading = true;\n categories: MJListCategoryEntity[] = [];\n categoryViewModels: CategoryViewModel[] = [];\n selectedCategory: MJListCategoryEntity | null = null;\n selectedCategoryLists: MJListEntity[] = [];\n\n // Dialog\n showDialog = false;\n editingCategory: MJListCategoryEntity | null = null;\n dialogName = '';\n dialogDescription = '';\n dialogParentId: string | null = null;\n availableParents: Array<{ ID: string | null; displayName: string }> = [];\n\n // Operation states\n isSaving = false;\n\n // Delete confirmation dialog\n showDeleteConfirm = false;\n deleteConfirmMessage = '';\n private categoryToDelete: MJListCategoryEntity | null = null;\n\n private listsByCategoryId: Map<string, MJListEntity[]> = new Map();\n private categoryMap: Map<string, MJListCategoryEntity> = new Map();\n\n constructor(\n private cdr: ChangeDetectorRef,\n private notificationService: MJNotificationService\n ) {\n super();\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 = new Metadata();\n const rv = new RunView();\n const userId = md.CurrentUser?.ID;\n\n const [categoriesResult, listsResult] = await rv.RunViews([\n {\n EntityName: 'MJ: List Categories',\n OrderBy: 'Name',\n ResultType: 'entity_object',\n CacheLocal: true // Categories rarely change, cache for performance\n },\n {\n EntityName: 'MJ: Lists',\n ExtraFilter: userId ? `UserID = '${userId}'` : '',\n ResultType: 'entity_object'\n }\n ]);\n\n if (!categoriesResult.Success) {\n console.error('Failed to load categories');\n return;\n }\n\n this.categories = categoriesResult.Results as MJListCategoryEntity[];\n const lists = listsResult.Results as MJListEntity[];\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 // Group lists by category\n this.listsByCategoryId.clear();\n for (const list of lists) {\n if (list.CategoryID) {\n const existing = this.listsByCategoryId.get(list.CategoryID) || [];\n existing.push(list);\n this.listsByCategoryId.set(list.CategoryID, existing);\n }\n }\n\n // Build view models\n this.buildCategoryViewModels();\n this.buildAvailableParents();\n } catch (error) {\n console.error('Error loading categories:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private buildCategoryViewModels() {\n this.categoryViewModels = [];\n\n const buildVm = (category: MJListCategoryEntity, depth: number): CategoryViewModel => {\n const lists = this.listsByCategoryId.get(category.ID) || [];\n const children = this.categories.filter(c => UUIDsEqual(c.ParentID, category.ID));\n\n return {\n category,\n listCount: lists.length,\n childCount: children.length,\n depth,\n isExpanded: true\n };\n };\n\n const processCategory = (category: MJListCategoryEntity, depth: number) => {\n this.categoryViewModels.push(buildVm(category, depth));\n const children = this.categories.filter(c => UUIDsEqual(c.ParentID, category.ID));\n for (const child of children) {\n processCategory(child, depth + 1);\n }\n };\n\n const topLevel = this.categories.filter(c => !c.ParentID);\n for (const cat of topLevel) {\n processCategory(cat, 0);\n }\n }\n\n private buildAvailableParents() {\n this.availableParents = [{ ID: null, displayName: '(Top Level)' }];\n\n const addCategory = (cat: MJListCategoryEntity, prefix: string) => {\n // Exclude the editing category and its descendants\n if (this.editingCategory && this.isDescendantOf(cat, this.editingCategory)) {\n return;\n }\n this.availableParents.push({ ID: cat.ID, displayName: prefix + cat.Name });\n const children = this.categories.filter(c => UUIDsEqual(c.ParentID, cat.ID));\n for (const child of children) {\n addCategory(child, prefix + '\\u00A0\\u00A0');\n }\n };\n\n const topLevel = this.categories.filter(c => !c.ParentID);\n for (const cat of topLevel) {\n if (!UUIDsEqual(this.editingCategory?.ID, cat.ID)) {\n addCategory(cat, '');\n }\n }\n }\n\n private isDescendantOf(category: MJListCategoryEntity, ancestor: MJListCategoryEntity): boolean {\n if (UUIDsEqual(category.ID, ancestor.ID)) return true;\n if (!category.ParentID) return false;\n const parent = this.categoryMap.get(category.ParentID);\n return parent ? this.isDescendantOf(parent, ancestor) : false;\n }\n\n getTopLevelCategories(): CategoryViewModel[] {\n return this.categoryViewModels.filter(vm => !vm.category.ParentID);\n }\n\n getChildCategories(parent: MJListCategoryEntity): CategoryViewModel[] {\n return this.categoryViewModels.filter(vm => UUIDsEqual(vm.category.ParentID, parent.ID));\n }\n\n hasChildren(category: MJListCategoryEntity): boolean {\n return this.categories.some(c => UUIDsEqual(c.ParentID, category.ID));\n }\n\n toggleExpand(event: Event, vm: CategoryViewModel) {\n event.stopPropagation();\n vm.isExpanded = !vm.isExpanded;\n }\n\n expandNode(event: Event, vm: CategoryViewModel) {\n event.preventDefault();\n if (this.hasChildren(vm.category) && !vm.isExpanded) {\n vm.isExpanded = true;\n }\n }\n\n collapseNode(event: Event, vm: CategoryViewModel) {\n event.preventDefault();\n if (vm.isExpanded) {\n vm.isExpanded = false;\n }\n }\n\n IsCategorySelected(category: MJListCategoryEntity): boolean {\n return UUIDsEqual(this.selectedCategory?.ID, category.ID);\n }\n\n selectCategory(category: MJListCategoryEntity) {\n this.selectedCategory = category;\n this.selectedCategoryLists = this.listsByCategoryId.get(category.ID) || [];\n }\n\n getParentCategoryName(category: MJListCategoryEntity): string | null {\n if (!category.ParentID) return null;\n return this.categoryMap.get(category.ParentID)?.Name || null;\n }\n\n getSelectedCategoryListCount(): number {\n if (!this.selectedCategory) return 0;\n return this.listsByCategoryId.get(this.selectedCategory.ID)?.length || 0;\n }\n\n getSelectedCategoryChildCount(): number {\n if (!this.selectedCategory) return 0;\n return this.categories.filter(c => UUIDsEqual(c.ParentID, this.selectedCategory!.ID)).length\n }\n\n createCategory() {\n this.editingCategory = null;\n this.dialogName = '';\n this.dialogDescription = '';\n this.dialogParentId = null;\n this.buildAvailableParents();\n this.showDialog = true;\n }\n\n editCategory() {\n if (!this.selectedCategory) return;\n this.editingCategory = this.selectedCategory;\n this.dialogName = this.selectedCategory.Name;\n this.dialogDescription = this.selectedCategory.Description || '';\n this.dialogParentId = this.selectedCategory.ParentID || null;\n this.buildAvailableParents();\n this.showDialog = true;\n }\n\n deleteCategory() {\n if (!this.selectedCategory) return;\n\n this.categoryToDelete = this.selectedCategory;\n const categoryName = this.categoryToDelete.Name;\n const listsInCategory = this.listsByCategoryId.get(this.categoryToDelete.ID) || [];\n const childCategories = this.categories.filter(c => UUIDsEqual(c.ParentID, this.categoryToDelete!.ID));\n\n let message = `Are you sure you want to delete \"${categoryName}\"?`;\n if (listsInCategory.length > 0) {\n message += ` ${listsInCategory.length} list(s) will be uncategorized.`;\n }\n if (childCategories.length > 0) {\n message += ` ${childCategories.length} subcategory(ies) will become top-level.`;\n }\n\n this.deleteConfirmMessage = message;\n this.showDeleteConfirm = true;\n }\n\n cancelDelete() {\n this.showDeleteConfirm = false;\n this.categoryToDelete = null;\n this.deleteConfirmMessage = '';\n }\n\n async confirmDelete() {\n if (!this.categoryToDelete) return;\n\n const categoryName = this.categoryToDelete.Name;\n const categoryToDelete = this.categoryToDelete;\n this.showDeleteConfirm = false;\n this.isLoading = true;\n this.cdr.detectChanges();\n\n try {\n const deleted = await categoryToDelete.Delete();\n if (deleted) {\n this.notificationService.CreateSimpleNotification(`\"${categoryName}\" deleted`, 'success', 3000);\n } else {\n // Get the detailed error message from LatestResult\n const errorMessage = categoryToDelete.LatestResult?.Message || 'Unknown error occurred';\n console.error('Failed to delete category:', categoryToDelete.LatestResult);\n this.notificationService.CreateSimpleNotification(`Failed to delete category: ${errorMessage}`, 'error', 6000);\n }\n this.selectedCategory = null;\n this.categoryToDelete = null;\n await this.loadData();\n } catch (error) {\n console.error('Error deleting category:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error deleting category: ${errorMessage}`, 'error', 6000);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n closeDialog() {\n this.showDialog = false;\n this.editingCategory = null;\n }\n\n async saveCategory() {\n this.isSaving = true;\n this.cdr.detectChanges();\n\n const isEditing = !!this.editingCategory;\n const categoryName = this.dialogName;\n\n try {\n const md = new Metadata();\n let category: MJListCategoryEntity;\n\n if (this.editingCategory) {\n category = this.editingCategory;\n } else {\n category = await md.GetEntityObject<MJListCategoryEntity>('MJ: List Categories');\n category.UserID = md.CurrentUser!.ID;\n }\n\n category.Name = this.dialogName;\n category.Description = this.dialogDescription || null;\n category.ParentID = this.dialogParentId || null;\n\n const saved = await category.Save();\n if (saved) {\n this.notificationService.CreateSimpleNotification(\n isEditing ? `\"${categoryName}\" updated` : `\"${categoryName}\" created`,\n 'success',\n 3000\n );\n this.closeDialog();\n await this.loadData();\n\n // Re-select the saved category\n if (isEditing) {\n this.selectedCategory = category;\n this.selectedCategoryLists = this.listsByCategoryId.get(category.ID) || [];\n }\n } else {\n // Get the detailed error message from LatestResult\n const errorMessage = category.LatestResult?.Message || 'Unknown error occurred';\n const action = isEditing ? 'update' : 'create';\n console.error(`Failed to ${action} category:`, category.LatestResult);\n this.notificationService.CreateSimpleNotification(\n `Failed to ${action} category: ${errorMessage}`,\n 'error',\n 6000\n );\n }\n } catch (error) {\n console.error('Error saving category:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error saving category: ${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 'Categories';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-tags';\n }\n}\n"]}
|
|
@@ -2,6 +2,7 @@ import { ChangeDetectorRef, OnDestroy, ElementRef } from '@angular/core';
|
|
|
2
2
|
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
3
3
|
import { ResourceData } from '@memberjunction/core-entities';
|
|
4
4
|
import { MJListEntity, MJListCategoryEntity } from '@memberjunction/core-entities';
|
|
5
|
+
import { Subject } from 'rxjs';
|
|
5
6
|
import { TabService } from '@memberjunction/ng-base-application';
|
|
6
7
|
import { MJNotificationService } from '@memberjunction/ng-notifications';
|
|
7
8
|
import * as i0 from "@angular/core";
|
|
@@ -21,7 +22,7 @@ export declare class ListsMyListsResource extends BaseResourceComponent implemen
|
|
|
21
22
|
private tabService;
|
|
22
23
|
private notificationService;
|
|
23
24
|
private elementRef;
|
|
24
|
-
|
|
25
|
+
protected destroy$: Subject<void>;
|
|
25
26
|
isLoading: boolean;
|
|
26
27
|
searchTerm: string;
|
|
27
28
|
viewMode: 'grid' | 'list';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lists-my-lists-resource.component.d.ts","sourceRoot":"","sources":["../../../src/Lists/components/lists-my-lists-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAgB,MAAM,eAAe,CAAC;AAErH,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAsB,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"lists-my-lists-resource.component.d.ts","sourceRoot":"","sources":["../../../src/Lists/components/lists-my-lists-resource.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -605,10 +605,12 @@ let ListsMyListsResource = class ListsMyListsResource extends BaseResourceCompon
|
|
|
605
605
|
}
|
|
606
606
|
}
|
|
607
607
|
async ngOnInit() {
|
|
608
|
+
super.ngOnInit();
|
|
608
609
|
await this.loadData();
|
|
609
610
|
this.NotifyLoadComplete();
|
|
610
611
|
}
|
|
611
612
|
ngOnDestroy() {
|
|
613
|
+
super.ngOnDestroy();
|
|
612
614
|
this.destroy$.next();
|
|
613
615
|
this.destroy$.complete();
|
|
614
616
|
}
|