@memberjunction/ng-dashboards 5.34.1 → 5.36.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 +51 -0
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +399 -292
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +8 -2
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +87 -85
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +96 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +453 -122
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +5 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/analytics-filter-bar.component.js +184 -135
- package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +8 -2
- 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 +104 -103
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +8 -2
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +76 -74
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +67 -87
- 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 +12 -19
- 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 +96 -203
- 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.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +110 -126
- 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.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +61 -77
- 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 +28 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2084 -2079
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +6 -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 +493 -490
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.d.ts +17 -0
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
- package/dist/AI/components/models/model-management.component.js +370 -425
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts +17 -0
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +317 -357
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts +11 -0
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +170 -175
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.d.ts +19 -0
- package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +403 -362
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +15 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +1423 -1438
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +8 -3
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +547 -521
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts +12 -8
- package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +329 -371
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +6 -0
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +202 -158
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +9 -3
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +191 -142
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +41 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +388 -94
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/index.d.ts +0 -1
- package/dist/Actions/components/explorer/index.d.ts.map +1 -1
- package/dist/Actions/components/explorer/index.js +0 -1
- package/dist/Actions/components/explorer/index.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +19 -79
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +19 -79
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +19 -79
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +19 -79
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/Admin/base-admin-container.component.d.ts +9 -7
- package/dist/Admin/base-admin-container.component.d.ts.map +1 -1
- package/dist/Admin/base-admin-container.component.js +26 -17
- package/dist/Admin/base-admin-container.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +92 -91
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -1
- package/dist/Archiving/components/archive-config-resource.component.js +24 -5
- package/dist/Archiving/components/archive-config-resource.component.js.map +1 -1
- package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -1
- package/dist/Archiving/components/archive-runs-resource.component.js +24 -5
- package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +80 -99
- 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 +127 -106
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-new-message-resource.component.d.ts +93 -0
- package/dist/Communication/communication-new-message-resource.component.d.ts.map +1 -0
- package/dist/Communication/communication-new-message-resource.component.js +661 -0
- package/dist/Communication/communication-new-message-resource.component.js.map +1 -0
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +44 -45
- 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 +60 -58
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +139 -162
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts +7 -0
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +310 -297
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +238 -266
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +7 -0
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +381 -399
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +222 -228
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +6 -0
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +290 -305
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +8 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +41 -21
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts +2 -0
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +148 -155
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +25 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/DevTools/app-state-inspector.component.d.ts +5 -0
- package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/app-state-inspector.component.js +46 -72
- package/dist/DevTools/app-state-inspector.component.js.map +1 -1
- package/dist/DevTools/class-registry.component.js +88 -100
- package/dist/DevTools/class-registry.component.js.map +1 -1
- package/dist/DevTools/event-monitor.component.js +158 -168
- package/dist/DevTools/event-monitor.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +257 -264
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/DevTools/layout-inspector.component.d.ts +5 -0
- package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/layout-inspector.component.js +46 -64
- package/dist/DevTools/layout-inspector.component.js.map +1 -1
- package/dist/DevTools/lazy-module-status.component.js +75 -84
- package/dist/DevTools/lazy-module-status.component.js.map +1 -1
- package/dist/DevTools/settings-explorer.component.js +76 -85
- package/dist/DevTools/settings-explorer.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +2 -0
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +24 -16
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +6 -0
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +521 -485
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts +8 -0
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +307 -318
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +654 -648
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +234 -233
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +182 -163
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts +2 -0
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +595 -606
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +230 -241
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/integration.module.d.ts +1 -1
- package/dist/Integration/integration.module.d.ts.map +1 -1
- package/dist/Integration/integration.module.js +28 -1
- package/dist/Integration/integration.module.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +5 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1138 -1147
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +54 -51
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +11 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +684 -697
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +12 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +191 -120
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +120 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +1239 -610
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +152 -160
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -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 +302 -319
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts +133 -3
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +1460 -272
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts +29 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts.map +1 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.js +77 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.js.map +1 -0
- package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts +6 -0
- package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts.map +1 -1
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js +35 -7
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
- package/dist/Lists/index.d.ts +1 -0
- package/dist/Lists/index.d.ts.map +1 -1
- package/dist/Lists/index.js +1 -0
- package/dist/Lists/index.js.map +1 -1
- package/dist/Lists/services/list-set-operations.service.d.ts +93 -2
- package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
- package/dist/Lists/services/list-set-operations.service.js +236 -10
- package/dist/Lists/services/list-set-operations.service.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +20 -0
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +1248 -1338
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp.module.d.ts +1 -1
- package/dist/MCP/mcp.module.d.ts.map +1 -1
- package/dist/MCP/mcp.module.js +34 -1
- package/dist/MCP/mcp.module.js.map +1 -1
- package/dist/Permissions/audit-log-resource.component.js +76 -85
- package/dist/Permissions/audit-log-resource.component.js.map +1 -1
- package/dist/Permissions/resource-access-resource.component.js +64 -69
- package/dist/Permissions/resource-access-resource.component.js.map +1 -1
- package/dist/Permissions/user-access-resource.component.js +63 -74
- package/dist/Permissions/user-access-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts +9 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +250 -197
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts +9 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +203 -147
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts +3 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +224 -190
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts +19 -6
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +259 -103
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +13 -3
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +1009 -1264
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.js +7 -14
- package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics.component.d.ts +3 -1
- package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics.component.js +420 -393
- package/dist/Testing/components/testing-analytics.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 +16 -19
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts +3 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.js +157 -122
- package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.js +7 -12
- package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +38 -6
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +679 -786
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts +4 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.js +9 -12
- package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-review.component.d.ts +3 -1
- package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review.component.js +310 -274
- package/dist/Testing/components/testing-review.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 +16 -19
- package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.d.ts +3 -1
- package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +307 -273
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +2 -0
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +114 -99
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +185 -188
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +154 -184
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts +7 -0
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +350 -354
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +163 -169
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/actions-dashboards.module.d.ts +15 -16
- package/dist/actions-dashboards.module.d.ts.map +1 -1
- package/dist/actions-dashboards.module.js +34 -11
- package/dist/actions-dashboards.module.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +45 -48
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +51 -10
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/archiving-dashboards.module.d.ts +2 -1
- package/dist/archiving-dashboards.module.d.ts.map +1 -1
- package/dist/archiving-dashboards.module.js +12 -2
- package/dist/archiving-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +9 -6
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +37 -7
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +1 -1
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +46 -1
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/credentials-dashboards.module.d.ts +1 -1
- package/dist/credentials-dashboards.module.d.ts.map +1 -1
- package/dist/credentials-dashboards.module.js +28 -1
- package/dist/credentials-dashboards.module.js.map +1 -1
- package/dist/lists-dashboards.module.d.ts +10 -9
- package/dist/lists-dashboards.module.d.ts.map +1 -1
- package/dist/lists-dashboards.module.js +40 -2
- package/dist/lists-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +3 -2
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +4 -3
- package/dist/public-api.js.map +1 -1
- package/dist/scheduling-dashboards.module.d.ts +1 -1
- package/dist/scheduling-dashboards.module.d.ts.map +1 -1
- package/dist/scheduling-dashboards.module.js +31 -1
- package/dist/scheduling-dashboards.module.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +8 -7
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +42 -0
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +53 -52
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts +0 -56
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +0 -285
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +0 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +0 -49
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +0 -184
- package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +0 -1
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts +0 -33
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/system/system-config-filter-panel.component.js +0 -144
- package/dist/AI/components/system/system-config-filter-panel.component.js.map +0 -1
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts +0 -63
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +0 -1
- package/dist/Actions/components/explorer/action-toolbar.component.js +0 -463
- package/dist/Actions/components/explorer/action-toolbar.component.js.map +0 -1
|
@@ -5,10 +5,12 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
7
|
import { Component, ViewEncapsulation, HostListener } from '@angular/core';
|
|
8
|
-
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
8
|
+
import { RegisterClass, UUIDsEqual, MJGlobal } from '@memberjunction/global';
|
|
9
9
|
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
10
|
-
import { RunView } from '@memberjunction/core';
|
|
10
|
+
import { BaseEntity, RunView } from '@memberjunction/core';
|
|
11
11
|
import { Subject } from 'rxjs';
|
|
12
|
+
import { takeUntil } from 'rxjs/operators';
|
|
13
|
+
import { CapabilitiesForLevel } from '@memberjunction/lists-base';
|
|
12
14
|
import * as i0 from "@angular/core";
|
|
13
15
|
import * as i1 from "@memberjunction/ng-base-application";
|
|
14
16
|
import * as i2 from "@memberjunction/ng-notifications";
|
|
@@ -19,42 +21,44 @@ import * as i6 from "@memberjunction/ng-ui-components";
|
|
|
19
21
|
import * as i7 from "@memberjunction/ng-shared-generic";
|
|
20
22
|
const _c0 = a0 => ({ node: a0, depth: 0 });
|
|
21
23
|
const _c1 = (a0, a1) => ({ node: a0, depth: a1 });
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
i0.ɵɵ
|
|
25
|
-
i0.ɵɵ
|
|
26
|
-
i0.ɵɵ
|
|
27
|
-
i0.ɵɵelementEnd();
|
|
28
|
-
} }
|
|
29
|
-
function ListsBrowseResource_For_19_Template(rf, ctx) { if (rf & 1) {
|
|
30
|
-
i0.ɵɵelementStart(0, "option", 16);
|
|
24
|
+
const _forTrack0 = ($index, $item) => $item.TagID;
|
|
25
|
+
function ListsBrowseResource_Conditional_17_For_5_Template(rf, ctx) { if (rf & 1) {
|
|
26
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
27
|
+
i0.ɵɵelementStart(0, "button", 31);
|
|
28
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_17_For_5_Template_button_click_0_listener() { const f_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.removeTagFilter(f_r4.TagID)); });
|
|
31
29
|
i0.ɵɵtext(1);
|
|
30
|
+
i0.ɵɵelement(2, "i", 32);
|
|
32
31
|
i0.ɵɵelementEnd();
|
|
33
32
|
} if (rf & 2) {
|
|
34
|
-
const
|
|
35
|
-
i0.ɵɵproperty("value", opt_r4.value);
|
|
33
|
+
const f_r4 = ctx.$implicit;
|
|
36
34
|
i0.ɵɵadvance();
|
|
37
|
-
i0.ɵɵ
|
|
35
|
+
i0.ɵɵtextInterpolate1(" ", f_r4.Name, " ");
|
|
38
36
|
} }
|
|
39
|
-
function
|
|
40
|
-
i0.ɵɵ
|
|
41
|
-
i0.ɵɵ
|
|
42
|
-
i0.ɵɵ
|
|
37
|
+
function ListsBrowseResource_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
38
|
+
const _r2 = i0.ɵɵgetCurrentView();
|
|
39
|
+
i0.ɵɵelementStart(0, "div", 14)(1, "span", 27);
|
|
40
|
+
i0.ɵɵelement(2, "i", 28);
|
|
41
|
+
i0.ɵɵtext(3, " Filtering by tag: ");
|
|
42
|
+
i0.ɵɵelementEnd();
|
|
43
|
+
i0.ɵɵrepeaterCreate(4, ListsBrowseResource_Conditional_17_For_5_Template, 3, 1, "button", 29, _forTrack0);
|
|
44
|
+
i0.ɵɵelementStart(6, "button", 30);
|
|
45
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_17_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r2); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.clearTagFilters()); });
|
|
46
|
+
i0.ɵɵtext(7, " Clear all ");
|
|
47
|
+
i0.ɵɵelementEnd()();
|
|
43
48
|
} if (rf & 2) {
|
|
44
|
-
const
|
|
45
|
-
i0.ɵɵ
|
|
46
|
-
i0.ɵɵ
|
|
47
|
-
i0.ɵɵtextInterpolate(opt_r5.name);
|
|
49
|
+
const ctx_r4 = i0.ɵɵnextContext();
|
|
50
|
+
i0.ɵɵadvance(4);
|
|
51
|
+
i0.ɵɵrepeater(ctx_r4.tagFilters);
|
|
48
52
|
} }
|
|
49
|
-
function
|
|
50
|
-
i0.ɵɵelementStart(0, "div",
|
|
51
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
53
|
+
function ListsBrowseResource_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
54
|
+
i0.ɵɵelementStart(0, "div", 15);
|
|
55
|
+
i0.ɵɵelement(1, "mj-loading", 33);
|
|
52
56
|
i0.ɵɵelementEnd();
|
|
53
57
|
} }
|
|
54
|
-
function
|
|
58
|
+
function ListsBrowseResource_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
55
59
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
56
|
-
i0.ɵɵelementStart(0, "div",
|
|
57
|
-
i0.ɵɵelement(2, "div",
|
|
60
|
+
i0.ɵɵelementStart(0, "div", 16)(1, "div", 34);
|
|
61
|
+
i0.ɵɵelement(2, "div", 35)(3, "i", 36);
|
|
58
62
|
i0.ɵɵelementEnd();
|
|
59
63
|
i0.ɵɵelementStart(4, "h3");
|
|
60
64
|
i0.ɵɵtext(5, "No Lists Yet");
|
|
@@ -62,31 +66,31 @@ function ListsBrowseResource_Conditional_32_Template(rf, ctx) { if (rf & 1) {
|
|
|
62
66
|
i0.ɵɵelementStart(6, "p");
|
|
63
67
|
i0.ɵɵtext(7, "Lists help you organize and track groups of records across your data.");
|
|
64
68
|
i0.ɵɵelementEnd();
|
|
65
|
-
i0.ɵɵelementStart(8, "div",
|
|
66
|
-
i0.ɵɵelement(10, "i",
|
|
69
|
+
i0.ɵɵelementStart(8, "div", 37)(9, "div", 38);
|
|
70
|
+
i0.ɵɵelement(10, "i", 39);
|
|
67
71
|
i0.ɵɵelementStart(11, "span");
|
|
68
72
|
i0.ɵɵtext(12, "Group records from any entity");
|
|
69
73
|
i0.ɵɵelementEnd()();
|
|
70
|
-
i0.ɵɵelementStart(13, "div",
|
|
71
|
-
i0.ɵɵelement(14, "i",
|
|
74
|
+
i0.ɵɵelementStart(13, "div", 38);
|
|
75
|
+
i0.ɵɵelement(14, "i", 39);
|
|
72
76
|
i0.ɵɵelementStart(15, "span");
|
|
73
77
|
i0.ɵɵtext(16, "Organize with categories");
|
|
74
78
|
i0.ɵɵelementEnd()();
|
|
75
|
-
i0.ɵɵelementStart(17, "div",
|
|
76
|
-
i0.ɵɵelement(18, "i",
|
|
79
|
+
i0.ɵɵelementStart(17, "div", 38);
|
|
80
|
+
i0.ɵɵelement(18, "i", 39);
|
|
77
81
|
i0.ɵɵelementStart(19, "span");
|
|
78
82
|
i0.ɵɵtext(20, "Quick access from any view");
|
|
79
83
|
i0.ɵɵelementEnd()()();
|
|
80
|
-
i0.ɵɵelementStart(21, "button",
|
|
81
|
-
i0.ɵɵlistener("click", function
|
|
82
|
-
i0.ɵɵelement(22, "i",
|
|
84
|
+
i0.ɵɵelementStart(21, "button", 40);
|
|
85
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_19_Template_button_click_21_listener() { i0.ɵɵrestoreView(_r6); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.createNewList()); });
|
|
86
|
+
i0.ɵɵelement(22, "i", 11);
|
|
83
87
|
i0.ɵɵtext(23, " Create Your First List ");
|
|
84
88
|
i0.ɵɵelementEnd()();
|
|
85
89
|
} }
|
|
86
|
-
function
|
|
90
|
+
function ListsBrowseResource_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
87
91
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
88
|
-
i0.ɵɵelementStart(0, "div",
|
|
89
|
-
i0.ɵɵelement(2, "i",
|
|
92
|
+
i0.ɵɵelementStart(0, "div", 17)(1, "div", 41);
|
|
93
|
+
i0.ɵɵelement(2, "i", 42);
|
|
90
94
|
i0.ɵɵelementEnd();
|
|
91
95
|
i0.ɵɵelementStart(3, "h3");
|
|
92
96
|
i0.ɵɵtext(4, "No Results Found");
|
|
@@ -94,16 +98,16 @@ function ListsBrowseResource_Conditional_33_Template(rf, ctx) { if (rf & 1) {
|
|
|
94
98
|
i0.ɵɵelementStart(5, "p");
|
|
95
99
|
i0.ɵɵtext(6, "No lists match your current filters.");
|
|
96
100
|
i0.ɵɵelementEnd();
|
|
97
|
-
i0.ɵɵelementStart(7, "p",
|
|
101
|
+
i0.ɵɵelementStart(7, "p", 43);
|
|
98
102
|
i0.ɵɵtext(8, "Try adjusting your search or filters.");
|
|
99
103
|
i0.ɵɵelementEnd();
|
|
100
|
-
i0.ɵɵelementStart(9, "button",
|
|
101
|
-
i0.ɵɵlistener("click", function
|
|
104
|
+
i0.ɵɵelementStart(9, "button", 44);
|
|
105
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_20_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r7); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.clearFilters()); });
|
|
102
106
|
i0.ɵɵtext(10, "Clear All Filters");
|
|
103
107
|
i0.ɵɵelementEnd()();
|
|
104
108
|
} }
|
|
105
|
-
function
|
|
106
|
-
i0.ɵɵelementStart(0, "option",
|
|
109
|
+
function ListsBrowseResource_Conditional_21_For_9_Template(rf, ctx) { if (rf & 1) {
|
|
110
|
+
i0.ɵɵelementStart(0, "option", 49);
|
|
107
111
|
i0.ɵɵtext(1);
|
|
108
112
|
i0.ɵɵelementEnd();
|
|
109
113
|
} if (rf & 2) {
|
|
@@ -112,8 +116,8 @@ function ListsBrowseResource_Conditional_34_For_9_Template(rf, ctx) { if (rf & 1
|
|
|
112
116
|
i0.ɵɵadvance();
|
|
113
117
|
i0.ɵɵtextInterpolate(opt_r9.name);
|
|
114
118
|
} }
|
|
115
|
-
function
|
|
116
|
-
i0.ɵɵelementStart(0, "span",
|
|
119
|
+
function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
120
|
+
i0.ɵɵelementStart(0, "span", 69);
|
|
117
121
|
i0.ɵɵtext(1);
|
|
118
122
|
i0.ɵɵelementEnd();
|
|
119
123
|
} if (rf & 2) {
|
|
@@ -121,10 +125,10 @@ function ListsBrowseResource_Conditional_34_Conditional_10_For_21_Conditional_8_
|
|
|
121
125
|
i0.ɵɵadvance();
|
|
122
126
|
i0.ɵɵtextInterpolate(item_r11.list.Description);
|
|
123
127
|
} }
|
|
124
|
-
function
|
|
125
|
-
i0.ɵɵelementStart(0, "span",
|
|
126
|
-
i0.ɵɵelement(1, "i",
|
|
127
|
-
i0.ɵɵelementStart(2, "span",
|
|
128
|
+
function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_15_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
129
|
+
i0.ɵɵelementStart(0, "span", 81);
|
|
130
|
+
i0.ɵɵelement(1, "i", 82);
|
|
131
|
+
i0.ɵɵelementStart(2, "span", 83);
|
|
128
132
|
i0.ɵɵtext(3);
|
|
129
133
|
i0.ɵɵelementEnd()();
|
|
130
134
|
} if (rf & 2) {
|
|
@@ -132,71 +136,65 @@ function ListsBrowseResource_Conditional_34_Conditional_10_For_21_Conditional_15
|
|
|
132
136
|
i0.ɵɵadvance(3);
|
|
133
137
|
i0.ɵɵtextInterpolate(sharing_r12.totalShares);
|
|
134
138
|
} }
|
|
135
|
-
function
|
|
136
|
-
i0.ɵɵelementStart(0, "span",
|
|
137
|
-
i0.ɵɵelement(1, "i",
|
|
139
|
+
function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_15_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
140
|
+
i0.ɵɵelementStart(0, "span", 74);
|
|
141
|
+
i0.ɵɵelement(1, "i", 84);
|
|
138
142
|
i0.ɵɵelementEnd();
|
|
139
143
|
} }
|
|
140
|
-
function
|
|
141
|
-
i0.ɵɵconditionalCreate(0,
|
|
142
|
-
i0.ɵɵconditionalCreate(1,
|
|
144
|
+
function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
145
|
+
i0.ɵɵconditionalCreate(0, ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_15_Conditional_0_Template, 4, 1, "span", 81);
|
|
146
|
+
i0.ɵɵconditionalCreate(1, ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_15_Conditional_1_Template, 2, 0, "span", 74);
|
|
143
147
|
} if (rf & 2) {
|
|
144
148
|
const sharing_r12 = ctx;
|
|
145
149
|
i0.ɵɵconditional(sharing_r12.totalShares > 0 ? 0 : -1);
|
|
146
150
|
i0.ɵɵadvance();
|
|
147
151
|
i0.ɵɵconditional(sharing_r12.totalShares === 0 ? 1 : -1);
|
|
148
152
|
} }
|
|
149
|
-
function
|
|
150
|
-
i0.ɵɵelementStart(0, "span",
|
|
151
|
-
i0.ɵɵelement(1, "i",
|
|
152
|
-
i0.ɵɵelementEnd();
|
|
153
|
-
} }
|
|
154
|
-
function ListsBrowseResource_Conditional_34_Conditional_10_For_21_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
155
|
-
const _r13 = i0.ɵɵgetCurrentView();
|
|
156
|
-
i0.ɵɵelementStart(0, "button", 87);
|
|
157
|
-
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_34_Conditional_10_For_21_Conditional_23_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r13); const item_r11 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openListMenu($event, item_r11)); });
|
|
158
|
-
i0.ɵɵelement(1, "i", 88);
|
|
153
|
+
function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
154
|
+
i0.ɵɵelementStart(0, "span", 74);
|
|
155
|
+
i0.ɵɵelement(1, "i", 84);
|
|
159
156
|
i0.ɵɵelementEnd();
|
|
160
157
|
} }
|
|
161
|
-
function
|
|
158
|
+
function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Template(rf, ctx) { if (rf & 1) {
|
|
162
159
|
const _r10 = i0.ɵɵgetCurrentView();
|
|
163
|
-
i0.ɵɵelementStart(0, "tr",
|
|
164
|
-
i0.ɵɵlistener("click", function
|
|
165
|
-
i0.ɵɵelementStart(1, "td",
|
|
160
|
+
i0.ɵɵelementStart(0, "tr", 63);
|
|
161
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Template_tr_click_0_listener() { const item_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openList(item_r11)); })("keydown.enter", function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Template_tr_keydown_enter_0_listener() { const item_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openList(item_r11)); });
|
|
162
|
+
i0.ɵɵelementStart(1, "td", 64)(2, "div", 65)(3, "div", 66);
|
|
166
163
|
i0.ɵɵelement(4, "i");
|
|
167
164
|
i0.ɵɵelementEnd();
|
|
168
|
-
i0.ɵɵelementStart(5, "div",
|
|
165
|
+
i0.ɵɵelementStart(5, "div", 67)(6, "span", 68);
|
|
169
166
|
i0.ɵɵtext(7);
|
|
170
167
|
i0.ɵɵelementEnd();
|
|
171
|
-
i0.ɵɵconditionalCreate(8,
|
|
168
|
+
i0.ɵɵconditionalCreate(8, ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_8_Template, 2, 1, "span", 69);
|
|
172
169
|
i0.ɵɵelementEnd()()();
|
|
173
|
-
i0.ɵɵelementStart(9, "td",
|
|
170
|
+
i0.ɵɵelementStart(9, "td", 70)(10, "span", 71);
|
|
174
171
|
i0.ɵɵtext(11);
|
|
175
172
|
i0.ɵɵelementEnd()();
|
|
176
|
-
i0.ɵɵelementStart(12, "td",
|
|
173
|
+
i0.ɵɵelementStart(12, "td", 72);
|
|
177
174
|
i0.ɵɵtext(13);
|
|
178
175
|
i0.ɵɵelementEnd();
|
|
179
|
-
i0.ɵɵelementStart(14, "td",
|
|
180
|
-
i0.ɵɵconditionalCreate(15,
|
|
181
|
-
i0.ɵɵconditionalCreate(16,
|
|
176
|
+
i0.ɵɵelementStart(14, "td", 73);
|
|
177
|
+
i0.ɵɵconditionalCreate(15, ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_15_Template, 2, 2);
|
|
178
|
+
i0.ɵɵconditionalCreate(16, ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_16_Template, 2, 0, "span", 74);
|
|
182
179
|
i0.ɵɵelementEnd();
|
|
183
|
-
i0.ɵɵelementStart(17, "td",
|
|
180
|
+
i0.ɵɵelementStart(17, "td", 75)(18, "span", 76);
|
|
184
181
|
i0.ɵɵtext(19);
|
|
185
182
|
i0.ɵɵelementEnd()();
|
|
186
|
-
i0.ɵɵelementStart(20, "td",
|
|
183
|
+
i0.ɵɵelementStart(20, "td", 77);
|
|
187
184
|
i0.ɵɵtext(21);
|
|
188
185
|
i0.ɵɵelementEnd();
|
|
189
|
-
i0.ɵɵelementStart(22, "td",
|
|
190
|
-
i0.ɵɵ
|
|
191
|
-
i0.ɵɵ
|
|
186
|
+
i0.ɵɵelementStart(22, "td", 78)(23, "button", 79);
|
|
187
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Template_button_click_23_listener($event) { const item_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openListMenu($event, item_r11)); });
|
|
188
|
+
i0.ɵɵelement(24, "i", 80);
|
|
189
|
+
i0.ɵɵelementEnd()()();
|
|
192
190
|
} if (rf & 2) {
|
|
193
191
|
let tmp_19_0;
|
|
194
192
|
const item_r11 = ctx.$implicit;
|
|
195
|
-
const
|
|
193
|
+
const ctx_r4 = i0.ɵɵnextContext(3);
|
|
196
194
|
i0.ɵɵadvance(3);
|
|
197
|
-
i0.ɵɵstyleProp("background-color",
|
|
195
|
+
i0.ɵɵstyleProp("background-color", ctx_r4.getEntityColor(item_r11.entityName));
|
|
198
196
|
i0.ɵɵadvance();
|
|
199
|
-
i0.ɵɵclassMap(
|
|
197
|
+
i0.ɵɵclassMap(ctx_r4.getEntityIcon(item_r11.entityName));
|
|
200
198
|
i0.ɵɵadvance(3);
|
|
201
199
|
i0.ɵɵtextInterpolate(item_r11.list.Name);
|
|
202
200
|
i0.ɵɵadvance();
|
|
@@ -214,389 +212,418 @@ function ListsBrowseResource_Conditional_34_Conditional_10_For_21_Template(rf, c
|
|
|
214
212
|
i0.ɵɵadvance();
|
|
215
213
|
i0.ɵɵtextInterpolate1(" ", item_r11.isOwner ? "You" : item_r11.ownerName, " ");
|
|
216
214
|
i0.ɵɵadvance(2);
|
|
217
|
-
i0.ɵɵtextInterpolate(
|
|
218
|
-
i0.ɵɵadvance(2);
|
|
219
|
-
i0.ɵɵconditional(item_r11.isOwner ? 23 : -1);
|
|
215
|
+
i0.ɵɵtextInterpolate(ctx_r4.formatDate(item_r11.list.__mj_UpdatedAt));
|
|
220
216
|
} }
|
|
221
|
-
function
|
|
222
|
-
i0.ɵɵelementStart(0, "div",
|
|
217
|
+
function ListsBrowseResource_Conditional_21_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
218
|
+
i0.ɵɵelementStart(0, "div", 50)(1, "table", 53)(2, "thead")(3, "tr")(4, "th", 54);
|
|
223
219
|
i0.ɵɵtext(5, "Name");
|
|
224
220
|
i0.ɵɵelementEnd();
|
|
225
|
-
i0.ɵɵelementStart(6, "th",
|
|
221
|
+
i0.ɵɵelementStart(6, "th", 55);
|
|
226
222
|
i0.ɵɵtext(7, "Entity");
|
|
227
223
|
i0.ɵɵelementEnd();
|
|
228
|
-
i0.ɵɵelementStart(8, "th",
|
|
224
|
+
i0.ɵɵelementStart(8, "th", 56);
|
|
229
225
|
i0.ɵɵtext(9, "Items");
|
|
230
226
|
i0.ɵɵelementEnd();
|
|
231
|
-
i0.ɵɵelementStart(10, "th",
|
|
227
|
+
i0.ɵɵelementStart(10, "th", 57);
|
|
232
228
|
i0.ɵɵtext(11, "Shared");
|
|
233
229
|
i0.ɵɵelementEnd();
|
|
234
|
-
i0.ɵɵelementStart(12, "th",
|
|
230
|
+
i0.ɵɵelementStart(12, "th", 58);
|
|
235
231
|
i0.ɵɵtext(13, "Owner");
|
|
236
232
|
i0.ɵɵelementEnd();
|
|
237
|
-
i0.ɵɵelementStart(14, "th",
|
|
233
|
+
i0.ɵɵelementStart(14, "th", 59);
|
|
238
234
|
i0.ɵɵtext(15, "Updated");
|
|
239
235
|
i0.ɵɵelementEnd();
|
|
240
|
-
i0.ɵɵelementStart(16, "th",
|
|
236
|
+
i0.ɵɵelementStart(16, "th", 60)(17, "span", 61);
|
|
241
237
|
i0.ɵɵtext(18, "Actions");
|
|
242
238
|
i0.ɵɵelementEnd()()()();
|
|
243
239
|
i0.ɵɵelementStart(19, "tbody");
|
|
244
|
-
i0.ɵɵrepeaterCreate(20,
|
|
240
|
+
i0.ɵɵrepeaterCreate(20, ListsBrowseResource_Conditional_21_Conditional_10_For_21_Template, 25, 14, "tr", 62, i0.ɵɵrepeaterTrackByIdentity);
|
|
245
241
|
i0.ɵɵelementEnd()()();
|
|
246
242
|
} if (rf & 2) {
|
|
247
|
-
const
|
|
243
|
+
const ctx_r4 = i0.ɵɵnextContext(2);
|
|
248
244
|
i0.ɵɵadvance(20);
|
|
249
|
-
i0.ɵɵrepeater(
|
|
245
|
+
i0.ɵɵrepeater(ctx_r4.filteredLists);
|
|
250
246
|
} }
|
|
251
|
-
function
|
|
252
|
-
|
|
253
|
-
i0.ɵɵelementStart(0, "div", 93)(1, "button", 106);
|
|
254
|
-
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_34_Conditional_11_For_2_Conditional_4_Template_button_click_1_listener($event) { i0.ɵɵrestoreView(_r16); const item_r15 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openListMenu($event, item_r15)); });
|
|
255
|
-
i0.ɵɵelement(2, "i", 88);
|
|
256
|
-
i0.ɵɵelementEnd()();
|
|
257
|
-
} }
|
|
258
|
-
function ListsBrowseResource_Conditional_34_Conditional_11_For_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
259
|
-
i0.ɵɵelementStart(0, "p", 96);
|
|
247
|
+
function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
248
|
+
i0.ɵɵelementStart(0, "p", 94);
|
|
260
249
|
i0.ɵɵtext(1);
|
|
261
250
|
i0.ɵɵelementEnd();
|
|
262
251
|
} if (rf & 2) {
|
|
263
|
-
const
|
|
252
|
+
const item_r14 = i0.ɵɵnextContext().$implicit;
|
|
264
253
|
i0.ɵɵadvance();
|
|
265
|
-
i0.ɵɵtextInterpolate(
|
|
254
|
+
i0.ɵɵtextInterpolate(item_r14.list.Description);
|
|
266
255
|
} }
|
|
267
|
-
function
|
|
268
|
-
i0.ɵɵelementStart(0, "span",
|
|
269
|
-
i0.ɵɵelement(1, "i",
|
|
256
|
+
function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Conditional_27_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
257
|
+
i0.ɵɵelementStart(0, "span", 106);
|
|
258
|
+
i0.ɵɵelement(1, "i", 82);
|
|
270
259
|
i0.ɵɵelementEnd();
|
|
271
260
|
} if (rf & 2) {
|
|
272
|
-
const
|
|
273
|
-
i0.ɵɵproperty("title", "Shared with " +
|
|
261
|
+
const sharing_r15 = i0.ɵɵnextContext();
|
|
262
|
+
i0.ɵɵproperty("title", "Shared with " + sharing_r15.totalShares + " user(s)/role(s)");
|
|
274
263
|
} }
|
|
275
|
-
function
|
|
276
|
-
i0.ɵɵconditionalCreate(0,
|
|
264
|
+
function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Conditional_27_Template(rf, ctx) { if (rf & 1) {
|
|
265
|
+
i0.ɵɵconditionalCreate(0, ListsBrowseResource_Conditional_21_Conditional_11_For_2_Conditional_27_Conditional_0_Template, 2, 1, "span", 106);
|
|
277
266
|
} if (rf & 2) {
|
|
278
267
|
i0.ɵɵconditional(ctx.totalShares > 0 ? 0 : -1);
|
|
279
268
|
} }
|
|
280
|
-
function
|
|
281
|
-
const
|
|
282
|
-
i0.ɵɵelementStart(0, "div",
|
|
283
|
-
i0.ɵɵlistener("click", function
|
|
284
|
-
i0.ɵɵelementStart(1, "div",
|
|
269
|
+
function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
270
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
271
|
+
i0.ɵɵelementStart(0, "div", 86);
|
|
272
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template_div_click_0_listener() { const item_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openList(item_r14)); })("keydown.enter", function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template_div_keydown_enter_0_listener() { const item_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openList(item_r14)); });
|
|
273
|
+
i0.ɵɵelementStart(1, "div", 87)(2, "div", 88);
|
|
285
274
|
i0.ɵɵelement(3, "i");
|
|
286
275
|
i0.ɵɵelementEnd();
|
|
287
|
-
i0.ɵɵ
|
|
276
|
+
i0.ɵɵelementStart(4, "button", 89);
|
|
277
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template_button_click_4_listener($event) { const item_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.toggleFavorite($event, item_r14)); });
|
|
278
|
+
i0.ɵɵelement(5, "i");
|
|
288
279
|
i0.ɵɵelementEnd();
|
|
289
|
-
i0.ɵɵelementStart(
|
|
290
|
-
i0.ɵɵ
|
|
280
|
+
i0.ɵɵelementStart(6, "div", 90)(7, "button", 91);
|
|
281
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template_button_click_7_listener($event) { const item_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openListMenu($event, item_r14)); });
|
|
282
|
+
i0.ɵɵelement(8, "i", 80);
|
|
283
|
+
i0.ɵɵelementEnd()()();
|
|
284
|
+
i0.ɵɵelementStart(9, "div", 92)(10, "h3", 93);
|
|
285
|
+
i0.ɵɵtext(11);
|
|
291
286
|
i0.ɵɵelementEnd();
|
|
292
|
-
i0.ɵɵconditionalCreate(
|
|
293
|
-
i0.ɵɵelementStart(
|
|
294
|
-
i0.ɵɵelement(
|
|
295
|
-
i0.ɵɵtext(
|
|
287
|
+
i0.ɵɵconditionalCreate(12, ListsBrowseResource_Conditional_21_Conditional_11_For_2_Conditional_12_Template, 2, 1, "p", 94);
|
|
288
|
+
i0.ɵɵelementStart(13, "div", 95)(14, "span", 96);
|
|
289
|
+
i0.ɵɵelement(15, "i", 97);
|
|
290
|
+
i0.ɵɵtext(16);
|
|
296
291
|
i0.ɵɵelementEnd();
|
|
297
|
-
i0.ɵɵelementStart(
|
|
298
|
-
i0.ɵɵelement(
|
|
299
|
-
i0.ɵɵtext(15);
|
|
300
|
-
i0.ɵɵelementEnd()()();
|
|
301
|
-
i0.ɵɵelementStart(16, "div", 101)(17, "span", 102);
|
|
302
|
-
i0.ɵɵelement(18, "i", 103);
|
|
292
|
+
i0.ɵɵelementStart(17, "span", 96);
|
|
293
|
+
i0.ɵɵelement(18, "i", 98);
|
|
303
294
|
i0.ɵɵtext(19);
|
|
304
|
-
i0.ɵɵelementEnd();
|
|
305
|
-
i0.ɵɵelementStart(20, "div",
|
|
306
|
-
i0.ɵɵ
|
|
307
|
-
i0.ɵɵelementStart(
|
|
308
|
-
i0.ɵɵ
|
|
295
|
+
i0.ɵɵelementEnd()();
|
|
296
|
+
i0.ɵɵelementStart(20, "div", 99);
|
|
297
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template_div_click_20_listener($event) { i0.ɵɵrestoreView(_r13); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
298
|
+
i0.ɵɵelementStart(21, "mj-tag-chips", 100);
|
|
299
|
+
i0.ɵɵlistener("TagClicked", function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template_mj_tag_chips_TagClicked_21_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.onCardTagClicked($event)); });
|
|
300
|
+
i0.ɵɵelementEnd()()();
|
|
301
|
+
i0.ɵɵelementStart(22, "div", 101)(23, "span", 102);
|
|
302
|
+
i0.ɵɵelement(24, "i", 103);
|
|
303
|
+
i0.ɵɵtext(25);
|
|
304
|
+
i0.ɵɵelementEnd();
|
|
305
|
+
i0.ɵɵelementStart(26, "div", 104);
|
|
306
|
+
i0.ɵɵconditionalCreate(27, ListsBrowseResource_Conditional_21_Conditional_11_For_2_Conditional_27_Template, 1, 1);
|
|
307
|
+
i0.ɵɵelementStart(28, "span", 105);
|
|
308
|
+
i0.ɵɵtext(29);
|
|
309
309
|
i0.ɵɵelementEnd()()()();
|
|
310
310
|
} if (rf & 2) {
|
|
311
|
-
let
|
|
312
|
-
const
|
|
313
|
-
const
|
|
311
|
+
let tmp_28_0;
|
|
312
|
+
const item_r14 = ctx.$implicit;
|
|
313
|
+
const ctx_r4 = i0.ɵɵnextContext(3);
|
|
314
314
|
i0.ɵɵadvance(2);
|
|
315
|
-
i0.ɵɵstyleProp("background-color",
|
|
315
|
+
i0.ɵɵstyleProp("background-color", ctx_r4.getEntityColor(item_r14.entityName));
|
|
316
316
|
i0.ɵɵadvance();
|
|
317
|
-
i0.ɵɵclassMap(
|
|
317
|
+
i0.ɵɵclassMap(ctx_r4.getEntityIcon(item_r14.entityName));
|
|
318
318
|
i0.ɵɵadvance();
|
|
319
|
-
i0.ɵɵ
|
|
320
|
-
i0.ɵɵ
|
|
321
|
-
i0.ɵɵtextInterpolate(item_r15.list.Name);
|
|
319
|
+
i0.ɵɵclassProp("favorite-btn--active", ctx_r4.isFavorite(item_r14.list.ID));
|
|
320
|
+
i0.ɵɵproperty("title", ctx_r4.isFavorite(item_r14.list.ID) ? "Remove from favorites" : "Add to favorites");
|
|
322
321
|
i0.ɵɵadvance();
|
|
323
|
-
i0.ɵɵ
|
|
322
|
+
i0.ɵɵclassMap(ctx_r4.isFavorite(item_r14.list.ID) ? "fa-solid fa-star" : "fa-regular fa-star");
|
|
323
|
+
i0.ɵɵadvance(6);
|
|
324
|
+
i0.ɵɵtextInterpolate(item_r14.list.Name);
|
|
325
|
+
i0.ɵɵadvance();
|
|
326
|
+
i0.ɵɵconditional(item_r14.list.Description ? 12 : -1);
|
|
324
327
|
i0.ɵɵadvance(4);
|
|
325
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
328
|
+
i0.ɵɵtextInterpolate1(" ", item_r14.entityName, " ");
|
|
326
329
|
i0.ɵɵadvance(3);
|
|
327
|
-
i0.ɵɵtextInterpolate2(" ",
|
|
330
|
+
i0.ɵɵtextInterpolate2(" ", item_r14.itemCount, " item", item_r14.itemCount !== 1 ? "s" : "", " ");
|
|
331
|
+
i0.ɵɵadvance(2);
|
|
332
|
+
i0.ɵɵproperty("Provider", ctx_r4.Provider)("RecordID", item_r14.list.ID)("Editable", false)("MaxDisplay", 3);
|
|
328
333
|
i0.ɵɵadvance(2);
|
|
329
|
-
i0.ɵɵclassProp("is-me",
|
|
334
|
+
i0.ɵɵclassProp("is-me", item_r14.isOwner);
|
|
330
335
|
i0.ɵɵadvance(2);
|
|
331
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
336
|
+
i0.ɵɵtextInterpolate1(" ", item_r14.isOwner ? "You" : item_r14.ownerName, " ");
|
|
332
337
|
i0.ɵɵadvance(2);
|
|
333
|
-
i0.ɵɵconditional((
|
|
338
|
+
i0.ɵɵconditional((tmp_28_0 = item_r14.sharingInfo) ? 27 : -1, tmp_28_0);
|
|
334
339
|
i0.ɵɵadvance(2);
|
|
335
|
-
i0.ɵɵtextInterpolate(
|
|
340
|
+
i0.ɵɵtextInterpolate(ctx_r4.formatDate(item_r14.list.__mj_UpdatedAt));
|
|
336
341
|
} }
|
|
337
|
-
function
|
|
338
|
-
i0.ɵɵelementStart(0, "div",
|
|
339
|
-
i0.ɵɵrepeaterCreate(1,
|
|
342
|
+
function ListsBrowseResource_Conditional_21_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
343
|
+
i0.ɵɵelementStart(0, "div", 51);
|
|
344
|
+
i0.ɵɵrepeaterCreate(1, ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template, 30, 23, "div", 85, i0.ɵɵrepeaterTrackByIdentity);
|
|
340
345
|
i0.ɵɵelementEnd();
|
|
341
346
|
} if (rf & 2) {
|
|
342
|
-
const
|
|
347
|
+
const ctx_r4 = i0.ɵɵnextContext(2);
|
|
343
348
|
i0.ɵɵadvance();
|
|
344
|
-
i0.ɵɵrepeater(
|
|
349
|
+
i0.ɵɵrepeater(ctx_r4.filteredLists);
|
|
345
350
|
} }
|
|
346
|
-
function
|
|
351
|
+
function ListsBrowseResource_Conditional_21_Conditional_12_For_2_ng_container_0_Template(rf, ctx) { if (rf & 1) {
|
|
347
352
|
i0.ɵɵelementContainer(0);
|
|
348
353
|
} }
|
|
349
|
-
function
|
|
350
|
-
i0.ɵɵtemplate(0,
|
|
354
|
+
function ListsBrowseResource_Conditional_21_Conditional_12_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
355
|
+
i0.ɵɵtemplate(0, ListsBrowseResource_Conditional_21_Conditional_12_For_2_ng_container_0_Template, 1, 0, "ng-container", 107);
|
|
351
356
|
} if (rf & 2) {
|
|
352
|
-
const
|
|
357
|
+
const node_r16 = ctx.$implicit;
|
|
353
358
|
i0.ɵɵnextContext(3);
|
|
354
|
-
const
|
|
355
|
-
i0.ɵɵproperty("ngTemplateOutlet",
|
|
359
|
+
const categoryNodeTemplate_r17 = i0.ɵɵreference(23);
|
|
360
|
+
i0.ɵɵproperty("ngTemplateOutlet", categoryNodeTemplate_r17)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, node_r16));
|
|
356
361
|
} }
|
|
357
|
-
function
|
|
358
|
-
i0.ɵɵelementStart(0, "div",
|
|
359
|
-
i0.ɵɵrepeaterCreate(1,
|
|
362
|
+
function ListsBrowseResource_Conditional_21_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
363
|
+
i0.ɵɵelementStart(0, "div", 52);
|
|
364
|
+
i0.ɵɵrepeaterCreate(1, ListsBrowseResource_Conditional_21_Conditional_12_For_2_Template, 1, 4, "ng-container", null, i0.ɵɵrepeaterTrackByIdentity);
|
|
360
365
|
i0.ɵɵelementEnd();
|
|
361
366
|
} if (rf & 2) {
|
|
362
|
-
const
|
|
367
|
+
const ctx_r4 = i0.ɵɵnextContext(2);
|
|
363
368
|
i0.ɵɵadvance();
|
|
364
|
-
i0.ɵɵrepeater(
|
|
369
|
+
i0.ɵɵrepeater(ctx_r4.categoryTree);
|
|
365
370
|
} }
|
|
366
|
-
function
|
|
371
|
+
function ListsBrowseResource_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
367
372
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
368
|
-
i0.ɵɵelementStart(0, "div",
|
|
373
|
+
i0.ɵɵelementStart(0, "div", 18)(1, "div", 45)(2, "span", 46);
|
|
369
374
|
i0.ɵɵtext(3);
|
|
370
375
|
i0.ɵɵelementEnd();
|
|
371
|
-
i0.ɵɵelementStart(4, "div",
|
|
376
|
+
i0.ɵɵelementStart(4, "div", 47)(5, "label");
|
|
372
377
|
i0.ɵɵtext(6, "Sort:");
|
|
373
378
|
i0.ɵɵelementEnd();
|
|
374
|
-
i0.ɵɵelementStart(7, "select",
|
|
375
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
376
|
-
i0.ɵɵlistener("ngModelChange", function
|
|
377
|
-
i0.ɵɵrepeaterCreate(8,
|
|
379
|
+
i0.ɵɵelementStart(7, "select", 48);
|
|
380
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_21_Template_select_ngModelChange_7_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r4 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r4.selectedSort, $event) || (ctx_r4.selectedSort = $event); return i0.ɵɵresetView($event); });
|
|
381
|
+
i0.ɵɵlistener("ngModelChange", function ListsBrowseResource_Conditional_21_Template_select_ngModelChange_7_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.onSortChange($event)); });
|
|
382
|
+
i0.ɵɵrepeaterCreate(8, ListsBrowseResource_Conditional_21_For_9_Template, 2, 2, "option", 49, i0.ɵɵrepeaterTrackByIdentity);
|
|
378
383
|
i0.ɵɵelementEnd()()();
|
|
379
|
-
i0.ɵɵconditionalCreate(10,
|
|
380
|
-
i0.ɵɵconditionalCreate(11,
|
|
381
|
-
i0.ɵɵconditionalCreate(12,
|
|
384
|
+
i0.ɵɵconditionalCreate(10, ListsBrowseResource_Conditional_21_Conditional_10_Template, 22, 0, "div", 50);
|
|
385
|
+
i0.ɵɵconditionalCreate(11, ListsBrowseResource_Conditional_21_Conditional_11_Template, 3, 0, "div", 51);
|
|
386
|
+
i0.ɵɵconditionalCreate(12, ListsBrowseResource_Conditional_21_Conditional_12_Template, 3, 0, "div", 52);
|
|
382
387
|
i0.ɵɵelementEnd();
|
|
383
388
|
} if (rf & 2) {
|
|
384
|
-
const
|
|
389
|
+
const ctx_r4 = i0.ɵɵnextContext();
|
|
385
390
|
i0.ɵɵadvance(3);
|
|
386
|
-
i0.ɵɵtextInterpolate2("",
|
|
391
|
+
i0.ɵɵtextInterpolate2("", ctx_r4.filteredLists.length, " list", ctx_r4.filteredLists.length !== 1 ? "s" : "");
|
|
387
392
|
i0.ɵɵadvance(4);
|
|
388
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
393
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r4.selectedSort);
|
|
389
394
|
i0.ɵɵadvance();
|
|
390
|
-
i0.ɵɵrepeater(
|
|
395
|
+
i0.ɵɵrepeater(ctx_r4.sortOptions);
|
|
391
396
|
i0.ɵɵadvance(2);
|
|
392
|
-
i0.ɵɵconditional(
|
|
397
|
+
i0.ɵɵconditional(ctx_r4.viewMode === "table" ? 10 : -1);
|
|
393
398
|
i0.ɵɵadvance();
|
|
394
|
-
i0.ɵɵconditional(
|
|
399
|
+
i0.ɵɵconditional(ctx_r4.viewMode === "card" ? 11 : -1);
|
|
395
400
|
i0.ɵɵadvance();
|
|
396
|
-
i0.ɵɵconditional(
|
|
401
|
+
i0.ɵɵconditional(ctx_r4.viewMode === "hierarchy" ? 12 : -1);
|
|
397
402
|
} }
|
|
398
|
-
function
|
|
399
|
-
const
|
|
400
|
-
i0.ɵɵelementStart(0, "div",
|
|
401
|
-
i0.ɵɵlistener("click", function
|
|
402
|
-
i0.ɵɵelement(1, "i")(2, "i",
|
|
403
|
-
i0.ɵɵelementStart(3, "span",
|
|
403
|
+
function ListsBrowseResource_ng_template_22_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
404
|
+
const _r18 = i0.ɵɵgetCurrentView();
|
|
405
|
+
i0.ɵɵelementStart(0, "div", 112);
|
|
406
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_ng_template_22_Conditional_1_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r18); const node_r19 = i0.ɵɵnextContext().node; const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.toggleCategory(node_r19)); });
|
|
407
|
+
i0.ɵɵelement(1, "i")(2, "i", 113);
|
|
408
|
+
i0.ɵɵelementStart(3, "span", 114);
|
|
404
409
|
i0.ɵɵtext(4);
|
|
405
410
|
i0.ɵɵelementEnd();
|
|
406
|
-
i0.ɵɵelementStart(5, "span",
|
|
411
|
+
i0.ɵɵelementStart(5, "span", 115);
|
|
407
412
|
i0.ɵɵtext(6);
|
|
408
413
|
i0.ɵɵelementEnd()();
|
|
409
414
|
} if (rf & 2) {
|
|
410
|
-
const
|
|
411
|
-
const
|
|
415
|
+
const node_r19 = i0.ɵɵnextContext().node;
|
|
416
|
+
const ctx_r4 = i0.ɵɵnextContext();
|
|
412
417
|
i0.ɵɵadvance();
|
|
413
|
-
i0.ɵɵclassMap(
|
|
418
|
+
i0.ɵɵclassMap(node_r19.isExpanded ? "fa-solid fa-chevron-down" : "fa-solid fa-chevron-right");
|
|
414
419
|
i0.ɵɵadvance();
|
|
415
|
-
i0.ɵɵclassProp("fa-folder-open",
|
|
420
|
+
i0.ɵɵclassProp("fa-folder-open", node_r19.isExpanded);
|
|
416
421
|
i0.ɵɵadvance(2);
|
|
417
|
-
i0.ɵɵtextInterpolate(
|
|
422
|
+
i0.ɵɵtextInterpolate(node_r19.category.Name);
|
|
418
423
|
i0.ɵɵadvance(2);
|
|
419
|
-
i0.ɵɵtextInterpolate(
|
|
424
|
+
i0.ɵɵtextInterpolate(ctx_r4.getListCountInCategory(node_r19));
|
|
420
425
|
} }
|
|
421
|
-
function
|
|
422
|
-
const
|
|
423
|
-
i0.ɵɵelementStart(0, "div",
|
|
424
|
-
i0.ɵɵlistener("click", function
|
|
425
|
-
i0.ɵɵelement(1, "i")(2, "i",
|
|
426
|
-
i0.ɵɵelementStart(3, "span",
|
|
426
|
+
function ListsBrowseResource_ng_template_22_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
427
|
+
const _r20 = i0.ɵɵgetCurrentView();
|
|
428
|
+
i0.ɵɵelementStart(0, "div", 116);
|
|
429
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_ng_template_22_Conditional_2_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r20); const node_r19 = i0.ɵɵnextContext().node; const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.toggleCategory(node_r19)); });
|
|
430
|
+
i0.ɵɵelement(1, "i")(2, "i", 117);
|
|
431
|
+
i0.ɵɵelementStart(3, "span", 114);
|
|
427
432
|
i0.ɵɵtext(4, "Uncategorized");
|
|
428
433
|
i0.ɵɵelementEnd();
|
|
429
|
-
i0.ɵɵelementStart(5, "span",
|
|
434
|
+
i0.ɵɵelementStart(5, "span", 115);
|
|
430
435
|
i0.ɵɵtext(6);
|
|
431
436
|
i0.ɵɵelementEnd()();
|
|
432
437
|
} if (rf & 2) {
|
|
433
|
-
const
|
|
438
|
+
const node_r19 = i0.ɵɵnextContext().node;
|
|
434
439
|
i0.ɵɵadvance();
|
|
435
|
-
i0.ɵɵclassMap(
|
|
440
|
+
i0.ɵɵclassMap(node_r19.isExpanded ? "fa-solid fa-chevron-down" : "fa-solid fa-chevron-right");
|
|
436
441
|
i0.ɵɵadvance(5);
|
|
437
|
-
i0.ɵɵtextInterpolate(
|
|
442
|
+
i0.ɵɵtextInterpolate(node_r19.lists.length);
|
|
438
443
|
} }
|
|
439
|
-
function
|
|
444
|
+
function ListsBrowseResource_ng_template_22_Conditional_3_For_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
440
445
|
i0.ɵɵelementStart(0, "span");
|
|
441
446
|
i0.ɵɵtext(1);
|
|
442
447
|
i0.ɵɵelementEnd();
|
|
443
448
|
} if (rf & 2) {
|
|
444
|
-
const
|
|
449
|
+
const item_r22 = i0.ɵɵnextContext().$implicit;
|
|
445
450
|
i0.ɵɵadvance();
|
|
446
|
-
i0.ɵɵtextInterpolate1(" \u00B7 ",
|
|
451
|
+
i0.ɵɵtextInterpolate1(" \u00B7 ", item_r22.ownerName);
|
|
447
452
|
} }
|
|
448
|
-
function
|
|
449
|
-
const
|
|
450
|
-
i0.ɵɵelementStart(0, "div",
|
|
451
|
-
i0.ɵɵlistener("click", function
|
|
452
|
-
i0.ɵɵ
|
|
453
|
-
i0.ɵɵelementEnd()();
|
|
454
|
-
} }
|
|
455
|
-
function ListsBrowseResource_ng_template_35_Conditional_3_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
456
|
-
const _r23 = i0.ɵɵgetCurrentView();
|
|
457
|
-
i0.ɵɵelementStart(0, "div", 120);
|
|
458
|
-
i0.ɵɵlistener("click", function ListsBrowseResource_ng_template_35_Conditional_3_For_2_Template_div_click_0_listener() { const item_r24 = i0.ɵɵrestoreView(_r23).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openList(item_r24)); })("keydown.enter", function ListsBrowseResource_ng_template_35_Conditional_3_For_2_Template_div_keydown_enter_0_listener() { const item_r24 = i0.ɵɵrestoreView(_r23).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openList(item_r24)); });
|
|
459
|
-
i0.ɵɵelementStart(1, "div", 69);
|
|
453
|
+
function ListsBrowseResource_ng_template_22_Conditional_3_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
454
|
+
const _r21 = i0.ɵɵgetCurrentView();
|
|
455
|
+
i0.ɵɵelementStart(0, "div", 119);
|
|
456
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_ng_template_22_Conditional_3_For_2_Template_div_click_0_listener() { const item_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openList(item_r22)); })("keydown.enter", function ListsBrowseResource_ng_template_22_Conditional_3_For_2_Template_div_keydown_enter_0_listener() { const item_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openList(item_r22)); });
|
|
457
|
+
i0.ɵɵelementStart(1, "div", 66);
|
|
460
458
|
i0.ɵɵelement(2, "i");
|
|
461
459
|
i0.ɵɵelementEnd();
|
|
462
|
-
i0.ɵɵelementStart(3, "div",
|
|
460
|
+
i0.ɵɵelementStart(3, "div", 120)(4, "span", 68);
|
|
463
461
|
i0.ɵɵtext(5);
|
|
464
462
|
i0.ɵɵelementEnd();
|
|
465
|
-
i0.ɵɵelementStart(6, "span",
|
|
463
|
+
i0.ɵɵelementStart(6, "span", 121);
|
|
466
464
|
i0.ɵɵtext(7);
|
|
467
|
-
i0.ɵɵconditionalCreate(8,
|
|
465
|
+
i0.ɵɵconditionalCreate(8, ListsBrowseResource_ng_template_22_Conditional_3_For_2_Conditional_8_Template, 2, 1, "span");
|
|
468
466
|
i0.ɵɵelementEnd()();
|
|
469
|
-
i0.ɵɵ
|
|
470
|
-
i0.ɵɵ
|
|
467
|
+
i0.ɵɵelementStart(9, "div", 122)(10, "button", 123);
|
|
468
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_ng_template_22_Conditional_3_For_2_Template_button_click_10_listener($event) { const item_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openListMenu($event, item_r22)); });
|
|
469
|
+
i0.ɵɵelement(11, "i", 80);
|
|
470
|
+
i0.ɵɵelementEnd()()();
|
|
471
471
|
} if (rf & 2) {
|
|
472
|
-
const
|
|
473
|
-
const
|
|
472
|
+
const item_r22 = ctx.$implicit;
|
|
473
|
+
const ctx_r4 = i0.ɵɵnextContext(3);
|
|
474
474
|
i0.ɵɵadvance();
|
|
475
|
-
i0.ɵɵstyleProp("background-color",
|
|
475
|
+
i0.ɵɵstyleProp("background-color", ctx_r4.getEntityColor(item_r22.entityName));
|
|
476
476
|
i0.ɵɵadvance();
|
|
477
|
-
i0.ɵɵclassMap(
|
|
477
|
+
i0.ɵɵclassMap(ctx_r4.getEntityIcon(item_r22.entityName));
|
|
478
478
|
i0.ɵɵadvance(3);
|
|
479
|
-
i0.ɵɵtextInterpolate(
|
|
479
|
+
i0.ɵɵtextInterpolate(item_r22.list.Name);
|
|
480
480
|
i0.ɵɵadvance(2);
|
|
481
|
-
i0.ɵɵtextInterpolate2(" ",
|
|
482
|
-
i0.ɵɵadvance();
|
|
483
|
-
i0.ɵɵconditional(!item_r24.isOwner ? 8 : -1);
|
|
481
|
+
i0.ɵɵtextInterpolate2(" ", item_r22.entityName, " \u00B7 ", item_r22.itemCount, " items ");
|
|
484
482
|
i0.ɵɵadvance();
|
|
485
|
-
i0.ɵɵconditional(
|
|
483
|
+
i0.ɵɵconditional(!item_r22.isOwner ? 8 : -1);
|
|
486
484
|
} }
|
|
487
|
-
function
|
|
488
|
-
i0.ɵɵelementStart(0, "div",
|
|
489
|
-
i0.ɵɵrepeaterCreate(1,
|
|
485
|
+
function ListsBrowseResource_ng_template_22_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
486
|
+
i0.ɵɵelementStart(0, "div", 111);
|
|
487
|
+
i0.ɵɵrepeaterCreate(1, ListsBrowseResource_ng_template_22_Conditional_3_For_2_Template, 12, 8, "div", 118, i0.ɵɵrepeaterTrackByIdentity);
|
|
490
488
|
i0.ɵɵelementEnd();
|
|
491
489
|
} if (rf & 2) {
|
|
492
|
-
const
|
|
490
|
+
const node_r19 = i0.ɵɵnextContext().node;
|
|
493
491
|
i0.ɵɵadvance();
|
|
494
|
-
i0.ɵɵrepeater(
|
|
492
|
+
i0.ɵɵrepeater(node_r19.lists);
|
|
495
493
|
} }
|
|
496
|
-
function
|
|
494
|
+
function ListsBrowseResource_ng_template_22_Conditional_4_For_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {
|
|
497
495
|
i0.ɵɵelementContainer(0);
|
|
498
496
|
} }
|
|
499
|
-
function
|
|
500
|
-
i0.ɵɵtemplate(0,
|
|
497
|
+
function ListsBrowseResource_ng_template_22_Conditional_4_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
498
|
+
i0.ɵɵtemplate(0, ListsBrowseResource_ng_template_22_Conditional_4_For_1_ng_container_0_Template, 1, 0, "ng-container", 107);
|
|
501
499
|
} if (rf & 2) {
|
|
502
|
-
const
|
|
503
|
-
const
|
|
500
|
+
const child_r23 = ctx.$implicit;
|
|
501
|
+
const depth_r24 = i0.ɵɵnextContext(2).depth;
|
|
504
502
|
i0.ɵɵnextContext();
|
|
505
|
-
const
|
|
506
|
-
i0.ɵɵproperty("ngTemplateOutlet",
|
|
503
|
+
const categoryNodeTemplate_r17 = i0.ɵɵreference(23);
|
|
504
|
+
i0.ɵɵproperty("ngTemplateOutlet", categoryNodeTemplate_r17)("ngTemplateOutletContext", i0.ɵɵpureFunction2(2, _c1, child_r23, depth_r24 + 1));
|
|
507
505
|
} }
|
|
508
|
-
function
|
|
509
|
-
i0.ɵɵrepeaterCreate(0,
|
|
506
|
+
function ListsBrowseResource_ng_template_22_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
507
|
+
i0.ɵɵrepeaterCreate(0, ListsBrowseResource_ng_template_22_Conditional_4_For_1_Template, 1, 5, "ng-container", null, i0.ɵɵrepeaterTrackByIdentity);
|
|
510
508
|
} if (rf & 2) {
|
|
511
|
-
const
|
|
512
|
-
i0.ɵɵrepeater(
|
|
509
|
+
const node_r19 = i0.ɵɵnextContext().node;
|
|
510
|
+
i0.ɵɵrepeater(node_r19.children);
|
|
513
511
|
} }
|
|
514
|
-
function
|
|
515
|
-
i0.ɵɵelementStart(0, "div",
|
|
516
|
-
i0.ɵɵconditionalCreate(1,
|
|
517
|
-
i0.ɵɵconditionalCreate(2,
|
|
518
|
-
i0.ɵɵconditionalCreate(3,
|
|
519
|
-
i0.ɵɵconditionalCreate(4,
|
|
512
|
+
function ListsBrowseResource_ng_template_22_Template(rf, ctx) { if (rf & 1) {
|
|
513
|
+
i0.ɵɵelementStart(0, "div", 108);
|
|
514
|
+
i0.ɵɵconditionalCreate(1, ListsBrowseResource_ng_template_22_Conditional_1_Template, 7, 6, "div", 109);
|
|
515
|
+
i0.ɵɵconditionalCreate(2, ListsBrowseResource_ng_template_22_Conditional_2_Template, 7, 3, "div", 110);
|
|
516
|
+
i0.ɵɵconditionalCreate(3, ListsBrowseResource_ng_template_22_Conditional_3_Template, 3, 0, "div", 111);
|
|
517
|
+
i0.ɵɵconditionalCreate(4, ListsBrowseResource_ng_template_22_Conditional_4_Template, 2, 0);
|
|
520
518
|
i0.ɵɵelementEnd();
|
|
521
519
|
} if (rf & 2) {
|
|
522
|
-
const
|
|
523
|
-
const
|
|
524
|
-
i0.ɵɵstyleProp("margin-left",
|
|
520
|
+
const node_r19 = ctx.node;
|
|
521
|
+
const depth_r24 = ctx.depth;
|
|
522
|
+
i0.ɵɵstyleProp("margin-left", depth_r24 * 20, "px");
|
|
525
523
|
i0.ɵɵadvance();
|
|
526
|
-
i0.ɵɵconditional(
|
|
524
|
+
i0.ɵɵconditional(node_r19.category ? 1 : -1);
|
|
527
525
|
i0.ɵɵadvance();
|
|
528
|
-
i0.ɵɵconditional(!
|
|
526
|
+
i0.ɵɵconditional(!node_r19.category && node_r19.lists.length > 0 ? 2 : -1);
|
|
529
527
|
i0.ɵɵadvance();
|
|
530
|
-
i0.ɵɵconditional(
|
|
528
|
+
i0.ɵɵconditional(node_r19.isExpanded ? 3 : -1);
|
|
531
529
|
i0.ɵɵadvance();
|
|
532
|
-
i0.ɵɵconditional(
|
|
530
|
+
i0.ɵɵconditional(node_r19.isExpanded ? 4 : -1);
|
|
531
|
+
} }
|
|
532
|
+
function ListsBrowseResource_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
533
|
+
const _r25 = i0.ɵɵgetCurrentView();
|
|
534
|
+
i0.ɵɵelementStart(0, "div", 124);
|
|
535
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_24_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r25); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeContextMenu()); });
|
|
536
|
+
i0.ɵɵelementEnd();
|
|
537
|
+
} }
|
|
538
|
+
function ListsBrowseResource_Conditional_25_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
539
|
+
const _r27 = i0.ɵɵgetCurrentView();
|
|
540
|
+
i0.ɵɵelementStart(0, "button", 127);
|
|
541
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_25_Conditional_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r27); const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.editList()); });
|
|
542
|
+
i0.ɵɵelement(1, "i", 130);
|
|
543
|
+
i0.ɵɵtext(2, " Edit ");
|
|
544
|
+
i0.ɵɵelementEnd();
|
|
533
545
|
} }
|
|
534
|
-
function
|
|
546
|
+
function ListsBrowseResource_Conditional_25_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
535
547
|
const _r28 = i0.ɵɵgetCurrentView();
|
|
536
|
-
i0.ɵɵelementStart(0, "
|
|
537
|
-
i0.ɵɵlistener("click", function
|
|
548
|
+
i0.ɵɵelementStart(0, "button", 127);
|
|
549
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_25_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r28); const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.openShareDialog()); });
|
|
550
|
+
i0.ɵɵelement(1, "i", 82);
|
|
551
|
+
i0.ɵɵtext(2, " Share ");
|
|
538
552
|
i0.ɵɵelementEnd();
|
|
539
553
|
} }
|
|
540
|
-
function
|
|
554
|
+
function ListsBrowseResource_Conditional_25_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
541
555
|
const _r29 = i0.ɵɵgetCurrentView();
|
|
542
|
-
i0.ɵɵ
|
|
543
|
-
i0.ɵɵ
|
|
544
|
-
i0.ɵɵ
|
|
545
|
-
i0.ɵɵ
|
|
546
|
-
i0.ɵɵ
|
|
547
|
-
i0.ɵɵ
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
i0.ɵɵ
|
|
551
|
-
i0.ɵɵ
|
|
552
|
-
i0.ɵɵ
|
|
553
|
-
i0.ɵɵ
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
i0.ɵɵ
|
|
557
|
-
i0.ɵɵ
|
|
558
|
-
i0.ɵɵ
|
|
559
|
-
i0.ɵɵ
|
|
560
|
-
i0.ɵɵ
|
|
561
|
-
i0.ɵɵ
|
|
562
|
-
i0.ɵɵ
|
|
556
|
+
i0.ɵɵelement(0, "div", 131);
|
|
557
|
+
i0.ɵɵelementStart(1, "button", 132);
|
|
558
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_25_Conditional_6_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r29); const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.confirmDeleteList()); });
|
|
559
|
+
i0.ɵɵelement(2, "i", 133);
|
|
560
|
+
i0.ɵɵtext(3, " Delete ");
|
|
561
|
+
i0.ɵɵelementEnd();
|
|
562
|
+
} }
|
|
563
|
+
function ListsBrowseResource_Conditional_25_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
564
|
+
i0.ɵɵelementStart(0, "div", 129);
|
|
565
|
+
i0.ɵɵelement(1, "i", 134);
|
|
566
|
+
i0.ɵɵtext(2, " Viewer access \u2014 read only ");
|
|
567
|
+
i0.ɵɵelementEnd();
|
|
568
|
+
} }
|
|
569
|
+
function ListsBrowseResource_Conditional_25_Template(rf, ctx) { if (rf & 1) {
|
|
570
|
+
const _r26 = i0.ɵɵgetCurrentView();
|
|
571
|
+
i0.ɵɵelementStart(0, "div", 125);
|
|
572
|
+
i0.ɵɵconditionalCreate(1, ListsBrowseResource_Conditional_25_Conditional_1_Template, 3, 0, "button", 126);
|
|
573
|
+
i0.ɵɵconditionalCreate(2, ListsBrowseResource_Conditional_25_Conditional_2_Template, 3, 0, "button", 126);
|
|
574
|
+
i0.ɵɵelementStart(3, "button", 127);
|
|
575
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_25_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r26); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.duplicateList()); });
|
|
576
|
+
i0.ɵɵelement(4, "i", 128);
|
|
577
|
+
i0.ɵɵtext(5, " Duplicate ");
|
|
578
|
+
i0.ɵɵelementEnd();
|
|
579
|
+
i0.ɵɵconditionalCreate(6, ListsBrowseResource_Conditional_25_Conditional_6_Template, 4, 0);
|
|
580
|
+
i0.ɵɵconditionalCreate(7, ListsBrowseResource_Conditional_25_Conditional_7_Template, 3, 0, "div", 129);
|
|
581
|
+
i0.ɵɵelementEnd();
|
|
563
582
|
} if (rf & 2) {
|
|
564
|
-
const
|
|
565
|
-
i0.ɵɵstyleProp("top",
|
|
583
|
+
const ctx_r4 = i0.ɵɵnextContext();
|
|
584
|
+
i0.ɵɵstyleProp("top", ctx_r4.contextMenuY, "px")("left", ctx_r4.contextMenuX, "px");
|
|
585
|
+
i0.ɵɵadvance();
|
|
586
|
+
i0.ɵɵconditional(ctx_r4.contextItemCapabilities.CanEdit ? 1 : -1);
|
|
587
|
+
i0.ɵɵadvance();
|
|
588
|
+
i0.ɵɵconditional(ctx_r4.contextItemCapabilities.CanShare ? 2 : -1);
|
|
589
|
+
i0.ɵɵadvance(4);
|
|
590
|
+
i0.ɵɵconditional(ctx_r4.contextItemCapabilities.CanDelete ? 6 : -1);
|
|
591
|
+
i0.ɵɵadvance();
|
|
592
|
+
i0.ɵɵconditional(!ctx_r4.contextItemCapabilities.CanEdit && !ctx_r4.contextItemCapabilities.CanShare && !ctx_r4.contextItemCapabilities.CanDelete ? 7 : -1);
|
|
566
593
|
} }
|
|
567
|
-
function
|
|
594
|
+
function ListsBrowseResource_Conditional_26_Template(rf, ctx) { if (rf & 1) {
|
|
568
595
|
const _r30 = i0.ɵɵgetCurrentView();
|
|
569
|
-
i0.ɵɵelementStart(0, "div",
|
|
570
|
-
i0.ɵɵlistener("click", function
|
|
596
|
+
i0.ɵɵelementStart(0, "div", 135);
|
|
597
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_26_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r30); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeCreateDialog()); });
|
|
571
598
|
i0.ɵɵelementEnd();
|
|
572
599
|
} }
|
|
573
|
-
function
|
|
600
|
+
function ListsBrowseResource_Conditional_27_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
574
601
|
const _r32 = i0.ɵɵgetCurrentView();
|
|
575
|
-
i0.ɵɵelementStart(0, "div",
|
|
602
|
+
i0.ɵɵelementStart(0, "div", 140)(1, "label");
|
|
576
603
|
i0.ɵɵtext(2, "Entity *");
|
|
577
604
|
i0.ɵɵelementEnd();
|
|
578
|
-
i0.ɵɵelementStart(3, "div",
|
|
579
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
580
|
-
i0.ɵɵlistener("ngModelChange", function
|
|
605
|
+
i0.ɵɵelementStart(3, "div", 149)(4, "input", 150, 1);
|
|
606
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_27_Conditional_15_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r32); const ctx_r4 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r4.entitySearchTerm, $event) || (ctx_r4.entitySearchTerm = $event); return i0.ɵɵresetView($event); });
|
|
607
|
+
i0.ɵɵlistener("ngModelChange", function ListsBrowseResource_Conditional_27_Conditional_15_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r32); const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.filterEntities($event)); })("focus", function ListsBrowseResource_Conditional_27_Conditional_15_Template_input_focus_4_listener() { i0.ɵɵrestoreView(_r32); const entityInput_r33 = i0.ɵɵreference(5); const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.openEntityDropdown(entityInput_r33)); });
|
|
581
608
|
i0.ɵɵelementEnd()()();
|
|
582
609
|
} if (rf & 2) {
|
|
583
|
-
const
|
|
610
|
+
const ctx_r4 = i0.ɵɵnextContext(2);
|
|
584
611
|
i0.ɵɵadvance(4);
|
|
585
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
612
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r4.entitySearchTerm);
|
|
586
613
|
} }
|
|
587
|
-
function
|
|
588
|
-
i0.ɵɵelementStart(0, "div",
|
|
614
|
+
function ListsBrowseResource_Conditional_27_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
615
|
+
i0.ɵɵelementStart(0, "div", 140)(1, "label");
|
|
589
616
|
i0.ɵɵtext(2, "Entity");
|
|
590
617
|
i0.ɵɵelementEnd();
|
|
591
|
-
i0.ɵɵelement(3, "input",
|
|
618
|
+
i0.ɵɵelement(3, "input", 151);
|
|
592
619
|
i0.ɵɵelementEnd();
|
|
593
620
|
} if (rf & 2) {
|
|
594
|
-
const
|
|
621
|
+
const ctx_r4 = i0.ɵɵnextContext(2);
|
|
595
622
|
i0.ɵɵadvance(3);
|
|
596
|
-
i0.ɵɵproperty("value",
|
|
623
|
+
i0.ɵɵproperty("value", ctx_r4.entitySearchTerm);
|
|
597
624
|
} }
|
|
598
|
-
function
|
|
599
|
-
i0.ɵɵelementStart(0, "option",
|
|
625
|
+
function ListsBrowseResource_Conditional_27_For_24_Template(rf, ctx) { if (rf & 1) {
|
|
626
|
+
i0.ɵɵelementStart(0, "option", 144);
|
|
600
627
|
i0.ɵɵtext(1);
|
|
601
628
|
i0.ɵɵelementEnd();
|
|
602
629
|
} if (rf & 2) {
|
|
@@ -605,168 +632,202 @@ function ListsBrowseResource_Conditional_40_For_24_Template(rf, ctx) { if (rf &
|
|
|
605
632
|
i0.ɵɵadvance();
|
|
606
633
|
i0.ɵɵtextInterpolate(cat_r34.displayName);
|
|
607
634
|
} }
|
|
608
|
-
function
|
|
609
|
-
i0.ɵɵelement(0, "i",
|
|
635
|
+
function ListsBrowseResource_Conditional_27_Conditional_27_Template(rf, ctx) { if (rf & 1) {
|
|
636
|
+
i0.ɵɵelement(0, "i", 147);
|
|
610
637
|
} }
|
|
611
|
-
function
|
|
638
|
+
function ListsBrowseResource_Conditional_27_Template(rf, ctx) { if (rf & 1) {
|
|
612
639
|
const _r31 = i0.ɵɵgetCurrentView();
|
|
613
|
-
i0.ɵɵelementStart(0, "div",
|
|
640
|
+
i0.ɵɵelementStart(0, "div", 22)(1, "div", 136)(2, "h3");
|
|
614
641
|
i0.ɵɵtext(3);
|
|
615
642
|
i0.ɵɵelementEnd();
|
|
616
|
-
i0.ɵɵelementStart(4, "button",
|
|
617
|
-
i0.ɵɵlistener("click", function
|
|
618
|
-
i0.ɵɵelement(5, "i",
|
|
643
|
+
i0.ɵɵelementStart(4, "button", 137);
|
|
644
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_27_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r31); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeCreateDialog()); });
|
|
645
|
+
i0.ɵɵelement(5, "i", 138);
|
|
619
646
|
i0.ɵɵelementEnd()();
|
|
620
|
-
i0.ɵɵelementStart(6, "div",
|
|
647
|
+
i0.ɵɵelementStart(6, "div", 139)(7, "div", 140)(8, "label");
|
|
621
648
|
i0.ɵɵtext(9, "Name *");
|
|
622
649
|
i0.ɵɵelementEnd();
|
|
623
|
-
i0.ɵɵelementStart(10, "input",
|
|
624
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
650
|
+
i0.ɵɵelementStart(10, "input", 141);
|
|
651
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_27_Template_input_ngModelChange_10_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r4 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r4.newListName, $event) || (ctx_r4.newListName = $event); return i0.ɵɵresetView($event); });
|
|
625
652
|
i0.ɵɵelementEnd()();
|
|
626
|
-
i0.ɵɵelementStart(11, "div",
|
|
653
|
+
i0.ɵɵelementStart(11, "div", 140)(12, "label");
|
|
627
654
|
i0.ɵɵtext(13, "Description");
|
|
628
655
|
i0.ɵɵelementEnd();
|
|
629
|
-
i0.ɵɵelementStart(14, "textarea",
|
|
630
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
656
|
+
i0.ɵɵelementStart(14, "textarea", 142);
|
|
657
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_27_Template_textarea_ngModelChange_14_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r4 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r4.newListDescription, $event) || (ctx_r4.newListDescription = $event); return i0.ɵɵresetView($event); });
|
|
631
658
|
i0.ɵɵelementEnd()();
|
|
632
|
-
i0.ɵɵconditionalCreate(15,
|
|
633
|
-
i0.ɵɵconditionalCreate(16,
|
|
634
|
-
i0.ɵɵelementStart(17, "div",
|
|
659
|
+
i0.ɵɵconditionalCreate(15, ListsBrowseResource_Conditional_27_Conditional_15_Template, 6, 1, "div", 140);
|
|
660
|
+
i0.ɵɵconditionalCreate(16, ListsBrowseResource_Conditional_27_Conditional_16_Template, 4, 1, "div", 140);
|
|
661
|
+
i0.ɵɵelementStart(17, "div", 140)(18, "label");
|
|
635
662
|
i0.ɵɵtext(19, "Category");
|
|
636
663
|
i0.ɵɵelementEnd();
|
|
637
|
-
i0.ɵɵelementStart(20, "select",
|
|
638
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
639
|
-
i0.ɵɵelementStart(21, "option",
|
|
664
|
+
i0.ɵɵelementStart(20, "select", 143);
|
|
665
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_27_Template_select_ngModelChange_20_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r4 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r4.selectedCategoryId, $event) || (ctx_r4.selectedCategoryId = $event); return i0.ɵɵresetView($event); });
|
|
666
|
+
i0.ɵɵelementStart(21, "option", 144);
|
|
640
667
|
i0.ɵɵtext(22, "No category");
|
|
641
668
|
i0.ɵɵelementEnd();
|
|
642
|
-
i0.ɵɵrepeaterCreate(23,
|
|
669
|
+
i0.ɵɵrepeaterCreate(23, ListsBrowseResource_Conditional_27_For_24_Template, 2, 2, "option", 144, i0.ɵɵrepeaterTrackByIdentity);
|
|
643
670
|
i0.ɵɵelementEnd()()();
|
|
644
|
-
i0.ɵɵelementStart(25, "div",
|
|
645
|
-
i0.ɵɵlistener("click", function
|
|
646
|
-
i0.ɵɵconditionalCreate(27,
|
|
671
|
+
i0.ɵɵelementStart(25, "div", 145)(26, "button", 146);
|
|
672
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_27_Template_button_click_26_listener() { i0.ɵɵrestoreView(_r31); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.saveList()); });
|
|
673
|
+
i0.ɵɵconditionalCreate(27, ListsBrowseResource_Conditional_27_Conditional_27_Template, 1, 0, "i", 147);
|
|
647
674
|
i0.ɵɵtext(28);
|
|
648
675
|
i0.ɵɵelementEnd();
|
|
649
|
-
i0.ɵɵelementStart(29, "button",
|
|
650
|
-
i0.ɵɵlistener("click", function
|
|
676
|
+
i0.ɵɵelementStart(29, "button", 148);
|
|
677
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_27_Template_button_click_29_listener() { i0.ɵɵrestoreView(_r31); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeCreateDialog()); });
|
|
651
678
|
i0.ɵɵtext(30, "Cancel");
|
|
652
679
|
i0.ɵɵelementEnd()()();
|
|
653
680
|
} if (rf & 2) {
|
|
654
|
-
const
|
|
681
|
+
const ctx_r4 = i0.ɵɵnextContext();
|
|
655
682
|
i0.ɵɵadvance(3);
|
|
656
|
-
i0.ɵɵtextInterpolate(
|
|
683
|
+
i0.ɵɵtextInterpolate(ctx_r4.editingList ? "Edit List" : "Create New List");
|
|
657
684
|
i0.ɵɵadvance(7);
|
|
658
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
685
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r4.newListName);
|
|
659
686
|
i0.ɵɵadvance(4);
|
|
660
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
687
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r4.newListDescription);
|
|
661
688
|
i0.ɵɵadvance();
|
|
662
|
-
i0.ɵɵconditional(!
|
|
689
|
+
i0.ɵɵconditional(!ctx_r4.editingList ? 15 : -1);
|
|
663
690
|
i0.ɵɵadvance();
|
|
664
|
-
i0.ɵɵconditional(
|
|
691
|
+
i0.ɵɵconditional(ctx_r4.editingList ? 16 : -1);
|
|
665
692
|
i0.ɵɵadvance(4);
|
|
666
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
693
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r4.selectedCategoryId);
|
|
667
694
|
i0.ɵɵadvance();
|
|
668
695
|
i0.ɵɵproperty("ngValue", null);
|
|
669
696
|
i0.ɵɵadvance(2);
|
|
670
|
-
i0.ɵɵrepeater(
|
|
697
|
+
i0.ɵɵrepeater(ctx_r4.flatCategories);
|
|
671
698
|
i0.ɵɵadvance(3);
|
|
672
|
-
i0.ɵɵproperty("disabled", !
|
|
699
|
+
i0.ɵɵproperty("disabled", !ctx_r4.newListName || !ctx_r4.editingList && !ctx_r4.selectedEntityId || ctx_r4.isSaving);
|
|
673
700
|
i0.ɵɵadvance();
|
|
674
|
-
i0.ɵɵconditional(
|
|
701
|
+
i0.ɵɵconditional(ctx_r4.isSaving ? 27 : -1);
|
|
675
702
|
i0.ɵɵadvance();
|
|
676
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
703
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r4.isSaving ? "Saving..." : ctx_r4.editingList ? "Save" : "Create", " ");
|
|
677
704
|
i0.ɵɵadvance();
|
|
678
|
-
i0.ɵɵproperty("disabled",
|
|
705
|
+
i0.ɵɵproperty("disabled", ctx_r4.isSaving);
|
|
679
706
|
} }
|
|
680
|
-
function
|
|
707
|
+
function ListsBrowseResource_Conditional_28_Template(rf, ctx) { if (rf & 1) {
|
|
681
708
|
const _r35 = i0.ɵɵgetCurrentView();
|
|
682
|
-
i0.ɵɵelementStart(0, "div",
|
|
683
|
-
i0.ɵɵlistener("click", function
|
|
709
|
+
i0.ɵɵelementStart(0, "div", 135);
|
|
710
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_28_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r35); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.cancelDelete()); });
|
|
684
711
|
i0.ɵɵelementEnd();
|
|
685
712
|
} }
|
|
686
|
-
function
|
|
687
|
-
i0.ɵɵelement(0, "i",
|
|
713
|
+
function ListsBrowseResource_Conditional_29_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
714
|
+
i0.ɵɵelement(0, "i", 147);
|
|
688
715
|
} }
|
|
689
|
-
function
|
|
716
|
+
function ListsBrowseResource_Conditional_29_Template(rf, ctx) { if (rf & 1) {
|
|
690
717
|
const _r36 = i0.ɵɵgetCurrentView();
|
|
691
|
-
i0.ɵɵelementStart(0, "div",
|
|
718
|
+
i0.ɵɵelementStart(0, "div", 23)(1, "div", 136)(2, "h3");
|
|
692
719
|
i0.ɵɵtext(3, "Delete List");
|
|
693
720
|
i0.ɵɵelementEnd();
|
|
694
|
-
i0.ɵɵelementStart(4, "button",
|
|
695
|
-
i0.ɵɵlistener("click", function
|
|
696
|
-
i0.ɵɵelement(5, "i",
|
|
721
|
+
i0.ɵɵelementStart(4, "button", 137);
|
|
722
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_29_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r36); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.cancelDelete()); });
|
|
723
|
+
i0.ɵɵelement(5, "i", 138);
|
|
697
724
|
i0.ɵɵelementEnd()();
|
|
698
|
-
i0.ɵɵelementStart(6, "div",
|
|
725
|
+
i0.ɵɵelementStart(6, "div", 139)(7, "p");
|
|
699
726
|
i0.ɵɵtext(8, "Are you sure you want to delete \"");
|
|
700
727
|
i0.ɵɵelementStart(9, "strong");
|
|
701
728
|
i0.ɵɵtext(10);
|
|
702
729
|
i0.ɵɵelementEnd();
|
|
703
730
|
i0.ɵɵtext(11, "\"?");
|
|
704
731
|
i0.ɵɵelementEnd();
|
|
705
|
-
i0.ɵɵelementStart(12, "p",
|
|
732
|
+
i0.ɵɵelementStart(12, "p", 152);
|
|
706
733
|
i0.ɵɵtext(13, "This will also remove all items in the list.");
|
|
707
734
|
i0.ɵɵelementEnd()();
|
|
708
|
-
i0.ɵɵelementStart(14, "div",
|
|
709
|
-
i0.ɵɵlistener("click", function
|
|
710
|
-
i0.ɵɵconditionalCreate(16,
|
|
735
|
+
i0.ɵɵelementStart(14, "div", 145)(15, "button", 153);
|
|
736
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_29_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r36); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.deleteList()); });
|
|
737
|
+
i0.ɵɵconditionalCreate(16, ListsBrowseResource_Conditional_29_Conditional_16_Template, 1, 0, "i", 147);
|
|
711
738
|
i0.ɵɵtext(17);
|
|
712
739
|
i0.ɵɵelementEnd();
|
|
713
|
-
i0.ɵɵelementStart(18, "button",
|
|
714
|
-
i0.ɵɵlistener("click", function
|
|
740
|
+
i0.ɵɵelementStart(18, "button", 148);
|
|
741
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_29_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r36); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.cancelDelete()); });
|
|
715
742
|
i0.ɵɵtext(19, "Cancel");
|
|
716
743
|
i0.ɵɵelementEnd()()();
|
|
717
744
|
} if (rf & 2) {
|
|
718
|
-
const
|
|
745
|
+
const ctx_r4 = i0.ɵɵnextContext();
|
|
719
746
|
i0.ɵɵadvance(10);
|
|
720
|
-
i0.ɵɵtextInterpolate(
|
|
747
|
+
i0.ɵɵtextInterpolate(ctx_r4.deleteListName);
|
|
721
748
|
i0.ɵɵadvance(5);
|
|
722
|
-
i0.ɵɵproperty("disabled",
|
|
749
|
+
i0.ɵɵproperty("disabled", ctx_r4.isDeleting);
|
|
723
750
|
i0.ɵɵadvance();
|
|
724
|
-
i0.ɵɵconditional(
|
|
751
|
+
i0.ɵɵconditional(ctx_r4.isDeleting ? 16 : -1);
|
|
725
752
|
i0.ɵɵadvance();
|
|
726
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
753
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r4.isDeleting ? "Deleting..." : "Delete", " ");
|
|
727
754
|
i0.ɵɵadvance();
|
|
728
|
-
i0.ɵɵproperty("disabled",
|
|
755
|
+
i0.ɵɵproperty("disabled", ctx_r4.isDeleting);
|
|
729
756
|
} }
|
|
730
|
-
function
|
|
757
|
+
function ListsBrowseResource_Conditional_30_Template(rf, ctx) { if (rf & 1) {
|
|
731
758
|
const _r37 = i0.ɵɵgetCurrentView();
|
|
732
|
-
i0.ɵɵelementStart(0, "mj-list-share-dialog",
|
|
733
|
-
i0.ɵɵlistener("complete", function
|
|
759
|
+
i0.ɵɵelementStart(0, "mj-list-share-dialog", 154);
|
|
760
|
+
i0.ɵɵlistener("complete", function ListsBrowseResource_Conditional_30_Template_mj_list_share_dialog_complete_0_listener($event) { i0.ɵɵrestoreView(_r37); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.onShareComplete($event)); })("cancel", function ListsBrowseResource_Conditional_30_Template_mj_list_share_dialog_cancel_0_listener() { i0.ɵɵrestoreView(_r37); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.onShareCancel()); })("manageInvitations", function ListsBrowseResource_Conditional_30_Template_mj_list_share_dialog_manageInvitations_0_listener() { i0.ɵɵrestoreView(_r37); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.onManageInvitations()); })("viewAuditLog", function ListsBrowseResource_Conditional_30_Template_mj_list_share_dialog_viewAuditLog_0_listener() { i0.ɵɵrestoreView(_r37); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.onViewAuditLog()); });
|
|
734
761
|
i0.ɵɵelementEnd();
|
|
735
762
|
} if (rf & 2) {
|
|
736
|
-
const
|
|
737
|
-
i0.ɵɵproperty("config",
|
|
763
|
+
const ctx_r4 = i0.ɵɵnextContext();
|
|
764
|
+
i0.ɵɵproperty("config", ctx_r4.shareDialogConfig)("visible", ctx_r4.showShareDialog);
|
|
738
765
|
} }
|
|
739
|
-
function
|
|
766
|
+
function ListsBrowseResource_Conditional_31_Template(rf, ctx) { if (rf & 1) {
|
|
740
767
|
const _r38 = i0.ɵɵgetCurrentView();
|
|
741
|
-
i0.ɵɵelementStart(0, "
|
|
742
|
-
i0.ɵɵlistener("
|
|
768
|
+
i0.ɵɵelementStart(0, "mj-dialog", 155);
|
|
769
|
+
i0.ɵɵlistener("Close", function ListsBrowseResource_Conditional_31_Template_mj_dialog_Close_0_listener() { i0.ɵɵrestoreView(_r38); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeInvitationsDialog()); });
|
|
770
|
+
i0.ɵɵelementStart(1, "div", 156);
|
|
771
|
+
i0.ɵɵelement(2, "mj-list-invitations", 157);
|
|
772
|
+
i0.ɵɵelementEnd();
|
|
773
|
+
i0.ɵɵelementStart(3, "mj-dialog-actions")(4, "button", 158);
|
|
774
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_31_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r38); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeInvitationsDialog()); });
|
|
775
|
+
i0.ɵɵtext(5, "Close");
|
|
776
|
+
i0.ɵɵelementEnd()()();
|
|
777
|
+
} if (rf & 2) {
|
|
778
|
+
const ctx_r4 = i0.ɵɵnextContext();
|
|
779
|
+
i0.ɵɵproperty("Visible", true)("Title", "Invitations \u2014 " + (ctx_r4.activeShareListName ?? "List"))("MinWidth", 640)("Width", 900)("Height", 640);
|
|
780
|
+
i0.ɵɵadvance(2);
|
|
781
|
+
i0.ɵɵproperty("Provider", ctx_r4.ProviderToUse)("ListID", ctx_r4.activeShareListId)("ListName", ctx_r4.activeShareListName);
|
|
782
|
+
} }
|
|
783
|
+
function ListsBrowseResource_Conditional_32_Template(rf, ctx) { if (rf & 1) {
|
|
784
|
+
const _r39 = i0.ɵɵgetCurrentView();
|
|
785
|
+
i0.ɵɵelementStart(0, "mj-dialog", 155);
|
|
786
|
+
i0.ɵɵlistener("Close", function ListsBrowseResource_Conditional_32_Template_mj_dialog_Close_0_listener() { i0.ɵɵrestoreView(_r39); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeAuditLogDialog()); });
|
|
787
|
+
i0.ɵɵelementStart(1, "div", 156);
|
|
788
|
+
i0.ɵɵelement(2, "mj-list-audit-log", 159);
|
|
789
|
+
i0.ɵɵelementEnd();
|
|
790
|
+
i0.ɵɵelementStart(3, "mj-dialog-actions")(4, "button", 158);
|
|
791
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_32_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r39); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeAuditLogDialog()); });
|
|
792
|
+
i0.ɵɵtext(5, "Close");
|
|
793
|
+
i0.ɵɵelementEnd()()();
|
|
794
|
+
} if (rf & 2) {
|
|
795
|
+
const ctx_r4 = i0.ɵɵnextContext();
|
|
796
|
+
i0.ɵɵproperty("Visible", true)("Title", "Audit Log \u2014 " + (ctx_r4.activeShareListName ?? "List"))("MinWidth", 720)("Width", 980)("Height", 680);
|
|
797
|
+
i0.ɵɵadvance(2);
|
|
798
|
+
i0.ɵɵproperty("Provider", ctx_r4.ProviderToUse)("ListID", ctx_r4.activeShareListId);
|
|
799
|
+
} }
|
|
800
|
+
function ListsBrowseResource_Conditional_33_For_3_Template(rf, ctx) { if (rf & 1) {
|
|
801
|
+
const _r40 = i0.ɵɵgetCurrentView();
|
|
802
|
+
i0.ɵɵelementStart(0, "div", 164);
|
|
803
|
+
i0.ɵɵlistener("mousedown", function ListsBrowseResource_Conditional_33_For_3_Template_div_mousedown_0_listener($event) { const entity_r41 = i0.ɵɵrestoreView(_r40).$implicit; const ctx_r4 = i0.ɵɵnextContext(2); ctx_r4.selectEntity(entity_r41); return i0.ɵɵresetView($event.preventDefault()); });
|
|
743
804
|
i0.ɵɵtext(1);
|
|
744
805
|
i0.ɵɵelementEnd();
|
|
745
806
|
} if (rf & 2) {
|
|
746
|
-
const
|
|
807
|
+
const entity_r41 = ctx.$implicit;
|
|
747
808
|
i0.ɵɵadvance();
|
|
748
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
809
|
+
i0.ɵɵtextInterpolate1(" ", entity_r41.Name, " ");
|
|
749
810
|
} }
|
|
750
|
-
function
|
|
751
|
-
i0.ɵɵelementStart(0, "div",
|
|
811
|
+
function ListsBrowseResource_Conditional_33_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
812
|
+
i0.ɵɵelementStart(0, "div", 163);
|
|
752
813
|
i0.ɵɵtext(1, " No entities found ");
|
|
753
814
|
i0.ɵɵelementEnd();
|
|
754
815
|
} }
|
|
755
|
-
function
|
|
756
|
-
i0.ɵɵelementStart(0, "div",
|
|
757
|
-
i0.ɵɵrepeaterCreate(2,
|
|
758
|
-
i0.ɵɵconditionalCreate(4,
|
|
816
|
+
function ListsBrowseResource_Conditional_33_Template(rf, ctx) { if (rf & 1) {
|
|
817
|
+
i0.ɵɵelementStart(0, "div", 160)(1, "div", 161);
|
|
818
|
+
i0.ɵɵrepeaterCreate(2, ListsBrowseResource_Conditional_33_For_3_Template, 2, 1, "div", 162, i0.ɵɵrepeaterTrackByIdentity);
|
|
819
|
+
i0.ɵɵconditionalCreate(4, ListsBrowseResource_Conditional_33_Conditional_4_Template, 2, 0, "div", 163);
|
|
759
820
|
i0.ɵɵelementEnd()();
|
|
760
821
|
} if (rf & 2) {
|
|
761
|
-
const
|
|
762
|
-
i0.ɵɵstyleProp("top",
|
|
763
|
-
i0.ɵɵclassProp("dropdown-above",
|
|
822
|
+
const ctx_r4 = i0.ɵɵnextContext();
|
|
823
|
+
i0.ɵɵstyleProp("top", ctx_r4.entityDropdownPosition.top, "px")("left", ctx_r4.entityDropdownPosition.left, "px")("width", ctx_r4.entityDropdownPosition.width, "px");
|
|
824
|
+
i0.ɵɵclassProp("dropdown-above", ctx_r4.entityDropdownPosition.openAbove);
|
|
764
825
|
i0.ɵɵadvance();
|
|
765
|
-
i0.ɵɵclassProp("open-above",
|
|
826
|
+
i0.ɵɵclassProp("open-above", ctx_r4.entityDropdownPosition.openAbove);
|
|
766
827
|
i0.ɵɵadvance();
|
|
767
|
-
i0.ɵɵrepeater(
|
|
828
|
+
i0.ɵɵrepeater(ctx_r4.filteredEntitiesList);
|
|
768
829
|
i0.ɵɵadvance(2);
|
|
769
|
-
i0.ɵɵconditional(
|
|
830
|
+
i0.ɵɵconditional(ctx_r4.filteredEntitiesList.length === 0 ? 4 : -1);
|
|
770
831
|
} }
|
|
771
832
|
let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponent {
|
|
772
833
|
cdr;
|
|
@@ -781,6 +842,27 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
781
842
|
selectedEntity = 'all';
|
|
782
843
|
selectedOwner = 'mine';
|
|
783
844
|
selectedSort = 'name';
|
|
845
|
+
/**
|
|
846
|
+
* Active tag filters (Phase 4.3). Multi-tag = AND — a list must have
|
|
847
|
+
* every active tag to appear. URL state mirrors this via the `tags`
|
|
848
|
+
* query param (comma-separated tag IDs).
|
|
849
|
+
*/
|
|
850
|
+
tagFilters = [];
|
|
851
|
+
/**
|
|
852
|
+
* Set of List IDs that match the current `tagFilters` (intersection).
|
|
853
|
+
* `null` means "no tag filter active" — pass-through. Populated by
|
|
854
|
+
* `recomputeTagMembership` whenever `tagFilters` changes; consumed by
|
|
855
|
+
* `applyFilters` to narrow the visible list.
|
|
856
|
+
*/
|
|
857
|
+
tagFilteredListIds = null;
|
|
858
|
+
/**
|
|
859
|
+
* Favorite-list IDs for the current user (Phase 5.3). Backed by the
|
|
860
|
+
* existing `MJ: User Favorites` entity. `null` while loading; a Set
|
|
861
|
+
* once populated so card-side toggling is O(1).
|
|
862
|
+
*/
|
|
863
|
+
favoriteListIds = new Set();
|
|
864
|
+
/** When true, only favorited lists appear in the grid. */
|
|
865
|
+
showOnlyFavorites = false;
|
|
784
866
|
allLists = [];
|
|
785
867
|
filteredLists = [];
|
|
786
868
|
categories = [];
|
|
@@ -825,6 +907,29 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
825
907
|
// Sharing dialog state
|
|
826
908
|
showShareDialog = false;
|
|
827
909
|
shareDialogConfig = null;
|
|
910
|
+
// Viewer-perspective gating (Phase 2.8). Capabilities are computed
|
|
911
|
+
// lazily when the user opens the context menu — running per-card
|
|
912
|
+
// would mean N permission-resolve calls per browse render. The
|
|
913
|
+
// resolved level is cached on the item so re-opening the same menu
|
|
914
|
+
// doesn't refetch.
|
|
915
|
+
contextItemCapabilities = CapabilitiesForLevel('Owner');
|
|
916
|
+
capabilityCache = new Map();
|
|
917
|
+
// Tracks whether the in-memory categories list is known-stale
|
|
918
|
+
// relative to the DB. Flipped to true by the BaseEntity event
|
|
919
|
+
// subscription whenever any `MJ: List Categories` row is saved or
|
|
920
|
+
// deleted (most often from the Categories tab next door). Reset to
|
|
921
|
+
// false after `refreshCategoriesForDialog` reloads. Initial true so
|
|
922
|
+
// the first dialog open always populates from a fresh fetch.
|
|
923
|
+
categoriesDirty = true;
|
|
924
|
+
// Invitations / audit log dialogs (mockups 16, 18) — opened from
|
|
925
|
+
// the share dialog. Each dialog binds to a single list at a time,
|
|
926
|
+
// tracked by `activeShareListId`/`activeShareListName` lifted from
|
|
927
|
+
// shareDialogConfig at open time so we keep the context after the
|
|
928
|
+
// share dialog closes.
|
|
929
|
+
showInvitationsDialog = false;
|
|
930
|
+
showAuditLogDialog = false;
|
|
931
|
+
activeShareListId = null;
|
|
932
|
+
activeShareListName = null;
|
|
828
933
|
entityColorMap = new Map();
|
|
829
934
|
entityIconMap = new Map();
|
|
830
935
|
categoryMap = new Map();
|
|
@@ -861,9 +966,38 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
861
966
|
}
|
|
862
967
|
async ngOnInit() {
|
|
863
968
|
super.ngOnInit();
|
|
969
|
+
this.subscribeToCategoryChanges();
|
|
864
970
|
await this.loadData();
|
|
865
971
|
this.NotifyLoadComplete();
|
|
866
972
|
}
|
|
973
|
+
/**
|
|
974
|
+
* Mark the in-memory categories list dirty whenever any BaseEntity
|
|
975
|
+
* raises a save / delete event for `MJ: List Categories`. The
|
|
976
|
+
* Create/Edit dialog uses this flag to skip the per-open RunView
|
|
977
|
+
* unless something has actually changed since last load — keeps the
|
|
978
|
+
* dialog snappy without showing stale categories.
|
|
979
|
+
*
|
|
980
|
+
* Subscribes to MJGlobal's event bus rather than wiring each
|
|
981
|
+
* category entity's per-instance listener, because the Categories
|
|
982
|
+
* tab creates fresh BaseEntity instances we can't see from here.
|
|
983
|
+
*/
|
|
984
|
+
subscribeToCategoryChanges() {
|
|
985
|
+
MJGlobal.Instance.GetEventListener()
|
|
986
|
+
.pipe(takeUntil(this.destroy$))
|
|
987
|
+
.subscribe((mjEvt) => {
|
|
988
|
+
if (mjEvt.eventCode !== BaseEntity.BaseEventCode)
|
|
989
|
+
return;
|
|
990
|
+
const beEvt = mjEvt.args;
|
|
991
|
+
if (!beEvt)
|
|
992
|
+
return;
|
|
993
|
+
const entityName = beEvt.baseEntity?.EntityInfo.Name ?? beEvt.entityName;
|
|
994
|
+
if (entityName !== 'MJ: List Categories')
|
|
995
|
+
return;
|
|
996
|
+
if (beEvt.type === 'save' || beEvt.type === 'delete') {
|
|
997
|
+
this.categoriesDirty = true;
|
|
998
|
+
}
|
|
999
|
+
});
|
|
1000
|
+
}
|
|
867
1001
|
ngOnDestroy() {
|
|
868
1002
|
super.ngOnDestroy();
|
|
869
1003
|
this.destroy$.next();
|
|
@@ -875,12 +1009,17 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
875
1009
|
const md = this.ProviderToUse;
|
|
876
1010
|
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
877
1011
|
this.currentUserId = md.CurrentUser?.ID || '';
|
|
878
|
-
//
|
|
1012
|
+
// BypassCache on Lists + List Details: after a delete/duplicate, the
|
|
1013
|
+
// RunView cache for these entities doesn't always reflect the latest
|
|
1014
|
+
// state in time (event-driven invalidation races the immediate
|
|
1015
|
+
// refresh). Trading a small perf hit for correctness here is worth
|
|
1016
|
+
// it — categories and users stay cache-warm.
|
|
879
1017
|
const [listsResult, categoriesResult, detailsResult, usersResult] = await rv.RunViews([
|
|
880
1018
|
{
|
|
881
1019
|
EntityName: 'MJ: Lists',
|
|
882
1020
|
OrderBy: 'Name',
|
|
883
|
-
ResultType: 'entity_object'
|
|
1021
|
+
ResultType: 'entity_object',
|
|
1022
|
+
BypassCache: true
|
|
884
1023
|
},
|
|
885
1024
|
{
|
|
886
1025
|
EntityName: 'MJ: List Categories',
|
|
@@ -890,7 +1029,8 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
890
1029
|
{
|
|
891
1030
|
EntityName: 'MJ: List Details',
|
|
892
1031
|
Fields: ['ListID'],
|
|
893
|
-
ResultType: 'simple'
|
|
1032
|
+
ResultType: 'simple',
|
|
1033
|
+
BypassCache: true
|
|
894
1034
|
},
|
|
895
1035
|
{
|
|
896
1036
|
EntityName: 'MJ: Users',
|
|
@@ -913,6 +1053,9 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
913
1053
|
}
|
|
914
1054
|
// Build flat categories for dropdown
|
|
915
1055
|
this.flatCategories = this.buildFlatCategories(this.categories);
|
|
1056
|
+
// loadData() already pulled fresh categories — clear the dirty
|
|
1057
|
+
// flag so the first dialog open doesn't redundantly refetch.
|
|
1058
|
+
this.categoriesDirty = false;
|
|
916
1059
|
// Build user map
|
|
917
1060
|
const userMap = new Map();
|
|
918
1061
|
for (const user of users) {
|
|
@@ -956,6 +1099,8 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
956
1099
|
];
|
|
957
1100
|
this.applyFilters();
|
|
958
1101
|
this.buildCategoryTree();
|
|
1102
|
+
// Load favorites in parallel — not critical-path, but cheap.
|
|
1103
|
+
void this.loadFavorites();
|
|
959
1104
|
// Load sharing info in the background
|
|
960
1105
|
this.loadSharingInfo();
|
|
961
1106
|
}
|
|
@@ -1029,7 +1174,61 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
1029
1174
|
setViewMode(mode) {
|
|
1030
1175
|
this.viewMode = mode;
|
|
1031
1176
|
}
|
|
1032
|
-
|
|
1177
|
+
/** View-mode options for the shared <mj-view-toggle>. */
|
|
1178
|
+
listViewOptions = [
|
|
1179
|
+
{ key: 'table', icon: 'fa-solid fa-table-list', title: 'Table view' },
|
|
1180
|
+
{ key: 'card', icon: 'fa-solid fa-grip', title: 'Card view' },
|
|
1181
|
+
{ key: 'hierarchy', icon: 'fa-solid fa-folder-tree', title: 'Category view' },
|
|
1182
|
+
];
|
|
1183
|
+
/** Values record consumed by the centralized <mj-filter-panel>. */
|
|
1184
|
+
get listFilterValues() {
|
|
1185
|
+
return { selectedOwner: this.selectedOwner, selectedEntity: this.selectedEntity };
|
|
1186
|
+
}
|
|
1187
|
+
/** Field config consumed by the centralized <mj-filter-panel>. */
|
|
1188
|
+
get listFilterFields() {
|
|
1189
|
+
return [
|
|
1190
|
+
{
|
|
1191
|
+
key: 'selectedOwner',
|
|
1192
|
+
type: 'dropdown',
|
|
1193
|
+
label: 'Owner',
|
|
1194
|
+
icon: 'fa-solid fa-user',
|
|
1195
|
+
options: this.ownerOptions.map(o => ({ text: o.name, value: o.value })),
|
|
1196
|
+
},
|
|
1197
|
+
{
|
|
1198
|
+
key: 'selectedEntity',
|
|
1199
|
+
type: 'dropdown',
|
|
1200
|
+
label: 'Entity',
|
|
1201
|
+
icon: 'fa-solid fa-table',
|
|
1202
|
+
filterable: this.entityOptions.length > 10,
|
|
1203
|
+
options: this.entityOptions.map(o => ({ text: o.name, value: o.value })),
|
|
1204
|
+
},
|
|
1205
|
+
];
|
|
1206
|
+
}
|
|
1207
|
+
/** Receive popover updates and apply them. */
|
|
1208
|
+
onFilterValuesChange(values) {
|
|
1209
|
+
this.selectedOwner = values['selectedOwner'] ?? 'mine';
|
|
1210
|
+
this.selectedEntity = values['selectedEntity'] ?? 'all';
|
|
1211
|
+
this.applyFilters();
|
|
1212
|
+
this.buildCategoryTree();
|
|
1213
|
+
}
|
|
1214
|
+
/** Reset popover filters to defaults; leaves searchTerm alone. */
|
|
1215
|
+
resetPopoverFilters() {
|
|
1216
|
+
this.selectedOwner = 'mine';
|
|
1217
|
+
this.selectedEntity = 'all';
|
|
1218
|
+
this.applyFilters();
|
|
1219
|
+
this.buildCategoryTree();
|
|
1220
|
+
}
|
|
1221
|
+
/** Active filter count for the popover badge (excludes searchTerm). */
|
|
1222
|
+
get ActiveFilterCount() {
|
|
1223
|
+
let n = 0;
|
|
1224
|
+
if (this.selectedOwner && this.selectedOwner !== 'mine')
|
|
1225
|
+
n++;
|
|
1226
|
+
if (this.selectedEntity && this.selectedEntity !== 'all')
|
|
1227
|
+
n++;
|
|
1228
|
+
return n;
|
|
1229
|
+
}
|
|
1230
|
+
onSearchChange(term) {
|
|
1231
|
+
this.searchTerm = term;
|
|
1033
1232
|
this.applyFilters();
|
|
1034
1233
|
this.buildCategoryTree();
|
|
1035
1234
|
}
|
|
@@ -1078,6 +1277,16 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
1078
1277
|
if (this.selectedEntity !== 'all') {
|
|
1079
1278
|
result = result.filter(item => item.entityName === this.selectedEntity);
|
|
1080
1279
|
}
|
|
1280
|
+
// Tag filter (Phase 4.3 — intersection of all active tags).
|
|
1281
|
+
if (this.tagFilteredListIds !== null) {
|
|
1282
|
+
const matches = this.tagFilteredListIds;
|
|
1283
|
+
result = result.filter(item => matches.has(item.list.ID));
|
|
1284
|
+
}
|
|
1285
|
+
// Favorites-only toggle (Phase 5.3).
|
|
1286
|
+
if (this.showOnlyFavorites) {
|
|
1287
|
+
const favs = this.favoriteListIds;
|
|
1288
|
+
result = result.filter(item => favs.has(item.list.ID));
|
|
1289
|
+
}
|
|
1081
1290
|
// Sort
|
|
1082
1291
|
switch (this.selectedSort) {
|
|
1083
1292
|
case 'name':
|
|
@@ -1145,14 +1354,215 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
1145
1354
|
const appId = this.Data?.Configuration?.applicationId || '';
|
|
1146
1355
|
this.tabService.OpenList(item.list.ID, item.list.Name, appId);
|
|
1147
1356
|
}
|
|
1357
|
+
/**
|
|
1358
|
+
* Handle a tag chip click on a list card — adds the tag to the
|
|
1359
|
+
* filter row (multi-tag = AND). Wired by Phase 4.3; the chip
|
|
1360
|
+
* component emits the (TagID, Name) pair so we can both display
|
|
1361
|
+
* the chip name and filter by ID.
|
|
1362
|
+
*/
|
|
1363
|
+
onCardTagClicked(payload) {
|
|
1364
|
+
if (this.tagFilters.some((f) => f.TagID === payload.TagID))
|
|
1365
|
+
return;
|
|
1366
|
+
this.tagFilters = [...this.tagFilters, payload];
|
|
1367
|
+
void this.recomputeTagMembership();
|
|
1368
|
+
}
|
|
1369
|
+
/** Remove a tag from the filter row. */
|
|
1370
|
+
removeTagFilter(tagId) {
|
|
1371
|
+
this.tagFilters = this.tagFilters.filter((f) => f.TagID !== tagId);
|
|
1372
|
+
void this.recomputeTagMembership();
|
|
1373
|
+
}
|
|
1374
|
+
/** Clear all active tag filters. */
|
|
1375
|
+
clearTagFilters() {
|
|
1376
|
+
this.tagFilters = [];
|
|
1377
|
+
this.tagFilteredListIds = null;
|
|
1378
|
+
this.applyFilters();
|
|
1379
|
+
}
|
|
1380
|
+
/**
|
|
1381
|
+
* Resolve which lists have ALL active tags. Done server-side so the
|
|
1382
|
+
* filter works regardless of which lists the user has scrolled past.
|
|
1383
|
+
* Result is cached on `tagFilteredListIds`; `applyFilters` consumes it.
|
|
1384
|
+
*/
|
|
1385
|
+
async recomputeTagMembership() {
|
|
1386
|
+
if (this.tagFilters.length === 0) {
|
|
1387
|
+
this.tagFilteredListIds = null;
|
|
1388
|
+
this.applyFilters();
|
|
1389
|
+
return;
|
|
1390
|
+
}
|
|
1391
|
+
try {
|
|
1392
|
+
const md = this.ProviderToUse;
|
|
1393
|
+
const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');
|
|
1394
|
+
if (!listsEntity) {
|
|
1395
|
+
this.tagFilteredListIds = new Set();
|
|
1396
|
+
this.applyFilters();
|
|
1397
|
+
return;
|
|
1398
|
+
}
|
|
1399
|
+
const tagIds = this.tagFilters.map((f) => `'${f.TagID}'`).join(',');
|
|
1400
|
+
const rv = RunView.FromMetadataProvider(md);
|
|
1401
|
+
const result = await rv.RunView({
|
|
1402
|
+
EntityName: 'MJ: Tagged Items',
|
|
1403
|
+
ExtraFilter: `EntityID='${listsEntity.ID}' AND TagID IN (${tagIds})`,
|
|
1404
|
+
Fields: ['RecordID', 'TagID'],
|
|
1405
|
+
ResultType: 'simple',
|
|
1406
|
+
});
|
|
1407
|
+
// Intersection: count tag hits per list, keep only those with
|
|
1408
|
+
// exactly `tagFilters.length` matches (one per required tag).
|
|
1409
|
+
const counts = new Map();
|
|
1410
|
+
for (const row of result.Results ?? []) {
|
|
1411
|
+
const id = String(row.RecordID);
|
|
1412
|
+
counts.set(id, (counts.get(id) ?? 0) + 1);
|
|
1413
|
+
}
|
|
1414
|
+
const required = this.tagFilters.length;
|
|
1415
|
+
const matches = new Set();
|
|
1416
|
+
for (const [id, count] of counts) {
|
|
1417
|
+
if (count >= required)
|
|
1418
|
+
matches.add(id);
|
|
1419
|
+
}
|
|
1420
|
+
this.tagFilteredListIds = matches;
|
|
1421
|
+
}
|
|
1422
|
+
catch (e) {
|
|
1423
|
+
// On failure, fall back to "no match" so the user sees an empty
|
|
1424
|
+
// state rather than every list — avoids leaking unfiltered data
|
|
1425
|
+
// when the filter intent failed silently.
|
|
1426
|
+
this.tagFilteredListIds = new Set();
|
|
1427
|
+
}
|
|
1428
|
+
this.applyFilters();
|
|
1429
|
+
}
|
|
1430
|
+
/**
|
|
1431
|
+
* Load the current user's favorite lists into `favoriteListIds`.
|
|
1432
|
+
* Cheap — typically <100 rows per user. Driven by the `MJ: User
|
|
1433
|
+
* Favorites` entity scoped by the Lists EntityID. Best-effort: on
|
|
1434
|
+
* failure the star icons just stay dim.
|
|
1435
|
+
*/
|
|
1436
|
+
async loadFavorites() {
|
|
1437
|
+
try {
|
|
1438
|
+
const md = this.ProviderToUse;
|
|
1439
|
+
const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');
|
|
1440
|
+
if (!listsEntity || !md.CurrentUser)
|
|
1441
|
+
return;
|
|
1442
|
+
const rv = RunView.FromMetadataProvider(md);
|
|
1443
|
+
const result = await rv.RunView({
|
|
1444
|
+
EntityName: 'MJ: User Favorites',
|
|
1445
|
+
ExtraFilter: `UserID='${md.CurrentUser.ID}' AND EntityID='${listsEntity.ID}'`,
|
|
1446
|
+
Fields: ['RecordID'],
|
|
1447
|
+
ResultType: 'simple',
|
|
1448
|
+
});
|
|
1449
|
+
this.favoriteListIds = new Set((result.Results ?? []).map((r) => String(r.RecordID)));
|
|
1450
|
+
}
|
|
1451
|
+
catch {
|
|
1452
|
+
// Silent — favorites are a polish feature, not load-bearing.
|
|
1453
|
+
this.favoriteListIds = new Set();
|
|
1454
|
+
}
|
|
1455
|
+
}
|
|
1456
|
+
/**
|
|
1457
|
+
* Toggle a list's favorite state. Optimistic: flips the local Set
|
|
1458
|
+
* first, then writes through. Reverts on failure.
|
|
1459
|
+
*/
|
|
1460
|
+
async toggleFavorite(event, item) {
|
|
1461
|
+
event.stopPropagation();
|
|
1462
|
+
const wasFav = this.favoriteListIds.has(item.list.ID);
|
|
1463
|
+
// Optimistic update.
|
|
1464
|
+
if (wasFav)
|
|
1465
|
+
this.favoriteListIds.delete(item.list.ID);
|
|
1466
|
+
else
|
|
1467
|
+
this.favoriteListIds.add(item.list.ID);
|
|
1468
|
+
// Re-trigger filter recompute since the favorites-only toggle
|
|
1469
|
+
// may be on.
|
|
1470
|
+
this.applyFilters();
|
|
1471
|
+
try {
|
|
1472
|
+
const md = this.ProviderToUse;
|
|
1473
|
+
const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');
|
|
1474
|
+
if (!listsEntity || !md.CurrentUser)
|
|
1475
|
+
throw new Error('Cannot resolve user favorites entity');
|
|
1476
|
+
if (wasFav) {
|
|
1477
|
+
// Find + delete the existing favorite row.
|
|
1478
|
+
const rv = RunView.FromMetadataProvider(md);
|
|
1479
|
+
const result = await rv.RunView({
|
|
1480
|
+
EntityName: 'MJ: User Favorites',
|
|
1481
|
+
ExtraFilter: `UserID='${md.CurrentUser.ID}' AND EntityID='${listsEntity.ID}' AND RecordID='${item.list.ID}'`,
|
|
1482
|
+
ResultType: 'entity_object',
|
|
1483
|
+
});
|
|
1484
|
+
for (const row of result.Results ?? [])
|
|
1485
|
+
await row.Delete();
|
|
1486
|
+
}
|
|
1487
|
+
else {
|
|
1488
|
+
const fav = await md.GetEntityObject('MJ: User Favorites', md.CurrentUser);
|
|
1489
|
+
fav.NewRecord();
|
|
1490
|
+
fav.UserID = md.CurrentUser.ID;
|
|
1491
|
+
fav.EntityID = listsEntity.ID;
|
|
1492
|
+
fav.RecordID = item.list.ID;
|
|
1493
|
+
await fav.Save();
|
|
1494
|
+
}
|
|
1495
|
+
}
|
|
1496
|
+
catch {
|
|
1497
|
+
// Revert on failure.
|
|
1498
|
+
if (wasFav)
|
|
1499
|
+
this.favoriteListIds.add(item.list.ID);
|
|
1500
|
+
else
|
|
1501
|
+
this.favoriteListIds.delete(item.list.ID);
|
|
1502
|
+
this.applyFilters();
|
|
1503
|
+
}
|
|
1504
|
+
}
|
|
1505
|
+
isFavorite(listId) {
|
|
1506
|
+
return this.favoriteListIds.has(listId);
|
|
1507
|
+
}
|
|
1508
|
+
toggleShowOnlyFavorites() {
|
|
1509
|
+
this.showOnlyFavorites = !this.showOnlyFavorites;
|
|
1510
|
+
this.applyFilters();
|
|
1511
|
+
}
|
|
1148
1512
|
openListMenu(event, item) {
|
|
1149
1513
|
event.stopPropagation();
|
|
1150
1514
|
const mouseEvent = event;
|
|
1151
1515
|
this.selectedContextItem = item;
|
|
1152
1516
|
this.contextMenuX = mouseEvent.clientX;
|
|
1153
1517
|
this.contextMenuY = mouseEvent.clientY;
|
|
1518
|
+
// Fast path: owners always have full capabilities. Avoid an extra
|
|
1519
|
+
// permission-resolve round trip for the common case.
|
|
1520
|
+
if (item.isOwner) {
|
|
1521
|
+
this.contextItemCapabilities = CapabilitiesForLevel('Owner');
|
|
1522
|
+
this.showContextMenu = true;
|
|
1523
|
+
return;
|
|
1524
|
+
}
|
|
1525
|
+
// Render the menu immediately with a conservative viewer-level cap
|
|
1526
|
+
// set, then refine via async resolve. The flicker is a single tick
|
|
1527
|
+
// — and viewers/editors stay correctly gated even if resolve fails.
|
|
1528
|
+
const cached = this.capabilityCache.get(item.list.ID);
|
|
1529
|
+
if (cached !== undefined) {
|
|
1530
|
+
this.contextItemCapabilities = CapabilitiesForLevel(cached);
|
|
1531
|
+
}
|
|
1532
|
+
else {
|
|
1533
|
+
this.contextItemCapabilities = CapabilitiesForLevel('View');
|
|
1534
|
+
void this.refineContextCapabilities(item.list.ID);
|
|
1535
|
+
}
|
|
1154
1536
|
this.showContextMenu = true;
|
|
1155
1537
|
}
|
|
1538
|
+
/** Resolve the current user's permission level for a list and update
|
|
1539
|
+
* the open context menu in place. Cached so re-opening the same menu
|
|
1540
|
+
* doesn't re-hit the resolver. */
|
|
1541
|
+
async refineContextCapabilities(listId) {
|
|
1542
|
+
try {
|
|
1543
|
+
const currentUserId = this.ProviderToUse.CurrentUser?.ID;
|
|
1544
|
+
if (!currentUserId) {
|
|
1545
|
+
// No user context — leave the conservative fallback in place.
|
|
1546
|
+
return;
|
|
1547
|
+
}
|
|
1548
|
+
// Go through the Angular sharing service rather than instantiating the
|
|
1549
|
+
// server-side `ListSharing` class directly. The service hits the GraphQL
|
|
1550
|
+
// surface, which is the only sanctioned client→server path; the server
|
|
1551
|
+
// package writes audit logs + permission rows that have no business
|
|
1552
|
+
// running in a browser bundle.
|
|
1553
|
+
const level = (await this.listSharingService.getUserPermissionLevel(listId, currentUserId));
|
|
1554
|
+
this.capabilityCache.set(listId, level);
|
|
1555
|
+
// Only mutate state if the user is still on this same menu — they
|
|
1556
|
+
// may have closed it before resolve finished.
|
|
1557
|
+
if (this.showContextMenu && this.selectedContextItem && UUIDsEqual(this.selectedContextItem.list.ID, listId)) {
|
|
1558
|
+
this.contextItemCapabilities = CapabilitiesForLevel(level);
|
|
1559
|
+
this.cdr.detectChanges();
|
|
1560
|
+
}
|
|
1561
|
+
}
|
|
1562
|
+
catch {
|
|
1563
|
+
// Conservative fallback already applied at menu open time.
|
|
1564
|
+
}
|
|
1565
|
+
}
|
|
1156
1566
|
closeContextMenu() {
|
|
1157
1567
|
this.showContextMenu = false;
|
|
1158
1568
|
this.selectedContextItem = null;
|
|
@@ -1166,6 +1576,10 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
1166
1576
|
this.selectedCategoryId = null;
|
|
1167
1577
|
this.showEntityDropdown = false;
|
|
1168
1578
|
this.showCreateDialog = true;
|
|
1579
|
+
// Refresh categories so newly-created ones appear without a page
|
|
1580
|
+
// reload. Cheap RunView; runs in the background while the user is
|
|
1581
|
+
// typing the list name.
|
|
1582
|
+
void this.refreshCategoriesForDialog();
|
|
1169
1583
|
}
|
|
1170
1584
|
editList() {
|
|
1171
1585
|
if (!this.selectedContextItem)
|
|
@@ -1177,8 +1591,49 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
1177
1591
|
this.selectedEntityId = list.EntityID;
|
|
1178
1592
|
this.entitySearchTerm = list.Entity || '';
|
|
1179
1593
|
this.selectedCategoryId = list.CategoryID || null;
|
|
1180
|
-
|
|
1594
|
+
// Ensure no stale state from a previous Create attempt — the entity
|
|
1595
|
+
// dropdown portal renders at z-index 10002 and could otherwise sit on
|
|
1596
|
+
// top of the edit dialog and block interaction.
|
|
1597
|
+
this.showEntityDropdown = false;
|
|
1598
|
+
// Close the context menu BEFORE opening the dialog. Doing it after
|
|
1599
|
+
// leaves a one-tick window where both the menu and the modal-overlay
|
|
1600
|
+
// are stacked, and the menu's outer click-overlay can swallow the
|
|
1601
|
+
// first click into the form fields below it.
|
|
1181
1602
|
this.closeContextMenu();
|
|
1603
|
+
this.showCreateDialog = true;
|
|
1604
|
+
this.cdr.detectChanges();
|
|
1605
|
+
void this.refreshCategoriesForDialog();
|
|
1606
|
+
}
|
|
1607
|
+
/** Re-pull MJ: List Categories so the dropdown reflects any
|
|
1608
|
+
* newly-created categories. Skips the round trip when nothing has
|
|
1609
|
+
* changed since the last load — `categoriesDirty` is flipped on
|
|
1610
|
+
* by the BaseEntity event subscription whenever a category row
|
|
1611
|
+
* is saved/deleted, so the only times this actually fetches are
|
|
1612
|
+
* (a) the first dialog open, and (b) after the user touched a
|
|
1613
|
+
* category somewhere else. */
|
|
1614
|
+
async refreshCategoriesForDialog() {
|
|
1615
|
+
if (!this.categoriesDirty)
|
|
1616
|
+
return;
|
|
1617
|
+
try {
|
|
1618
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
1619
|
+
const result = await rv.RunView({
|
|
1620
|
+
EntityName: 'MJ: List Categories',
|
|
1621
|
+
OrderBy: 'Name',
|
|
1622
|
+
ResultType: 'simple',
|
|
1623
|
+
});
|
|
1624
|
+
if (!result.Success)
|
|
1625
|
+
return;
|
|
1626
|
+
this.categories = (result.Results ?? []);
|
|
1627
|
+
this.categoryMap.clear();
|
|
1628
|
+
for (const cat of this.categories)
|
|
1629
|
+
this.categoryMap.set(cat.ID, cat);
|
|
1630
|
+
this.flatCategories = this.buildFlatCategories(this.categories);
|
|
1631
|
+
this.categoriesDirty = false;
|
|
1632
|
+
this.cdr.detectChanges();
|
|
1633
|
+
}
|
|
1634
|
+
catch {
|
|
1635
|
+
// Best-effort — the dialog still works with the previously-loaded list.
|
|
1636
|
+
}
|
|
1182
1637
|
}
|
|
1183
1638
|
selectEntity(entity) {
|
|
1184
1639
|
this.selectedEntityId = entity.ID;
|
|
@@ -1223,7 +1678,7 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
1223
1678
|
try {
|
|
1224
1679
|
const md = this.ProviderToUse;
|
|
1225
1680
|
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
1226
|
-
const newList = await md.GetEntityObject('MJ: Lists');
|
|
1681
|
+
const newList = await md.GetEntityObject('MJ: Lists', md.CurrentUser);
|
|
1227
1682
|
newList.Name = `${listToDuplicate.Name} (Copy)`;
|
|
1228
1683
|
newList.Description = listToDuplicate.Description;
|
|
1229
1684
|
newList.EntityID = listToDuplicate.EntityID;
|
|
@@ -1234,26 +1689,45 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
1234
1689
|
this.notificationService.CreateSimpleNotification('Failed to duplicate list', 'error', 4000);
|
|
1235
1690
|
return;
|
|
1236
1691
|
}
|
|
1692
|
+
// BypassCache to avoid any stale RunView cache that might mask members.
|
|
1693
|
+
// High MaxRows to cover large lists; entity_object so we have typed access.
|
|
1237
1694
|
const itemsResult = await rv.RunView({
|
|
1238
1695
|
EntityName: 'MJ: List Details',
|
|
1239
1696
|
ExtraFilter: `ListID = '${listToDuplicate.ID}'`,
|
|
1240
|
-
ResultType: 'entity_object'
|
|
1697
|
+
ResultType: 'entity_object',
|
|
1698
|
+
MaxRows: 100000,
|
|
1699
|
+
BypassCache: true
|
|
1241
1700
|
});
|
|
1242
|
-
if (itemsResult.Success
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1701
|
+
if (!itemsResult.Success) {
|
|
1702
|
+
console.error('Duplicate: failed to load source list members', itemsResult.ErrorMessage);
|
|
1703
|
+
this.notificationService.CreateSimpleNotification(`Could not load source list members: ${itemsResult.ErrorMessage || 'unknown'}`, 'error', 6000);
|
|
1704
|
+
return;
|
|
1705
|
+
}
|
|
1706
|
+
const sourceItems = itemsResult.Results ?? [];
|
|
1707
|
+
if (sourceItems.length === 0) {
|
|
1708
|
+
this.notificationService.CreateSimpleNotification('List duplicated (source had no records)', 'success', 3000);
|
|
1709
|
+
}
|
|
1710
|
+
else {
|
|
1711
|
+
// Batch all detail inserts into one transaction group so this is
|
|
1712
|
+
// a single round-trip instead of 1-per-row. All-or-nothing: if any
|
|
1713
|
+
// row fails server-side validation the whole group rolls back.
|
|
1714
|
+
const tg = await md.CreateTransactionGroup();
|
|
1715
|
+
for (const item of sourceItems) {
|
|
1716
|
+
const newItem = await md.GetEntityObject('MJ: List Details', md.CurrentUser);
|
|
1246
1717
|
newItem.ListID = newList.ID;
|
|
1247
1718
|
newItem.RecordID = item.RecordID;
|
|
1248
1719
|
newItem.Sequence = item.Sequence;
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1720
|
+
newItem.TransactionGroup = tg;
|
|
1721
|
+
await newItem.Save(); // queued into tg, not sent yet
|
|
1722
|
+
}
|
|
1723
|
+
const submitted = await tg.Submit();
|
|
1724
|
+
if (submitted) {
|
|
1725
|
+
this.notificationService.CreateSimpleNotification(`List duplicated with ${sourceItems.length} item${sourceItems.length !== 1 ? 's' : ''}`, 'success', 3000);
|
|
1726
|
+
}
|
|
1727
|
+
else {
|
|
1728
|
+
console.error('Duplicate: transaction group submit failed');
|
|
1729
|
+
this.notificationService.CreateSimpleNotification(`Duplicated list but failed to copy ${sourceItems.length} items — see console`, 'error', 6000);
|
|
1252
1730
|
}
|
|
1253
|
-
this.notificationService.CreateSimpleNotification(`List duplicated with ${copiedCount} item${copiedCount !== 1 ? 's' : ''}`, 'success', 3000);
|
|
1254
|
-
}
|
|
1255
|
-
else {
|
|
1256
|
-
this.notificationService.CreateSimpleNotification('List duplicated successfully', 'success', 3000);
|
|
1257
1731
|
}
|
|
1258
1732
|
await this.loadData();
|
|
1259
1733
|
}
|
|
@@ -1287,9 +1761,31 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
1287
1761
|
this.isDeleting = true;
|
|
1288
1762
|
this.cdr.detectChanges();
|
|
1289
1763
|
try {
|
|
1764
|
+
// spDeleteList doesn't cascade to MJ: List Details, so the FK
|
|
1765
|
+
// constraint (FK_ListDetail_List) blocks the delete if the list
|
|
1766
|
+
// has any members. Cascade-delete the details first in a
|
|
1767
|
+
// transaction group so the whole thing rolls back if any single
|
|
1768
|
+
// delete fails. The proper long-term fix is a migration that
|
|
1769
|
+
// adds ON DELETE CASCADE (or extends the SP); this keeps the UI
|
|
1770
|
+
// unblocked in the meantime.
|
|
1771
|
+
const cascadeOk = await this.cascadeDeleteListMembers(listToDelete.ID);
|
|
1772
|
+
if (!cascadeOk) {
|
|
1773
|
+
this.notificationService.CreateSimpleNotification(`Failed to delete list members for "${listName}" — list not deleted`, 'error', 6000);
|
|
1774
|
+
return;
|
|
1775
|
+
}
|
|
1290
1776
|
const deleted = await listToDelete.Delete();
|
|
1291
1777
|
if (deleted) {
|
|
1292
1778
|
this.notificationService.CreateSimpleNotification(`"${listName}" deleted`, 'success', 3000);
|
|
1779
|
+
// Optimistic removal from local state so the card disappears
|
|
1780
|
+
// immediately. Without this, the user sees the just-deleted list
|
|
1781
|
+
// until loadData() rebuilds — and worse, can click Delete on it
|
|
1782
|
+
// again (which hangs because the in-memory entity still has the
|
|
1783
|
+
// now-deleted record's ID).
|
|
1784
|
+
const deletedId = listToDelete.ID;
|
|
1785
|
+
this.allLists = this.allLists.filter(item => !UUIDsEqual(item.list.ID, deletedId));
|
|
1786
|
+
this.applyFilters();
|
|
1787
|
+
this.buildCategoryTree();
|
|
1788
|
+
this.cdr.detectChanges();
|
|
1293
1789
|
}
|
|
1294
1790
|
else {
|
|
1295
1791
|
const errorMessage = listToDelete.LatestResult?.Message || 'Unknown error occurred';
|
|
@@ -1297,7 +1793,10 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
1297
1793
|
this.notificationService.CreateSimpleNotification(`Failed to delete list: ${errorMessage}`, 'error', 6000);
|
|
1298
1794
|
}
|
|
1299
1795
|
this.cancelDelete();
|
|
1300
|
-
|
|
1796
|
+
// Authoritative refresh — loadData() now sets BypassCache: true on
|
|
1797
|
+
// the 'MJ: Lists' RunView, so this no longer races the optimistic
|
|
1798
|
+
// local removal against a stale cache.
|
|
1799
|
+
void this.loadData();
|
|
1301
1800
|
}
|
|
1302
1801
|
catch (error) {
|
|
1303
1802
|
console.error('Error deleting list:', error);
|
|
@@ -1309,6 +1808,35 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
1309
1808
|
this.cdr.detectChanges();
|
|
1310
1809
|
}
|
|
1311
1810
|
}
|
|
1811
|
+
/** Delete every MJ: List Details row for a given list in a single
|
|
1812
|
+
* transaction group. Returns true if everything succeeded (including
|
|
1813
|
+
* the trivial "no members" case). */
|
|
1814
|
+
async cascadeDeleteListMembers(listId) {
|
|
1815
|
+
const md = this.ProviderToUse;
|
|
1816
|
+
const rv = RunView.FromMetadataProvider(md);
|
|
1817
|
+
const lookup = await rv.RunView({
|
|
1818
|
+
EntityName: 'MJ: List Details',
|
|
1819
|
+
ExtraFilter: `ListID='${listId}'`,
|
|
1820
|
+
ResultType: 'entity_object',
|
|
1821
|
+
});
|
|
1822
|
+
if (!lookup.Success) {
|
|
1823
|
+
console.error('Failed to load list details for cascade-delete:', lookup.ErrorMessage);
|
|
1824
|
+
return false;
|
|
1825
|
+
}
|
|
1826
|
+
const details = lookup.Results ?? [];
|
|
1827
|
+
if (details.length === 0)
|
|
1828
|
+
return true;
|
|
1829
|
+
const tg = await md.CreateTransactionGroup();
|
|
1830
|
+
for (const d of details) {
|
|
1831
|
+
d.TransactionGroup = tg;
|
|
1832
|
+
await d.Delete();
|
|
1833
|
+
}
|
|
1834
|
+
const ok = await tg.Submit();
|
|
1835
|
+
if (!ok) {
|
|
1836
|
+
console.error('Cascade-delete transaction failed for list', listId);
|
|
1837
|
+
}
|
|
1838
|
+
return ok;
|
|
1839
|
+
}
|
|
1312
1840
|
closeCreateDialog() {
|
|
1313
1841
|
this.showCreateDialog = false;
|
|
1314
1842
|
this.editingList = null;
|
|
@@ -1326,7 +1854,7 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
1326
1854
|
list = this.editingList;
|
|
1327
1855
|
}
|
|
1328
1856
|
else {
|
|
1329
|
-
list = await md.GetEntityObject('MJ: Lists');
|
|
1857
|
+
list = await md.GetEntityObject('MJ: Lists', md.CurrentUser);
|
|
1330
1858
|
list.UserID = md.CurrentUser.ID;
|
|
1331
1859
|
list.EntityID = this.selectedEntityId;
|
|
1332
1860
|
}
|
|
@@ -1381,6 +1909,36 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
1381
1909
|
this.showShareDialog = false;
|
|
1382
1910
|
this.shareDialogConfig = null;
|
|
1383
1911
|
}
|
|
1912
|
+
/** "Manage Invitations" clicked inside the share dialog — opens a
|
|
1913
|
+
* modal hosting `<mj-list-invitations>` for the same list. The
|
|
1914
|
+
* share dialog is closed so dialogs don't visually stack. */
|
|
1915
|
+
onManageInvitations() {
|
|
1916
|
+
if (!this.shareDialogConfig)
|
|
1917
|
+
return;
|
|
1918
|
+
this.activeShareListId = this.shareDialogConfig.listId;
|
|
1919
|
+
this.activeShareListName = this.shareDialogConfig.listName;
|
|
1920
|
+
this.showShareDialog = false;
|
|
1921
|
+
this.showInvitationsDialog = true;
|
|
1922
|
+
this.cdr.detectChanges();
|
|
1923
|
+
}
|
|
1924
|
+
closeInvitationsDialog() {
|
|
1925
|
+
this.showInvitationsDialog = false;
|
|
1926
|
+
this.cdr.detectChanges();
|
|
1927
|
+
}
|
|
1928
|
+
/** "View audit log" link in share dialog. */
|
|
1929
|
+
onViewAuditLog() {
|
|
1930
|
+
if (!this.shareDialogConfig)
|
|
1931
|
+
return;
|
|
1932
|
+
this.activeShareListId = this.shareDialogConfig.listId;
|
|
1933
|
+
this.activeShareListName = this.shareDialogConfig.listName;
|
|
1934
|
+
this.showShareDialog = false;
|
|
1935
|
+
this.showAuditLogDialog = true;
|
|
1936
|
+
this.cdr.detectChanges();
|
|
1937
|
+
}
|
|
1938
|
+
closeAuditLogDialog() {
|
|
1939
|
+
this.showAuditLogDialog = false;
|
|
1940
|
+
this.cdr.detectChanges();
|
|
1941
|
+
}
|
|
1384
1942
|
async loadSharingInfo() {
|
|
1385
1943
|
// Load sharing summaries for all lists that the user owns
|
|
1386
1944
|
const ownedLists = this.allLists.filter(item => item.isOwner);
|
|
@@ -1404,107 +1962,98 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
1404
1962
|
static ɵfac = function ListsBrowseResource_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ListsBrowseResource)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.TabService), i0.ɵɵdirectiveInject(i2.MJNotificationService), i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i3.ListSharingService)); };
|
|
1405
1963
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ListsBrowseResource, selectors: [["mj-lists-browse-resource"]], hostBindings: function ListsBrowseResource_HostBindings(rf, ctx) { if (rf & 1) {
|
|
1406
1964
|
i0.ɵɵlistener("click", function ListsBrowseResource_click_HostBindingHandler($event) { return ctx.onDocumentClick($event); }, i0.ɵɵresolveDocument)("keydown.escape", function ListsBrowseResource_keydown_escape_HostBindingHandler() { return ctx.onEscapeKey(); }, i0.ɵɵresolveDocument);
|
|
1407
|
-
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
1965
|
+
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 34, vars: 29, consts: [["categoryNodeTemplate", ""], ["entityInput", ""], ["Title", "Lists", "Icon", "fa-solid fa-list-check"], ["meta", ""], ["Label", "lists", 3, "Count", "Total"], ["actions", ""], [3, "ClearAllRequested", "ActiveCount", "ShowClearAll"], [3, "ValuesChange", "Reset", "Fields", "Values"], [3, "KeyChange", "Options", "ActiveKey"], [1, "favorite-filter-toggle", 3, "click", "title"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click"], [1, "fa-solid", "fa-plus"], ["toolbar", ""], ["Placeholder", "Search lists...", 3, "ValueChange", "Value"], [1, "tag-filter-row"], [1, "loading-container"], [1, "empty-state"], [1, "empty-state", "search-empty"], [1, "browse-content"], [1, "context-menu-overlay"], [1, "context-menu", 3, "top", "left"], [1, "modal-overlay"], [1, "modal-dialog"], [1, "modal-dialog", "confirm-dialog"], [3, "config", "visible"], [3, "Visible", "Title", "MinWidth", "Width", "Height"], [1, "entity-dropdown-portal", 3, "top", "left", "width", "dropdown-above"], [1, "tag-filter-row__label"], [1, "fa-solid", "fa-tag"], ["type", "button", 1, "tag-filter-chip"], ["type", "button", 1, "tag-filter-row__clear", 3, "click"], ["type", "button", 1, "tag-filter-chip", 3, "click"], [1, "fa-solid", "fa-xmark"], ["text", "Loading lists...", "size", "medium"], [1, "empty-state-icon-wrapper"], [1, "icon-bg"], [1, "fa-solid", "fa-list-check"], [1, "empty-state-features"], [1, "feature-item"], [1, "fa-solid", "fa-check-circle"], [1, "btn-create-large", 3, "click"], [1, "empty-state-icon-wrapper", "search"], [1, "fa-solid", "fa-filter-circle-xmark"], [1, "empty-hint"], [1, "btn-clear", 3, "click"], [1, "results-header"], [1, "result-count"], [1, "sort-options"], [1, "filter-select", "sort-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "lists-table"], ["role", "list", "aria-label", "Lists", 1, "lists-grid"], [1, "category-tree"], ["role", "grid", "aria-label", "Lists table"], ["scope", "col", 1, "col-name"], ["scope", "col", 1, "col-entity"], ["scope", "col", 1, "col-items"], ["scope", "col", 1, "col-sharing"], ["scope", "col", 1, "col-owner"], ["scope", "col", 1, "col-updated"], ["scope", "col", 1, "col-actions"], [1, "sr-only"], ["tabindex", "0", "role", "row", 1, "list-row"], ["tabindex", "0", "role", "row", 1, "list-row", 3, "click", "keydown.enter"], ["role", "gridcell", 1, "col-name"], [1, "name-cell"], ["aria-hidden", "true", 1, "list-icon"], [1, "name-content"], [1, "list-name"], [1, "list-desc"], ["role", "gridcell", 1, "col-entity"], [1, "entity-badge"], ["role", "gridcell", 1, "col-items"], ["role", "gridcell", 1, "col-sharing"], [1, "sharing-private"], ["role", "gridcell", 1, "col-owner"], [1, "owner-name"], ["role", "gridcell", 1, "col-updated"], ["role", "gridcell", 1, "col-actions"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "More options", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-ellipsis-v"], [1, "sharing-indicator"], [1, "fa-solid", "fa-share-nodes"], [1, "share-count"], [1, "fa-solid", "fa-lock"], ["tabindex", "0", "role", "listitem", 1, "list-card"], ["tabindex", "0", "role", "listitem", 1, "list-card", 3, "click", "keydown.enter"], [1, "card-header"], ["aria-hidden", "true", 1, "card-icon"], [1, "favorite-btn", 3, "click", "title"], [1, "card-menu"], [1, "menu-btn", 3, "click"], [1, "card-body"], [1, "card-title"], [1, "card-description"], [1, "card-meta"], [1, "meta-item"], [1, "fa-solid", "fa-database"], [1, "fa-solid", "fa-hashtag"], [1, "card-tags", 3, "click"], ["EntityName", "MJ: Lists", 3, "TagClicked", "Provider", "RecordID", "Editable", "MaxDisplay"], [1, "card-footer"], [1, "owner-tag"], [1, "fa-solid", "fa-user"], [1, "card-footer-right"], [1, "date-info"], [1, "sharing-badge", 3, "title"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "category-section"], [1, "category-header"], [1, "category-header", "uncategorized"], ["role", "list", 1, "category-lists"], [1, "category-header", 3, "click"], [1, "fa-solid", "fa-folder"], [1, "category-name"], [1, "category-count"], [1, "category-header", "uncategorized", 3, "click"], [1, "fa-solid", "fa-inbox"], ["tabindex", "0", "role", "listitem", 1, "list-row", "hierarchy-row"], ["tabindex", "0", "role", "listitem", 1, "list-row", "hierarchy-row", 3, "click", "keydown.enter"], [1, "list-info"], [1, "list-meta"], [1, "list-actions"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "click"], [1, "context-menu-overlay", 3, "click"], [1, "context-menu"], [1, "menu-item"], [1, "menu-item", 3, "click"], [1, "fa-solid", "fa-copy"], [1, "menu-viewer-hint"], [1, "fa-solid", "fa-pen"], [1, "menu-divider"], [1, "menu-item", "danger", 3, "click"], [1, "fa-solid", "fa-trash"], [1, "fa-solid", "fa-eye"], [1, "modal-overlay", 3, "click"], [1, "modal-header"], [1, "modal-close", 3, "click"], [1, "fa-solid", "fa-times"], [1, "modal-body"], [1, "form-group"], ["type", "text", "placeholder", "Enter list name", 1, "form-input", 3, "ngModelChange", "ngModel"], ["placeholder", "Optional description", "rows", "3", 1, "form-input", 3, "ngModelChange", "ngModel"], [1, "form-input", 3, "ngModelChange", "ngModel"], [3, "ngValue"], [1, "modal-footer"], [1, "btn-primary", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "btn-secondary", 3, "click", "disabled"], [1, "custom-select-wrapper"], ["type", "text", "placeholder", "Search and select an entity", 1, "form-input", 3, "ngModelChange", "focus", "ngModel"], ["type", "text", "disabled", "", 1, "form-input", 3, "value"], [1, "warning-text"], [1, "btn-danger", 3, "click", "disabled"], [3, "complete", "cancel", "manageInvitations", "viewAuditLog", "config", "visible"], [3, "Close", "Visible", "Title", "MinWidth", "Width", "Height"], [1, "dialog-content"], [3, "Provider", "ListID", "ListName"], ["mjButton", "", "variant", "outline", 3, "click"], [3, "Provider", "ListID"], [1, "entity-dropdown-portal"], [1, "entity-dropdown-content"], [1, "dropdown-item"], [1, "dropdown-empty"], [1, "dropdown-item", 3, "mousedown"]], template: function ListsBrowseResource_Template(rf, ctx) { if (rf & 1) {
|
|
1408
1966
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
1409
|
-
i0.ɵɵelementStart(0, "
|
|
1410
|
-
i0.ɵɵelement(
|
|
1411
|
-
i0.ɵɵ
|
|
1412
|
-
i0.ɵɵ
|
|
1967
|
+
i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 2)(2, "div", 3);
|
|
1968
|
+
i0.ɵɵelement(3, "mj-stat-badge", 4);
|
|
1969
|
+
i0.ɵɵelementEnd();
|
|
1970
|
+
i0.ɵɵelementStart(4, "div", 5)(5, "mj-filter-popover", 6);
|
|
1971
|
+
i0.ɵɵlistener("ClearAllRequested", function ListsBrowseResource_Template_mj_filter_popover_ClearAllRequested_5_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.resetPopoverFilters()); });
|
|
1972
|
+
i0.ɵɵelementStart(6, "mj-filter-panel", 7);
|
|
1973
|
+
i0.ɵɵlistener("ValuesChange", function ListsBrowseResource_Template_mj_filter_panel_ValuesChange_6_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onFilterValuesChange($event)); })("Reset", function ListsBrowseResource_Template_mj_filter_panel_Reset_6_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.resetPopoverFilters()); });
|
|
1413
1974
|
i0.ɵɵelementEnd()();
|
|
1414
|
-
i0.ɵɵelementStart(7, "
|
|
1415
|
-
i0.ɵɵlistener("
|
|
1416
|
-
i0.ɵɵelement(8, "i", 8);
|
|
1417
|
-
i0.ɵɵelementStart(9, "span");
|
|
1418
|
-
i0.ɵɵtext(10, "New List");
|
|
1419
|
-
i0.ɵɵelementEnd()()();
|
|
1420
|
-
i0.ɵɵelementStart(11, "div", 9)(12, "div", 10);
|
|
1421
|
-
i0.ɵɵelement(13, "i", 11);
|
|
1422
|
-
i0.ɵɵelementStart(14, "input", 12);
|
|
1423
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Template_input_ngModelChange_14_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.searchTerm, $event) || (ctx.searchTerm = $event); return i0.ɵɵresetView($event); });
|
|
1424
|
-
i0.ɵɵlistener("ngModelChange", function ListsBrowseResource_Template_input_ngModelChange_14_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSearchChange($event)); });
|
|
1975
|
+
i0.ɵɵelementStart(7, "mj-view-toggle", 8);
|
|
1976
|
+
i0.ɵɵlistener("KeyChange", function ListsBrowseResource_Template_mj_view_toggle_KeyChange_7_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.setViewMode($event)); });
|
|
1425
1977
|
i0.ɵɵelementEnd();
|
|
1426
|
-
i0.ɵɵ
|
|
1978
|
+
i0.ɵɵelementStart(8, "button", 9);
|
|
1979
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.toggleShowOnlyFavorites()); });
|
|
1980
|
+
i0.ɵɵelement(9, "i");
|
|
1981
|
+
i0.ɵɵtext(10, " Favorites ");
|
|
1427
1982
|
i0.ɵɵelementEnd();
|
|
1428
|
-
i0.ɵɵelementStart(
|
|
1429
|
-
i0.ɵɵ
|
|
1430
|
-
i0.ɵɵ
|
|
1431
|
-
i0.ɵɵ
|
|
1432
|
-
i0.ɵɵelementEnd()();
|
|
1433
|
-
i0.ɵɵelementStart(20, "div", 14)(21, "select", 17);
|
|
1434
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Template_select_ngModelChange_21_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.selectedEntity, $event) || (ctx.selectedEntity = $event); return i0.ɵɵresetView($event); });
|
|
1435
|
-
i0.ɵɵlistener("ngModelChange", function ListsBrowseResource_Template_select_ngModelChange_21_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onEntityFilterChange($event)); });
|
|
1436
|
-
i0.ɵɵrepeaterCreate(22, ListsBrowseResource_For_23_Template, 2, 2, "option", 16, i0.ɵɵrepeaterTrackByIdentity);
|
|
1983
|
+
i0.ɵɵelementStart(11, "button", 10);
|
|
1984
|
+
i0.ɵɵlistener("click", function ListsBrowseResource_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.createNewList()); });
|
|
1985
|
+
i0.ɵɵelement(12, "i", 11);
|
|
1986
|
+
i0.ɵɵtext(13, " New List ");
|
|
1437
1987
|
i0.ɵɵelementEnd()();
|
|
1438
|
-
i0.ɵɵelementStart(
|
|
1439
|
-
i0.ɵɵlistener("
|
|
1440
|
-
i0.ɵɵ
|
|
1441
|
-
i0.ɵɵ
|
|
1442
|
-
i0.ɵɵ
|
|
1443
|
-
i0.ɵɵ
|
|
1444
|
-
i0.ɵɵ
|
|
1988
|
+
i0.ɵɵelementStart(14, "div", 12)(15, "mj-page-search", 13);
|
|
1989
|
+
i0.ɵɵlistener("ValueChange", function ListsBrowseResource_Template_mj_page_search_ValueChange_15_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSearchChange($event)); });
|
|
1990
|
+
i0.ɵɵelementEnd()()();
|
|
1991
|
+
i0.ɵɵelementStart(16, "mj-page-body");
|
|
1992
|
+
i0.ɵɵconditionalCreate(17, ListsBrowseResource_Conditional_17_Template, 8, 0, "div", 14);
|
|
1993
|
+
i0.ɵɵconditionalCreate(18, ListsBrowseResource_Conditional_18_Template, 2, 0, "div", 15);
|
|
1994
|
+
i0.ɵɵconditionalCreate(19, ListsBrowseResource_Conditional_19_Template, 24, 0, "div", 16);
|
|
1995
|
+
i0.ɵɵconditionalCreate(20, ListsBrowseResource_Conditional_20_Template, 11, 0, "div", 17);
|
|
1996
|
+
i0.ɵɵconditionalCreate(21, ListsBrowseResource_Conditional_21_Template, 13, 6, "div", 18);
|
|
1997
|
+
i0.ɵɵtemplate(22, ListsBrowseResource_ng_template_22_Template, 5, 6, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
|
|
1998
|
+
i0.ɵɵconditionalCreate(24, ListsBrowseResource_Conditional_24_Template, 1, 0, "div", 19);
|
|
1999
|
+
i0.ɵɵconditionalCreate(25, ListsBrowseResource_Conditional_25_Template, 8, 8, "div", 20);
|
|
1445
2000
|
i0.ɵɵelementEnd();
|
|
1446
|
-
i0.ɵɵ
|
|
1447
|
-
i0.ɵɵ
|
|
1448
|
-
i0.ɵɵ
|
|
1449
|
-
i0.ɵɵ
|
|
1450
|
-
i0.ɵɵconditionalCreate(
|
|
1451
|
-
i0.ɵɵconditionalCreate(
|
|
1452
|
-
i0.ɵɵconditionalCreate(
|
|
1453
|
-
i0.ɵɵconditionalCreate(
|
|
1454
|
-
i0.ɵɵtemplate(35, ListsBrowseResource_ng_template_35_Template, 5, 6, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
|
|
1455
|
-
i0.ɵɵconditionalCreate(37, ListsBrowseResource_Conditional_37_Template, 1, 0, "div", 29);
|
|
1456
|
-
i0.ɵɵconditionalCreate(38, ListsBrowseResource_Conditional_38_Template, 14, 4, "div", 30);
|
|
1457
|
-
i0.ɵɵconditionalCreate(39, ListsBrowseResource_Conditional_39_Template, 1, 0, "div", 31);
|
|
1458
|
-
i0.ɵɵconditionalCreate(40, ListsBrowseResource_Conditional_40_Template, 31, 11, "div", 32);
|
|
1459
|
-
i0.ɵɵconditionalCreate(41, ListsBrowseResource_Conditional_41_Template, 1, 0, "div", 31);
|
|
1460
|
-
i0.ɵɵconditionalCreate(42, ListsBrowseResource_Conditional_42_Template, 20, 5, "div", 33);
|
|
1461
|
-
i0.ɵɵconditionalCreate(43, ListsBrowseResource_Conditional_43_Template, 1, 2, "mj-list-share-dialog", 34);
|
|
1462
|
-
i0.ɵɵconditionalCreate(44, ListsBrowseResource_Conditional_44_Template, 5, 11, "div", 35);
|
|
2001
|
+
i0.ɵɵconditionalCreate(26, ListsBrowseResource_Conditional_26_Template, 1, 0, "div", 21);
|
|
2002
|
+
i0.ɵɵconditionalCreate(27, ListsBrowseResource_Conditional_27_Template, 31, 11, "div", 22);
|
|
2003
|
+
i0.ɵɵconditionalCreate(28, ListsBrowseResource_Conditional_28_Template, 1, 0, "div", 21);
|
|
2004
|
+
i0.ɵɵconditionalCreate(29, ListsBrowseResource_Conditional_29_Template, 20, 5, "div", 23);
|
|
2005
|
+
i0.ɵɵconditionalCreate(30, ListsBrowseResource_Conditional_30_Template, 1, 2, "mj-list-share-dialog", 24);
|
|
2006
|
+
i0.ɵɵconditionalCreate(31, ListsBrowseResource_Conditional_31_Template, 6, 8, "mj-dialog", 25);
|
|
2007
|
+
i0.ɵɵconditionalCreate(32, ListsBrowseResource_Conditional_32_Template, 6, 7, "mj-dialog", 25);
|
|
2008
|
+
i0.ɵɵconditionalCreate(33, ListsBrowseResource_Conditional_33_Template, 5, 11, "div", 26);
|
|
1463
2009
|
i0.ɵɵelementEnd();
|
|
1464
2010
|
} if (rf & 2) {
|
|
1465
|
-
i0.ɵɵadvance(
|
|
1466
|
-
i0.ɵɵ
|
|
1467
|
-
i0.ɵɵadvance();
|
|
1468
|
-
i0.ɵɵconditional(ctx.searchTerm ? 15 : -1);
|
|
2011
|
+
i0.ɵɵadvance(3);
|
|
2012
|
+
i0.ɵɵproperty("Count", ctx.filteredLists.length)("Total", ctx.allLists.length);
|
|
1469
2013
|
i0.ɵɵadvance(2);
|
|
1470
|
-
i0.ɵɵ
|
|
2014
|
+
i0.ɵɵproperty("ActiveCount", ctx.ActiveFilterCount)("ShowClearAll", ctx.ActiveFilterCount > 0);
|
|
1471
2015
|
i0.ɵɵadvance();
|
|
1472
|
-
i0.ɵɵ
|
|
1473
|
-
i0.ɵɵadvance(3);
|
|
1474
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx.selectedEntity);
|
|
2016
|
+
i0.ɵɵproperty("Fields", ctx.listFilterFields)("Values", ctx.listFilterValues);
|
|
1475
2017
|
i0.ɵɵadvance();
|
|
1476
|
-
i0.ɵɵ
|
|
1477
|
-
i0.ɵɵadvance(
|
|
1478
|
-
i0.ɵɵclassProp("active", ctx.
|
|
1479
|
-
i0.ɵɵ
|
|
1480
|
-
i0.ɵɵ
|
|
1481
|
-
i0.ɵɵ
|
|
1482
|
-
i0.ɵɵ
|
|
2018
|
+
i0.ɵɵproperty("Options", ctx.listViewOptions)("ActiveKey", ctx.viewMode);
|
|
2019
|
+
i0.ɵɵadvance();
|
|
2020
|
+
i0.ɵɵclassProp("favorite-filter-toggle--active", ctx.showOnlyFavorites);
|
|
2021
|
+
i0.ɵɵproperty("title", ctx.showOnlyFavorites ? "Showing favorites only" : "Show all lists");
|
|
2022
|
+
i0.ɵɵadvance();
|
|
2023
|
+
i0.ɵɵclassMap(ctx.showOnlyFavorites ? "fa-solid fa-star" : "fa-regular fa-star");
|
|
2024
|
+
i0.ɵɵadvance(6);
|
|
2025
|
+
i0.ɵɵproperty("Value", ctx.searchTerm);
|
|
1483
2026
|
i0.ɵɵadvance(2);
|
|
1484
|
-
i0.ɵɵconditional(ctx.
|
|
2027
|
+
i0.ɵɵconditional(ctx.tagFilters.length > 0 ? 17 : -1);
|
|
2028
|
+
i0.ɵɵadvance();
|
|
2029
|
+
i0.ɵɵconditional(ctx.isLoading ? 18 : -1);
|
|
1485
2030
|
i0.ɵɵadvance();
|
|
1486
|
-
i0.ɵɵconditional(!ctx.isLoading && ctx.allLists.length === 0 ?
|
|
2031
|
+
i0.ɵɵconditional(!ctx.isLoading && ctx.allLists.length === 0 ? 19 : -1);
|
|
1487
2032
|
i0.ɵɵadvance();
|
|
1488
|
-
i0.ɵɵconditional(!ctx.isLoading && ctx.allLists.length > 0 && ctx.filteredLists.length === 0 ?
|
|
2033
|
+
i0.ɵɵconditional(!ctx.isLoading && ctx.allLists.length > 0 && ctx.filteredLists.length === 0 ? 20 : -1);
|
|
1489
2034
|
i0.ɵɵadvance();
|
|
1490
|
-
i0.ɵɵconditional(!ctx.isLoading && ctx.filteredLists.length > 0 ?
|
|
2035
|
+
i0.ɵɵconditional(!ctx.isLoading && ctx.filteredLists.length > 0 ? 21 : -1);
|
|
1491
2036
|
i0.ɵɵadvance(3);
|
|
1492
|
-
i0.ɵɵconditional(ctx.showContextMenu ?
|
|
2037
|
+
i0.ɵɵconditional(ctx.showContextMenu ? 24 : -1);
|
|
2038
|
+
i0.ɵɵadvance();
|
|
2039
|
+
i0.ɵɵconditional(ctx.showContextMenu ? 25 : -1);
|
|
2040
|
+
i0.ɵɵadvance();
|
|
2041
|
+
i0.ɵɵconditional(ctx.showCreateDialog ? 26 : -1);
|
|
1493
2042
|
i0.ɵɵadvance();
|
|
1494
|
-
i0.ɵɵconditional(ctx.
|
|
2043
|
+
i0.ɵɵconditional(ctx.showCreateDialog ? 27 : -1);
|
|
1495
2044
|
i0.ɵɵadvance();
|
|
1496
|
-
i0.ɵɵconditional(ctx.
|
|
2045
|
+
i0.ɵɵconditional(ctx.showDeleteConfirm ? 28 : -1);
|
|
1497
2046
|
i0.ɵɵadvance();
|
|
1498
|
-
i0.ɵɵconditional(ctx.
|
|
2047
|
+
i0.ɵɵconditional(ctx.showDeleteConfirm ? 29 : -1);
|
|
1499
2048
|
i0.ɵɵadvance();
|
|
1500
|
-
i0.ɵɵconditional(ctx.
|
|
2049
|
+
i0.ɵɵconditional(ctx.shareDialogConfig ? 30 : -1);
|
|
1501
2050
|
i0.ɵɵadvance();
|
|
1502
|
-
i0.ɵɵconditional(ctx.
|
|
2051
|
+
i0.ɵɵconditional(ctx.showInvitationsDialog && ctx.activeShareListId ? 31 : -1);
|
|
1503
2052
|
i0.ɵɵadvance();
|
|
1504
|
-
i0.ɵɵconditional(ctx.
|
|
2053
|
+
i0.ɵɵconditional(ctx.showAuditLogDialog && ctx.activeShareListId ? 32 : -1);
|
|
1505
2054
|
i0.ɵɵadvance();
|
|
1506
|
-
i0.ɵɵconditional(ctx.showEntityDropdown && !ctx.editingList ?
|
|
1507
|
-
} }, dependencies: [i4.NgTemplateOutlet, i5.NgSelectOption, i5.ɵNgSelectMultipleOption, i5.DefaultValueAccessor, i5.SelectControlValueAccessor, i5.NgControlStatus, i5.NgModel, i6.MJButtonDirective, i7.LoadingComponent, i3.ListShareDialogComponent], styles: ["\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .lists-browse-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 .browse-header {\n display: flex;\n flex-direction: column;\n gap: 12px;\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-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\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 .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n }\n\n .search-box {\n position: relative;\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 200px;\n max-width: 300px;\n }\n\n .search-box i.fa-search {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n }\n\n .search-box input {\n padding: 8px 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n font-size: 14px;\n width: 100%;\n transition: border-color 0.2s, box-shadow 0.2s;\n }\n\n .search-box 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 .clear-search {\n position: absolute;\n right: 8px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n }\n\n .filter-group {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .filter-group label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .filter-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n min-width: 120px;\n }\n\n .filter-select: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 .sort-select {\n min-width: 140px;\n }\n\n .view-toggle-group {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n }\n\n .view-toggle {\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border: none;\n border-right: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .view-toggle:last-child {\n border-right: none;\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 color: var(--mj-text-inverse);\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: 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 .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 transition: background 0.2s;\n }\n\n .btn-clear:hover {\n background: var(--mj-border-default);\n }\n\n /* Content */\n .browse-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px 24px;\n }\n\n .results-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n }\n\n .result-count {\n font-size: 14px;\n color: var(--mj-text-secondary);\n }\n\n .sort-options {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .sort-options label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n /* Table View */\n .lists-table {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: var(--mj-shadow-sm);\n }\n\n .lists-table table {\n width: 100%;\n border-collapse: collapse;\n }\n\n .lists-table th {\n text-align: left;\n padding: 12px 16px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .lists-table td {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .list-row {\n cursor: pointer;\n transition: background 0.15s;\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-row:last-child td {\n border-bottom: none;\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n .col-name { width: 30%; }\n .col-entity { width: 15%; }\n .col-items { width: 8%; text-align: center; }\n .col-sharing { width: 8%; text-align: center; }\n .col-owner { width: 14%; }\n .col-updated { width: 15%; }\n .col-actions { width: 10%; text-align: right; }\n\n /* Sharing indicators */\n .sharing-indicator {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: var(--mj-brand-primary);\n font-size: 13px;\n }\n\n .sharing-indicator i {\n font-size: 14px;\n }\n\n .share-count {\n font-weight: 500;\n }\n\n .sharing-private {\n color: var(--mj-text-muted);\n font-size: 13px;\n }\n\n .sharing-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 50%;\n color: var(--mj-brand-primary);\n font-size: 11px;\n }\n\n .card-footer-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .name-cell {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .list-icon {\n width: 36px;\n height: 36px;\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 .name-content {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .list-name {\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .entity-badge {\n display: inline-block;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 4px;\n font-size: 12px;\n color: var(--mj-brand-primary-hover);\n }\n\n .owner-name {\n color: var(--mj-text-secondary);\n }\n\n .owner-name.is-me {\n color: var(--mj-brand-primary);\n font-weight: 500;\n }\n\n .action-btn {\n background: none;\n border: none;\n padding: 6px 10px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s;\n }\n\n .action-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Card 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 .owner-tag {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n }\n\n .owner-tag.is-me {\n color: var(--mj-brand-primary);\n }\n\n .date-info {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n /* Hierarchy View */\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 .hierarchy-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 .hierarchy-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .hierarchy-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .hierarchy-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-info {\n flex: 1;\n min-width: 0;\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 opacity: 0;\n transition: opacity 0.2s;\n }\n\n .hierarchy-row:hover .list-actions {\n opacity: 1;\n }\n\n /* Context Menu */\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 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 */\n .entity-dropdown-portal {\n position: fixed;\n z-index: 10002;\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 .header-row {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n\n .btn-create {\n width: 100%;\n justify-content: center;\n }\n\n .header-actions {\n flex-direction: column;\n align-items: stretch;\n }\n\n .search-box {\n max-width: none;\n }\n\n .filter-group {\n width: 100%;\n }\n\n .filter-select {\n flex: 1;\n width: 100%;\n }\n\n .view-toggle-group {\n justify-content: center;\n }\n\n .lists-table {\n overflow-x: auto;\n }\n\n .col-entity, .col-items, .col-updated {\n display: none;\n }\n\n .lists-grid {\n grid-template-columns: 1fr;\n }\n\n .modal-dialog {\n width: 95vw;\n }\n }\n "], encapsulation: 2 });
|
|
2055
|
+
i0.ɵɵconditional(ctx.showEntityDropdown && !ctx.editingList ? 33 : -1);
|
|
2056
|
+
} }, dependencies: [i4.NgTemplateOutlet, i5.NgSelectOption, i5.ɵNgSelectMultipleOption, i5.DefaultValueAccessor, i5.SelectControlValueAccessor, i5.NgControlStatus, i5.NgModel, i6.MJButtonDirective, i6.MJDialogComponent, i6.MJDialogActionsComponent, i6.MJPageLayoutComponent, i6.MJPageHeaderComponent, i6.MJPageBodyComponent, i6.MJPageSearchComponent, i6.MJFilterPopoverComponent, i6.MJFilterPanelComponent, i6.MJViewToggleComponent, i6.MJStatBadgeComponent, i7.LoadingComponent, i3.ListAuditLogComponent, i3.ListInvitationsComponent, i3.ListShareDialogComponent, i3.TagChipsComponent], styles: ["\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .lists-browse-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 .browse-header {\n display: flex;\n flex-direction: column;\n gap: 12px;\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-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\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 .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n }\n\n .search-box {\n position: relative;\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 200px;\n max-width: 300px;\n }\n\n .search-box i.fa-search {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n }\n\n .search-box input {\n padding: 8px 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n font-size: 14px;\n width: 100%;\n transition: border-color 0.2s, box-shadow 0.2s;\n }\n\n .search-box 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 .clear-search {\n position: absolute;\n right: 8px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n }\n\n .filter-group {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .filter-group label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .filter-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n min-width: 120px;\n }\n\n .filter-select: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 .sort-select {\n min-width: 140px;\n }\n\n .view-toggle-group {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n }\n\n .view-toggle {\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border: none;\n border-right: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .view-toggle:last-child {\n border-right: none;\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 color: var(--mj-text-inverse);\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: 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 .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 transition: background 0.2s;\n }\n\n .btn-clear:hover {\n background: var(--mj-border-default);\n }\n\n /* Content */\n .browse-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px 24px;\n }\n\n .results-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n }\n\n .result-count {\n font-size: 14px;\n color: var(--mj-text-secondary);\n }\n\n .sort-options {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .sort-options label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n /* Table View */\n .lists-table {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: var(--mj-shadow-sm);\n }\n\n .lists-table table {\n width: 100%;\n border-collapse: collapse;\n }\n\n .lists-table th {\n text-align: left;\n padding: 12px 16px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .lists-table td {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .list-row {\n cursor: pointer;\n transition: background 0.15s;\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-row:last-child td {\n border-bottom: none;\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n .col-name { width: 30%; }\n .col-entity { width: 15%; }\n .col-items { width: 8%; text-align: center; }\n .col-sharing { width: 8%; text-align: center; }\n .col-owner { width: 14%; }\n .col-updated { width: 15%; }\n .col-actions { width: 10%; text-align: right; }\n\n /* Sharing indicators */\n .sharing-indicator {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: var(--mj-brand-primary);\n font-size: 13px;\n }\n\n .sharing-indicator i {\n font-size: 14px;\n }\n\n .share-count {\n font-weight: 500;\n }\n\n .sharing-private {\n color: var(--mj-text-muted);\n font-size: 13px;\n }\n\n .sharing-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 50%;\n color: var(--mj-brand-primary);\n font-size: 11px;\n }\n\n .card-footer-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .name-cell {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .list-icon {\n width: 36px;\n height: 36px;\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 .name-content {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .list-name {\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .entity-badge {\n display: inline-block;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 4px;\n font-size: 12px;\n color: var(--mj-brand-primary-hover);\n }\n\n .owner-name {\n color: var(--mj-text-secondary);\n }\n\n .owner-name.is-me {\n color: var(--mj-brand-primary);\n font-weight: 500;\n }\n\n .action-btn {\n background: none;\n border: none;\n padding: 6px 10px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s;\n }\n\n .action-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Card 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 /* Tag chips on a card. Stop-propagation is set on the wrapper so\n clicks on chips don't open the underlying list. */\n .card-tags {\n margin-top: 8px;\n }\n\n /* Favorite star on cards (Phase 5.3). */\n .favorite-btn {\n background: none;\n border: none;\n padding: 4px;\n margin: -4px;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 14px;\n border-radius: 4px;\n transition: color 0.12s ease, background 0.12s ease;\n }\n\n .favorite-btn:hover {\n background: var(--mj-bg-surface-card);\n color: var(--mj-status-warning);\n }\n\n .favorite-btn--active {\n color: var(--mj-status-warning);\n }\n\n /* Favorites-only toggle in the toolbar. */\n .favorite-filter-toggle {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: none;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 12.5px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n }\n\n .favorite-filter-toggle:hover {\n border-color: var(--mj-status-warning);\n color: var(--mj-status-warning);\n }\n\n .favorite-filter-toggle--active {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n color: var(--mj-status-warning);\n font-weight: 600;\n }\n\n /* Active-tag filter row above the grid (Phase 4.3). */\n .tag-filter-row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n margin-bottom: 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n font-size: 12.5px;\n }\n\n .tag-filter-row__label {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n\n .tag-filter-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 10px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n font-size: 11.5px;\n cursor: pointer;\n }\n\n .tag-filter-chip:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface));\n }\n\n .tag-filter-row__clear {\n background: none;\n border: none;\n color: var(--mj-text-link);\n font-size: 11.5px;\n cursor: pointer;\n margin-left: auto;\n }\n\n .tag-filter-row__clear:hover {\n text-decoration: underline;\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 .owner-tag {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n }\n\n .owner-tag.is-me {\n color: var(--mj-brand-primary);\n }\n\n .date-info {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n /* Hierarchy View */\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 .hierarchy-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 .hierarchy-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .hierarchy-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .hierarchy-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-info {\n flex: 1;\n min-width: 0;\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 opacity: 0;\n transition: opacity 0.2s;\n }\n\n .hierarchy-row:hover .list-actions {\n opacity: 1;\n }\n\n /* Context Menu */\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 .menu-viewer-hint {\n padding: 10px 14px;\n font-size: 12px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 8px;\n font-style: italic;\n }\n .menu-viewer-hint i { color: var(--mj-text-muted); }\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 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 */\n .entity-dropdown-portal {\n position: fixed;\n z-index: 10002;\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 .header-row {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n\n .btn-create {\n width: 100%;\n justify-content: center;\n }\n\n .header-actions {\n flex-direction: column;\n align-items: stretch;\n }\n\n .search-box {\n max-width: none;\n }\n\n .filter-group {\n width: 100%;\n }\n\n .filter-select {\n flex: 1;\n width: 100%;\n }\n\n .view-toggle-group {\n justify-content: center;\n }\n\n .lists-table {\n overflow-x: auto;\n }\n\n .col-entity, .col-items, .col-updated {\n display: none;\n }\n\n .lists-grid {\n grid-template-columns: 1fr;\n }\n\n .modal-dialog {\n width: 95vw;\n }\n }\n "], encapsulation: 2 });
|
|
1508
2057
|
};
|
|
1509
2058
|
ListsBrowseResource = __decorate([
|
|
1510
2059
|
RegisterClass(BaseResourceComponent, 'ListsBrowseResource')
|
|
@@ -1513,92 +2062,91 @@ export { ListsBrowseResource };
|
|
|
1513
2062
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ListsBrowseResource, [{
|
|
1514
2063
|
type: Component,
|
|
1515
2064
|
args: [{ standalone: false, selector: 'mj-lists-browse-resource', template: `
|
|
1516
|
-
<
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
<div
|
|
1520
|
-
<
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
2065
|
+
<mj-page-layout>
|
|
2066
|
+
<mj-page-header Title="Lists" Icon="fa-solid fa-list-check">
|
|
2067
|
+
<!-- X-of-Y filtered count earns its meta spot per chrome conventions §2. -->
|
|
2068
|
+
<div meta>
|
|
2069
|
+
<mj-stat-badge
|
|
2070
|
+
[Count]="filteredLists.length"
|
|
2071
|
+
[Total]="allLists.length"
|
|
2072
|
+
Label="lists">
|
|
2073
|
+
</mj-stat-badge>
|
|
2074
|
+
</div>
|
|
2075
|
+
<div actions>
|
|
2076
|
+
<mj-filter-popover
|
|
2077
|
+
[ActiveCount]="ActiveFilterCount"
|
|
2078
|
+
[ShowClearAll]="ActiveFilterCount > 0"
|
|
2079
|
+
(ClearAllRequested)="resetPopoverFilters()">
|
|
2080
|
+
<mj-filter-panel
|
|
2081
|
+
[Fields]="listFilterFields"
|
|
2082
|
+
[Values]="listFilterValues"
|
|
2083
|
+
(ValuesChange)="onFilterValuesChange($event)"
|
|
2084
|
+
(Reset)="resetPopoverFilters()">
|
|
2085
|
+
</mj-filter-panel>
|
|
2086
|
+
</mj-filter-popover>
|
|
2087
|
+
|
|
2088
|
+
<mj-view-toggle
|
|
2089
|
+
[Options]="listViewOptions"
|
|
2090
|
+
[ActiveKey]="viewMode"
|
|
2091
|
+
(KeyChange)="setViewMode($any($event))">
|
|
2092
|
+
</mj-view-toggle>
|
|
2093
|
+
|
|
2094
|
+
<!-- Favorites-only toggle (Phase 5.3). Sits next to the view toggle
|
|
2095
|
+
so it reads as "filter scope" alongside view mode. -->
|
|
2096
|
+
<button
|
|
2097
|
+
class="favorite-filter-toggle"
|
|
2098
|
+
[class.favorite-filter-toggle--active]="showOnlyFavorites"
|
|
2099
|
+
(click)="toggleShowOnlyFavorites()"
|
|
2100
|
+
[title]="showOnlyFavorites ? 'Showing favorites only' : 'Show all lists'">
|
|
2101
|
+
<i [class]="showOnlyFavorites ? 'fa-solid fa-star' : 'fa-regular fa-star'"></i>
|
|
2102
|
+
Favorites
|
|
2103
|
+
</button>
|
|
2104
|
+
|
|
2105
|
+
<button mjButton variant="primary" size="sm" (click)="createNewList()">
|
|
2106
|
+
<i class="fa-solid fa-plus"></i> New List
|
|
1527
2107
|
</button>
|
|
1528
2108
|
</div>
|
|
2109
|
+
<div toolbar>
|
|
2110
|
+
<mj-page-search
|
|
2111
|
+
Placeholder="Search lists..."
|
|
2112
|
+
[Value]="searchTerm"
|
|
2113
|
+
(ValueChange)="onSearchChange($event)">
|
|
2114
|
+
</mj-page-search>
|
|
2115
|
+
</div>
|
|
2116
|
+
</mj-page-header>
|
|
2117
|
+
|
|
2118
|
+
<mj-page-body>
|
|
1529
2119
|
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
<button class="clear-search" (click)="clearSearch()">
|
|
1540
|
-
<i class="fa-solid fa-times"></i>
|
|
1541
|
-
</button>
|
|
1542
|
-
}
|
|
1543
|
-
</div>
|
|
1544
|
-
|
|
1545
|
-
<div class="filter-group">
|
|
1546
|
-
<select
|
|
1547
|
-
[(ngModel)]="selectedOwner"
|
|
1548
|
-
(ngModelChange)="onOwnerFilterChange($event)"
|
|
1549
|
-
class="filter-select"
|
|
1550
|
-
title="Filter by owner">
|
|
1551
|
-
@for (opt of ownerOptions; track opt) {
|
|
1552
|
-
<option [value]="opt.value">{{opt.name}}</option>
|
|
1553
|
-
}
|
|
1554
|
-
</select>
|
|
1555
|
-
</div>
|
|
1556
|
-
|
|
1557
|
-
<div class="filter-group">
|
|
1558
|
-
<select
|
|
1559
|
-
[(ngModel)]="selectedEntity"
|
|
1560
|
-
(ngModelChange)="onEntityFilterChange($event)"
|
|
1561
|
-
class="filter-select"
|
|
1562
|
-
title="Filter by entity">
|
|
1563
|
-
@for (opt of entityOptions; track opt) {
|
|
1564
|
-
<option [value]="opt.value">{{opt.name}}</option>
|
|
1565
|
-
}
|
|
1566
|
-
</select>
|
|
1567
|
-
</div>
|
|
1568
|
-
|
|
1569
|
-
<div class="view-toggle-group">
|
|
1570
|
-
<button
|
|
1571
|
-
class="view-toggle"
|
|
1572
|
-
[class.active]="viewMode === 'table'"
|
|
1573
|
-
(click)="setViewMode('table')"
|
|
1574
|
-
title="Table view">
|
|
1575
|
-
<i class="fa-solid fa-table-list"></i>
|
|
1576
|
-
</button>
|
|
1577
|
-
<button
|
|
1578
|
-
class="view-toggle"
|
|
1579
|
-
[class.active]="viewMode === 'card'"
|
|
1580
|
-
(click)="setViewMode('card')"
|
|
1581
|
-
title="Card view">
|
|
1582
|
-
<i class="fa-solid fa-grip"></i>
|
|
1583
|
-
</button>
|
|
2120
|
+
<!-- Active tag filters (Phase 4.3). Renders only when at least one
|
|
2121
|
+
tag is active — multi-tag = AND. Clicking a chip's × removes it. -->
|
|
2122
|
+
@if (tagFilters.length > 0) {
|
|
2123
|
+
<div class="tag-filter-row">
|
|
2124
|
+
<span class="tag-filter-row__label">
|
|
2125
|
+
<i class="fa-solid fa-tag"></i>
|
|
2126
|
+
Filtering by tag:
|
|
2127
|
+
</span>
|
|
2128
|
+
@for (f of tagFilters; track f.TagID) {
|
|
1584
2129
|
<button
|
|
1585
|
-
class="
|
|
1586
|
-
|
|
1587
|
-
(click)="
|
|
1588
|
-
|
|
1589
|
-
<i class="fa-solid fa-
|
|
2130
|
+
class="tag-filter-chip"
|
|
2131
|
+
type="button"
|
|
2132
|
+
(click)="removeTagFilter(f.TagID)">
|
|
2133
|
+
{{ f.Name }}
|
|
2134
|
+
<i class="fa-solid fa-xmark"></i>
|
|
1590
2135
|
</button>
|
|
1591
|
-
|
|
2136
|
+
}
|
|
2137
|
+
<button class="tag-filter-row__clear" type="button" (click)="clearTagFilters()">
|
|
2138
|
+
Clear all
|
|
2139
|
+
</button>
|
|
1592
2140
|
</div>
|
|
1593
|
-
|
|
1594
|
-
|
|
2141
|
+
}
|
|
2142
|
+
|
|
1595
2143
|
<!-- Loading State -->
|
|
1596
2144
|
@if (isLoading) {
|
|
1597
2145
|
<div class="loading-container">
|
|
1598
2146
|
<mj-loading text="Loading lists..." size="medium"></mj-loading>
|
|
1599
2147
|
</div>
|
|
1600
2148
|
}
|
|
1601
|
-
|
|
2149
|
+
|
|
1602
2150
|
<!-- Empty State - No Lists -->
|
|
1603
2151
|
@if (!isLoading && allLists.length === 0) {
|
|
1604
2152
|
<div class="empty-state">
|
|
@@ -1726,15 +2274,13 @@ export { ListsBrowseResource };
|
|
|
1726
2274
|
</td>
|
|
1727
2275
|
<td class="col-updated" role="gridcell">{{formatDate(item.list.__mj_UpdatedAt)}}</td>
|
|
1728
2276
|
<td class="col-actions" role="gridcell">
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
</button>
|
|
1737
|
-
}
|
|
2277
|
+
<button mjButton
|
|
2278
|
+
variant="flat"
|
|
2279
|
+
size="sm"
|
|
2280
|
+
(click)="openListMenu($event, item)"
|
|
2281
|
+
title="More options">
|
|
2282
|
+
<i class="fa-solid fa-ellipsis-v" aria-hidden="true"></i>
|
|
2283
|
+
</button>
|
|
1738
2284
|
</td>
|
|
1739
2285
|
</tr>
|
|
1740
2286
|
}
|
|
@@ -1756,13 +2302,18 @@ export { ListsBrowseResource };
|
|
|
1756
2302
|
<div class="card-icon" [style.background-color]="getEntityColor(item.entityName)" aria-hidden="true">
|
|
1757
2303
|
<i [class]="getEntityIcon(item.entityName)"></i>
|
|
1758
2304
|
</div>
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
2305
|
+
<button
|
|
2306
|
+
class="favorite-btn"
|
|
2307
|
+
[class.favorite-btn--active]="isFavorite(item.list.ID)"
|
|
2308
|
+
(click)="toggleFavorite($event, item)"
|
|
2309
|
+
[title]="isFavorite(item.list.ID) ? 'Remove from favorites' : 'Add to favorites'">
|
|
2310
|
+
<i [class]="isFavorite(item.list.ID) ? 'fa-solid fa-star' : 'fa-regular fa-star'"></i>
|
|
2311
|
+
</button>
|
|
2312
|
+
<div class="card-menu">
|
|
2313
|
+
<button class="menu-btn" (click)="openListMenu($event, item)">
|
|
2314
|
+
<i class="fa-solid fa-ellipsis-v" aria-hidden="true"></i>
|
|
2315
|
+
</button>
|
|
2316
|
+
</div>
|
|
1766
2317
|
</div>
|
|
1767
2318
|
<div class="card-body">
|
|
1768
2319
|
<h3 class="card-title">{{item.list.Name}}</h3>
|
|
@@ -1779,6 +2330,20 @@ export { ListsBrowseResource };
|
|
|
1779
2330
|
{{item.itemCount}} item{{item.itemCount !== 1 ? 's' : ''}}
|
|
1780
2331
|
</span>
|
|
1781
2332
|
</div>
|
|
2333
|
+
<!-- Tag chips (Phase 4). Read-only on cards; click adds the
|
|
2334
|
+
tag to the filter row above. We stop propagation on
|
|
2335
|
+
the wrapper so clicks on chips don't also fire the
|
|
2336
|
+
card's openList handler. -->
|
|
2337
|
+
<div class="card-tags" (click)="$event.stopPropagation()">
|
|
2338
|
+
<mj-tag-chips
|
|
2339
|
+
[Provider]="Provider"
|
|
2340
|
+
EntityName="MJ: Lists"
|
|
2341
|
+
[RecordID]="item.list.ID"
|
|
2342
|
+
[Editable]="false"
|
|
2343
|
+
[MaxDisplay]="3"
|
|
2344
|
+
(TagClicked)="onCardTagClicked($event)">
|
|
2345
|
+
</mj-tag-chips>
|
|
2346
|
+
</div>
|
|
1782
2347
|
</div>
|
|
1783
2348
|
<div class="card-footer">
|
|
1784
2349
|
<span class="owner-tag" [class.is-me]="item.isOwner">
|
|
@@ -1860,13 +2425,11 @@ export { ListsBrowseResource };
|
|
|
1860
2425
|
}
|
|
1861
2426
|
</span>
|
|
1862
2427
|
</div>
|
|
1863
|
-
|
|
1864
|
-
<
|
|
1865
|
-
<
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
</div>
|
|
1869
|
-
}
|
|
2428
|
+
<div class="list-actions">
|
|
2429
|
+
<button mjButton variant="flat" size="sm" (click)="openListMenu($event, item)">
|
|
2430
|
+
<i class="fa-solid fa-ellipsis-v" aria-hidden="true"></i>
|
|
2431
|
+
</button>
|
|
2432
|
+
</div>
|
|
1870
2433
|
</div>
|
|
1871
2434
|
}
|
|
1872
2435
|
</div>
|
|
@@ -1881,32 +2444,53 @@ export { ListsBrowseResource };
|
|
|
1881
2444
|
</div>
|
|
1882
2445
|
</ng-template>
|
|
1883
2446
|
|
|
1884
|
-
<!-- Context Menu
|
|
2447
|
+
<!-- Context Menu (Phase 2.8 viewer-perspective gating).
|
|
2448
|
+
Items shown depend on contextItemCapabilities, resolved lazily
|
|
2449
|
+
on menu open. Viewers (no Edit/Share/Delete) still see
|
|
2450
|
+
Duplicate. Server-side enforcement remains source of truth;
|
|
2451
|
+
hiding is just UX so users don't see buttons that would fail. -->
|
|
1885
2452
|
@if (showContextMenu) {
|
|
1886
2453
|
<div class="context-menu-overlay" (click)="closeContextMenu()"></div>
|
|
1887
2454
|
}
|
|
1888
2455
|
@if (showContextMenu) {
|
|
1889
2456
|
<div class="context-menu" [style.top.px]="contextMenuY" [style.left.px]="contextMenuX">
|
|
1890
|
-
|
|
1891
|
-
<
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
2457
|
+
@if (contextItemCapabilities.CanEdit) {
|
|
2458
|
+
<button class="menu-item" (click)="editList()">
|
|
2459
|
+
<i class="fa-solid fa-pen"></i>
|
|
2460
|
+
Edit
|
|
2461
|
+
</button>
|
|
2462
|
+
}
|
|
2463
|
+
@if (contextItemCapabilities.CanShare) {
|
|
2464
|
+
<button class="menu-item" (click)="openShareDialog()">
|
|
2465
|
+
<i class="fa-solid fa-share-nodes"></i>
|
|
2466
|
+
Share
|
|
2467
|
+
</button>
|
|
2468
|
+
}
|
|
1898
2469
|
<button class="menu-item" (click)="duplicateList()">
|
|
1899
2470
|
<i class="fa-solid fa-copy"></i>
|
|
1900
2471
|
Duplicate
|
|
1901
2472
|
</button>
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
<
|
|
1905
|
-
|
|
1906
|
-
|
|
2473
|
+
@if (contextItemCapabilities.CanDelete) {
|
|
2474
|
+
<div class="menu-divider"></div>
|
|
2475
|
+
<button class="menu-item danger" (click)="confirmDeleteList()">
|
|
2476
|
+
<i class="fa-solid fa-trash"></i>
|
|
2477
|
+
Delete
|
|
2478
|
+
</button>
|
|
2479
|
+
}
|
|
2480
|
+
@if (!contextItemCapabilities.CanEdit && !contextItemCapabilities.CanShare && !contextItemCapabilities.CanDelete) {
|
|
2481
|
+
<div class="menu-viewer-hint">
|
|
2482
|
+
<i class="fa-solid fa-eye"></i>
|
|
2483
|
+
Viewer access — read only
|
|
2484
|
+
</div>
|
|
2485
|
+
}
|
|
1907
2486
|
</div>
|
|
1908
2487
|
}
|
|
1909
|
-
|
|
2488
|
+
</mj-page-body>
|
|
2489
|
+
|
|
2490
|
+
<!-- Modals/overlays live outside mj-page-body so its stacking context
|
|
2491
|
+
doesn't trap them. Position:fixed overlays would otherwise render
|
|
2492
|
+
behind a sibling overlay div, which silently closes the dialog on
|
|
2493
|
+
any click. -->
|
|
1910
2494
|
<!-- Create/Edit Dialog -->
|
|
1911
2495
|
@if (showCreateDialog) {
|
|
1912
2496
|
<div class="modal-overlay" (click)="closeCreateDialog()"></div>
|
|
@@ -2016,9 +2600,54 @@ export { ListsBrowseResource };
|
|
|
2016
2600
|
[config]="shareDialogConfig"
|
|
2017
2601
|
[visible]="showShareDialog"
|
|
2018
2602
|
(complete)="onShareComplete($event)"
|
|
2019
|
-
(cancel)="onShareCancel()"
|
|
2603
|
+
(cancel)="onShareCancel()"
|
|
2604
|
+
(manageInvitations)="onManageInvitations()"
|
|
2605
|
+
(viewAuditLog)="onViewAuditLog()">
|
|
2020
2606
|
</mj-list-share-dialog>
|
|
2021
2607
|
}
|
|
2608
|
+
|
|
2609
|
+
<!-- Invitations Dialog (mockup 16) -->
|
|
2610
|
+
@if (showInvitationsDialog && activeShareListId) {
|
|
2611
|
+
<mj-dialog
|
|
2612
|
+
[Visible]="true"
|
|
2613
|
+
[Title]="'Invitations — ' + (activeShareListName ?? 'List')"
|
|
2614
|
+
(Close)="closeInvitationsDialog()"
|
|
2615
|
+
[MinWidth]="640"
|
|
2616
|
+
[Width]="900"
|
|
2617
|
+
[Height]="640">
|
|
2618
|
+
<div class="dialog-content">
|
|
2619
|
+
<mj-list-invitations
|
|
2620
|
+
[Provider]="ProviderToUse"
|
|
2621
|
+
[ListID]="activeShareListId"
|
|
2622
|
+
[ListName]="activeShareListName">
|
|
2623
|
+
</mj-list-invitations>
|
|
2624
|
+
</div>
|
|
2625
|
+
<mj-dialog-actions>
|
|
2626
|
+
<button mjButton (click)="closeInvitationsDialog()" variant="outline">Close</button>
|
|
2627
|
+
</mj-dialog-actions>
|
|
2628
|
+
</mj-dialog>
|
|
2629
|
+
}
|
|
2630
|
+
|
|
2631
|
+
<!-- Audit Log Dialog (mockup 18) -->
|
|
2632
|
+
@if (showAuditLogDialog && activeShareListId) {
|
|
2633
|
+
<mj-dialog
|
|
2634
|
+
[Visible]="true"
|
|
2635
|
+
[Title]="'Audit Log — ' + (activeShareListName ?? 'List')"
|
|
2636
|
+
(Close)="closeAuditLogDialog()"
|
|
2637
|
+
[MinWidth]="720"
|
|
2638
|
+
[Width]="980"
|
|
2639
|
+
[Height]="680">
|
|
2640
|
+
<div class="dialog-content">
|
|
2641
|
+
<mj-list-audit-log
|
|
2642
|
+
[Provider]="ProviderToUse"
|
|
2643
|
+
[ListID]="activeShareListId">
|
|
2644
|
+
</mj-list-audit-log>
|
|
2645
|
+
</div>
|
|
2646
|
+
<mj-dialog-actions>
|
|
2647
|
+
<button mjButton (click)="closeAuditLogDialog()" variant="outline">Close</button>
|
|
2648
|
+
</mj-dialog-actions>
|
|
2649
|
+
</mj-dialog>
|
|
2650
|
+
}
|
|
2022
2651
|
|
|
2023
2652
|
<!-- Entity Dropdown Portal -->
|
|
2024
2653
|
@if (showEntityDropdown && !editingList) {
|
|
@@ -2044,8 +2673,8 @@ export { ListsBrowseResource };
|
|
|
2044
2673
|
</div>
|
|
2045
2674
|
</div>
|
|
2046
2675
|
}
|
|
2047
|
-
</
|
|
2048
|
-
`, encapsulation: ViewEncapsulation.None, styles: ["\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .lists-browse-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 .browse-header {\n display: flex;\n flex-direction: column;\n gap: 12px;\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-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\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 .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n }\n\n .search-box {\n position: relative;\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 200px;\n max-width: 300px;\n }\n\n .search-box i.fa-search {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n }\n\n .search-box input {\n padding: 8px 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n font-size: 14px;\n width: 100%;\n transition: border-color 0.2s, box-shadow 0.2s;\n }\n\n .search-box 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 .clear-search {\n position: absolute;\n right: 8px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n }\n\n .filter-group {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .filter-group label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .filter-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n min-width: 120px;\n }\n\n .filter-select: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 .sort-select {\n min-width: 140px;\n }\n\n .view-toggle-group {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n }\n\n .view-toggle {\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border: none;\n border-right: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .view-toggle:last-child {\n border-right: none;\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 color: var(--mj-text-inverse);\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: 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 .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 transition: background 0.2s;\n }\n\n .btn-clear:hover {\n background: var(--mj-border-default);\n }\n\n /* Content */\n .browse-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px 24px;\n }\n\n .results-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n }\n\n .result-count {\n font-size: 14px;\n color: var(--mj-text-secondary);\n }\n\n .sort-options {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .sort-options label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n /* Table View */\n .lists-table {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: var(--mj-shadow-sm);\n }\n\n .lists-table table {\n width: 100%;\n border-collapse: collapse;\n }\n\n .lists-table th {\n text-align: left;\n padding: 12px 16px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .lists-table td {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .list-row {\n cursor: pointer;\n transition: background 0.15s;\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-row:last-child td {\n border-bottom: none;\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n .col-name { width: 30%; }\n .col-entity { width: 15%; }\n .col-items { width: 8%; text-align: center; }\n .col-sharing { width: 8%; text-align: center; }\n .col-owner { width: 14%; }\n .col-updated { width: 15%; }\n .col-actions { width: 10%; text-align: right; }\n\n /* Sharing indicators */\n .sharing-indicator {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: var(--mj-brand-primary);\n font-size: 13px;\n }\n\n .sharing-indicator i {\n font-size: 14px;\n }\n\n .share-count {\n font-weight: 500;\n }\n\n .sharing-private {\n color: var(--mj-text-muted);\n font-size: 13px;\n }\n\n .sharing-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 50%;\n color: var(--mj-brand-primary);\n font-size: 11px;\n }\n\n .card-footer-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .name-cell {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .list-icon {\n width: 36px;\n height: 36px;\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 .name-content {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .list-name {\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .entity-badge {\n display: inline-block;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 4px;\n font-size: 12px;\n color: var(--mj-brand-primary-hover);\n }\n\n .owner-name {\n color: var(--mj-text-secondary);\n }\n\n .owner-name.is-me {\n color: var(--mj-brand-primary);\n font-weight: 500;\n }\n\n .action-btn {\n background: none;\n border: none;\n padding: 6px 10px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s;\n }\n\n .action-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Card 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 .owner-tag {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n }\n\n .owner-tag.is-me {\n color: var(--mj-brand-primary);\n }\n\n .date-info {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n /* Hierarchy View */\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 .hierarchy-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 .hierarchy-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .hierarchy-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .hierarchy-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-info {\n flex: 1;\n min-width: 0;\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 opacity: 0;\n transition: opacity 0.2s;\n }\n\n .hierarchy-row:hover .list-actions {\n opacity: 1;\n }\n\n /* Context Menu */\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 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 */\n .entity-dropdown-portal {\n position: fixed;\n z-index: 10002;\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 .header-row {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n\n .btn-create {\n width: 100%;\n justify-content: center;\n }\n\n .header-actions {\n flex-direction: column;\n align-items: stretch;\n }\n\n .search-box {\n max-width: none;\n }\n\n .filter-group {\n width: 100%;\n }\n\n .filter-select {\n flex: 1;\n width: 100%;\n }\n\n .view-toggle-group {\n justify-content: center;\n }\n\n .lists-table {\n overflow-x: auto;\n }\n\n .col-entity, .col-items, .col-updated {\n display: none;\n }\n\n .lists-grid {\n grid-template-columns: 1fr;\n }\n\n .modal-dialog {\n width: 95vw;\n }\n }\n "] }]
|
|
2676
|
+
</mj-page-layout>
|
|
2677
|
+
`, encapsulation: ViewEncapsulation.None, styles: ["\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .lists-browse-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 .browse-header {\n display: flex;\n flex-direction: column;\n gap: 12px;\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-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\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 .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n }\n\n .search-box {\n position: relative;\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 200px;\n max-width: 300px;\n }\n\n .search-box i.fa-search {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n }\n\n .search-box input {\n padding: 8px 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n font-size: 14px;\n width: 100%;\n transition: border-color 0.2s, box-shadow 0.2s;\n }\n\n .search-box 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 .clear-search {\n position: absolute;\n right: 8px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n }\n\n .filter-group {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .filter-group label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .filter-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n min-width: 120px;\n }\n\n .filter-select: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 .sort-select {\n min-width: 140px;\n }\n\n .view-toggle-group {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n }\n\n .view-toggle {\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border: none;\n border-right: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .view-toggle:last-child {\n border-right: none;\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 color: var(--mj-text-inverse);\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: 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 .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 transition: background 0.2s;\n }\n\n .btn-clear:hover {\n background: var(--mj-border-default);\n }\n\n /* Content */\n .browse-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px 24px;\n }\n\n .results-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n }\n\n .result-count {\n font-size: 14px;\n color: var(--mj-text-secondary);\n }\n\n .sort-options {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .sort-options label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n /* Table View */\n .lists-table {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: var(--mj-shadow-sm);\n }\n\n .lists-table table {\n width: 100%;\n border-collapse: collapse;\n }\n\n .lists-table th {\n text-align: left;\n padding: 12px 16px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .lists-table td {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .list-row {\n cursor: pointer;\n transition: background 0.15s;\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-row:last-child td {\n border-bottom: none;\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n .col-name { width: 30%; }\n .col-entity { width: 15%; }\n .col-items { width: 8%; text-align: center; }\n .col-sharing { width: 8%; text-align: center; }\n .col-owner { width: 14%; }\n .col-updated { width: 15%; }\n .col-actions { width: 10%; text-align: right; }\n\n /* Sharing indicators */\n .sharing-indicator {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: var(--mj-brand-primary);\n font-size: 13px;\n }\n\n .sharing-indicator i {\n font-size: 14px;\n }\n\n .share-count {\n font-weight: 500;\n }\n\n .sharing-private {\n color: var(--mj-text-muted);\n font-size: 13px;\n }\n\n .sharing-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 50%;\n color: var(--mj-brand-primary);\n font-size: 11px;\n }\n\n .card-footer-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .name-cell {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .list-icon {\n width: 36px;\n height: 36px;\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 .name-content {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .list-name {\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .entity-badge {\n display: inline-block;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 4px;\n font-size: 12px;\n color: var(--mj-brand-primary-hover);\n }\n\n .owner-name {\n color: var(--mj-text-secondary);\n }\n\n .owner-name.is-me {\n color: var(--mj-brand-primary);\n font-weight: 500;\n }\n\n .action-btn {\n background: none;\n border: none;\n padding: 6px 10px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s;\n }\n\n .action-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Card 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 /* Tag chips on a card. Stop-propagation is set on the wrapper so\n clicks on chips don't open the underlying list. */\n .card-tags {\n margin-top: 8px;\n }\n\n /* Favorite star on cards (Phase 5.3). */\n .favorite-btn {\n background: none;\n border: none;\n padding: 4px;\n margin: -4px;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 14px;\n border-radius: 4px;\n transition: color 0.12s ease, background 0.12s ease;\n }\n\n .favorite-btn:hover {\n background: var(--mj-bg-surface-card);\n color: var(--mj-status-warning);\n }\n\n .favorite-btn--active {\n color: var(--mj-status-warning);\n }\n\n /* Favorites-only toggle in the toolbar. */\n .favorite-filter-toggle {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: none;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 12.5px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n }\n\n .favorite-filter-toggle:hover {\n border-color: var(--mj-status-warning);\n color: var(--mj-status-warning);\n }\n\n .favorite-filter-toggle--active {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n color: var(--mj-status-warning);\n font-weight: 600;\n }\n\n /* Active-tag filter row above the grid (Phase 4.3). */\n .tag-filter-row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n margin-bottom: 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n font-size: 12.5px;\n }\n\n .tag-filter-row__label {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n\n .tag-filter-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 10px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n font-size: 11.5px;\n cursor: pointer;\n }\n\n .tag-filter-chip:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface));\n }\n\n .tag-filter-row__clear {\n background: none;\n border: none;\n color: var(--mj-text-link);\n font-size: 11.5px;\n cursor: pointer;\n margin-left: auto;\n }\n\n .tag-filter-row__clear:hover {\n text-decoration: underline;\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 .owner-tag {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n }\n\n .owner-tag.is-me {\n color: var(--mj-brand-primary);\n }\n\n .date-info {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n /* Hierarchy View */\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 .hierarchy-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 .hierarchy-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .hierarchy-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .hierarchy-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-info {\n flex: 1;\n min-width: 0;\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 opacity: 0;\n transition: opacity 0.2s;\n }\n\n .hierarchy-row:hover .list-actions {\n opacity: 1;\n }\n\n /* Context Menu */\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 .menu-viewer-hint {\n padding: 10px 14px;\n font-size: 12px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 8px;\n font-style: italic;\n }\n .menu-viewer-hint i { color: var(--mj-text-muted); }\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 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 */\n .entity-dropdown-portal {\n position: fixed;\n z-index: 10002;\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 .header-row {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n\n .btn-create {\n width: 100%;\n justify-content: center;\n }\n\n .header-actions {\n flex-direction: column;\n align-items: stretch;\n }\n\n .search-box {\n max-width: none;\n }\n\n .filter-group {\n width: 100%;\n }\n\n .filter-select {\n flex: 1;\n width: 100%;\n }\n\n .view-toggle-group {\n justify-content: center;\n }\n\n .lists-table {\n overflow-x: auto;\n }\n\n .col-entity, .col-items, .col-updated {\n display: none;\n }\n\n .lists-grid {\n grid-template-columns: 1fr;\n }\n\n .modal-dialog {\n width: 95vw;\n }\n }\n "] }]
|
|
2049
2678
|
}], () => [{ type: i0.ChangeDetectorRef }, { type: i1.TabService }, { type: i2.MJNotificationService }, { type: i0.ElementRef }, { type: i3.ListSharingService }], { onDocumentClick: [{
|
|
2050
2679
|
type: HostListener,
|
|
2051
2680
|
args: ['document:click', ['$event']]
|
|
@@ -2053,5 +2682,5 @@ export { ListsBrowseResource };
|
|
|
2053
2682
|
type: HostListener,
|
|
2054
2683
|
args: ['document:keydown.escape']
|
|
2055
2684
|
}] }); })();
|
|
2056
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ListsBrowseResource, { className: "ListsBrowseResource", filePath: "src/Lists/components/lists-browse-resource.component.ts", lineNumber:
|
|
2685
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ListsBrowseResource, { className: "ListsBrowseResource", filePath: "src/Lists/components/lists-browse-resource.component.ts", lineNumber: 1866 }); })();
|
|
2057
2686
|
//# sourceMappingURL=lists-browse-resource.component.js.map
|