@memberjunction/ng-dashboards 6.2.0-edge.6 → 6.2.0-edge.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -16
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +2 -2
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-management.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-management.component.js +3 -1
- package/dist/AI/components/analytics/realtime/realtime-management.component.js.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-overview.component.d.ts +1 -1
- package/dist/AI/components/analytics/realtime/realtime-overview.component.js +3 -3
- package/dist/AI/components/analytics/realtime/realtime-overview.component.js.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-session-data.d.ts +6 -4
- package/dist/AI/components/analytics/realtime/realtime-session-data.d.ts.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-session-data.js +8 -2
- package/dist/AI/components/analytics/realtime/realtime-session-data.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +31 -10
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js +1 -1
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -1
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +1 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -1
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -1
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +2 -2
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +14 -24
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +14 -7
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js +4 -2
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/Actions/action-result-code.d.ts +80 -0
- package/dist/Actions/action-result-code.d.ts.map +1 -0
- package/dist/Actions/action-result-code.js +163 -0
- package/dist/Actions/action-result-code.js.map +1 -0
- package/dist/Actions/components/actions-overview.component.d.ts +8 -0
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +12 -9
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +29 -9
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +65 -42
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.js +5 -4
- package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts +92 -130
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts.map +1 -1
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.js +189 -274
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.js.map +1 -1
- package/dist/ChiefOfStaff/chief-of-staff-approvals.component.d.ts +29 -0
- package/dist/ChiefOfStaff/chief-of-staff-approvals.component.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-approvals.component.js +666 -0
- package/dist/ChiefOfStaff/chief-of-staff-approvals.component.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-governance.component.d.ts +56 -0
- package/dist/ChiefOfStaff/chief-of-staff-governance.component.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-governance.component.js +515 -0
- package/dist/ChiefOfStaff/chief-of-staff-governance.component.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-live-refresh.d.ts +14 -0
- package/dist/ChiefOfStaff/chief-of-staff-live-refresh.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-live-refresh.js +39 -0
- package/dist/ChiefOfStaff/chief-of-staff-live-refresh.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-overview.component.d.ts +17 -0
- package/dist/ChiefOfStaff/chief-of-staff-overview.component.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-overview.component.js +485 -0
- package/dist/ChiefOfStaff/chief-of-staff-overview.component.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-page-base.d.ts +139 -0
- package/dist/ChiefOfStaff/chief-of-staff-page-base.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-page-base.js +602 -0
- package/dist/ChiefOfStaff/chief-of-staff-page-base.js.map +1 -0
- package/dist/ChiefOfStaff/index.d.ts +4 -1
- package/dist/ChiefOfStaff/index.d.ts.map +1 -1
- package/dist/ChiefOfStaff/index.js +4 -1
- package/dist/ChiefOfStaff/index.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +3 -3
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +3 -3
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +2 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/services/component-version.service.d.ts.map +1 -1
- package/dist/ComponentStudio/services/component-version.service.js +3 -0
- package/dist/ComponentStudio/services/component-version.service.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +21 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +32 -5
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +2 -2
- package/dist/DevTools/lazy-module-status.component.js +2 -2
- package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.js +5 -0
- package/dist/FormBuilder/form-builder-resource.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +2 -2
- package/dist/Integration/services/integration-data.service.d.ts +1 -1
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +4 -3
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +11 -3
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +16 -16
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/visualize/semantic-graph/semantic-graph-explorer.component.d.ts +113 -0
- package/dist/KnowledgeHub/components/visualize/semantic-graph/semantic-graph-explorer.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/semantic-graph/semantic-graph-explorer.component.js +1184 -0
- package/dist/KnowledgeHub/components/visualize/semantic-graph/semantic-graph-explorer.component.js.map +1 -0
- package/dist/KnowledgeHub/components/visualize/visualize-agent-context.d.ts +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-agent-context.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-agent-context.js +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-agent-context.js.map +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js +21 -10
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/LoginStudio/login-studio-resource.component.d.ts.map +1 -1
- package/dist/LoginStudio/login-studio-resource.component.js +1 -0
- package/dist/LoginStudio/login-studio-resource.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-experiments.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-experiments.component.js +1 -0
- package/dist/PredictiveStudio/components/ps-experiments.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js +2 -2
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.js +3 -0
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.js.map +1 -1
- package/dist/PredictiveStudio/engine/predictive-studio.engine.d.ts.map +1 -1
- package/dist/PredictiveStudio/engine/predictive-studio.engine.js +1 -0
- package/dist/PredictiveStudio/engine/predictive-studio.engine.js.map +1 -1
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js +1 -0
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +26 -0
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +375 -252
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +4 -2
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/UserRoutines/user-routines-resource.component.d.ts +8 -1
- package/dist/UserRoutines/user-routines-resource.component.d.ts.map +1 -1
- package/dist/UserRoutines/user-routines-resource.component.js +22 -4
- package/dist/UserRoutines/user-routines-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +1 -0
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VideoStudio/components/vs-archetype-editor.component.d.ts +162 -0
- package/dist/VideoStudio/components/vs-archetype-editor.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-archetype-editor.component.js +1105 -0
- package/dist/VideoStudio/components/vs-archetype-editor.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-audio-options.component.d.ts +27 -0
- package/dist/VideoStudio/components/vs-audio-options.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-audio-options.component.js +119 -0
- package/dist/VideoStudio/components/vs-audio-options.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-copilot-panel.component.d.ts +105 -0
- package/dist/VideoStudio/components/vs-copilot-panel.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-copilot-panel.component.js +560 -0
- package/dist/VideoStudio/components/vs-copilot-panel.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-production-brief.component.d.ts +163 -0
- package/dist/VideoStudio/components/vs-production-brief.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-production-brief.component.js +1054 -0
- package/dist/VideoStudio/components/vs-production-brief.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-setup-health-card.component.d.ts +43 -0
- package/dist/VideoStudio/components/vs-setup-health-card.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-setup-health-card.component.js +412 -0
- package/dist/VideoStudio/components/vs-setup-health-card.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-studio-slide-in.component.d.ts +73 -0
- package/dist/VideoStudio/components/vs-studio-slide-in.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-studio-slide-in.component.js +271 -0
- package/dist/VideoStudio/components/vs-studio-slide-in.component.js.map +1 -0
- package/dist/VideoStudio/index.d.ts +12 -0
- package/dist/VideoStudio/index.d.ts.map +1 -0
- package/dist/VideoStudio/index.js +12 -0
- package/dist/VideoStudio/index.js.map +1 -0
- package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.d.ts +118 -0
- package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.d.ts.map +1 -0
- package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.js +964 -0
- package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.js.map +1 -0
- package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.d.ts +70 -0
- package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.d.ts.map +1 -0
- package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.js +600 -0
- package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.js.map +1 -0
- package/dist/VideoStudio/resources/video-studio-productions-resource.component.d.ts +182 -0
- package/dist/VideoStudio/resources/video-studio-productions-resource.component.d.ts.map +1 -0
- package/dist/VideoStudio/resources/video-studio-productions-resource.component.js +1481 -0
- package/dist/VideoStudio/resources/video-studio-productions-resource.component.js.map +1 -0
- package/dist/VideoStudio/services/vs-studio-slide-in-state.service.d.ts +102 -0
- package/dist/VideoStudio/services/vs-studio-slide-in-state.service.d.ts.map +1 -0
- package/dist/VideoStudio/services/vs-studio-slide-in-state.service.js +240 -0
- package/dist/VideoStudio/services/vs-studio-slide-in-state.service.js.map +1 -0
- package/dist/VideoStudio/video-studio-agent-context.d.ts +495 -0
- package/dist/VideoStudio/video-studio-agent-context.d.ts.map +1 -0
- package/dist/VideoStudio/video-studio-agent-context.js +992 -0
- package/dist/VideoStudio/video-studio-agent-context.js.map +1 -0
- package/dist/ai-dashboards.module.d.ts +46 -41
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +33 -7
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/module.d.ts +13 -12
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +7 -0
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +8 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +10 -2
- package/dist/public-api.js.map +1 -1
- package/dist/shared/action-scheduled-job.d.ts.map +1 -1
- package/dist/shared/action-scheduled-job.js +2 -0
- package/dist/shared/action-scheduled-job.js.map +1 -1
- package/dist/video-studio-dashboards.module.d.ts +40 -0
- package/dist/video-studio-dashboards.module.d.ts.map +1 -0
- package/dist/video-studio-dashboards.module.js +159 -0
- package/dist/video-studio-dashboards.module.js.map +1 -0
- package/package.json +78 -71
- package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts +0 -195
- package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts.map +0 -1
- package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.js +0 -2910
- package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lists-browse-resource.component.js","sourceRoot":"","sources":["../../../src/Lists/components/lists-browse-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, ChangeDetectorRef, OnDestroy, ElementRef, HostListener } from '@angular/core';\nimport { RegisterClass , UUIDsEqual, MJGlobal } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData, MJListCategoryEntity } from '@memberjunction/core-entities';\nimport { MJListEntity, MJListEntityExtended, MJListDetailEntity, MJUserFavoriteEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { BaseEntity, BaseEntityEvent, Metadata, RunView } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { TabService } from '@memberjunction/ng-base-application';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { ListSharingService, ListSharingSummary, ListShareDialogConfig, ListShareDialogResult } from '@memberjunction/ng-list-management';\nimport { CapabilitiesForLevel, type ListCapabilities, type SharePermissionLevel } from '@memberjunction/lists-base';\nimport { FilterFieldConfig } from '@memberjunction/ng-ui-components';\nimport { validateEnumParam, validateStringParam } from '../../shared/agent-tool-validation';\nimport { buildListBrowseAgentContext, resolveNamedRecord, buildNotFoundError } from '../lists-agent-context';\ninterface BrowseListItem {\n list: MJListEntity;\n itemCount: number;\n entityName: string;\n ownerName: string;\n isOwner: boolean;\n sharingInfo?: ListSharingSummary;\n}\n\ninterface CategoryNode {\n category: MJListCategoryEntity | null;\n lists: BrowseListItem[];\n children: CategoryNode[];\n isExpanded: boolean;\n}\n\ntype ViewMode = 'table' | 'card' | 'hierarchy';\n\n@RegisterClass(BaseResourceComponent, 'ListsBrowseResource')\n@Component({\n standalone: false,\n selector: 'mj-lists-browse-resource',\n template: `\n <mj-page-layout>\n <mj-page-header Title=\"Lists\" Icon=\"fa-solid fa-list-check\">\n <!-- X-of-Y filtered count earns its meta spot per chrome conventions §2. -->\n <div meta>\n <mj-stat-badge\n [Count]=\"filteredLists.length\"\n [Total]=\"allLists.length\"\n Label=\"lists\">\n </mj-stat-badge>\n </div>\n <div actions>\n <!-- Single primary CTA; all filters live behind the Filter button in\n the control bar below (concise chrome). -->\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createNewList()\">\n <i class=\"fa-solid fa-plus\"></i> <span class=\"action-btn-label\">New List</span>\n </button>\n </div>\n <div toolbar>\n <!-- Control bar: search · Filter · view. Owner, Entity and Favorites\n all live behind the one Filter button; applied filters (including\n tags) show as removable chips below. On mobile the popover docks\n as a bottom sheet and the Filter button is icon-only. -->\n <mj-page-search\n Placeholder=\"Search lists...\"\n [Value]=\"searchTerm\"\n (ValueChange)=\"onSearchChange($event)\">\n </mj-page-search>\n <mj-filter-popover\n Label=\"Filters\"\n Icon=\"fa-solid fa-filter\"\n [ActiveCount]=\"TotalActiveFilterCount\"\n [ShowClearAll]=\"TotalActiveFilterCount > 0\"\n (ClearAllRequested)=\"clearAllAppliedFilters()\">\n <mj-filter-panel\n [Fields]=\"listFilterFields\"\n [Values]=\"listFilterValues\"\n (ValuesChange)=\"onFilterValuesChange($event)\"\n (Reset)=\"resetPopoverFilters()\">\n </mj-filter-panel>\n </mj-filter-popover>\n <mj-view-toggle\n [Options]=\"listViewOptions\"\n [ActiveKey]=\"viewMode\"\n (KeyChange)=\"setViewMode($any($event))\">\n </mj-view-toggle>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading lists...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n <!-- Empty State - No Lists -->\n @if (!isLoading && allLists.length === 0) {\n <mj-empty-state Size=\"large\"\n Icon=\"fa-solid fa-list-check\"\n Title=\"No Lists Yet\"\n Message=\"Lists help you organize and track groups of records across your data.\"\n ActionText=\"Create Your First List\"\n ActionIcon=\"fa-solid fa-plus\"\n (Action)=\"createNewList()\">\n <div class=\"empty-state-features\">\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Group records from any entity</span>\n </div>\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Organize with categories</span>\n </div>\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Quick access from any view</span>\n </div>\n </div>\n </mj-empty-state>\n }\n\n <!-- Empty State - No Results -->\n @if (!isLoading && allLists.length > 0 && filteredLists.length === 0) {\n <mj-empty-state Variant=\"no-results\"\n Icon=\"fa-solid fa-filter-circle-xmark\"\n Title=\"No Results Found\"\n Message=\"No lists match your current filters. Try adjusting your search or filters.\"\n ActionText=\"Reset filters\"\n ActionIcon=\"fa-solid fa-rotate-left\"\n (Action)=\"clearFilters()\" />\n }\n \n <!-- Results Content -->\n @if (!isLoading && filteredLists.length > 0) {\n <div class=\"browse-content\">\n <div class=\"results-header\">\n <span class=\"result-count\">{{filteredLists.length}} list{{filteredLists.length !== 1 ? 's' : ''}}</span>\n <div class=\"sort-options\">\n <label>Sort:</label>\n <select\n [(ngModel)]=\"selectedSort\"\n (ngModelChange)=\"onSortChange($event)\"\n class=\"filter-select sort-select\">\n @for (opt of sortOptions; track opt) {\n <option [value]=\"opt.value\">{{opt.name}}</option>\n }\n </select>\n </div>\n </div>\n <!-- Table View -->\n @if (viewMode === 'table') {\n <div class=\"lists-table\">\n <table role=\"grid\" aria-label=\"Lists table\">\n <thead>\n <tr>\n <th class=\"col-name\" scope=\"col\">Name</th>\n <th class=\"col-entity\" scope=\"col\">Entity</th>\n <th class=\"col-items\" scope=\"col\">Items</th>\n <th class=\"col-sharing\" scope=\"col\">Shared</th>\n <th class=\"col-owner\" scope=\"col\">Owner</th>\n <th class=\"col-updated\" scope=\"col\">Updated</th>\n <th class=\"col-actions\" scope=\"col\"><span class=\"sr-only\">Actions</span></th>\n </tr>\n </thead>\n <tbody>\n @for (item of filteredLists; track item) {\n <tr\n (click)=\"openList(item)\"\n (keydown.enter)=\"openList(item)\"\n class=\"list-row\"\n tabindex=\"0\"\n role=\"row\">\n <td class=\"col-name\" role=\"gridcell\">\n <div class=\"name-cell\">\n <div class=\"list-icon\" [style.background-color]=\"getEntityColor(item.entityName)\" aria-hidden=\"true\">\n <i [class]=\"getEntityIcon(item.entityName)\"></i>\n </div>\n <div class=\"name-content\">\n <span class=\"list-name\">{{item.list.Name}}</span>\n @if (item.list.Description) {\n <span class=\"list-desc\">{{item.list.Description}}</span>\n }\n </div>\n </div>\n </td>\n <td class=\"col-entity\" role=\"gridcell\">\n <span class=\"entity-badge\">{{item.entityName}}</span>\n </td>\n <td class=\"col-items\" role=\"gridcell\">{{item.itemCount}}</td>\n <td class=\"col-sharing\" role=\"gridcell\">\n @if (item.sharingInfo; as sharing) {\n @if (sharing.totalShares > 0) {\n <span class=\"sharing-indicator\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n <span class=\"share-count\">{{sharing.totalShares}}</span>\n </span>\n }\n @if (sharing.totalShares === 0) {\n <span class=\"sharing-private\">\n <i class=\"fa-solid fa-lock\"></i>\n </span>\n }\n }\n @if (!item.sharingInfo) {\n <span class=\"sharing-private\">\n <i class=\"fa-solid fa-lock\"></i>\n </span>\n }\n </td>\n <td class=\"col-owner\" role=\"gridcell\">\n <span class=\"owner-name\" [class.is-me]=\"item.isOwner\">\n {{item.isOwner ? 'You' : item.ownerName}}\n </span>\n </td>\n <td class=\"col-updated\" role=\"gridcell\">{{formatDate(item.list.__mj_UpdatedAt)}}</td>\n <td class=\"col-actions\" role=\"gridcell\">\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"openListMenu($event, item)\"\n title=\"More options\">\n <i class=\"fa-solid fa-ellipsis-v\" aria-hidden=\"true\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n <!-- Card View -->\n @if (viewMode === 'card') {\n <div class=\"lists-grid\" role=\"list\" aria-label=\"Lists\">\n @for (item of filteredLists; track item) {\n <div\n class=\"list-card\"\n (click)=\"openList(item)\"\n (keydown.enter)=\"openList(item)\"\n tabindex=\"0\"\n role=\"listitem\">\n <div class=\"card-header\">\n <div class=\"card-icon\" [style.background-color]=\"getEntityColor(item.entityName)\" aria-hidden=\"true\">\n <i [class]=\"getEntityIcon(item.entityName)\"></i>\n </div>\n <button\n class=\"favorite-btn\"\n [class.favorite-btn--active]=\"isFavorite(item.list.ID)\"\n (click)=\"toggleFavorite($event, item)\"\n [title]=\"isFavorite(item.list.ID) ? 'Remove from favorites' : 'Add to favorites'\">\n <i [class]=\"isFavorite(item.list.ID) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n <div class=\"card-menu\">\n <button class=\"menu-btn\" (click)=\"openListMenu($event, item)\">\n <i class=\"fa-solid fa-ellipsis-v\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"card-body\">\n <h3 class=\"card-title\">{{item.list.Name}}</h3>\n @if (item.list.Description) {\n <p class=\"card-description\">{{item.list.Description}}</p>\n }\n <div class=\"card-meta\">\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-database\"></i>\n {{item.entityName}}\n </span>\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-hashtag\"></i>\n {{item.itemCount}} item{{item.itemCount !== 1 ? 's' : ''}}\n </span>\n </div>\n <!-- Tag chips (Phase 4). Read-only on cards; click adds the\n tag to the filter row above. We stop propagation on\n the wrapper so clicks on chips don't also fire the\n card's openList handler. -->\n <div class=\"card-tags\" (click)=\"$event.stopPropagation()\">\n <mj-tag-chips\n [Provider]=\"Provider\"\n EntityName=\"MJ: Lists\"\n [RecordID]=\"item.list.ID\"\n [Editable]=\"false\"\n [MaxDisplay]=\"3\"\n (TagClicked)=\"onCardTagClicked($event)\">\n </mj-tag-chips>\n </div>\n </div>\n <div class=\"card-footer\">\n <span class=\"owner-tag\" [class.is-me]=\"item.isOwner\">\n <i class=\"fa-solid fa-user\"></i>\n {{item.isOwner ? 'You' : item.ownerName}}\n </span>\n <div class=\"card-footer-right\">\n @if (item.sharingInfo; as sharing) {\n @if (sharing.totalShares > 0) {\n <span class=\"sharing-badge\" [title]=\"'Shared with ' + sharing.totalShares + ' user(s)/role(s)'\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n </span>\n }\n }\n <span class=\"date-info\">{{formatDate(item.list.__mj_UpdatedAt)}}</span>\n </div>\n </div>\n </div>\n }\n </div>\n }\n <!-- Hierarchy View -->\n @if (viewMode === 'hierarchy') {\n <div class=\"category-tree\">\n @for (node of categoryTree; track node) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { node: node, depth: 0 }\"></ng-container>\n }\n </div>\n }\n </div>\n }\n \n <!-- Category Node Template -->\n <ng-template #categoryNodeTemplate let-node=\"node\" let-depth=\"depth\">\n <div class=\"category-section\" [style.margin-left.px]=\"depth * 20\">\n <!-- Category Header -->\n @if (node.category) {\n <div\n class=\"category-header\"\n (click)=\"toggleCategory(node)\">\n <i [class]=\"node.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n <i class=\"fa-solid fa-folder\" [class.fa-folder-open]=\"node.isExpanded\"></i>\n <span class=\"category-name\">{{node.category.Name}}</span>\n <span class=\"category-count\">{{getListCountInCategory(node)}}</span>\n </div>\n }\n \n <!-- Uncategorized Header -->\n @if (!node.category && node.lists.length > 0) {\n <div\n class=\"category-header uncategorized\"\n (click)=\"toggleCategory(node)\">\n <i [class]=\"node.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n <i class=\"fa-solid fa-inbox\"></i>\n <span class=\"category-name\">Uncategorized</span>\n <span class=\"category-count\">{{node.lists.length}}</span>\n </div>\n }\n \n <!-- Lists in this category -->\n @if (node.isExpanded) {\n <div class=\"category-lists\" role=\"list\">\n @for (item of node.lists; track item) {\n <div\n class=\"list-row hierarchy-row\"\n (click)=\"openList(item)\"\n (keydown.enter)=\"openList(item)\"\n tabindex=\"0\"\n role=\"listitem\">\n <div class=\"list-icon\" [style.background-color]=\"getEntityColor(item.entityName)\" aria-hidden=\"true\">\n <i [class]=\"getEntityIcon(item.entityName)\"></i>\n </div>\n <div class=\"list-info\">\n <span class=\"list-name\">{{item.list.Name}}</span>\n <span class=\"list-meta\">\n {{item.entityName}} · {{item.itemCount}} items\n @if (!item.isOwner) {\n <span> · {{item.ownerName}}</span>\n }\n </span>\n </div>\n <div class=\"list-actions\">\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"openListMenu($event, item)\">\n <i class=\"fa-solid fa-ellipsis-v\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n \n <!-- Child categories -->\n @if (node.isExpanded) {\n @for (child of node.children; track child) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { node: child, depth: depth + 1 }\"></ng-container>\n }\n }\n </div>\n </ng-template>\n \n <!-- Context Menu (Phase 2.8 viewer-perspective gating).\n Items shown depend on contextItemCapabilities, resolved lazily\n on menu open. Viewers (no Edit/Share/Delete) still see\n Duplicate. Server-side enforcement remains source of truth;\n hiding is just UX so users don't see buttons that would fail. -->\n @if (showContextMenu) {\n <div class=\"context-menu-overlay\" (click)=\"closeContextMenu()\"></div>\n }\n @if (showContextMenu) {\n <div class=\"context-menu\" [style.top.px]=\"contextMenuY\" [style.left.px]=\"contextMenuX\">\n @if (contextItemCapabilities.CanEdit) {\n <button class=\"menu-item\" (click)=\"editList()\">\n <i class=\"fa-solid fa-pen\"></i>\n Edit\n </button>\n }\n @if (contextItemCapabilities.CanShare) {\n <button class=\"menu-item\" (click)=\"openShareDialog()\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n Share\n </button>\n }\n <button class=\"menu-item\" (click)=\"duplicateList()\">\n <i class=\"fa-solid fa-copy\"></i>\n Duplicate\n </button>\n @if (CanDeleteContextItem) {\n <div class=\"menu-divider\"></div>\n <button class=\"menu-item danger\" (click)=\"confirmDeleteList()\">\n <i class=\"fa-solid fa-trash\"></i>\n Delete\n </button>\n }\n @if (!contextItemCapabilities.CanEdit && !contextItemCapabilities.CanShare && !CanDeleteContextItem) {\n <div class=\"menu-viewer-hint\">\n <i class=\"fa-solid fa-eye\"></i>\n Viewer access — read only\n </div>\n }\n </div>\n }\n </mj-page-body>\n\n <!-- Modals/overlays live outside mj-page-body so its stacking context\n doesn't trap them. Position:fixed overlays would otherwise render\n behind a sibling overlay div, which silently closes the dialog on\n any click. -->\n <!-- Create/Edit Dialog -->\n @if (showCreateDialog) {\n <div class=\"modal-overlay\" (click)=\"closeCreateDialog()\"></div>\n }\n @if (showCreateDialog) {\n <div class=\"modal-dialog\">\n <div class=\"modal-header\">\n <h3>{{editingList ? 'Edit List' : 'Create New List'}}</h3>\n <button class=\"modal-close\" (click)=\"closeCreateDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"form-group\">\n <label>Name *</label>\n <input\n type=\"text\"\n [(ngModel)]=\"newListName\"\n placeholder=\"Enter list name\"\n class=\"form-input\" />\n </div>\n <div class=\"form-group\">\n <label>Description</label>\n <textarea\n [(ngModel)]=\"newListDescription\"\n placeholder=\"Optional description\"\n class=\"form-input\"\n rows=\"3\"></textarea>\n </div>\n @if (!editingList) {\n <div class=\"form-group\">\n <label>Entity *</label>\n <div class=\"custom-select-wrapper\">\n <input\n #entityInput\n type=\"text\"\n [(ngModel)]=\"entitySearchTerm\"\n (ngModelChange)=\"filterEntities($event)\"\n (focus)=\"openEntityDropdown(entityInput)\"\n placeholder=\"Search and select an entity\"\n class=\"form-input\" />\n </div>\n </div>\n }\n @if (editingList) {\n <div class=\"form-group\">\n <label>Entity</label>\n <input type=\"text\" [value]=\"entitySearchTerm\" class=\"form-input\" disabled />\n </div>\n }\n <div class=\"form-group\">\n <label>Category</label>\n <select [(ngModel)]=\"selectedCategoryId\" class=\"form-input\">\n <option [ngValue]=\"null\">No category</option>\n @for (cat of flatCategories; track cat) {\n <option [ngValue]=\"cat.ID\">{{cat.displayName}}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn-primary\"\n (click)=\"saveList()\"\n [disabled]=\"!newListName || (!editingList && !selectedEntityId) || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isSaving ? 'Saving...' : (editingList ? 'Save' : 'Create')}}\n </button>\n <button class=\"btn-secondary\" (click)=\"closeCreateDialog()\" [disabled]=\"isSaving\">Cancel</button>\n </div>\n </div>\n }\n \n <!-- Delete Confirmation Dialog -->\n @if (showDeleteConfirm) {\n <div class=\"modal-overlay\" (click)=\"cancelDelete()\"></div>\n }\n @if (showDeleteConfirm) {\n <div class=\"modal-dialog confirm-dialog\">\n <div class=\"modal-header\">\n <h3>Delete List</h3>\n <button class=\"modal-close\" (click)=\"cancelDelete()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <p>Are you sure you want to delete \"<strong>{{deleteListName}}</strong>\"?</p>\n <p class=\"warning-text\">This will also remove all items in the list.</p>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn-danger\" (click)=\"deleteList()\" [disabled]=\"isDeleting\">\n @if (isDeleting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isDeleting ? 'Deleting...' : 'Delete'}}\n </button>\n <button class=\"btn-secondary\" (click)=\"cancelDelete()\" [disabled]=\"isDeleting\">Cancel</button>\n </div>\n </div>\n }\n \n <!-- Share Dialog -->\n @if (shareDialogConfig) {\n <mj-list-share-dialog\n [config]=\"shareDialogConfig\"\n [visible]=\"showShareDialog\"\n (complete)=\"onShareComplete($event)\"\n (cancel)=\"onShareCancel()\"\n (manageInvitations)=\"onManageInvitations()\"\n (viewAuditLog)=\"onViewAuditLog()\">\n </mj-list-share-dialog>\n }\n\n <!-- Invitations Dialog (mockup 16) -->\n @if (showInvitationsDialog && activeShareListId) {\n <mj-dialog\n [Visible]=\"true\"\n [Title]=\"'Invitations — ' + (activeShareListName ?? 'List')\"\n (Close)=\"closeInvitationsDialog()\"\n [MinWidth]=\"640\"\n [Width]=\"900\"\n [Height]=\"640\">\n <div class=\"dialog-content\">\n <mj-list-invitations\n [Provider]=\"ProviderToUse\"\n [ListID]=\"activeShareListId\"\n [ListName]=\"activeShareListName\">\n </mj-list-invitations>\n </div>\n <mj-dialog-actions>\n <button mjButton (click)=\"closeInvitationsDialog()\" variant=\"outline\">Close</button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n\n <!-- Audit Log Dialog (mockup 18) -->\n @if (showAuditLogDialog && activeShareListId) {\n <mj-dialog\n [Visible]=\"true\"\n [Title]=\"'Audit Log — ' + (activeShareListName ?? 'List')\"\n (Close)=\"closeAuditLogDialog()\"\n [MinWidth]=\"720\"\n [Width]=\"980\"\n [Height]=\"680\">\n <div class=\"dialog-content\">\n <mj-list-audit-log\n [Provider]=\"ProviderToUse\"\n [ListID]=\"activeShareListId\">\n </mj-list-audit-log>\n </div>\n <mj-dialog-actions>\n <button mjButton (click)=\"closeAuditLogDialog()\" variant=\"outline\">Close</button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n \n <!-- Entity Dropdown Portal -->\n @if (showEntityDropdown && !editingList) {\n <div\n class=\"entity-dropdown-portal\"\n [style.top.px]=\"entityDropdownPosition.top\"\n [style.left.px]=\"entityDropdownPosition.left\"\n [style.width.px]=\"entityDropdownPosition.width\"\n [class.dropdown-above]=\"entityDropdownPosition.openAbove\">\n <div class=\"entity-dropdown-content\" [class.open-above]=\"entityDropdownPosition.openAbove\">\n @for (entity of filteredEntitiesList; track entity) {\n <div\n class=\"dropdown-item\"\n (mousedown)=\"selectEntity(entity); $event.preventDefault()\">\n {{entity.DisplayName}}\n </div>\n }\n @if (filteredEntitiesList.length === 0) {\n <div class=\"dropdown-empty\">\n No entities found\n </div>\n }\n </div>\n </div>\n }\n </mj-page-layout>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n /* Control bar: on mobile search grows so the icon-only Filter + view toggle\n stay on one line. On desktop search keeps its natural width. */\n @media (max-width: 768px) {\n mj-page-search {\n flex: 1;\n }\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 /* Onboarding feature checklist — projected into <mj-empty-state>. */\n .empty-state-features {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-2);\n margin: var(--mj-space-5) 0 var(--mj-space-2);\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 /* 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 `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ListsBrowseResource extends BaseResourceComponent implements OnDestroy {\n protected override destroy$ = new Subject<void>();\n\n isLoading = true;\n SearchTerm = '';\n\n /** @deprecated Use {@link SearchTerm}. */\n get searchTerm() {\n return this.SearchTerm;\n }\n /** @deprecated Use {@link SearchTerm}. */\n set searchTerm(value) {\n this.SearchTerm = value;\n }\n ViewMode: ViewMode = 'card';\n\n /** @deprecated Use {@link ViewMode}. */\n get viewMode(): ViewMode {\n return this.ViewMode;\n }\n /** @deprecated Use {@link ViewMode}. */\n set viewMode(value: ViewMode) {\n this.ViewMode = value;\n }\n SelectedEntity = 'all';\n\n /** @deprecated Use {@link SelectedEntity}. */\n get selectedEntity() {\n return this.SelectedEntity;\n }\n /** @deprecated Use {@link SelectedEntity}. */\n set selectedEntity(value) {\n this.SelectedEntity = value;\n }\n SelectedOwner = 'mine';\n\n /** @deprecated Use {@link SelectedOwner}. */\n get selectedOwner() {\n return this.SelectedOwner;\n }\n /** @deprecated Use {@link SelectedOwner}. */\n set selectedOwner(value) {\n this.SelectedOwner = value;\n }\n SelectedSort = 'name';\n\n /** @deprecated Use {@link SelectedSort}. */\n get selectedSort() {\n return this.SelectedSort;\n }\n /** @deprecated Use {@link SelectedSort}. */\n set selectedSort(value) {\n this.SelectedSort = value;\n }\n\n /**\n * Active tag filters (Phase 4.3). Multi-tag = AND — a list must have\n * every active tag to appear. URL state mirrors this via the `tags`\n * query param (comma-separated tag IDs).\n */\n TagFilters: Array<{ TagID: string; Name: string }> = [];\n\n /** @deprecated Use {@link TagFilters}. */\n get tagFilters(): Array<{ TagID: string; Name: string }> {\n return this.TagFilters;\n }\n /** @deprecated Use {@link TagFilters}. */\n set tagFilters(value: Array<{ TagID: string; Name: string }>) {\n this.TagFilters = value;\n }\n\n /**\n * Set of List IDs that match the current `tagFilters` (intersection).\n * `null` means \"no tag filter active\" — pass-through. Populated by\n * `recomputeTagMembership` whenever `tagFilters` changes; consumed by\n * `applyFilters` to narrow the visible list.\n */\n private tagFilteredListIds: Set<string> | null = null;\n\n /**\n * Favorite-list IDs for the current user (Phase 5.3). Backed by the\n * existing `MJ: User Favorites` entity. `null` while loading; a Set\n * once populated so card-side toggling is O(1).\n */\n FavoriteListIds: Set<string> = new Set();\n\n /** @deprecated Use {@link FavoriteListIds}. */\n get favoriteListIds(): Set<string> {\n return this.FavoriteListIds;\n }\n /** @deprecated Use {@link FavoriteListIds}. */\n set favoriteListIds(value: Set<string>) {\n this.FavoriteListIds = value;\n }\n\n /** When true, only favorited lists appear in the grid. */\n ShowOnlyFavorites = false;\n\n /** @deprecated Use {@link ShowOnlyFavorites}. */\n get showOnlyFavorites() {\n return this.ShowOnlyFavorites;\n }\n /** @deprecated Use {@link ShowOnlyFavorites}. */\n set showOnlyFavorites(value) {\n this.ShowOnlyFavorites = value;\n }\n\n AllLists: BrowseListItem[] = [];\n\n /** @deprecated Use {@link AllLists}. */\n get allLists(): BrowseListItem[] {\n return this.AllLists;\n }\n /** @deprecated Use {@link AllLists}. */\n set allLists(value: BrowseListItem[]) {\n this.AllLists = value;\n }\n FilteredLists: BrowseListItem[] = [];\n\n /** @deprecated Use {@link FilteredLists}. */\n get filteredLists(): BrowseListItem[] {\n return this.FilteredLists;\n }\n /** @deprecated Use {@link FilteredLists}. */\n set filteredLists(value: BrowseListItem[]) {\n this.FilteredLists = value;\n }\n Categories: MJListCategoryEntity[] = [];\n\n /** @deprecated Use {@link Categories}. */\n get categories(): MJListCategoryEntity[] {\n return this.Categories;\n }\n /** @deprecated Use {@link Categories}. */\n set categories(value: MJListCategoryEntity[]) {\n this.Categories = value;\n }\n CategoryTree: CategoryNode[] = [];\n\n /** @deprecated Use {@link CategoryTree}. */\n get categoryTree(): CategoryNode[] {\n return this.CategoryTree;\n }\n /** @deprecated Use {@link CategoryTree}. */\n set categoryTree(value: CategoryNode[]) {\n this.CategoryTree = value;\n }\n FlatCategories: Array<{ ID: string; displayName: string }> = [];\n\n /** @deprecated Use {@link FlatCategories}. */\n get flatCategories(): Array<{ ID: string; displayName: string }> {\n return this.FlatCategories;\n }\n /** @deprecated Use {@link FlatCategories}. */\n set flatCategories(value: Array<{ ID: string; displayName: string }>) {\n this.FlatCategories = value;\n }\n AvailableEntities: Array<{ ID: string; Name: string; DisplayName: string }> = [];\n\n /** @deprecated Use {@link AvailableEntities}. */\n get availableEntities(): Array<{ ID: string; Name: string; DisplayName: string }> {\n return this.AvailableEntities;\n }\n /** @deprecated Use {@link AvailableEntities}. */\n set availableEntities(value: Array<{ ID: string; Name: string; DisplayName: string }>) {\n this.AvailableEntities = value;\n }\n FilteredEntitiesList: Array<{ ID: string; Name: string; DisplayName: string }> = [];\n\n /** @deprecated Use {@link FilteredEntitiesList}. */\n get filteredEntitiesList(): Array<{ ID: string; Name: string; DisplayName: string }> {\n return this.FilteredEntitiesList;\n }\n /** @deprecated Use {@link FilteredEntitiesList}. */\n set filteredEntitiesList(value: Array<{ ID: string; Name: string; DisplayName: string }>) {\n this.FilteredEntitiesList = value;\n }\n\n EntityOptions: Array<{ name: string; value: string }> = [{ name: 'All Entities', value: 'all' }];\n\n /** @deprecated Use {@link EntityOptions}. */\n get entityOptions(): Array<{ name: string; value: string }> {\n return this.EntityOptions;\n }\n /** @deprecated Use {@link EntityOptions}. */\n set entityOptions(value: Array<{ name: string; value: string }>) {\n this.EntityOptions = value;\n }\n OwnerOptions: Array<{ name: string; value: string }> = [\n { name: 'My Lists', value: 'mine' },\n { name: 'All Lists', value: 'all' },\n { name: 'Others', value: 'others' }\n ];\n\n /** @deprecated Use {@link OwnerOptions}. */\n get ownerOptions(): Array<{ name: string; value: string }> {\n return this.OwnerOptions;\n }\n /** @deprecated Use {@link OwnerOptions}. */\n set ownerOptions(value: Array<{ name: string; value: string }>) {\n this.OwnerOptions = value;\n }\n SortOptions: Array<{ name: string; value: string }> = [\n { name: 'Name', value: 'name' },\n { name: 'Recently Updated', value: 'updated' },\n { name: 'Most Items', value: 'items' },\n { name: 'Entity', value: 'entity' }\n ];\n\n /** @deprecated Use {@link SortOptions}. */\n get sortOptions(): Array<{ name: string; value: string }> {\n return this.SortOptions;\n }\n /** @deprecated Use {@link SortOptions}. */\n set sortOptions(value: Array<{ name: string; value: string }>) {\n this.SortOptions = value;\n }\n\n // Context menu state\n ShowContextMenu = false;\n\n /** @deprecated Use {@link ShowContextMenu}. */\n get showContextMenu() {\n return this.ShowContextMenu;\n }\n /** @deprecated Use {@link ShowContextMenu}. */\n set showContextMenu(value) {\n this.ShowContextMenu = value;\n }\n ContextMenuX = 0;\n\n /** @deprecated Use {@link ContextMenuX}. */\n get contextMenuX() {\n return this.ContextMenuX;\n }\n /** @deprecated Use {@link ContextMenuX}. */\n set contextMenuX(value) {\n this.ContextMenuX = value;\n }\n ContextMenuY = 0;\n\n /** @deprecated Use {@link ContextMenuY}. */\n get contextMenuY() {\n return this.ContextMenuY;\n }\n /** @deprecated Use {@link ContextMenuY}. */\n set contextMenuY(value) {\n this.ContextMenuY = value;\n }\n SelectedContextItem: BrowseListItem | null = null;\n\n /** @deprecated Use {@link SelectedContextItem}. */\n get selectedContextItem(): BrowseListItem | null {\n return this.SelectedContextItem;\n }\n /** @deprecated Use {@link SelectedContextItem}. */\n set selectedContextItem(value: BrowseListItem | null) {\n this.SelectedContextItem = value;\n }\n\n // Create/Edit dialog state\n showCreateDialog = false;\n EditingList: MJListEntity | null = null;\n\n /** @deprecated Use {@link EditingList}. */\n get editingList(): MJListEntity | null {\n return this.EditingList;\n }\n /** @deprecated Use {@link EditingList}. */\n set editingList(value: MJListEntity | null) {\n this.EditingList = value;\n }\n NewListName = '';\n\n /** @deprecated Use {@link NewListName}. */\n get newListName() {\n return this.NewListName;\n }\n /** @deprecated Use {@link NewListName}. */\n set newListName(value) {\n this.NewListName = value;\n }\n NewListDescription = '';\n\n /** @deprecated Use {@link NewListDescription}. */\n get newListDescription() {\n return this.NewListDescription;\n }\n /** @deprecated Use {@link NewListDescription}. */\n set newListDescription(value) {\n this.NewListDescription = value;\n }\n SelectedEntityId = '';\n\n /** @deprecated Use {@link SelectedEntityId}. */\n get selectedEntityId() {\n return this.SelectedEntityId;\n }\n /** @deprecated Use {@link SelectedEntityId}. */\n set selectedEntityId(value) {\n this.SelectedEntityId = value;\n }\n SelectedCategoryId: string | null = null;\n\n /** @deprecated Use {@link SelectedCategoryId}. */\n get selectedCategoryId(): string | null {\n return this.SelectedCategoryId;\n }\n /** @deprecated Use {@link SelectedCategoryId}. */\n set selectedCategoryId(value: string | null) {\n this.SelectedCategoryId = value;\n }\n EntitySearchTerm = '';\n\n /** @deprecated Use {@link EntitySearchTerm}. */\n get entitySearchTerm() {\n return this.EntitySearchTerm;\n }\n /** @deprecated Use {@link EntitySearchTerm}. */\n set entitySearchTerm(value) {\n this.EntitySearchTerm = value;\n }\n ShowEntityDropdown = false;\n\n /** @deprecated Use {@link ShowEntityDropdown}. */\n get showEntityDropdown() {\n return this.ShowEntityDropdown;\n }\n /** @deprecated Use {@link ShowEntityDropdown}. */\n set showEntityDropdown(value) {\n this.ShowEntityDropdown = value;\n }\n EntityDropdownPosition = { top: 0, left: 0, width: 0, openAbove: false };\n\n /** @deprecated Use {@link EntityDropdownPosition}. */\n get entityDropdownPosition() {\n return this.EntityDropdownPosition;\n }\n /** @deprecated Use {@link EntityDropdownPosition}. */\n set entityDropdownPosition(value) {\n this.EntityDropdownPosition = value;\n }\n\n // Delete confirmation state\n ShowDeleteConfirm = false;\n\n /** @deprecated Use {@link ShowDeleteConfirm}. */\n get showDeleteConfirm() {\n return this.ShowDeleteConfirm;\n }\n /** @deprecated Use {@link ShowDeleteConfirm}. */\n set showDeleteConfirm(value) {\n this.ShowDeleteConfirm = value;\n }\n DeleteListName = '';\n\n /** @deprecated Use {@link DeleteListName}. */\n get deleteListName() {\n return this.DeleteListName;\n }\n /** @deprecated Use {@link DeleteListName}. */\n set deleteListName(value) {\n this.DeleteListName = value;\n }\n ListToDelete: MJListEntity | null = null;\n\n /** @deprecated Use {@link ListToDelete}. */\n get listToDelete(): MJListEntity | null {\n return this.ListToDelete;\n }\n /** @deprecated Use {@link ListToDelete}. */\n set listToDelete(value: MJListEntity | null) {\n this.ListToDelete = value;\n }\n\n // Operation states\n IsSaving = false;\n\n /** @deprecated Use {@link IsSaving}. */\n get isSaving() {\n return this.IsSaving;\n }\n /** @deprecated Use {@link IsSaving}. */\n set isSaving(value) {\n this.IsSaving = value;\n }\n IsDeleting = false;\n\n /** @deprecated Use {@link IsDeleting}. */\n get isDeleting() {\n return this.IsDeleting;\n }\n /** @deprecated Use {@link IsDeleting}. */\n set isDeleting(value) {\n this.IsDeleting = value;\n }\n\n // Sharing dialog state\n ShowShareDialog = false;\n\n /** @deprecated Use {@link ShowShareDialog}. */\n get showShareDialog() {\n return this.ShowShareDialog;\n }\n /** @deprecated Use {@link ShowShareDialog}. */\n set showShareDialog(value) {\n this.ShowShareDialog = value;\n }\n ShareDialogConfig: ListShareDialogConfig | null = null;\n\n /** @deprecated Use {@link ShareDialogConfig}. */\n get shareDialogConfig(): ListShareDialogConfig | null {\n return this.ShareDialogConfig;\n }\n /** @deprecated Use {@link ShareDialogConfig}. */\n set shareDialogConfig(value: ListShareDialogConfig | null) {\n this.ShareDialogConfig = value;\n }\n\n // Viewer-perspective gating (Phase 2.8). Capabilities are computed\n // lazily when the user opens the context menu — running per-card\n // would mean N permission-resolve calls per browse render. The\n // resolved level is cached on the item so re-opening the same menu\n // doesn't refetch.\n public ContextItemCapabilities: ListCapabilities = CapabilitiesForLevel('Owner');\n\n /** @deprecated Use {@link ContextItemCapabilities}. */\n public get contextItemCapabilities(): ListCapabilities {\n return this.ContextItemCapabilities;\n }\n /** @deprecated Use {@link ContextItemCapabilities}. */\n public set contextItemCapabilities(value: ListCapabilities) {\n this.ContextItemCapabilities = value;\n }\n private capabilityCache = new Map<string, SharePermissionLevel | null>();\n\n /**\n * Whether the current user may DELETE the context-menu's list. This uses the single shared\n * ownership rule ({@link MJListEntityExtended.UserCanDelete}) — the same rule the server enforces\n * in MJListEntityServer.Delete() — rather than the share-level capability, so the button is shown\n * only when the delete would actually succeed: the List's owner, or a Developer/Integration user.\n */\n public get CanDeleteContextItem(): boolean {\n const list = this.SelectedContextItem?.list;\n if (!list) {\n return false;\n }\n return MJListEntityExtended.UserCanDelete(list.UserID, this.ProviderToUse.CurrentUser);\n }\n\n // Tracks whether the in-memory categories list is known-stale\n // relative to the DB. Flipped to true by the BaseEntity event\n // subscription whenever any `MJ: List Categories` row is saved or\n // deleted (most often from the Categories tab next door). Reset to\n // false after `refreshCategoriesForDialog` reloads. Initial true so\n // the first dialog open always populates from a fresh fetch.\n private categoriesDirty = true;\n\n // Invitations / audit log dialogs (mockups 16, 18) — opened from\n // the share dialog. Each dialog binds to a single list at a time,\n // tracked by `activeShareListId`/`activeShareListName` lifted from\n // shareDialogConfig at open time so we keep the context after the\n // share dialog closes.\n ShowInvitationsDialog = false;\n\n /** @deprecated Use {@link ShowInvitationsDialog}. */\n get showInvitationsDialog() {\n return this.ShowInvitationsDialog;\n }\n /** @deprecated Use {@link ShowInvitationsDialog}. */\n set showInvitationsDialog(value) {\n this.ShowInvitationsDialog = value;\n }\n ShowAuditLogDialog = false;\n\n /** @deprecated Use {@link ShowAuditLogDialog}. */\n get showAuditLogDialog() {\n return this.ShowAuditLogDialog;\n }\n /** @deprecated Use {@link ShowAuditLogDialog}. */\n set showAuditLogDialog(value) {\n this.ShowAuditLogDialog = value;\n }\n ActiveShareListId: string | null = null;\n\n /** @deprecated Use {@link ActiveShareListId}. */\n get activeShareListId(): string | null {\n return this.ActiveShareListId;\n }\n /** @deprecated Use {@link ActiveShareListId}. */\n set activeShareListId(value: string | null) {\n this.ActiveShareListId = value;\n }\n ActiveShareListName: string | null = null;\n\n /** @deprecated Use {@link ActiveShareListName}. */\n get activeShareListName(): string | null {\n return this.ActiveShareListName;\n }\n /** @deprecated Use {@link ActiveShareListName}. */\n set activeShareListName(value: string | null) {\n this.ActiveShareListName = value;\n }\n\n private entityColorMap: Map<string, string> = new Map();\n private entityIconMap: Map<string, string> = new Map();\n private categoryMap: Map<string, MJListCategoryEntity> = new Map();\n private currentUserId = '';\n\n constructor(\n private cdr: ChangeDetectorRef,\n private tabService: TabService,\n private notificationService: MJNotificationService,\n private elementRef: ElementRef,\n private listSharingService: ListSharingService\n ) {\n super();\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent) {\n if (this.ShowEntityDropdown) {\n const target = event.target as HTMLElement;\n if (!target.closest('.custom-select-wrapper') && !target.closest('.entity-dropdown-portal')) {\n this.ShowEntityDropdown = false;\n }\n }\n }\n\n @HostListener('document:keydown.escape')\n onEscapeKey() {\n if (this.ShowContextMenu) {\n this.CloseContextMenu();\n }\n if (this.showCreateDialog) {\n this.CloseCreateDialog();\n }\n if (this.ShowDeleteConfirm) {\n this.CancelDelete();\n }\n if (this.ShowEntityDropdown) {\n this.CloseEntityDropdown();\n }\n }\n\n /** User-preference key for the favorites-only filter (F5a) — server-persisted so it survives reloads and follows the user across devices. */\n private static readonly FAVORITES_FILTER_PREF_KEY = 'mj.lists.browse.showOnlyFavorites';\n\n /** Persists the current favorites-filter state as a user preference (debounced). */\n private persistFavoritesFilter(): void {\n UserInfoEngine.Instance.SetSettingDebounced(\n ListsBrowseResource.FAVORITES_FILTER_PREF_KEY,\n String(this.ShowOnlyFavorites),\n );\n }\n\n async ngOnInit() {\n super.ngOnInit();\n // Restore the favorites-only filter preference (synchronous cache hit —\n // UserInfoEngine is populated during app bootstrap)\n this.ShowOnlyFavorites = UserInfoEngine.Instance.GetSetting(\n ListsBrowseResource.FAVORITES_FILTER_PREF_KEY,\n ) === 'true';\n this.subscribeToCategoryChanges();\n await this.loadData();\n this.registerAgentTools();\n this.publishAgentContext();\n this.NotifyLoadComplete();\n }\n\n // ================================================================\n // AI Agent Context & Client Tools\n //\n // SAFETY BOUNDARY: This surface exposes only SAFE (read-only /\n // navigational / selection) operations plus ONE bounded-mutation tool\n // (CreateList) that merely opens the dialog-validated create flow.\n // The following are INTENTIONALLY EXCLUDED from agent tools and must\n // NOT be wired in:\n // - EditList (editList) — mutates an existing record\n // - DeleteList (confirmDeleteList/deleteList) — destructive\n // - ShareList (openShareDialog) — grants access to others\n // - DuplicateList(duplicateList) — bulk record copy\n // - ToggleFavorite(toggleFavorite) — prefer the agent ask the user\n // Edit/delete/share/duplicate/favorite stay user-driven on purpose.\n // ================================================================\n\n /**\n * Report the Browse surface's salient state to the AI agent. Re-called\n * on every meaningful state change (search / filter / view / sort /\n * data load) so the chat agent and realtime co-agent stay in sync with\n * what the user is looking at.\n */\n private publishAgentContext(): void {\n this.navigationService.SetAgentContext(this, buildListBrowseAgentContext({\n SearchTerm: this.SearchTerm,\n ViewMode: this.ViewMode,\n AllListCount: this.AllLists.length,\n FilteredListCount: this.FilteredLists.length,\n // Deep context: the NAMES of the lists currently on screen (bounded), so\n // the agent can refer to / open them by name rather than an opaque GUID.\n VisibleListNames: this.FilteredLists.map(i => i.list.Name),\n SelectedSort: this.SelectedSort,\n ActiveFilterCount: this.TotalActiveFilterCount,\n SelectedOwner: this.SelectedOwner,\n SelectedEntity: this.SelectedEntity,\n ShowOnlyFavorites: this.ShowOnlyFavorites,\n }));\n }\n\n /**\n * Resolve an agent-supplied reference (a list ID or a list NAME, exact or\n * partial) to one of the loaded Browse list items. Delegates the matching to\n * the pure {@link resolveNamedRecord} helper over the filtered lists' rows.\n */\n private resolveBrowseListItem(input: string): BrowseListItem | null {\n const match = resolveNamedRecord(input, this.AllLists.map(i => ({ ID: i.list.ID, Name: i.list.Name })));\n if (!match) {\n return null;\n }\n return this.AllLists.find(i => UUIDsEqual(i.list.ID, match.ID)) ?? null;\n }\n\n /**\n * Register the Browse surface's agent-actionable tools. SAFE tools are\n * navigation / search / filter / selection; the single bounded-mutation\n * tool (CreateList) only opens the dialog-validated create flow.\n */\n private registerAgentTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'OpenList',\n Description: 'Open a list in a new tab by its ID or name. Pass the list name the user says (see VisibleListNames) — the tool resolves an exact ID, an exact name, or a partial name match.',\n ParameterSchema: { type: 'object', properties: { list: { type: 'string', description: 'The list ID or name to open' }, listId: { type: 'string', description: 'Deprecated alias for \"list\".' } } },\n Handler: async (params: Record<string, unknown>) => {\n const idCheck = validateStringParam(params['list'] ?? params['listId'], 'list');\n if (!idCheck.ok) return idCheck.result;\n const item = this.resolveBrowseListItem(idCheck.value);\n if (!item) return { Success: false, ErrorMessage: buildNotFoundError(idCheck.value, this.AllLists.map(i => ({ ID: i.list.ID, Name: i.list.Name })), 'list') };\n this.OpenList(item);\n return { Success: true, Data: { listName: item.list.Name } };\n },\n },\n {\n Name: 'SearchLists',\n Description: 'Set the search term that filters the visible lists by name, description, entity, or owner.',\n ParameterSchema: { type: 'object', properties: { searchTerm: { type: 'string', description: 'Text to search for' } }, required: ['searchTerm'] },\n Handler: async (params: Record<string, unknown>) => {\n const check = validateStringParam(params['searchTerm'], 'searchTerm');\n if (!check.ok) return check.result;\n this.OnSearchChange(check.value);\n this.publishAgentContext();\n return { Success: true, Data: { resultCount: this.FilteredLists.length } };\n },\n },\n {\n Name: 'FilterLists',\n Description: 'Apply Owner / Entity / Favorites filters. Owner: \"mine\" | \"all\" | \"others\". Entity: an entity name or \"all\". Favorites: \"favorites\" | \"all\". Omitted keys are left unchanged.',\n ParameterSchema: {\n type: 'object',\n properties: {\n owner: { type: 'string', enum: ['mine', 'all', 'others'] },\n entity: { type: 'string' },\n favorites: { type: 'string', enum: ['favorites', 'all'] },\n },\n },\n Handler: async (params: Record<string, unknown>) => {\n const next: Record<string, unknown> = { ...this.ListFilterValues };\n if (params['owner'] !== undefined) {\n const ownerCheck = validateEnumParam(params['owner'], ['mine', 'all', 'others'] as const, 'owner');\n if (!ownerCheck.ok) return ownerCheck.result;\n next['selectedOwner'] = ownerCheck.value;\n }\n if (params['entity'] !== undefined) {\n const entityCheck = validateStringParam(params['entity'], 'entity');\n if (!entityCheck.ok) return entityCheck.result;\n next['selectedEntity'] = entityCheck.value;\n }\n if (params['favorites'] !== undefined) {\n const favCheck = validateEnumParam(params['favorites'], ['favorites', 'all'] as const, 'favorites');\n if (!favCheck.ok) return favCheck.result;\n next['favorites'] = favCheck.value;\n }\n this.OnFilterValuesChange(next);\n this.publishAgentContext();\n return { Success: true, Data: { resultCount: this.FilteredLists.length, activeFilterCount: this.TotalActiveFilterCount } };\n },\n },\n {\n Name: 'ClearFilters',\n Description: 'Clear all applied filters (Owner, Entity, Favorites, Tags).',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.ClearAllAppliedFilters();\n this.publishAgentContext();\n return { Success: true, Data: { resultCount: this.FilteredLists.length } };\n },\n },\n {\n Name: 'SetViewMode',\n Description: 'Set the list view mode: \"table\", \"card\", or \"hierarchy\".',\n ParameterSchema: { type: 'object', properties: { mode: { type: 'string', enum: ['table', 'card', 'hierarchy'] } }, required: ['mode'] },\n Handler: async (params: Record<string, unknown>) => {\n const check = validateEnumParam(params['mode'], ['table', 'card', 'hierarchy'] as const, 'mode');\n if (!check.ok) return check.result;\n this.SetViewMode(check.value);\n this.publishAgentContext();\n return { Success: true };\n },\n },\n {\n Name: 'SortBy',\n Description: 'Sort the lists by a field: \"name\", \"updated\", \"items\", or \"entity\".',\n ParameterSchema: { type: 'object', properties: { field: { type: 'string', enum: ['name', 'updated', 'items', 'entity'] } }, required: ['field'] },\n Handler: async (params: Record<string, unknown>) => {\n const check = validateEnumParam(params['field'], ['name', 'updated', 'items', 'entity'] as const, 'field');\n if (!check.ok) return check.result;\n this.SelectedSort = check.value;\n this.OnSortChange(check.value);\n this.publishAgentContext();\n return { Success: true };\n },\n },\n {\n // BOUNDED MUTATION: opens the create dialog only. The list name +\n // entity are validated by the dialog before any record is written,\n // so the agent cannot silently create a malformed/empty list.\n Name: 'CreateList',\n Description: 'Open the \"Create New List\" dialog. The user confirms the name and entity in the dialog; nothing is saved until they do.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.CreateNewList();\n return { Success: true };\n },\n },\n ]);\n }\n\n /**\n * Mark the in-memory categories list dirty whenever any BaseEntity\n * raises a save / delete event for `MJ: List Categories`. The\n * Create/Edit dialog uses this flag to skip the per-open RunView\n * unless something has actually changed since last load — keeps the\n * dialog snappy without showing stale categories.\n *\n * Subscribes to MJGlobal's event bus rather than wiring each\n * category entity's per-instance listener, because the Categories\n * tab creates fresh BaseEntity instances we can't see from here.\n */\n private subscribeToCategoryChanges(): void {\n MJGlobal.Instance.GetEventListener()\n .pipe(takeUntil(this.destroy$))\n .subscribe((mjEvt) => {\n if (mjEvt.eventCode !== BaseEntity.BaseEventCode) return;\n const beEvt = mjEvt.args as BaseEntityEvent | undefined;\n if (!beEvt) return;\n const entityName = beEvt.baseEntity?.EntityInfo.Name ?? beEvt.entityName;\n if (entityName !== 'MJ: List Categories') return;\n if (beEvt.type === 'save' || beEvt.type === 'delete') {\n this.categoriesDirty = true;\n }\n });\n }\n\n ngOnDestroy() {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async loadData() {\n this.isLoading = true;\n\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n this.currentUserId = md.CurrentUser?.ID || '';\n\n // BypassCache on Lists: after a delete/duplicate, the RunView cache\n // for this entity doesn't always reflect the latest state in time\n // (event-driven invalidation races the immediate refresh). Trading a\n // small perf hit for correctness here is worth it — categories stay\n // cache-warm. Owner names come from the denormalized `User` view\n // field on each list, and item counts from batched COUNT queries —\n // this deliberately does NOT download List Details or Users rows.\n const [listsResult, categoriesResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Lists',\n OrderBy: 'Name',\n ResultType: 'entity_object',\n BypassCache: true\n },\n {\n EntityName: 'MJ: List Categories',\n OrderBy: 'Name',\n ResultType: 'entity_object'\n }\n ]);\n\n if (!listsResult.Success) {\n console.error('Failed to load lists');\n return;\n }\n\n const lists = listsResult.Results as MJListEntity[];\n this.Categories = (categoriesResult.Results || []) as MJListCategoryEntity[];\n\n // Build category map\n this.categoryMap.clear();\n for (const cat of this.Categories) {\n this.categoryMap.set(cat.ID, cat);\n }\n\n // Build flat categories for dropdown\n this.FlatCategories = this.buildFlatCategories(this.Categories);\n // loadData() already pulled fresh categories — clear the dirty\n // flag so the first dialog open doesn't redundantly refetch.\n this.categoriesDirty = false;\n\n // Per-list item counts: one batched round trip of count_only queries\n // (each an index-seek COUNT on ListDetail.ListID server-side) instead\n // of transferring every membership row to the client.\n const itemCounts = new Map<string, number>();\n if (lists.length > 0) {\n const countResults = await rv.RunViews(lists.map(list => ({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID = '${list.ID}'`,\n ResultType: 'count_only' as const,\n BypassCache: true\n })));\n countResults.forEach((res, idx) => {\n itemCounts.set(lists[idx].ID, res.Success ? res.TotalRowCount : 0);\n });\n }\n\n // Build entity info\n const entities = md.Entities;\n const entitySet = new Set<string>();\n\n for (const entity of entities) {\n this.entityColorMap.set(entity.Name, this.generateEntityColor(entity.Name));\n this.entityIconMap.set(entity.Name, entity.Icon || 'fa-solid fa-table');\n }\n\n // Build available entities for dropdown\n this.AvailableEntities = entities\n .filter(e => e.IncludeInAPI)\n .map(e => ({ ID: e.ID, Name: e.Name, DisplayName: e.DisplayNameOrName }))\n .sort((a, b) => a.DisplayName.localeCompare(b.DisplayName));\n this.FilteredEntitiesList = [...this.AvailableEntities];\n\n // Build list items\n this.AllLists = lists.map(list => {\n const entityName = list.Entity || 'Unknown';\n entitySet.add(entityName);\n return {\n list,\n itemCount: itemCounts.get(list.ID) || 0,\n entityName,\n ownerName: list.User || 'Unknown',\n isOwner: UUIDsEqual(list.UserID, this.currentUserId)\n };\n });\n\n // Build entity filter options\n this.EntityOptions = [\n { name: 'All Entities', value: 'all' },\n ...Array.from(entitySet).sort().map(e => ({ name: e, value: e }))\n ];\n\n this.applyFilters();\n this.buildCategoryTree();\n\n // Load favorites in parallel — not critical-path, but cheap.\n void this.loadFavorites();\n\n // Load sharing info in the background\n this.loadSharingInfo();\n } catch (error) {\n console.error('Error loading lists:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private buildFlatCategories(categories: MJListCategoryEntity[]): Array<{ ID: string; displayName: string }> {\n const result: Array<{ ID: string; displayName: string }> = [];\n const topLevel = categories.filter(c => !c.ParentID);\n\n const processCategory = (cat: MJListCategoryEntity, level: number) => {\n const indent = '\\u00A0\\u00A0'.repeat(level);\n result.push({ ID: cat.ID, displayName: `${indent}${cat.Name}` });\n\n const children = categories.filter(c => UUIDsEqual(c.ParentID, cat.ID));\n for (const child of children) {\n processCategory(child, level + 1);\n }\n };\n\n for (const cat of topLevel) {\n processCategory(cat, 0);\n }\n\n return result;\n }\n\n private buildCategoryTree() {\n const rootNodes: CategoryNode[] = [];\n const categoryNodes = new Map<string, CategoryNode>();\n\n // Create nodes for all categories\n for (const cat of this.Categories) {\n categoryNodes.set(cat.ID, {\n category: cat,\n lists: [],\n children: [],\n isExpanded: true\n });\n }\n\n // Build tree structure\n for (const cat of this.Categories) {\n const node = categoryNodes.get(cat.ID)!;\n if (cat.ParentID && categoryNodes.has(cat.ParentID)) {\n categoryNodes.get(cat.ParentID)!.children.push(node);\n } else {\n rootNodes.push(node);\n }\n }\n\n // Assign lists to categories\n const uncategorizedLists: BrowseListItem[] = [];\n for (const item of this.FilteredLists) {\n if (item.list.CategoryID && categoryNodes.has(item.list.CategoryID)) {\n categoryNodes.get(item.list.CategoryID)!.lists.push(item);\n } else {\n uncategorizedLists.push(item);\n }\n }\n\n // Add uncategorized node if there are uncategorized lists\n if (uncategorizedLists.length > 0) {\n rootNodes.unshift({\n category: null,\n lists: uncategorizedLists,\n children: [],\n isExpanded: true\n });\n }\n\n this.CategoryTree = rootNodes;\n }\n\n SetViewMode(mode: ViewMode) {\n this.ViewMode = mode;\n this.publishAgentContext();\n }\n\n /** @deprecated Use {@link SetViewMode}. */\n setViewMode(mode: ViewMode) {\n return this.SetViewMode(mode);\n }\n\n /** View-mode options for the shared <mj-view-toggle>. */\n public readonly ListViewOptions = [\n { key: 'table', icon: 'fa-solid fa-table-list', title: 'Table view' },\n { key: 'card', icon: 'fa-solid fa-grip', title: 'Card view' },\n { key: 'hierarchy', icon: 'fa-solid fa-folder-tree', title: 'Category view' },\n ];\n\n /** @deprecated Use {@link ListViewOptions}. */\n public get listViewOptions() {\n return this.ListViewOptions;\n }\n\n /** Values record consumed by the centralized <mj-filter-panel>. */\n public get ListFilterValues(): Record<string, unknown> {\n return {\n selectedOwner: this.SelectedOwner,\n selectedEntity: this.SelectedEntity,\n favorites: this.ShowOnlyFavorites ? 'favorites' : 'all',\n };\n }\n\n /** @deprecated Use {@link ListFilterValues}. */\n public get listFilterValues(): Record<string, unknown> {\n return this.ListFilterValues;\n }\n\n /** Field config consumed by the centralized <mj-filter-panel>. */\n public get ListFilterFields(): FilterFieldConfig[] {\n return [\n {\n key: 'selectedOwner',\n type: 'dropdown',\n label: 'Owner',\n icon: 'fa-solid fa-user',\n options: this.OwnerOptions.map(o => ({ text: o.name, value: o.value })),\n },\n {\n key: 'selectedEntity',\n type: 'dropdown',\n label: 'Entity',\n icon: 'fa-solid fa-table',\n filterable: this.EntityOptions.length > 10,\n options: this.EntityOptions.map(o => ({ text: o.name, value: o.value })),\n },\n {\n key: 'favorites',\n type: 'chips',\n label: 'Favorites',\n chipOptions: [\n { text: 'All lists', value: 'all' },\n { text: 'Favorites only', value: 'favorites' },\n ],\n },\n ];\n }\n\n /** @deprecated Use {@link ListFilterFields}. */\n public get listFilterFields(): FilterFieldConfig[] {\n return this.ListFilterFields;\n }\n\n /** Receive popover updates and apply them. */\n public OnFilterValuesChange(values: Record<string, unknown>): void {\n this.SelectedOwner = (values['selectedOwner'] as string) ?? 'mine';\n this.SelectedEntity = (values['selectedEntity'] as string) ?? 'all';\n this.ShowOnlyFavorites = values['favorites'] === 'favorites';\n this.persistFavoritesFilter();\n this.applyFilters();\n this.buildCategoryTree();\n this.publishAgentContext();\n }\n\n /** @deprecated Use {@link OnFilterValuesChange}. */\n public onFilterValuesChange(values: Record<string, unknown>): void {\n return this.OnFilterValuesChange(values);\n }\n\n /** Reset the popover's own fields (Owner · Entity · Favorites); leaves search + tags alone. */\n public ResetPopoverFilters(): void {\n this.SelectedOwner = 'mine';\n this.SelectedEntity = 'all';\n this.ShowOnlyFavorites = false;\n this.persistFavoritesFilter();\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n /** @deprecated Use {@link ResetPopoverFilters}. */\n public resetPopoverFilters(): void {\n return this.ResetPopoverFilters();\n }\n\n /** Active popover-field count for the badge (Owner + Entity; excludes search). */\n public get ActiveFilterCount(): number {\n let n = 0;\n if (this.SelectedOwner && this.SelectedOwner !== 'mine') n++;\n if (this.SelectedEntity && this.SelectedEntity !== 'all') n++;\n return n;\n }\n\n /** Total active filters (Owner + Entity + Favorites + Tags) — drives the Filter button badge. */\n public get TotalActiveFilterCount(): number {\n return this.ActiveFilterCount + (this.ShowOnlyFavorites ? 1 : 0) + this.TagFilters.length;\n }\n\n /** Clear every filter (Owner · Entity · Favorites · Tags). Leaves search. */\n public ClearAllAppliedFilters(): void {\n this.SelectedOwner = 'mine';\n this.SelectedEntity = 'all';\n this.ShowOnlyFavorites = false;\n this.persistFavoritesFilter();\n this.TagFilters = [];\n void this.recomputeTagMembership();\n this.buildCategoryTree();\n this.publishAgentContext();\n }\n\n /** @deprecated Use {@link ClearAllAppliedFilters}. */\n public clearAllAppliedFilters(): void {\n return this.ClearAllAppliedFilters();\n }\n\n OnSearchChange(term: string) {\n this.SearchTerm = term;\n this.applyFilters();\n this.buildCategoryTree();\n this.publishAgentContext();\n }\n\n /** @deprecated Use {@link OnSearchChange}. */\n onSearchChange(term: string) {\n return this.OnSearchChange(term);\n }\n\n OnEntityFilterChange(_value: string) {\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n /** @deprecated Use {@link OnEntityFilterChange}. */\n onEntityFilterChange(_value: string) {\n return this.OnEntityFilterChange(_value);\n }\n\n OnOwnerFilterChange(_value: string) {\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n /** @deprecated Use {@link OnOwnerFilterChange}. */\n onOwnerFilterChange(_value: string) {\n return this.OnOwnerFilterChange(_value);\n }\n\n OnSortChange(_value: string) {\n this.applyFilters();\n this.buildCategoryTree();\n this.publishAgentContext();\n }\n\n /** @deprecated Use {@link OnSortChange}. */\n onSortChange(_value: string) {\n return this.OnSortChange(_value);\n }\n\n ClearSearch() {\n this.SearchTerm = '';\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n /** @deprecated Use {@link ClearSearch}. */\n clearSearch() {\n return this.ClearSearch();\n }\n\n ClearFilters() {\n // Reset EVERY dimension applyFilters() narrows on — search, owner, entity,\n // favorites, and tags — so the empty-state \"Reset filters\" CTA actually clears\n // the no-results state (favorites/tags were previously left active).\n this.SearchTerm = '';\n this.SelectedEntity = 'all';\n this.SelectedOwner = 'mine';\n this.ShowOnlyFavorites = false;\n this.persistFavoritesFilter();\n this.TagFilters = [];\n void this.recomputeTagMembership(); // empty tagFilters → clears tagFilteredListIds + re-applies\n this.buildCategoryTree();\n }\n\n /** @deprecated Use {@link ClearFilters}. */\n clearFilters() {\n return this.ClearFilters();\n }\n\n private applyFilters() {\n let result = [...this.AllLists];\n\n // Owner filter\n if (this.SelectedOwner === 'mine') {\n result = result.filter(item => item.isOwner);\n } else if (this.SelectedOwner === 'others') {\n result = result.filter(item => !item.isOwner);\n }\n\n // Search filter\n if (this.SearchTerm) {\n const term = this.SearchTerm.toLowerCase();\n result = result.filter(item =>\n item.list.Name.toLowerCase().includes(term) ||\n (item.list.Description && item.list.Description.toLowerCase().includes(term)) ||\n item.entityName.toLowerCase().includes(term) ||\n item.ownerName.toLowerCase().includes(term)\n );\n }\n\n // Entity filter\n if (this.SelectedEntity !== 'all') {\n result = result.filter(item => item.entityName === this.SelectedEntity);\n }\n\n // Tag filter (Phase 4.3 — intersection of all active tags).\n if (this.tagFilteredListIds !== null) {\n const matches = this.tagFilteredListIds;\n result = result.filter(item => matches.has(item.list.ID));\n }\n\n // Favorites-only toggle (Phase 5.3).\n if (this.ShowOnlyFavorites) {\n const favs = this.FavoriteListIds;\n result = result.filter(item => favs.has(item.list.ID));\n }\n\n // Sort\n switch (this.SelectedSort) {\n case 'name':\n result.sort((a, b) => a.list.Name.localeCompare(b.list.Name));\n break;\n case 'updated':\n result.sort((a, b) => {\n const dateA = new Date(a.list.__mj_UpdatedAt).getTime();\n const dateB = new Date(b.list.__mj_UpdatedAt).getTime();\n return dateB - dateA;\n });\n break;\n case 'items':\n result.sort((a, b) => b.itemCount - a.itemCount);\n break;\n case 'entity':\n result.sort((a, b) => a.entityName.localeCompare(b.entityName));\n break;\n }\n\n this.FilteredLists = result;\n }\n\n ToggleCategory(node: CategoryNode) {\n node.isExpanded = !node.isExpanded;\n }\n\n /** @deprecated Use {@link ToggleCategory}. */\n toggleCategory(node: CategoryNode) {\n return this.ToggleCategory(node);\n }\n\n GetListCountInCategory(node: CategoryNode): number {\n let count = node.lists.length;\n for (const child of node.children) {\n count += this.GetListCountInCategory(child);\n }\n return count;\n }\n\n /** @deprecated Use {@link GetListCountInCategory}. */\n getListCountInCategory(node: CategoryNode): number {\n return this.GetListCountInCategory(node);\n }\n\n GetEntityColor(entityName: string): string {\n return this.entityColorMap.get(entityName) || '#607D8B';\n }\n\n /** @deprecated Use {@link GetEntityColor}. */\n getEntityColor(entityName: string): string {\n return this.GetEntityColor(entityName);\n }\n\n GetEntityIcon(entityName: string): string {\n return this.entityIconMap.get(entityName) || 'fa-solid fa-table';\n }\n\n /** @deprecated Use {@link GetEntityIcon}. */\n getEntityIcon(entityName: string): string {\n return this.GetEntityIcon(entityName);\n }\n\n private generateEntityColor(entityName: string): string {\n let hash = 0;\n for (let i = 0; i < entityName.length; i++) {\n hash = entityName.charCodeAt(i) + ((hash << 5) - hash);\n }\n const colors = [\n '#2196F3', '#4CAF50', '#FF9800', '#9C27B0', '#F44336',\n '#00BCD4', '#795548', '#607D8B', '#E91E63', '#3F51B5'\n ];\n return colors[Math.abs(hash) % colors.length];\n }\n\n formatDate(date: Date): string {\n if (!date) return '';\n const now = new Date();\n const d = new Date(date);\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) return 'Today';\n if (diffDays === 1) return 'Yesterday';\n if (diffDays < 7) return `${diffDays} days ago`;\n return d.toLocaleDateString();\n }\n\n OpenList(item: BrowseListItem) {\n const appId = this.Data?.Configuration?.applicationId || '';\n this.tabService.OpenList(item.list.ID, item.list.Name, appId);\n }\n\n /** @deprecated Use {@link OpenList}. */\n openList(item: BrowseListItem) {\n return this.OpenList(item);\n }\n\n /**\n * Handle a tag chip click on a list card — adds the tag to the\n * filter row (multi-tag = AND). Wired by Phase 4.3; the chip\n * component emits the (TagID, Name) pair so we can both display\n * the chip name and filter by ID.\n */\n OnCardTagClicked(payload: { TagID: string; Name: string }): void {\n if (this.TagFilters.some((f) => f.TagID === payload.TagID)) return;\n this.TagFilters = [...this.TagFilters, payload];\n void this.recomputeTagMembership();\n }\n\n /** @deprecated Use {@link OnCardTagClicked}. */\n onCardTagClicked(payload: { TagID: string; Name: string }): void {\n return this.OnCardTagClicked(payload);\n }\n\n /** Remove a tag from the filter row. */\n RemoveTagFilter(tagId: string): void {\n this.TagFilters = this.TagFilters.filter((f) => f.TagID !== tagId);\n void this.recomputeTagMembership();\n }\n\n /** @deprecated Use {@link RemoveTagFilter}. */\n removeTagFilter(tagId: string): void {\n return this.RemoveTagFilter(tagId);\n }\n\n /** Clear all active tag filters. */\n ClearTagFilters(): void {\n this.TagFilters = [];\n this.tagFilteredListIds = null;\n this.applyFilters();\n }\n\n /** @deprecated Use {@link ClearTagFilters}. */\n clearTagFilters(): void {\n return this.ClearTagFilters();\n }\n\n /**\n * Resolve which lists have ALL active tags. Done server-side so the\n * filter works regardless of which lists the user has scrolled past.\n * Result is cached on `tagFilteredListIds`; `applyFilters` consumes it.\n */\n private async recomputeTagMembership(): Promise<void> {\n if (this.TagFilters.length === 0) {\n this.tagFilteredListIds = null;\n this.applyFilters();\n return;\n }\n try {\n const md = this.ProviderToUse;\n const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');\n if (!listsEntity) {\n this.tagFilteredListIds = new Set();\n this.applyFilters();\n return;\n }\n const tagIds = this.TagFilters.map((f) => `'${f.TagID}'`).join(',');\n const rv = RunView.FromMetadataProvider(md);\n const result = await rv.RunView<{ RecordID: string; TagID: string }>({\n EntityName: 'MJ: Tagged Items',\n ExtraFilter: `EntityID='${listsEntity.ID}' AND TagID IN (${tagIds})`,\n Fields: ['RecordID', 'TagID'],\n ResultType: 'simple',\n });\n // Intersection: count tag hits per list, keep only those with\n // exactly `tagFilters.length` matches (one per required tag).\n const counts = new Map<string, number>();\n for (const row of result.Results ?? []) {\n const id = String(row.RecordID);\n counts.set(id, (counts.get(id) ?? 0) + 1);\n }\n const required = this.TagFilters.length;\n const matches = new Set<string>();\n for (const [id, count] of counts) {\n if (count >= required) matches.add(id);\n }\n this.tagFilteredListIds = matches;\n } catch (e) {\n // On failure, fall back to \"no match\" so the user sees an empty\n // state rather than every list — avoids leaking unfiltered data\n // when the filter intent failed silently.\n this.tagFilteredListIds = new Set();\n }\n this.applyFilters();\n }\n\n /**\n * Load the current user's favorite lists into `favoriteListIds`.\n * Cheap — typically <100 rows per user. Driven by the `MJ: User\n * Favorites` entity scoped by the Lists EntityID. Best-effort: on\n * failure the star icons just stay dim.\n */\n private async loadFavorites(): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');\n if (!listsEntity || !md.CurrentUser) return;\n const rv = RunView.FromMetadataProvider(md);\n const result = await rv.RunView<{ RecordID: string }>({\n EntityName: 'MJ: User Favorites',\n ExtraFilter: `UserID='${md.CurrentUser.ID}' AND EntityID='${listsEntity.ID}'`,\n Fields: ['RecordID'],\n ResultType: 'simple',\n });\n this.FavoriteListIds = new Set((result.Results ?? []).map((r) => String(r.RecordID)));\n } catch {\n // Silent — favorites are a polish feature, not load-bearing.\n this.FavoriteListIds = new Set();\n }\n }\n\n /**\n * Toggle a list's favorite state. Optimistic: flips the local Set\n * first, then writes through. Reverts on failure.\n */\n async ToggleFavorite(event: Event, item: BrowseListItem): Promise<void> {\n event.stopPropagation();\n const wasFav = this.FavoriteListIds.has(item.list.ID);\n // Optimistic update.\n if (wasFav) this.FavoriteListIds.delete(item.list.ID);\n else this.FavoriteListIds.add(item.list.ID);\n // Re-trigger filter recompute since the favorites-only toggle\n // may be on.\n this.applyFilters();\n\n try {\n const md = this.ProviderToUse;\n const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');\n if (!listsEntity || !md.CurrentUser) throw new Error('Cannot resolve user favorites entity');\n\n if (wasFav) {\n // Find + delete the existing favorite row.\n const rv = RunView.FromMetadataProvider(md);\n const result = await rv.RunView<MJUserFavoriteEntity>({\n EntityName: 'MJ: User Favorites',\n ExtraFilter:\n `UserID='${md.CurrentUser.ID}' AND EntityID='${listsEntity.ID}' AND RecordID='${item.list.ID}'`,\n ResultType: 'entity_object',\n });\n for (const row of result.Results ?? []) await row.Delete();\n } else {\n const fav = await md.GetEntityObject<MJUserFavoriteEntity>('MJ: User Favorites', md.CurrentUser);\n fav.NewRecord();\n fav.UserID = md.CurrentUser.ID;\n fav.EntityID = listsEntity.ID;\n fav.RecordID = item.list.ID;\n await fav.Save();\n }\n } catch {\n // Revert on failure.\n if (wasFav) this.FavoriteListIds.add(item.list.ID);\n else this.FavoriteListIds.delete(item.list.ID);\n this.applyFilters();\n }\n }\n\n /** @deprecated Use {@link ToggleFavorite}. */\n async toggleFavorite(event: Event, item: BrowseListItem): Promise<void> {\n return this.ToggleFavorite(event, item);\n }\n\n IsFavorite(listId: string): boolean {\n return this.FavoriteListIds.has(listId);\n }\n\n /** @deprecated Use {@link IsFavorite}. */\n isFavorite(listId: string): boolean {\n return this.IsFavorite(listId);\n }\n\n ToggleShowOnlyFavorites(): void {\n this.ShowOnlyFavorites = !this.ShowOnlyFavorites;\n this.applyFilters();\n }\n\n /** @deprecated Use {@link ToggleShowOnlyFavorites}. */\n toggleShowOnlyFavorites(): void {\n return this.ToggleShowOnlyFavorites();\n }\n\n OpenListMenu(event: Event, item: BrowseListItem) {\n event.stopPropagation();\n const mouseEvent = event as MouseEvent;\n this.SelectedContextItem = item;\n this.ContextMenuX = mouseEvent.clientX;\n this.ContextMenuY = mouseEvent.clientY;\n // Fast path: owners always have full capabilities. Avoid an extra\n // permission-resolve round trip for the common case.\n if (item.isOwner) {\n this.ContextItemCapabilities = CapabilitiesForLevel('Owner');\n this.ShowContextMenu = true;\n return;\n }\n // Render the menu immediately with a conservative viewer-level cap\n // set, then refine via async resolve. The flicker is a single tick\n // — and viewers/editors stay correctly gated even if resolve fails.\n const cached = this.capabilityCache.get(item.list.ID);\n if (cached !== undefined) {\n this.ContextItemCapabilities = CapabilitiesForLevel(cached);\n } else {\n this.ContextItemCapabilities = CapabilitiesForLevel('View');\n void this.refineContextCapabilities(item.list.ID);\n }\n this.ShowContextMenu = true;\n }\n\n /** @deprecated Use {@link OpenListMenu}. */\n openListMenu(event: Event, item: BrowseListItem) {\n return this.OpenListMenu(event, item);\n }\n\n /** Resolve the current user's permission level for a list and update\n * the open context menu in place. Cached so re-opening the same menu\n * doesn't re-hit the resolver. */\n private async refineContextCapabilities(listId: string): Promise<void> {\n try {\n const currentUserId = this.ProviderToUse.CurrentUser?.ID;\n if (!currentUserId) {\n // No user context — leave the conservative fallback in place.\n return;\n }\n // Go through the Angular sharing service rather than instantiating the\n // server-side `ListSharing` class directly. The service hits the GraphQL\n // surface, which is the only sanctioned client→server path; the server\n // package writes audit logs + permission rows that have no business\n // running in a browser bundle.\n const level = (await this.listSharingService.getUserPermissionLevel(listId, currentUserId)) as SharePermissionLevel | null;\n this.capabilityCache.set(listId, level);\n // Only mutate state if the user is still on this same menu — they\n // may have closed it before resolve finished.\n if (this.ShowContextMenu && this.SelectedContextItem && UUIDsEqual(this.SelectedContextItem.list.ID, listId)) {\n this.ContextItemCapabilities = CapabilitiesForLevel(level);\n this.cdr.detectChanges();\n }\n } catch {\n // Conservative fallback already applied at menu open time.\n }\n }\n\n CloseContextMenu() {\n this.ShowContextMenu = false;\n this.SelectedContextItem = null;\n }\n\n /** @deprecated Use {@link CloseContextMenu}. */\n closeContextMenu() {\n return this.CloseContextMenu();\n }\n\n CreateNewList() {\n this.EditingList = null;\n this.NewListName = '';\n this.NewListDescription = '';\n this.SelectedEntityId = '';\n this.EntitySearchTerm = '';\n this.SelectedCategoryId = null;\n this.ShowEntityDropdown = false;\n this.showCreateDialog = true;\n // Refresh categories so newly-created ones appear without a page\n // reload. Cheap RunView; runs in the background while the user is\n // typing the list name.\n void this.refreshCategoriesForDialog();\n }\n\n /** @deprecated Use {@link CreateNewList}. */\n createNewList() {\n return this.CreateNewList();\n }\n\n EditList() {\n if (!this.SelectedContextItem) return;\n\n const list = this.SelectedContextItem.list;\n this.EditingList = list;\n this.NewListName = list.Name;\n this.NewListDescription = list.Description || '';\n this.SelectedEntityId = list.EntityID;\n this.EntitySearchTerm = list.Entity || '';\n this.SelectedCategoryId = list.CategoryID || null;\n // Ensure no stale state from a previous Create attempt — the entity\n // dropdown portal renders at z-index 10002 and could otherwise sit on\n // top of the edit dialog and block interaction.\n this.ShowEntityDropdown = false;\n // Close the context menu BEFORE opening the dialog. Doing it after\n // leaves a one-tick window where both the menu and the modal-overlay\n // are stacked, and the menu's outer click-overlay can swallow the\n // first click into the form fields below it.\n this.CloseContextMenu();\n this.showCreateDialog = true;\n this.cdr.detectChanges();\n void this.refreshCategoriesForDialog();\n }\n\n /** @deprecated Use {@link EditList}. */\n editList() {\n return this.EditList();\n }\n\n /** Re-pull MJ: List Categories so the dropdown reflects any\n * newly-created categories. Skips the round trip when nothing has\n * changed since the last load — `categoriesDirty` is flipped on\n * by the BaseEntity event subscription whenever a category row\n * is saved/deleted, so the only times this actually fetches are\n * (a) the first dialog open, and (b) after the user touched a\n * category somewhere else. */\n private async refreshCategoriesForDialog(): Promise<void> {\n if (!this.categoriesDirty) return;\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJListCategoryEntity>({\n EntityName: 'MJ: List Categories',\n OrderBy: 'Name',\n ResultType: 'simple',\n });\n if (!result.Success) return;\n this.Categories = (result.Results ?? []) as MJListCategoryEntity[];\n this.categoryMap.clear();\n for (const cat of this.Categories) this.categoryMap.set(cat.ID, cat);\n this.FlatCategories = this.buildFlatCategories(this.Categories);\n this.categoriesDirty = false;\n this.cdr.detectChanges();\n } catch {\n // Best-effort — the dialog still works with the previously-loaded list.\n }\n }\n\n SelectEntity(entity: { ID: string; Name: string; DisplayName: string }) {\n this.SelectedEntityId = entity.ID;\n this.EntitySearchTerm = entity.DisplayName;\n this.ShowEntityDropdown = false;\n }\n\n /** @deprecated Use {@link SelectEntity}. */\n selectEntity(entity: { ID: string; Name: string; DisplayName: string }) {\n return this.SelectEntity(entity);\n }\n\n FilterEntities(term: string) {\n const lowerTerm = term.toLowerCase();\n this.FilteredEntitiesList = this.AvailableEntities.filter(e =>\n e.DisplayName.toLowerCase().includes(lowerTerm) ||\n e.Name.toLowerCase().includes(lowerTerm)\n );\n // Ensure dropdown is visible while typing\n if (!this.ShowEntityDropdown && term) {\n this.ShowEntityDropdown = true;\n }\n // Clear selection when user modifies the search text\n this.SelectedEntityId = '';\n }\n\n /** @deprecated Use {@link FilterEntities}. */\n filterEntities(term: string) {\n return this.FilterEntities(term);\n }\n\n OpenEntityDropdown(inputElement: HTMLInputElement) {\n const rect = inputElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const dropdownHeight = 200;\n const spaceBelow = viewportHeight - rect.bottom;\n const openAbove = spaceBelow < dropdownHeight && rect.top > dropdownHeight;\n\n this.EntityDropdownPosition = {\n top: openAbove ? rect.top - dropdownHeight : rect.bottom,\n left: rect.left,\n width: rect.width,\n openAbove\n };\n this.ShowEntityDropdown = true;\n this.FilteredEntitiesList = [...this.AvailableEntities];\n }\n\n /** @deprecated Use {@link OpenEntityDropdown}. */\n openEntityDropdown(inputElement: HTMLInputElement) {\n return this.OpenEntityDropdown(inputElement);\n }\n\n CloseEntityDropdown() {\n this.ShowEntityDropdown = false;\n }\n\n /** @deprecated Use {@link CloseEntityDropdown}. */\n closeEntityDropdown() {\n return this.CloseEntityDropdown();\n }\n\n async DuplicateList() {\n if (!this.SelectedContextItem) return;\n\n const listToDuplicate = this.SelectedContextItem.list;\n this.CloseContextMenu();\n\n this.isLoading = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n const newList = await md.GetEntityObject<MJListEntity>('MJ: Lists', md.CurrentUser);\n newList.Name = `${listToDuplicate.Name} (Copy)`;\n newList.Description = listToDuplicate.Description;\n newList.EntityID = listToDuplicate.EntityID;\n newList.CategoryID = listToDuplicate.CategoryID;\n newList.UserID = md.CurrentUser!.ID;\n\n const listSaved = await newList.Save();\n if (!listSaved) {\n this.notificationService.CreateSimpleNotification('Failed to duplicate list', 'error', 4000);\n return;\n }\n\n // BypassCache to avoid any stale RunView cache that might mask members.\n // High MaxRows to cover large lists; entity_object so we have typed access.\n const itemsResult = await rv.RunView<MJListDetailEntity>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID = '${listToDuplicate.ID}'`,\n ResultType: 'entity_object',\n MaxRows: 100000,\n BypassCache: true\n });\n\n if (!itemsResult.Success) {\n console.error('Duplicate: failed to load source list members', itemsResult.ErrorMessage);\n this.notificationService.CreateSimpleNotification(\n `Could not load source list members: ${itemsResult.ErrorMessage || 'unknown'}`,\n 'error', 6000\n );\n return;\n }\n\n const sourceItems = itemsResult.Results ?? [];\n if (sourceItems.length === 0) {\n this.notificationService.CreateSimpleNotification('List duplicated (source had no records)', 'success', 3000);\n } else {\n // Batch all detail inserts into one transaction group so this is\n // a single round-trip instead of 1-per-row. All-or-nothing: if any\n // row fails server-side validation the whole group rolls back.\n const tg = await md.CreateTransactionGroup();\n for (const item of sourceItems) {\n const newItem = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details', md.CurrentUser);\n newItem.ListID = newList.ID;\n newItem.RecordID = item.RecordID;\n newItem.Sequence = item.Sequence;\n newItem.TransactionGroup = tg;\n await newItem.Save(); // queued into tg, not sent yet\n }\n const submitted = await tg.Submit();\n if (submitted) {\n this.notificationService.CreateSimpleNotification(\n `List duplicated with ${sourceItems.length} item${sourceItems.length !== 1 ? 's' : ''}`,\n 'success', 3000\n );\n } else {\n console.error('Duplicate: transaction group submit failed');\n this.notificationService.CreateSimpleNotification(\n `Duplicated list but failed to copy ${sourceItems.length} items — see console`,\n 'error', 6000\n );\n }\n }\n\n await this.loadData();\n } catch (error) {\n console.error('Error duplicating list:', error);\n this.notificationService.CreateSimpleNotification('Error duplicating list. Please try again.', 'error', 4000);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link DuplicateList}. */\n async duplicateList() {\n return this.DuplicateList();\n }\n\n ConfirmDeleteList() {\n if (!this.SelectedContextItem) return;\n this.ListToDelete = this.SelectedContextItem.list;\n this.DeleteListName = this.SelectedContextItem.list.Name;\n this.ShowDeleteConfirm = true;\n this.CloseContextMenu();\n }\n\n /** @deprecated Use {@link ConfirmDeleteList}. */\n confirmDeleteList() {\n return this.ConfirmDeleteList();\n }\n\n CancelDelete() {\n this.ShowDeleteConfirm = false;\n this.ListToDelete = null;\n this.DeleteListName = '';\n }\n\n /** @deprecated Use {@link CancelDelete}. */\n cancelDelete() {\n return this.CancelDelete();\n }\n\n async DeleteList() {\n if (!this.ListToDelete) return;\n\n const listToDelete = this.ListToDelete;\n const listName = listToDelete.Name;\n\n // Defense-in-depth: re-check the ownership rule before deleting so a stale/forced menu can't\n // bypass the gate. The server (MJListEntityServer.Delete) is the true enforcement point, but\n // failing fast here gives a clean message instead of a rejected server round-trip.\n if (!MJListEntityExtended.UserCanDelete(listToDelete.UserID, this.ProviderToUse.CurrentUser)) {\n this.notificationService.CreateSimpleNotification(\n `You don't have permission to delete \"${listName}\".`,\n 'error', 6000,\n );\n return;\n }\n\n this.IsDeleting = true;\n this.cdr.detectChanges();\n\n try {\n // spDeleteList doesn't cascade to MJ: List Details, so the FK\n // constraint (FK_ListDetail_List) blocks the delete if the list\n // has any members. Cascade-delete the details first in a\n // transaction group so the whole thing rolls back if any single\n // delete fails. The proper long-term fix is a migration that\n // adds ON DELETE CASCADE (or extends the SP); this keeps the UI\n // unblocked in the meantime.\n const cascadeOk = await this.cascadeDeleteListMembers(listToDelete.ID);\n if (!cascadeOk) {\n this.notificationService.CreateSimpleNotification(\n `Failed to delete list members for \"${listName}\" — list not deleted`,\n 'error', 6000,\n );\n return;\n }\n\n const deleted = await listToDelete.Delete();\n if (deleted) {\n this.notificationService.CreateSimpleNotification(`\"${listName}\" deleted`, 'success', 3000);\n // Optimistic removal from local state so the card disappears\n // immediately. Without this, the user sees the just-deleted list\n // until loadData() rebuilds — and worse, can click Delete on it\n // again (which hangs because the in-memory entity still has the\n // now-deleted record's ID).\n const deletedId = listToDelete.ID;\n this.AllLists = this.AllLists.filter(item => !UUIDsEqual(item.list.ID, deletedId));\n this.applyFilters();\n this.buildCategoryTree();\n this.cdr.detectChanges();\n } else {\n const errorMessage = listToDelete.LatestResult?.Message || 'Unknown error occurred';\n console.error('Failed to delete list:', listToDelete.LatestResult);\n this.notificationService.CreateSimpleNotification(`Failed to delete list: ${errorMessage}`, 'error', 6000);\n }\n this.CancelDelete();\n // Authoritative refresh — loadData() now sets BypassCache: true on\n // the 'MJ: Lists' RunView, so this no longer races the optimistic\n // local removal against a stale cache.\n void this.loadData();\n } catch (error) {\n console.error('Error deleting list:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error deleting list: ${errorMessage}`, 'error', 6000);\n } finally {\n this.IsDeleting = false;\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link DeleteList}. */\n async deleteList() {\n return this.DeleteList();\n }\n\n /** Delete every MJ: List Details row for a given list in a single\n * transaction group. Returns true if everything succeeded (including\n * the trivial \"no members\" case). */\n private async cascadeDeleteListMembers(listId: string): Promise<boolean> {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(md);\n const lookup = await rv.RunView<MJListDetailEntity>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID='${listId}'`,\n ResultType: 'entity_object',\n });\n if (!lookup.Success) {\n console.error('Failed to load list details for cascade-delete:', lookup.ErrorMessage);\n return false;\n }\n const details = lookup.Results ?? [];\n if (details.length === 0) return true;\n\n const tg = await md.CreateTransactionGroup();\n for (const d of details) {\n d.TransactionGroup = tg;\n await d.Delete();\n }\n const ok = await tg.Submit();\n if (!ok) {\n console.error('Cascade-delete transaction failed for list', listId);\n }\n return ok;\n }\n\n CloseCreateDialog() {\n this.showCreateDialog = false;\n this.EditingList = null;\n this.ShowEntityDropdown = false;\n }\n\n /** @deprecated Use {@link CloseCreateDialog}. */\n closeCreateDialog() {\n return this.CloseCreateDialog();\n }\n\n async SaveList() {\n this.IsSaving = true;\n this.cdr.detectChanges();\n\n const isEditing = !!this.EditingList;\n const listName = this.NewListName;\n\n try {\n const md = this.ProviderToUse;\n let list: MJListEntity;\n\n if (this.EditingList) {\n list = this.EditingList;\n } else {\n list = await md.GetEntityObject<MJListEntity>('MJ: Lists', md.CurrentUser);\n list.UserID = md.CurrentUser!.ID;\n list.EntityID = this.SelectedEntityId;\n }\n\n list.Name = this.NewListName;\n list.Description = this.NewListDescription || null;\n list.CategoryID = this.SelectedCategoryId || null;\n\n const saved = await list.Save();\n if (saved) {\n this.notificationService.CreateSimpleNotification(\n isEditing ? `\"${listName}\" updated` : `\"${listName}\" created`,\n 'success',\n 3000\n );\n this.CloseCreateDialog();\n await this.loadData();\n } else {\n const errorMessage = list.LatestResult?.Message || 'Unknown error occurred';\n const action = isEditing ? 'update' : 'create';\n console.error(`Failed to ${action} list:`, list.LatestResult);\n this.notificationService.CreateSimpleNotification(\n `Failed to ${action} list: ${errorMessage}`,\n 'error',\n 6000\n );\n }\n } catch (error) {\n console.error('Error saving list:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error saving list: ${errorMessage}`, 'error', 6000);\n } finally {\n this.IsSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link SaveList}. */\n async saveList() {\n return this.SaveList();\n }\n\n // Sharing methods\n OpenShareDialog() {\n if (!this.SelectedContextItem) return;\n\n const item = this.SelectedContextItem;\n this.ShareDialogConfig = {\n listId: item.list.ID,\n listName: item.list.Name,\n currentUserId: this.currentUserId,\n isOwner: item.isOwner\n };\n this.ShowShareDialog = true;\n this.CloseContextMenu();\n }\n\n /** @deprecated Use {@link OpenShareDialog}. */\n openShareDialog() {\n return this.OpenShareDialog();\n }\n\n OnShareComplete(_result: ListShareDialogResult) {\n this.ShowShareDialog = false;\n this.ShareDialogConfig = null;\n // Reload sharing info for all lists\n this.loadSharingInfo();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnShareComplete}. */\n onShareComplete(_result: ListShareDialogResult) {\n return this.OnShareComplete(_result);\n }\n\n OnShareCancel() {\n this.ShowShareDialog = false;\n this.ShareDialogConfig = null;\n }\n\n /** @deprecated Use {@link OnShareCancel}. */\n onShareCancel() {\n return this.OnShareCancel();\n }\n\n /** \"Manage Invitations\" clicked inside the share dialog — opens a\n * modal hosting `<mj-list-invitations>` for the same list. The\n * share dialog is closed so dialogs don't visually stack. */\n OnManageInvitations() {\n if (!this.ShareDialogConfig) return;\n this.ActiveShareListId = this.ShareDialogConfig.listId;\n this.ActiveShareListName = this.ShareDialogConfig.listName;\n this.ShowShareDialog = false;\n this.ShowInvitationsDialog = true;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnManageInvitations}. */\n onManageInvitations() {\n return this.OnManageInvitations();\n }\n\n CloseInvitationsDialog() {\n this.ShowInvitationsDialog = false;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link CloseInvitationsDialog}. */\n closeInvitationsDialog() {\n return this.CloseInvitationsDialog();\n }\n\n /** \"View audit log\" link in share dialog. */\n OnViewAuditLog() {\n if (!this.ShareDialogConfig) return;\n this.ActiveShareListId = this.ShareDialogConfig.listId;\n this.ActiveShareListName = this.ShareDialogConfig.listName;\n this.ShowShareDialog = false;\n this.ShowAuditLogDialog = true;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnViewAuditLog}. */\n onViewAuditLog() {\n return this.OnViewAuditLog();\n }\n\n CloseAuditLogDialog() {\n this.ShowAuditLogDialog = false;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link CloseAuditLogDialog}. */\n closeAuditLogDialog() {\n return this.CloseAuditLogDialog();\n }\n\n private async loadSharingInfo() {\n // Load sharing summaries for all lists that the user owns\n const ownedLists = this.AllLists.filter(item => item.isOwner);\n\n for (const item of ownedLists) {\n try {\n const summary = await this.listSharingService.getListSharingSummary(item.list.ID);\n item.sharingInfo = summary;\n } catch (error) {\n console.error(`Error loading sharing info for list ${item.list.ID}:`, error);\n }\n }\n\n this.cdr.detectChanges();\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Lists';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-list-check';\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"lists-browse-resource.component.js","sourceRoot":"","sources":["../../../src/Lists/components/lists-browse-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, ChangeDetectorRef, OnDestroy, ElementRef, HostListener } from '@angular/core';\nimport { RegisterClass , UUIDsEqual, MJGlobal } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData, MJListCategoryEntity } from '@memberjunction/core-entities';\nimport { MJListEntity, MJListEntityExtended, MJListDetailEntity, MJUserFavoriteEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { BaseEntity, BaseEntityEvent, Metadata, RunView } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { TabService } from '@memberjunction/ng-base-application';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { ListSharingService, ListSharingSummary, ListShareDialogConfig, ListShareDialogResult } from '@memberjunction/ng-list-management';\nimport { CapabilitiesForLevel, type ListCapabilities, type SharePermissionLevel } from '@memberjunction/lists-base';\nimport { FilterFieldConfig } from '@memberjunction/ng-ui-components';\nimport { validateEnumParam, validateStringParam } from '../../shared/agent-tool-validation';\nimport { buildListBrowseAgentContext, resolveNamedRecord, buildNotFoundError } from '../lists-agent-context';\ninterface BrowseListItem {\n list: MJListEntity;\n itemCount: number;\n entityName: string;\n ownerName: string;\n isOwner: boolean;\n sharingInfo?: ListSharingSummary;\n}\n\ninterface CategoryNode {\n category: MJListCategoryEntity | null;\n lists: BrowseListItem[];\n children: CategoryNode[];\n isExpanded: boolean;\n}\n\ntype ViewMode = 'table' | 'card' | 'hierarchy';\n\n@RegisterClass(BaseResourceComponent, 'ListsBrowseResource')\n@Component({\n standalone: false,\n selector: 'mj-lists-browse-resource',\n template: `\n <mj-page-layout>\n <mj-page-header Title=\"Lists\" Icon=\"fa-solid fa-list-check\">\n <!-- X-of-Y filtered count earns its meta spot per chrome conventions §2. -->\n <div meta>\n <mj-stat-badge\n [Count]=\"filteredLists.length\"\n [Total]=\"allLists.length\"\n Label=\"lists\">\n </mj-stat-badge>\n </div>\n <div actions>\n <!-- Single primary CTA; all filters live behind the Filter button in\n the control bar below (concise chrome). -->\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createNewList()\">\n <i class=\"fa-solid fa-plus\"></i> <span class=\"action-btn-label\">New List</span>\n </button>\n </div>\n <div toolbar>\n <!-- Control bar: search · Filter · view. Owner, Entity and Favorites\n all live behind the one Filter button; applied filters (including\n tags) show as removable chips below. On mobile the popover docks\n as a bottom sheet and the Filter button is icon-only. -->\n <mj-page-search\n Placeholder=\"Search lists...\"\n [Value]=\"searchTerm\"\n (ValueChange)=\"onSearchChange($event)\">\n </mj-page-search>\n <mj-filter-popover\n Label=\"Filters\"\n Icon=\"fa-solid fa-filter\"\n [ActiveCount]=\"TotalActiveFilterCount\"\n [ShowClearAll]=\"TotalActiveFilterCount > 0\"\n (ClearAllRequested)=\"clearAllAppliedFilters()\">\n <mj-filter-panel\n [Fields]=\"listFilterFields\"\n [Values]=\"listFilterValues\"\n (ValuesChange)=\"onFilterValuesChange($event)\"\n (Reset)=\"resetPopoverFilters()\">\n </mj-filter-panel>\n </mj-filter-popover>\n <mj-view-toggle\n [Options]=\"listViewOptions\"\n [ActiveKey]=\"viewMode\"\n (KeyChange)=\"setViewMode($any($event))\">\n </mj-view-toggle>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading lists...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n <!-- Empty State - No Lists -->\n @if (!isLoading && allLists.length === 0) {\n <mj-empty-state Size=\"large\"\n Icon=\"fa-solid fa-list-check\"\n Title=\"No Lists Yet\"\n Message=\"Lists help you organize and track groups of records across your data.\"\n ActionText=\"Create Your First List\"\n ActionIcon=\"fa-solid fa-plus\"\n (Action)=\"createNewList()\">\n <div class=\"empty-state-features\">\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Group records from any entity</span>\n </div>\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Organize with categories</span>\n </div>\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Quick access from any view</span>\n </div>\n </div>\n </mj-empty-state>\n }\n\n <!-- Empty State - No Results -->\n @if (!isLoading && allLists.length > 0 && filteredLists.length === 0) {\n <mj-empty-state Variant=\"no-results\"\n Icon=\"fa-solid fa-filter-circle-xmark\"\n Title=\"No Results Found\"\n Message=\"No lists match your current filters. Try adjusting your search or filters.\"\n ActionText=\"Reset filters\"\n ActionIcon=\"fa-solid fa-rotate-left\"\n (Action)=\"clearFilters()\" />\n }\n \n <!-- Results Content -->\n @if (!isLoading && filteredLists.length > 0) {\n <div class=\"browse-content\">\n <div class=\"results-header\">\n <span class=\"result-count\">{{filteredLists.length}} list{{filteredLists.length !== 1 ? 's' : ''}}</span>\n <div class=\"sort-options\">\n <label>Sort:</label>\n <select\n [(ngModel)]=\"selectedSort\"\n (ngModelChange)=\"onSortChange($event)\"\n class=\"filter-select sort-select\">\n @for (opt of sortOptions; track opt) {\n <option [value]=\"opt.value\">{{opt.name}}</option>\n }\n </select>\n </div>\n </div>\n <!-- Table View -->\n @if (viewMode === 'table') {\n <div class=\"lists-table\">\n <table role=\"grid\" aria-label=\"Lists table\">\n <thead>\n <tr>\n <th class=\"col-name\" scope=\"col\">Name</th>\n <th class=\"col-entity\" scope=\"col\">Entity</th>\n <th class=\"col-items\" scope=\"col\">Items</th>\n <th class=\"col-sharing\" scope=\"col\">Shared</th>\n <th class=\"col-owner\" scope=\"col\">Owner</th>\n <th class=\"col-updated\" scope=\"col\">Updated</th>\n <th class=\"col-actions\" scope=\"col\"><span class=\"sr-only\">Actions</span></th>\n </tr>\n </thead>\n <tbody>\n @for (item of filteredLists; track item) {\n <tr\n (click)=\"openList(item)\"\n (keydown.enter)=\"openList(item)\"\n class=\"list-row\"\n tabindex=\"0\"\n role=\"row\">\n <td class=\"col-name\" role=\"gridcell\">\n <div class=\"name-cell\">\n <div class=\"list-icon\" [style.background-color]=\"getEntityColor(item.entityName)\" aria-hidden=\"true\">\n <i [class]=\"getEntityIcon(item.entityName)\"></i>\n </div>\n <div class=\"name-content\">\n <span class=\"list-name\">{{item.list.Name}}</span>\n @if (item.list.Description) {\n <span class=\"list-desc\">{{item.list.Description}}</span>\n }\n </div>\n </div>\n </td>\n <td class=\"col-entity\" role=\"gridcell\">\n <span class=\"entity-badge\">{{item.entityName}}</span>\n </td>\n <td class=\"col-items\" role=\"gridcell\">{{item.itemCount}}</td>\n <td class=\"col-sharing\" role=\"gridcell\">\n @if (item.sharingInfo; as sharing) {\n @if (sharing.totalShares > 0) {\n <span class=\"sharing-indicator\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n <span class=\"share-count\">{{sharing.totalShares}}</span>\n </span>\n }\n @if (sharing.totalShares === 0) {\n <span class=\"sharing-private\">\n <i class=\"fa-solid fa-lock\"></i>\n </span>\n }\n }\n @if (!item.sharingInfo) {\n <span class=\"sharing-private\">\n <i class=\"fa-solid fa-lock\"></i>\n </span>\n }\n </td>\n <td class=\"col-owner\" role=\"gridcell\">\n <span class=\"owner-name\" [class.is-me]=\"item.isOwner\">\n {{item.isOwner ? 'You' : item.ownerName}}\n </span>\n </td>\n <td class=\"col-updated\" role=\"gridcell\">{{formatDate(item.list.__mj_UpdatedAt)}}</td>\n <td class=\"col-actions\" role=\"gridcell\">\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"openListMenu($event, item)\"\n title=\"More options\">\n <i class=\"fa-solid fa-ellipsis-v\" aria-hidden=\"true\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n <!-- Card View -->\n @if (viewMode === 'card') {\n <div class=\"lists-grid\" role=\"list\" aria-label=\"Lists\">\n @for (item of filteredLists; track item) {\n <div\n class=\"list-card\"\n (click)=\"openList(item)\"\n (keydown.enter)=\"openList(item)\"\n tabindex=\"0\"\n role=\"listitem\">\n <div class=\"card-header\">\n <div class=\"card-icon\" [style.background-color]=\"getEntityColor(item.entityName)\" aria-hidden=\"true\">\n <i [class]=\"getEntityIcon(item.entityName)\"></i>\n </div>\n <button\n class=\"favorite-btn\"\n [class.favorite-btn--active]=\"isFavorite(item.list.ID)\"\n (click)=\"toggleFavorite($event, item)\"\n [title]=\"isFavorite(item.list.ID) ? 'Remove from favorites' : 'Add to favorites'\">\n <i [class]=\"isFavorite(item.list.ID) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n <div class=\"card-menu\">\n <button class=\"menu-btn\" (click)=\"openListMenu($event, item)\">\n <i class=\"fa-solid fa-ellipsis-v\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"card-body\">\n <h3 class=\"card-title\">{{item.list.Name}}</h3>\n @if (item.list.Description) {\n <p class=\"card-description\">{{item.list.Description}}</p>\n }\n <div class=\"card-meta\">\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-database\"></i>\n {{item.entityName}}\n </span>\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-hashtag\"></i>\n {{item.itemCount}} item{{item.itemCount !== 1 ? 's' : ''}}\n </span>\n </div>\n <!-- Tag chips (Phase 4). Read-only on cards; click adds the\n tag to the filter row above. We stop propagation on\n the wrapper so clicks on chips don't also fire the\n card's openList handler. -->\n <div class=\"card-tags\" (click)=\"$event.stopPropagation()\">\n <mj-tag-chips\n [Provider]=\"Provider\"\n EntityName=\"MJ: Lists\"\n [RecordID]=\"item.list.ID\"\n [Editable]=\"false\"\n [MaxDisplay]=\"3\"\n (TagClicked)=\"onCardTagClicked($event)\">\n </mj-tag-chips>\n </div>\n </div>\n <div class=\"card-footer\">\n <span class=\"owner-tag\" [class.is-me]=\"item.isOwner\">\n <i class=\"fa-solid fa-user\"></i>\n {{item.isOwner ? 'You' : item.ownerName}}\n </span>\n <div class=\"card-footer-right\">\n @if (item.sharingInfo; as sharing) {\n @if (sharing.totalShares > 0) {\n <span class=\"sharing-badge\" [title]=\"'Shared with ' + sharing.totalShares + ' user(s)/role(s)'\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n </span>\n }\n }\n <span class=\"date-info\">{{formatDate(item.list.__mj_UpdatedAt)}}</span>\n </div>\n </div>\n </div>\n }\n </div>\n }\n <!-- Hierarchy View -->\n @if (viewMode === 'hierarchy') {\n <div class=\"category-tree\">\n @for (node of categoryTree; track node) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { node: node, depth: 0 }\"></ng-container>\n }\n </div>\n }\n </div>\n }\n \n <!-- Category Node Template -->\n <ng-template #categoryNodeTemplate let-node=\"node\" let-depth=\"depth\">\n <div class=\"category-section\" [style.margin-left.px]=\"depth * 20\">\n <!-- Category Header -->\n @if (node.category) {\n <div\n class=\"category-header\"\n (click)=\"toggleCategory(node)\">\n <i [class]=\"node.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n <i class=\"fa-solid fa-folder\" [class.fa-folder-open]=\"node.isExpanded\"></i>\n <span class=\"category-name\">{{node.category.Name}}</span>\n <span class=\"category-count\">{{getListCountInCategory(node)}}</span>\n </div>\n }\n \n <!-- Uncategorized Header -->\n @if (!node.category && node.lists.length > 0) {\n <div\n class=\"category-header uncategorized\"\n (click)=\"toggleCategory(node)\">\n <i [class]=\"node.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n <i class=\"fa-solid fa-inbox\"></i>\n <span class=\"category-name\">Uncategorized</span>\n <span class=\"category-count\">{{node.lists.length}}</span>\n </div>\n }\n \n <!-- Lists in this category -->\n @if (node.isExpanded) {\n <div class=\"category-lists\" role=\"list\">\n @for (item of node.lists; track item) {\n <div\n class=\"list-row hierarchy-row\"\n (click)=\"openList(item)\"\n (keydown.enter)=\"openList(item)\"\n tabindex=\"0\"\n role=\"listitem\">\n <div class=\"list-icon\" [style.background-color]=\"getEntityColor(item.entityName)\" aria-hidden=\"true\">\n <i [class]=\"getEntityIcon(item.entityName)\"></i>\n </div>\n <div class=\"list-info\">\n <span class=\"list-name\">{{item.list.Name}}</span>\n <span class=\"list-meta\">\n {{item.entityName}} · {{item.itemCount}} items\n @if (!item.isOwner) {\n <span> · {{item.ownerName}}</span>\n }\n </span>\n </div>\n <div class=\"list-actions\">\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"openListMenu($event, item)\">\n <i class=\"fa-solid fa-ellipsis-v\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n \n <!-- Child categories -->\n @if (node.isExpanded) {\n @for (child of node.children; track child) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { node: child, depth: depth + 1 }\"></ng-container>\n }\n }\n </div>\n </ng-template>\n \n <!-- Context Menu (Phase 2.8 viewer-perspective gating).\n Items shown depend on contextItemCapabilities, resolved lazily\n on menu open. Viewers (no Edit/Share/Delete) still see\n Duplicate. Server-side enforcement remains source of truth;\n hiding is just UX so users don't see buttons that would fail. -->\n @if (showContextMenu) {\n <div class=\"context-menu-overlay\" (click)=\"closeContextMenu()\"></div>\n }\n @if (showContextMenu) {\n <div class=\"context-menu\" [style.top.px]=\"contextMenuY\" [style.left.px]=\"contextMenuX\">\n @if (contextItemCapabilities.CanEdit) {\n <button class=\"menu-item\" (click)=\"editList()\">\n <i class=\"fa-solid fa-pen\"></i>\n Edit\n </button>\n }\n @if (contextItemCapabilities.CanShare) {\n <button class=\"menu-item\" (click)=\"openShareDialog()\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n Share\n </button>\n }\n <button class=\"menu-item\" (click)=\"duplicateList()\">\n <i class=\"fa-solid fa-copy\"></i>\n Duplicate\n </button>\n @if (CanDeleteContextItem) {\n <div class=\"menu-divider\"></div>\n <button class=\"menu-item danger\" (click)=\"confirmDeleteList()\">\n <i class=\"fa-solid fa-trash\"></i>\n Delete\n </button>\n }\n @if (!contextItemCapabilities.CanEdit && !contextItemCapabilities.CanShare && !CanDeleteContextItem) {\n <div class=\"menu-viewer-hint\">\n <i class=\"fa-solid fa-eye\"></i>\n Viewer access — read only\n </div>\n }\n </div>\n }\n </mj-page-body>\n\n <!-- Modals/overlays live outside mj-page-body so its stacking context\n doesn't trap them. Position:fixed overlays would otherwise render\n behind a sibling overlay div, which silently closes the dialog on\n any click. -->\n <!-- Create/Edit Dialog -->\n @if (showCreateDialog) {\n <div class=\"modal-overlay\" (click)=\"closeCreateDialog()\"></div>\n }\n @if (showCreateDialog) {\n <div class=\"modal-dialog\">\n <div class=\"modal-header\">\n <h3>{{editingList ? 'Edit List' : 'Create New List'}}</h3>\n <button class=\"modal-close\" (click)=\"closeCreateDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"form-group\">\n <label>Name *</label>\n <input\n type=\"text\"\n [(ngModel)]=\"newListName\"\n placeholder=\"Enter list name\"\n class=\"form-input\" />\n </div>\n <div class=\"form-group\">\n <label>Description</label>\n <textarea\n [(ngModel)]=\"newListDescription\"\n placeholder=\"Optional description\"\n class=\"form-input\"\n rows=\"3\"></textarea>\n </div>\n @if (!editingList) {\n <div class=\"form-group\">\n <label>Entity *</label>\n <div class=\"custom-select-wrapper\">\n <input\n #entityInput\n type=\"text\"\n [(ngModel)]=\"entitySearchTerm\"\n (ngModelChange)=\"filterEntities($event)\"\n (focus)=\"openEntityDropdown(entityInput)\"\n placeholder=\"Search and select an entity\"\n class=\"form-input\" />\n </div>\n </div>\n }\n @if (editingList) {\n <div class=\"form-group\">\n <label>Entity</label>\n <input type=\"text\" [value]=\"entitySearchTerm\" class=\"form-input\" disabled />\n </div>\n }\n <div class=\"form-group\">\n <label>Category</label>\n <select [(ngModel)]=\"selectedCategoryId\" class=\"form-input\">\n <option [ngValue]=\"null\">No category</option>\n @for (cat of flatCategories; track cat) {\n <option [ngValue]=\"cat.ID\">{{cat.displayName}}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn-primary\"\n (click)=\"saveList()\"\n [disabled]=\"!newListName || (!editingList && !selectedEntityId) || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isSaving ? 'Saving...' : (editingList ? 'Save' : 'Create')}}\n </button>\n <button class=\"btn-secondary\" (click)=\"closeCreateDialog()\" [disabled]=\"isSaving\">Cancel</button>\n </div>\n </div>\n }\n \n <!-- Delete Confirmation Dialog -->\n @if (showDeleteConfirm) {\n <div class=\"modal-overlay\" (click)=\"cancelDelete()\"></div>\n }\n @if (showDeleteConfirm) {\n <div class=\"modal-dialog confirm-dialog\">\n <div class=\"modal-header\">\n <h3>Delete List</h3>\n <button class=\"modal-close\" (click)=\"cancelDelete()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <p>Are you sure you want to delete \"<strong>{{deleteListName}}</strong>\"?</p>\n <p class=\"warning-text\">This will also remove all items in the list.</p>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn-danger\" (click)=\"deleteList()\" [disabled]=\"isDeleting\">\n @if (isDeleting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isDeleting ? 'Deleting...' : 'Delete'}}\n </button>\n <button class=\"btn-secondary\" (click)=\"cancelDelete()\" [disabled]=\"isDeleting\">Cancel</button>\n </div>\n </div>\n }\n \n <!-- Share Dialog -->\n @if (shareDialogConfig) {\n <mj-list-share-dialog\n [config]=\"shareDialogConfig\"\n [visible]=\"showShareDialog\"\n (complete)=\"onShareComplete($event)\"\n (cancel)=\"onShareCancel()\"\n (manageInvitations)=\"onManageInvitations()\"\n (viewAuditLog)=\"onViewAuditLog()\">\n </mj-list-share-dialog>\n }\n\n <!-- Invitations Dialog (mockup 16) -->\n @if (showInvitationsDialog && activeShareListId) {\n <mj-dialog\n [Visible]=\"true\"\n [Title]=\"'Invitations — ' + (activeShareListName ?? 'List')\"\n (Close)=\"closeInvitationsDialog()\"\n [MinWidth]=\"640\"\n [Width]=\"900\"\n [Height]=\"640\">\n <div class=\"dialog-content\">\n <mj-list-invitations\n [Provider]=\"ProviderToUse\"\n [ListID]=\"activeShareListId\"\n [ListName]=\"activeShareListName\">\n </mj-list-invitations>\n </div>\n <mj-dialog-actions>\n <button mjButton (click)=\"closeInvitationsDialog()\" variant=\"outline\">Close</button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n\n <!-- Audit Log Dialog (mockup 18) -->\n @if (showAuditLogDialog && activeShareListId) {\n <mj-dialog\n [Visible]=\"true\"\n [Title]=\"'Audit Log — ' + (activeShareListName ?? 'List')\"\n (Close)=\"closeAuditLogDialog()\"\n [MinWidth]=\"720\"\n [Width]=\"980\"\n [Height]=\"680\">\n <div class=\"dialog-content\">\n <mj-list-audit-log\n [Provider]=\"ProviderToUse\"\n [ListID]=\"activeShareListId\">\n </mj-list-audit-log>\n </div>\n <mj-dialog-actions>\n <button mjButton (click)=\"closeAuditLogDialog()\" variant=\"outline\">Close</button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n \n <!-- Entity Dropdown Portal -->\n @if (showEntityDropdown && !editingList) {\n <div\n class=\"entity-dropdown-portal\"\n [style.top.px]=\"entityDropdownPosition.top\"\n [style.left.px]=\"entityDropdownPosition.left\"\n [style.width.px]=\"entityDropdownPosition.width\"\n [class.dropdown-above]=\"entityDropdownPosition.openAbove\">\n <div class=\"entity-dropdown-content\" [class.open-above]=\"entityDropdownPosition.openAbove\">\n @for (entity of filteredEntitiesList; track entity) {\n <div\n class=\"dropdown-item\"\n (mousedown)=\"selectEntity(entity); $event.preventDefault()\">\n {{entity.DisplayName}}\n </div>\n }\n @if (filteredEntitiesList.length === 0) {\n <div class=\"dropdown-empty\">\n No entities found\n </div>\n }\n </div>\n </div>\n }\n </mj-page-layout>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n /* Control bar: on mobile search grows so the icon-only Filter + view toggle\n stay on one line. On desktop search keeps its natural width. */\n @media (max-width: 768px) {\n mj-page-search {\n flex: 1;\n }\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 /* Onboarding feature checklist — projected into <mj-empty-state>. */\n .empty-state-features {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-2);\n margin: var(--mj-space-5) 0 var(--mj-space-2);\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 /* 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 `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ListsBrowseResource extends BaseResourceComponent implements OnDestroy {\n protected override destroy$ = new Subject<void>();\n\n isLoading = true;\n SearchTerm = '';\n\n /** @deprecated Use {@link SearchTerm}. */\n get searchTerm() {\n return this.SearchTerm;\n }\n /** @deprecated Use {@link SearchTerm}. */\n set searchTerm(value) {\n this.SearchTerm = value;\n }\n ViewMode: ViewMode = 'card';\n\n /** @deprecated Use {@link ViewMode}. */\n get viewMode(): ViewMode {\n return this.ViewMode;\n }\n /** @deprecated Use {@link ViewMode}. */\n set viewMode(value: ViewMode) {\n this.ViewMode = value;\n }\n SelectedEntity = 'all';\n\n /** @deprecated Use {@link SelectedEntity}. */\n get selectedEntity() {\n return this.SelectedEntity;\n }\n /** @deprecated Use {@link SelectedEntity}. */\n set selectedEntity(value) {\n this.SelectedEntity = value;\n }\n SelectedOwner = 'mine';\n\n /** @deprecated Use {@link SelectedOwner}. */\n get selectedOwner() {\n return this.SelectedOwner;\n }\n /** @deprecated Use {@link SelectedOwner}. */\n set selectedOwner(value) {\n this.SelectedOwner = value;\n }\n SelectedSort = 'name';\n\n /** @deprecated Use {@link SelectedSort}. */\n get selectedSort() {\n return this.SelectedSort;\n }\n /** @deprecated Use {@link SelectedSort}. */\n set selectedSort(value) {\n this.SelectedSort = value;\n }\n\n /**\n * Active tag filters (Phase 4.3). Multi-tag = AND — a list must have\n * every active tag to appear. URL state mirrors this via the `tags`\n * query param (comma-separated tag IDs).\n */\n TagFilters: Array<{ TagID: string; Name: string }> = [];\n\n /** @deprecated Use {@link TagFilters}. */\n get tagFilters(): Array<{ TagID: string; Name: string }> {\n return this.TagFilters;\n }\n /** @deprecated Use {@link TagFilters}. */\n set tagFilters(value: Array<{ TagID: string; Name: string }>) {\n this.TagFilters = value;\n }\n\n /**\n * Set of List IDs that match the current `tagFilters` (intersection).\n * `null` means \"no tag filter active\" — pass-through. Populated by\n * `recomputeTagMembership` whenever `tagFilters` changes; consumed by\n * `applyFilters` to narrow the visible list.\n */\n private tagFilteredListIds: Set<string> | null = null;\n\n /**\n * Favorite-list IDs for the current user (Phase 5.3). Backed by the\n * existing `MJ: User Favorites` entity. `null` while loading; a Set\n * once populated so card-side toggling is O(1).\n */\n FavoriteListIds: Set<string> = new Set();\n\n /** @deprecated Use {@link FavoriteListIds}. */\n get favoriteListIds(): Set<string> {\n return this.FavoriteListIds;\n }\n /** @deprecated Use {@link FavoriteListIds}. */\n set favoriteListIds(value: Set<string>) {\n this.FavoriteListIds = value;\n }\n\n /** When true, only favorited lists appear in the grid. */\n ShowOnlyFavorites = false;\n\n /** @deprecated Use {@link ShowOnlyFavorites}. */\n get showOnlyFavorites() {\n return this.ShowOnlyFavorites;\n }\n /** @deprecated Use {@link ShowOnlyFavorites}. */\n set showOnlyFavorites(value) {\n this.ShowOnlyFavorites = value;\n }\n\n AllLists: BrowseListItem[] = [];\n\n /** @deprecated Use {@link AllLists}. */\n get allLists(): BrowseListItem[] {\n return this.AllLists;\n }\n /** @deprecated Use {@link AllLists}. */\n set allLists(value: BrowseListItem[]) {\n this.AllLists = value;\n }\n FilteredLists: BrowseListItem[] = [];\n\n /** @deprecated Use {@link FilteredLists}. */\n get filteredLists(): BrowseListItem[] {\n return this.FilteredLists;\n }\n /** @deprecated Use {@link FilteredLists}. */\n set filteredLists(value: BrowseListItem[]) {\n this.FilteredLists = value;\n }\n Categories: MJListCategoryEntity[] = [];\n\n /** @deprecated Use {@link Categories}. */\n get categories(): MJListCategoryEntity[] {\n return this.Categories;\n }\n /** @deprecated Use {@link Categories}. */\n set categories(value: MJListCategoryEntity[]) {\n this.Categories = value;\n }\n CategoryTree: CategoryNode[] = [];\n\n /** @deprecated Use {@link CategoryTree}. */\n get categoryTree(): CategoryNode[] {\n return this.CategoryTree;\n }\n /** @deprecated Use {@link CategoryTree}. */\n set categoryTree(value: CategoryNode[]) {\n this.CategoryTree = value;\n }\n FlatCategories: Array<{ ID: string; displayName: string }> = [];\n\n /** @deprecated Use {@link FlatCategories}. */\n get flatCategories(): Array<{ ID: string; displayName: string }> {\n return this.FlatCategories;\n }\n /** @deprecated Use {@link FlatCategories}. */\n set flatCategories(value: Array<{ ID: string; displayName: string }>) {\n this.FlatCategories = value;\n }\n AvailableEntities: Array<{ ID: string; Name: string; DisplayName: string }> = [];\n\n /** @deprecated Use {@link AvailableEntities}. */\n get availableEntities(): Array<{ ID: string; Name: string; DisplayName: string }> {\n return this.AvailableEntities;\n }\n /** @deprecated Use {@link AvailableEntities}. */\n set availableEntities(value: Array<{ ID: string; Name: string; DisplayName: string }>) {\n this.AvailableEntities = value;\n }\n FilteredEntitiesList: Array<{ ID: string; Name: string; DisplayName: string }> = [];\n\n /** @deprecated Use {@link FilteredEntitiesList}. */\n get filteredEntitiesList(): Array<{ ID: string; Name: string; DisplayName: string }> {\n return this.FilteredEntitiesList;\n }\n /** @deprecated Use {@link FilteredEntitiesList}. */\n set filteredEntitiesList(value: Array<{ ID: string; Name: string; DisplayName: string }>) {\n this.FilteredEntitiesList = value;\n }\n\n EntityOptions: Array<{ name: string; value: string }> = [{ name: 'All Entities', value: 'all' }];\n\n /** @deprecated Use {@link EntityOptions}. */\n get entityOptions(): Array<{ name: string; value: string }> {\n return this.EntityOptions;\n }\n /** @deprecated Use {@link EntityOptions}. */\n set entityOptions(value: Array<{ name: string; value: string }>) {\n this.EntityOptions = value;\n }\n OwnerOptions: Array<{ name: string; value: string }> = [\n { name: 'My Lists', value: 'mine' },\n { name: 'All Lists', value: 'all' },\n { name: 'Others', value: 'others' }\n ];\n\n /** @deprecated Use {@link OwnerOptions}. */\n get ownerOptions(): Array<{ name: string; value: string }> {\n return this.OwnerOptions;\n }\n /** @deprecated Use {@link OwnerOptions}. */\n set ownerOptions(value: Array<{ name: string; value: string }>) {\n this.OwnerOptions = value;\n }\n SortOptions: Array<{ name: string; value: string }> = [\n { name: 'Name', value: 'name' },\n { name: 'Recently Updated', value: 'updated' },\n { name: 'Most Items', value: 'items' },\n { name: 'Entity', value: 'entity' }\n ];\n\n /** @deprecated Use {@link SortOptions}. */\n get sortOptions(): Array<{ name: string; value: string }> {\n return this.SortOptions;\n }\n /** @deprecated Use {@link SortOptions}. */\n set sortOptions(value: Array<{ name: string; value: string }>) {\n this.SortOptions = value;\n }\n\n // Context menu state\n ShowContextMenu = false;\n\n /** @deprecated Use {@link ShowContextMenu}. */\n get showContextMenu() {\n return this.ShowContextMenu;\n }\n /** @deprecated Use {@link ShowContextMenu}. */\n set showContextMenu(value) {\n this.ShowContextMenu = value;\n }\n ContextMenuX = 0;\n\n /** @deprecated Use {@link ContextMenuX}. */\n get contextMenuX() {\n return this.ContextMenuX;\n }\n /** @deprecated Use {@link ContextMenuX}. */\n set contextMenuX(value) {\n this.ContextMenuX = value;\n }\n ContextMenuY = 0;\n\n /** @deprecated Use {@link ContextMenuY}. */\n get contextMenuY() {\n return this.ContextMenuY;\n }\n /** @deprecated Use {@link ContextMenuY}. */\n set contextMenuY(value) {\n this.ContextMenuY = value;\n }\n SelectedContextItem: BrowseListItem | null = null;\n\n /** @deprecated Use {@link SelectedContextItem}. */\n get selectedContextItem(): BrowseListItem | null {\n return this.SelectedContextItem;\n }\n /** @deprecated Use {@link SelectedContextItem}. */\n set selectedContextItem(value: BrowseListItem | null) {\n this.SelectedContextItem = value;\n }\n\n // Create/Edit dialog state\n showCreateDialog = false;\n EditingList: MJListEntity | null = null;\n\n /** @deprecated Use {@link EditingList}. */\n get editingList(): MJListEntity | null {\n return this.EditingList;\n }\n /** @deprecated Use {@link EditingList}. */\n set editingList(value: MJListEntity | null) {\n this.EditingList = value;\n }\n NewListName = '';\n\n /** @deprecated Use {@link NewListName}. */\n get newListName() {\n return this.NewListName;\n }\n /** @deprecated Use {@link NewListName}. */\n set newListName(value) {\n this.NewListName = value;\n }\n NewListDescription = '';\n\n /** @deprecated Use {@link NewListDescription}. */\n get newListDescription() {\n return this.NewListDescription;\n }\n /** @deprecated Use {@link NewListDescription}. */\n set newListDescription(value) {\n this.NewListDescription = value;\n }\n SelectedEntityId = '';\n\n /** @deprecated Use {@link SelectedEntityId}. */\n get selectedEntityId() {\n return this.SelectedEntityId;\n }\n /** @deprecated Use {@link SelectedEntityId}. */\n set selectedEntityId(value) {\n this.SelectedEntityId = value;\n }\n SelectedCategoryId: string | null = null;\n\n /** @deprecated Use {@link SelectedCategoryId}. */\n get selectedCategoryId(): string | null {\n return this.SelectedCategoryId;\n }\n /** @deprecated Use {@link SelectedCategoryId}. */\n set selectedCategoryId(value: string | null) {\n this.SelectedCategoryId = value;\n }\n EntitySearchTerm = '';\n\n /** @deprecated Use {@link EntitySearchTerm}. */\n get entitySearchTerm() {\n return this.EntitySearchTerm;\n }\n /** @deprecated Use {@link EntitySearchTerm}. */\n set entitySearchTerm(value) {\n this.EntitySearchTerm = value;\n }\n ShowEntityDropdown = false;\n\n /** @deprecated Use {@link ShowEntityDropdown}. */\n get showEntityDropdown() {\n return this.ShowEntityDropdown;\n }\n /** @deprecated Use {@link ShowEntityDropdown}. */\n set showEntityDropdown(value) {\n this.ShowEntityDropdown = value;\n }\n EntityDropdownPosition = { top: 0, left: 0, width: 0, openAbove: false };\n\n /** @deprecated Use {@link EntityDropdownPosition}. */\n get entityDropdownPosition() {\n return this.EntityDropdownPosition;\n }\n /** @deprecated Use {@link EntityDropdownPosition}. */\n set entityDropdownPosition(value) {\n this.EntityDropdownPosition = value;\n }\n\n // Delete confirmation state\n ShowDeleteConfirm = false;\n\n /** @deprecated Use {@link ShowDeleteConfirm}. */\n get showDeleteConfirm() {\n return this.ShowDeleteConfirm;\n }\n /** @deprecated Use {@link ShowDeleteConfirm}. */\n set showDeleteConfirm(value) {\n this.ShowDeleteConfirm = value;\n }\n DeleteListName = '';\n\n /** @deprecated Use {@link DeleteListName}. */\n get deleteListName() {\n return this.DeleteListName;\n }\n /** @deprecated Use {@link DeleteListName}. */\n set deleteListName(value) {\n this.DeleteListName = value;\n }\n ListToDelete: MJListEntity | null = null;\n\n /** @deprecated Use {@link ListToDelete}. */\n get listToDelete(): MJListEntity | null {\n return this.ListToDelete;\n }\n /** @deprecated Use {@link ListToDelete}. */\n set listToDelete(value: MJListEntity | null) {\n this.ListToDelete = value;\n }\n\n // Operation states\n IsSaving = false;\n\n /** @deprecated Use {@link IsSaving}. */\n get isSaving() {\n return this.IsSaving;\n }\n /** @deprecated Use {@link IsSaving}. */\n set isSaving(value) {\n this.IsSaving = value;\n }\n IsDeleting = false;\n\n /** @deprecated Use {@link IsDeleting}. */\n get isDeleting() {\n return this.IsDeleting;\n }\n /** @deprecated Use {@link IsDeleting}. */\n set isDeleting(value) {\n this.IsDeleting = value;\n }\n\n // Sharing dialog state\n ShowShareDialog = false;\n\n /** @deprecated Use {@link ShowShareDialog}. */\n get showShareDialog() {\n return this.ShowShareDialog;\n }\n /** @deprecated Use {@link ShowShareDialog}. */\n set showShareDialog(value) {\n this.ShowShareDialog = value;\n }\n ShareDialogConfig: ListShareDialogConfig | null = null;\n\n /** @deprecated Use {@link ShareDialogConfig}. */\n get shareDialogConfig(): ListShareDialogConfig | null {\n return this.ShareDialogConfig;\n }\n /** @deprecated Use {@link ShareDialogConfig}. */\n set shareDialogConfig(value: ListShareDialogConfig | null) {\n this.ShareDialogConfig = value;\n }\n\n // Viewer-perspective gating (Phase 2.8). Capabilities are computed\n // lazily when the user opens the context menu — running per-card\n // would mean N permission-resolve calls per browse render. The\n // resolved level is cached on the item so re-opening the same menu\n // doesn't refetch.\n public ContextItemCapabilities: ListCapabilities = CapabilitiesForLevel('Owner');\n\n /** @deprecated Use {@link ContextItemCapabilities}. */\n public get contextItemCapabilities(): ListCapabilities {\n return this.ContextItemCapabilities;\n }\n /** @deprecated Use {@link ContextItemCapabilities}. */\n public set contextItemCapabilities(value: ListCapabilities) {\n this.ContextItemCapabilities = value;\n }\n private capabilityCache = new Map<string, SharePermissionLevel | null>();\n\n /**\n * Whether the current user may DELETE the context-menu's list. This uses the single shared\n * ownership rule ({@link MJListEntityExtended.UserCanDelete}) — the same rule the server enforces\n * in MJListEntityServer.Delete() — rather than the share-level capability, so the button is shown\n * only when the delete would actually succeed: the List's owner, or a Developer/Integration user.\n */\n public get CanDeleteContextItem(): boolean {\n const list = this.SelectedContextItem?.list;\n if (!list) {\n return false;\n }\n return MJListEntityExtended.UserCanDelete(list.UserID, this.ProviderToUse.CurrentUser);\n }\n\n // Tracks whether the in-memory categories list is known-stale\n // relative to the DB. Flipped to true by the BaseEntity event\n // subscription whenever any `MJ: List Categories` row is saved or\n // deleted (most often from the Categories tab next door). Reset to\n // false after `refreshCategoriesForDialog` reloads. Initial true so\n // the first dialog open always populates from a fresh fetch.\n private categoriesDirty = true;\n\n // Invitations / audit log dialogs (mockups 16, 18) — opened from\n // the share dialog. Each dialog binds to a single list at a time,\n // tracked by `activeShareListId`/`activeShareListName` lifted from\n // shareDialogConfig at open time so we keep the context after the\n // share dialog closes.\n ShowInvitationsDialog = false;\n\n /** @deprecated Use {@link ShowInvitationsDialog}. */\n get showInvitationsDialog() {\n return this.ShowInvitationsDialog;\n }\n /** @deprecated Use {@link ShowInvitationsDialog}. */\n set showInvitationsDialog(value) {\n this.ShowInvitationsDialog = value;\n }\n ShowAuditLogDialog = false;\n\n /** @deprecated Use {@link ShowAuditLogDialog}. */\n get showAuditLogDialog() {\n return this.ShowAuditLogDialog;\n }\n /** @deprecated Use {@link ShowAuditLogDialog}. */\n set showAuditLogDialog(value) {\n this.ShowAuditLogDialog = value;\n }\n ActiveShareListId: string | null = null;\n\n /** @deprecated Use {@link ActiveShareListId}. */\n get activeShareListId(): string | null {\n return this.ActiveShareListId;\n }\n /** @deprecated Use {@link ActiveShareListId}. */\n set activeShareListId(value: string | null) {\n this.ActiveShareListId = value;\n }\n ActiveShareListName: string | null = null;\n\n /** @deprecated Use {@link ActiveShareListName}. */\n get activeShareListName(): string | null {\n return this.ActiveShareListName;\n }\n /** @deprecated Use {@link ActiveShareListName}. */\n set activeShareListName(value: string | null) {\n this.ActiveShareListName = value;\n }\n\n private entityColorMap: Map<string, string> = new Map();\n private entityIconMap: Map<string, string> = new Map();\n private categoryMap: Map<string, MJListCategoryEntity> = new Map();\n private currentUserId = '';\n\n constructor(\n private cdr: ChangeDetectorRef,\n private tabService: TabService,\n private notificationService: MJNotificationService,\n private elementRef: ElementRef,\n private listSharingService: ListSharingService\n ) {\n super();\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent) {\n if (this.ShowEntityDropdown) {\n const target = event.target as HTMLElement;\n if (!target.closest('.custom-select-wrapper') && !target.closest('.entity-dropdown-portal')) {\n this.ShowEntityDropdown = false;\n }\n }\n }\n\n @HostListener('document:keydown.escape')\n onEscapeKey() {\n if (this.ShowContextMenu) {\n this.CloseContextMenu();\n }\n if (this.showCreateDialog) {\n this.CloseCreateDialog();\n }\n if (this.ShowDeleteConfirm) {\n this.CancelDelete();\n }\n if (this.ShowEntityDropdown) {\n this.CloseEntityDropdown();\n }\n }\n\n /** User-preference key for the favorites-only filter (F5a) — server-persisted so it survives reloads and follows the user across devices. */\n private static readonly FAVORITES_FILTER_PREF_KEY = 'mj.lists.browse.showOnlyFavorites';\n\n /** Persists the current favorites-filter state as a user preference (debounced). */\n private persistFavoritesFilter(): void {\n UserInfoEngine.Instance.SetSettingDebounced(\n ListsBrowseResource.FAVORITES_FILTER_PREF_KEY,\n String(this.ShowOnlyFavorites),\n );\n }\n\n async ngOnInit() {\n super.ngOnInit();\n // Restore the favorites-only filter preference (synchronous cache hit —\n // UserInfoEngine is populated during app bootstrap)\n this.ShowOnlyFavorites = UserInfoEngine.Instance.GetSetting(\n ListsBrowseResource.FAVORITES_FILTER_PREF_KEY,\n ) === 'true';\n this.subscribeToCategoryChanges();\n await this.loadData();\n this.registerAgentTools();\n this.publishAgentContext();\n this.NotifyLoadComplete();\n }\n\n // ================================================================\n // AI Agent Context & Client Tools\n //\n // SAFETY BOUNDARY: This surface exposes only SAFE (read-only /\n // navigational / selection) operations plus ONE bounded-mutation tool\n // (CreateList) that merely opens the dialog-validated create flow.\n // The following are INTENTIONALLY EXCLUDED from agent tools and must\n // NOT be wired in:\n // - EditList (editList) — mutates an existing record\n // - DeleteList (confirmDeleteList/deleteList) — destructive\n // - ShareList (openShareDialog) — grants access to others\n // - DuplicateList(duplicateList) — bulk record copy\n // - ToggleFavorite(toggleFavorite) — prefer the agent ask the user\n // Edit/delete/share/duplicate/favorite stay user-driven on purpose.\n // ================================================================\n\n /**\n * Report the Browse surface's salient state to the AI agent. Re-called\n * on every meaningful state change (search / filter / view / sort /\n * data load) so the chat agent and realtime co-agent stay in sync with\n * what the user is looking at.\n */\n private publishAgentContext(): void {\n this.navigationService.SetAgentContext(this, buildListBrowseAgentContext({\n SearchTerm: this.SearchTerm,\n ViewMode: this.ViewMode,\n AllListCount: this.AllLists.length,\n FilteredListCount: this.FilteredLists.length,\n // Deep context: the NAMES of the lists currently on screen (bounded), so\n // the agent can refer to / open them by name rather than an opaque GUID.\n VisibleListNames: this.FilteredLists.map(i => i.list.Name),\n SelectedSort: this.SelectedSort,\n ActiveFilterCount: this.TotalActiveFilterCount,\n SelectedOwner: this.SelectedOwner,\n SelectedEntity: this.SelectedEntity,\n ShowOnlyFavorites: this.ShowOnlyFavorites,\n }));\n }\n\n /**\n * Resolve an agent-supplied reference (a list ID or a list NAME, exact or\n * partial) to one of the loaded Browse list items. Delegates the matching to\n * the pure {@link resolveNamedRecord} helper over the filtered lists' rows.\n */\n private resolveBrowseListItem(input: string): BrowseListItem | null {\n const match = resolveNamedRecord(input, this.AllLists.map(i => ({ ID: i.list.ID, Name: i.list.Name })));\n if (!match) {\n return null;\n }\n return this.AllLists.find(i => UUIDsEqual(i.list.ID, match.ID)) ?? null;\n }\n\n /**\n * Register the Browse surface's agent-actionable tools. SAFE tools are\n * navigation / search / filter / selection; the single bounded-mutation\n * tool (CreateList) only opens the dialog-validated create flow.\n */\n private registerAgentTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'OpenList',\n Description: 'Open a list in a new tab by its ID or name. Pass the list name the user says (see VisibleListNames) — the tool resolves an exact ID, an exact name, or a partial name match.',\n ParameterSchema: { type: 'object', properties: { list: { type: 'string', description: 'The list ID or name to open' }, listId: { type: 'string', description: 'Deprecated alias for \"list\".' } } },\n Handler: async (params: Record<string, unknown>) => {\n const idCheck = validateStringParam(params['list'] ?? params['listId'], 'list');\n if (!idCheck.ok) return idCheck.result;\n const item = this.resolveBrowseListItem(idCheck.value);\n if (!item) return { Success: false, ErrorMessage: buildNotFoundError(idCheck.value, this.AllLists.map(i => ({ ID: i.list.ID, Name: i.list.Name })), 'list') };\n this.OpenList(item);\n return { Success: true, Data: { listName: item.list.Name } };\n },\n },\n {\n Name: 'SearchLists',\n Description: 'Set the search term that filters the visible lists by name, description, entity, or owner.',\n ParameterSchema: { type: 'object', properties: { searchTerm: { type: 'string', description: 'Text to search for' } }, required: ['searchTerm'] },\n Handler: async (params: Record<string, unknown>) => {\n const check = validateStringParam(params['searchTerm'], 'searchTerm');\n if (!check.ok) return check.result;\n this.OnSearchChange(check.value);\n this.publishAgentContext();\n return { Success: true, Data: { resultCount: this.FilteredLists.length } };\n },\n },\n {\n Name: 'FilterLists',\n Description: 'Apply Owner / Entity / Favorites filters. Owner: \"mine\" | \"all\" | \"others\". Entity: an entity name or \"all\". Favorites: \"favorites\" | \"all\". Omitted keys are left unchanged.',\n ParameterSchema: {\n type: 'object',\n properties: {\n owner: { type: 'string', enum: ['mine', 'all', 'others'] },\n entity: { type: 'string' },\n favorites: { type: 'string', enum: ['favorites', 'all'] },\n },\n },\n Handler: async (params: Record<string, unknown>) => {\n const next: Record<string, unknown> = { ...this.ListFilterValues };\n if (params['owner'] !== undefined) {\n const ownerCheck = validateEnumParam(params['owner'], ['mine', 'all', 'others'] as const, 'owner');\n if (!ownerCheck.ok) return ownerCheck.result;\n next['selectedOwner'] = ownerCheck.value;\n }\n if (params['entity'] !== undefined) {\n const entityCheck = validateStringParam(params['entity'], 'entity');\n if (!entityCheck.ok) return entityCheck.result;\n next['selectedEntity'] = entityCheck.value;\n }\n if (params['favorites'] !== undefined) {\n const favCheck = validateEnumParam(params['favorites'], ['favorites', 'all'] as const, 'favorites');\n if (!favCheck.ok) return favCheck.result;\n next['favorites'] = favCheck.value;\n }\n this.OnFilterValuesChange(next);\n this.publishAgentContext();\n return { Success: true, Data: { resultCount: this.FilteredLists.length, activeFilterCount: this.TotalActiveFilterCount } };\n },\n },\n {\n Name: 'ClearFilters',\n Description: 'Clear all applied filters (Owner, Entity, Favorites, Tags).',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.ClearAllAppliedFilters();\n this.publishAgentContext();\n return { Success: true, Data: { resultCount: this.FilteredLists.length } };\n },\n },\n {\n Name: 'SetViewMode',\n Description: 'Set the list view mode: \"table\", \"card\", or \"hierarchy\".',\n ParameterSchema: { type: 'object', properties: { mode: { type: 'string', enum: ['table', 'card', 'hierarchy'] } }, required: ['mode'] },\n Handler: async (params: Record<string, unknown>) => {\n const check = validateEnumParam(params['mode'], ['table', 'card', 'hierarchy'] as const, 'mode');\n if (!check.ok) return check.result;\n this.SetViewMode(check.value);\n this.publishAgentContext();\n return { Success: true };\n },\n },\n {\n Name: 'SortBy',\n Description: 'Sort the lists by a field: \"name\", \"updated\", \"items\", or \"entity\".',\n ParameterSchema: { type: 'object', properties: { field: { type: 'string', enum: ['name', 'updated', 'items', 'entity'] } }, required: ['field'] },\n Handler: async (params: Record<string, unknown>) => {\n const check = validateEnumParam(params['field'], ['name', 'updated', 'items', 'entity'] as const, 'field');\n if (!check.ok) return check.result;\n this.SelectedSort = check.value;\n this.OnSortChange(check.value);\n this.publishAgentContext();\n return { Success: true };\n },\n },\n {\n // BOUNDED MUTATION: opens the create dialog only. The list name +\n // entity are validated by the dialog before any record is written,\n // so the agent cannot silently create a malformed/empty list.\n Name: 'CreateList',\n Description: 'Open the \"Create New List\" dialog. The user confirms the name and entity in the dialog; nothing is saved until they do.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.CreateNewList();\n return { Success: true };\n },\n },\n ]);\n }\n\n /**\n * Mark the in-memory categories list dirty whenever any BaseEntity\n * raises a save / delete event for `MJ: List Categories`. The\n * Create/Edit dialog uses this flag to skip the per-open RunView\n * unless something has actually changed since last load — keeps the\n * dialog snappy without showing stale categories.\n *\n * Subscribes to MJGlobal's event bus rather than wiring each\n * category entity's per-instance listener, because the Categories\n * tab creates fresh BaseEntity instances we can't see from here.\n */\n private subscribeToCategoryChanges(): void {\n MJGlobal.Instance.GetEventListener()\n .pipe(takeUntil(this.destroy$))\n .subscribe((mjEvt) => {\n if (mjEvt.eventCode !== BaseEntity.BaseEventCode) return;\n const beEvt = mjEvt.args as BaseEntityEvent | undefined;\n if (!beEvt) return;\n const entityName = beEvt.baseEntity?.EntityInfo.Name ?? beEvt.entityName;\n if (entityName !== 'MJ: List Categories') return;\n if (beEvt.type === 'save' || beEvt.type === 'delete') {\n this.categoriesDirty = true;\n }\n });\n }\n\n ngOnDestroy() {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async loadData() {\n this.isLoading = true;\n\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n this.currentUserId = md.CurrentUser?.ID || '';\n\n // BypassCache on Lists: after a delete/duplicate, the RunView cache\n // for this entity doesn't always reflect the latest state in time\n // (event-driven invalidation races the immediate refresh). Trading a\n // small perf hit for correctness here is worth it — categories stay\n // cache-warm. Owner names come from the denormalized `User` view\n // field on each list, and item counts from batched COUNT queries —\n // this deliberately does NOT download List Details or Users rows.\n const [listsResult, categoriesResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Lists',\n OrderBy: 'Name',\n ResultType: 'entity_object',\n BypassCache: true\n },\n {\n EntityName: 'MJ: List Categories',\n OrderBy: 'Name',\n ResultType: 'entity_object'\n }\n ]);\n\n if (!listsResult.Success) {\n console.error('Failed to load lists');\n return;\n }\n\n const lists = listsResult.Results as MJListEntity[];\n this.Categories = (categoriesResult.Results || []) as MJListCategoryEntity[];\n\n // Build category map\n this.categoryMap.clear();\n for (const cat of this.Categories) {\n this.categoryMap.set(cat.ID, cat);\n }\n\n // Build flat categories for dropdown\n this.FlatCategories = this.buildFlatCategories(this.Categories);\n // loadData() already pulled fresh categories — clear the dirty\n // flag so the first dialog open doesn't redundantly refetch.\n this.categoriesDirty = false;\n\n // Per-list item counts: one batched round trip of count_only queries\n // (each an index-seek COUNT on ListDetail.ListID server-side) instead\n // of transferring every membership row to the client.\n const itemCounts = new Map<string, number>();\n if (lists.length > 0) {\n const countResults = await rv.RunViews(lists.map(list => ({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID = '${list.ID}'`,\n ResultType: 'count_only' as const,\n BypassCache: true\n })));\n countResults.forEach((res, idx) => {\n itemCounts.set(lists[idx].ID, res.Success ? res.TotalRowCount ?? 0 : 0);\n });\n }\n\n // Build entity info\n const entities = md.Entities;\n const entitySet = new Set<string>();\n\n for (const entity of entities) {\n this.entityColorMap.set(entity.Name, this.generateEntityColor(entity.Name));\n this.entityIconMap.set(entity.Name, entity.Icon || 'fa-solid fa-table');\n }\n\n // Build available entities for dropdown\n this.AvailableEntities = entities\n .filter(e => e.IncludeInAPI)\n .map(e => ({ ID: e.ID, Name: e.Name, DisplayName: e.DisplayNameOrName }))\n .sort((a, b) => a.DisplayName.localeCompare(b.DisplayName));\n this.FilteredEntitiesList = [...this.AvailableEntities];\n\n // Build list items\n this.AllLists = lists.map(list => {\n const entityName = list.Entity || 'Unknown';\n entitySet.add(entityName);\n return {\n list,\n itemCount: itemCounts.get(list.ID) || 0,\n entityName,\n ownerName: list.User || 'Unknown',\n isOwner: UUIDsEqual(list.UserID, this.currentUserId)\n };\n });\n\n // Build entity filter options\n this.EntityOptions = [\n { name: 'All Entities', value: 'all' },\n ...Array.from(entitySet).sort().map(e => ({ name: e, value: e }))\n ];\n\n this.applyFilters();\n this.buildCategoryTree();\n\n // Load favorites in parallel — not critical-path, but cheap.\n void this.loadFavorites();\n\n // Load sharing info in the background\n this.loadSharingInfo();\n } catch (error) {\n console.error('Error loading lists:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private buildFlatCategories(categories: MJListCategoryEntity[]): Array<{ ID: string; displayName: string }> {\n const result: Array<{ ID: string; displayName: string }> = [];\n const topLevel = categories.filter(c => !c.ParentID);\n\n const processCategory = (cat: MJListCategoryEntity, level: number) => {\n const indent = '\\u00A0\\u00A0'.repeat(level);\n result.push({ ID: cat.ID, displayName: `${indent}${cat.Name}` });\n\n const children = categories.filter(c => UUIDsEqual(c.ParentID, cat.ID));\n for (const child of children) {\n processCategory(child, level + 1);\n }\n };\n\n for (const cat of topLevel) {\n processCategory(cat, 0);\n }\n\n return result;\n }\n\n private buildCategoryTree() {\n const rootNodes: CategoryNode[] = [];\n const categoryNodes = new Map<string, CategoryNode>();\n\n // Create nodes for all categories\n for (const cat of this.Categories) {\n categoryNodes.set(cat.ID, {\n category: cat,\n lists: [],\n children: [],\n isExpanded: true\n });\n }\n\n // Build tree structure\n for (const cat of this.Categories) {\n const node = categoryNodes.get(cat.ID)!;\n if (cat.ParentID && categoryNodes.has(cat.ParentID)) {\n categoryNodes.get(cat.ParentID)!.children.push(node);\n } else {\n rootNodes.push(node);\n }\n }\n\n // Assign lists to categories\n const uncategorizedLists: BrowseListItem[] = [];\n for (const item of this.FilteredLists) {\n if (item.list.CategoryID && categoryNodes.has(item.list.CategoryID)) {\n categoryNodes.get(item.list.CategoryID)!.lists.push(item);\n } else {\n uncategorizedLists.push(item);\n }\n }\n\n // Add uncategorized node if there are uncategorized lists\n if (uncategorizedLists.length > 0) {\n rootNodes.unshift({\n category: null,\n lists: uncategorizedLists,\n children: [],\n isExpanded: true\n });\n }\n\n this.CategoryTree = rootNodes;\n }\n\n SetViewMode(mode: ViewMode) {\n this.ViewMode = mode;\n this.publishAgentContext();\n }\n\n /** @deprecated Use {@link SetViewMode}. */\n setViewMode(mode: ViewMode) {\n return this.SetViewMode(mode);\n }\n\n /** View-mode options for the shared <mj-view-toggle>. */\n public readonly ListViewOptions = [\n { key: 'table', icon: 'fa-solid fa-table-list', title: 'Table view' },\n { key: 'card', icon: 'fa-solid fa-grip', title: 'Card view' },\n { key: 'hierarchy', icon: 'fa-solid fa-folder-tree', title: 'Category view' },\n ];\n\n /** @deprecated Use {@link ListViewOptions}. */\n public get listViewOptions() {\n return this.ListViewOptions;\n }\n\n /** Values record consumed by the centralized <mj-filter-panel>. */\n public get ListFilterValues(): Record<string, unknown> {\n return {\n selectedOwner: this.SelectedOwner,\n selectedEntity: this.SelectedEntity,\n favorites: this.ShowOnlyFavorites ? 'favorites' : 'all',\n };\n }\n\n /** @deprecated Use {@link ListFilterValues}. */\n public get listFilterValues(): Record<string, unknown> {\n return this.ListFilterValues;\n }\n\n /** Field config consumed by the centralized <mj-filter-panel>. */\n public get ListFilterFields(): FilterFieldConfig[] {\n return [\n {\n key: 'selectedOwner',\n type: 'dropdown',\n label: 'Owner',\n icon: 'fa-solid fa-user',\n options: this.OwnerOptions.map(o => ({ text: o.name, value: o.value })),\n },\n {\n key: 'selectedEntity',\n type: 'dropdown',\n label: 'Entity',\n icon: 'fa-solid fa-table',\n filterable: this.EntityOptions.length > 10,\n options: this.EntityOptions.map(o => ({ text: o.name, value: o.value })),\n },\n {\n key: 'favorites',\n type: 'chips',\n label: 'Favorites',\n chipOptions: [\n { text: 'All lists', value: 'all' },\n { text: 'Favorites only', value: 'favorites' },\n ],\n },\n ];\n }\n\n /** @deprecated Use {@link ListFilterFields}. */\n public get listFilterFields(): FilterFieldConfig[] {\n return this.ListFilterFields;\n }\n\n /** Receive popover updates and apply them. */\n public OnFilterValuesChange(values: Record<string, unknown>): void {\n this.SelectedOwner = (values['selectedOwner'] as string) ?? 'mine';\n this.SelectedEntity = (values['selectedEntity'] as string) ?? 'all';\n this.ShowOnlyFavorites = values['favorites'] === 'favorites';\n this.persistFavoritesFilter();\n this.applyFilters();\n this.buildCategoryTree();\n this.publishAgentContext();\n }\n\n /** @deprecated Use {@link OnFilterValuesChange}. */\n public onFilterValuesChange(values: Record<string, unknown>): void {\n return this.OnFilterValuesChange(values);\n }\n\n /** Reset the popover's own fields (Owner · Entity · Favorites); leaves search + tags alone. */\n public ResetPopoverFilters(): void {\n this.SelectedOwner = 'mine';\n this.SelectedEntity = 'all';\n this.ShowOnlyFavorites = false;\n this.persistFavoritesFilter();\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n /** @deprecated Use {@link ResetPopoverFilters}. */\n public resetPopoverFilters(): void {\n return this.ResetPopoverFilters();\n }\n\n /** Active popover-field count for the badge (Owner + Entity; excludes search). */\n public get ActiveFilterCount(): number {\n let n = 0;\n if (this.SelectedOwner && this.SelectedOwner !== 'mine') n++;\n if (this.SelectedEntity && this.SelectedEntity !== 'all') n++;\n return n;\n }\n\n /** Total active filters (Owner + Entity + Favorites + Tags) — drives the Filter button badge. */\n public get TotalActiveFilterCount(): number {\n return this.ActiveFilterCount + (this.ShowOnlyFavorites ? 1 : 0) + this.TagFilters.length;\n }\n\n /** Clear every filter (Owner · Entity · Favorites · Tags). Leaves search. */\n public ClearAllAppliedFilters(): void {\n this.SelectedOwner = 'mine';\n this.SelectedEntity = 'all';\n this.ShowOnlyFavorites = false;\n this.persistFavoritesFilter();\n this.TagFilters = [];\n void this.recomputeTagMembership();\n this.buildCategoryTree();\n this.publishAgentContext();\n }\n\n /** @deprecated Use {@link ClearAllAppliedFilters}. */\n public clearAllAppliedFilters(): void {\n return this.ClearAllAppliedFilters();\n }\n\n OnSearchChange(term: string) {\n this.SearchTerm = term;\n this.applyFilters();\n this.buildCategoryTree();\n this.publishAgentContext();\n }\n\n /** @deprecated Use {@link OnSearchChange}. */\n onSearchChange(term: string) {\n return this.OnSearchChange(term);\n }\n\n OnEntityFilterChange(_value: string) {\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n /** @deprecated Use {@link OnEntityFilterChange}. */\n onEntityFilterChange(_value: string) {\n return this.OnEntityFilterChange(_value);\n }\n\n OnOwnerFilterChange(_value: string) {\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n /** @deprecated Use {@link OnOwnerFilterChange}. */\n onOwnerFilterChange(_value: string) {\n return this.OnOwnerFilterChange(_value);\n }\n\n OnSortChange(_value: string) {\n this.applyFilters();\n this.buildCategoryTree();\n this.publishAgentContext();\n }\n\n /** @deprecated Use {@link OnSortChange}. */\n onSortChange(_value: string) {\n return this.OnSortChange(_value);\n }\n\n ClearSearch() {\n this.SearchTerm = '';\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n /** @deprecated Use {@link ClearSearch}. */\n clearSearch() {\n return this.ClearSearch();\n }\n\n ClearFilters() {\n // Reset EVERY dimension applyFilters() narrows on — search, owner, entity,\n // favorites, and tags — so the empty-state \"Reset filters\" CTA actually clears\n // the no-results state (favorites/tags were previously left active).\n this.SearchTerm = '';\n this.SelectedEntity = 'all';\n this.SelectedOwner = 'mine';\n this.ShowOnlyFavorites = false;\n this.persistFavoritesFilter();\n this.TagFilters = [];\n void this.recomputeTagMembership(); // empty tagFilters → clears tagFilteredListIds + re-applies\n this.buildCategoryTree();\n }\n\n /** @deprecated Use {@link ClearFilters}. */\n clearFilters() {\n return this.ClearFilters();\n }\n\n private applyFilters() {\n let result = [...this.AllLists];\n\n // Owner filter\n if (this.SelectedOwner === 'mine') {\n result = result.filter(item => item.isOwner);\n } else if (this.SelectedOwner === 'others') {\n result = result.filter(item => !item.isOwner);\n }\n\n // Search filter\n if (this.SearchTerm) {\n const term = this.SearchTerm.toLowerCase();\n result = result.filter(item =>\n item.list.Name.toLowerCase().includes(term) ||\n (item.list.Description && item.list.Description.toLowerCase().includes(term)) ||\n item.entityName.toLowerCase().includes(term) ||\n item.ownerName.toLowerCase().includes(term)\n );\n }\n\n // Entity filter\n if (this.SelectedEntity !== 'all') {\n result = result.filter(item => item.entityName === this.SelectedEntity);\n }\n\n // Tag filter (Phase 4.3 — intersection of all active tags).\n if (this.tagFilteredListIds !== null) {\n const matches = this.tagFilteredListIds;\n result = result.filter(item => matches.has(item.list.ID));\n }\n\n // Favorites-only toggle (Phase 5.3).\n if (this.ShowOnlyFavorites) {\n const favs = this.FavoriteListIds;\n result = result.filter(item => favs.has(item.list.ID));\n }\n\n // Sort\n switch (this.SelectedSort) {\n case 'name':\n result.sort((a, b) => a.list.Name.localeCompare(b.list.Name));\n break;\n case 'updated':\n result.sort((a, b) => {\n const dateA = new Date(a.list.__mj_UpdatedAt).getTime();\n const dateB = new Date(b.list.__mj_UpdatedAt).getTime();\n return dateB - dateA;\n });\n break;\n case 'items':\n result.sort((a, b) => b.itemCount - a.itemCount);\n break;\n case 'entity':\n result.sort((a, b) => a.entityName.localeCompare(b.entityName));\n break;\n }\n\n this.FilteredLists = result;\n }\n\n ToggleCategory(node: CategoryNode) {\n node.isExpanded = !node.isExpanded;\n }\n\n /** @deprecated Use {@link ToggleCategory}. */\n toggleCategory(node: CategoryNode) {\n return this.ToggleCategory(node);\n }\n\n GetListCountInCategory(node: CategoryNode): number {\n let count = node.lists.length;\n for (const child of node.children) {\n count += this.GetListCountInCategory(child);\n }\n return count;\n }\n\n /** @deprecated Use {@link GetListCountInCategory}. */\n getListCountInCategory(node: CategoryNode): number {\n return this.GetListCountInCategory(node);\n }\n\n GetEntityColor(entityName: string): string {\n return this.entityColorMap.get(entityName) || '#607D8B';\n }\n\n /** @deprecated Use {@link GetEntityColor}. */\n getEntityColor(entityName: string): string {\n return this.GetEntityColor(entityName);\n }\n\n GetEntityIcon(entityName: string): string {\n return this.entityIconMap.get(entityName) || 'fa-solid fa-table';\n }\n\n /** @deprecated Use {@link GetEntityIcon}. */\n getEntityIcon(entityName: string): string {\n return this.GetEntityIcon(entityName);\n }\n\n private generateEntityColor(entityName: string): string {\n let hash = 0;\n for (let i = 0; i < entityName.length; i++) {\n hash = entityName.charCodeAt(i) + ((hash << 5) - hash);\n }\n const colors = [\n '#2196F3', '#4CAF50', '#FF9800', '#9C27B0', '#F44336',\n '#00BCD4', '#795548', '#607D8B', '#E91E63', '#3F51B5'\n ];\n return colors[Math.abs(hash) % colors.length];\n }\n\n formatDate(date: Date): string {\n if (!date) return '';\n const now = new Date();\n const d = new Date(date);\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) return 'Today';\n if (diffDays === 1) return 'Yesterday';\n if (diffDays < 7) return `${diffDays} days ago`;\n return d.toLocaleDateString();\n }\n\n OpenList(item: BrowseListItem) {\n const appId = this.Data?.Configuration?.applicationId || '';\n this.tabService.OpenList(item.list.ID, item.list.Name, appId);\n }\n\n /** @deprecated Use {@link OpenList}. */\n openList(item: BrowseListItem) {\n return this.OpenList(item);\n }\n\n /**\n * Handle a tag chip click on a list card — adds the tag to the\n * filter row (multi-tag = AND). Wired by Phase 4.3; the chip\n * component emits the (TagID, Name) pair so we can both display\n * the chip name and filter by ID.\n */\n OnCardTagClicked(payload: { TagID: string; Name: string }): void {\n if (this.TagFilters.some((f) => f.TagID === payload.TagID)) return;\n this.TagFilters = [...this.TagFilters, payload];\n void this.recomputeTagMembership();\n }\n\n /** @deprecated Use {@link OnCardTagClicked}. */\n onCardTagClicked(payload: { TagID: string; Name: string }): void {\n return this.OnCardTagClicked(payload);\n }\n\n /** Remove a tag from the filter row. */\n RemoveTagFilter(tagId: string): void {\n this.TagFilters = this.TagFilters.filter((f) => f.TagID !== tagId);\n void this.recomputeTagMembership();\n }\n\n /** @deprecated Use {@link RemoveTagFilter}. */\n removeTagFilter(tagId: string): void {\n return this.RemoveTagFilter(tagId);\n }\n\n /** Clear all active tag filters. */\n ClearTagFilters(): void {\n this.TagFilters = [];\n this.tagFilteredListIds = null;\n this.applyFilters();\n }\n\n /** @deprecated Use {@link ClearTagFilters}. */\n clearTagFilters(): void {\n return this.ClearTagFilters();\n }\n\n /**\n * Resolve which lists have ALL active tags. Done server-side so the\n * filter works regardless of which lists the user has scrolled past.\n * Result is cached on `tagFilteredListIds`; `applyFilters` consumes it.\n */\n private async recomputeTagMembership(): Promise<void> {\n if (this.TagFilters.length === 0) {\n this.tagFilteredListIds = null;\n this.applyFilters();\n return;\n }\n try {\n const md = this.ProviderToUse;\n const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');\n if (!listsEntity) {\n this.tagFilteredListIds = new Set();\n this.applyFilters();\n return;\n }\n const tagIds = this.TagFilters.map((f) => `'${f.TagID}'`).join(',');\n const rv = RunView.FromMetadataProvider(md);\n const result = await rv.RunView<{ RecordID: string; TagID: string }>({\n EntityName: 'MJ: Tagged Items',\n ExtraFilter: `EntityID='${listsEntity.ID}' AND TagID IN (${tagIds})`,\n Fields: ['RecordID', 'TagID'],\n ResultType: 'simple',\n });\n // Intersection: count tag hits per list, keep only those with\n // exactly `tagFilters.length` matches (one per required tag).\n const counts = new Map<string, number>();\n for (const row of result.Results ?? []) {\n const id = String(row.RecordID);\n counts.set(id, (counts.get(id) ?? 0) + 1);\n }\n const required = this.TagFilters.length;\n const matches = new Set<string>();\n for (const [id, count] of counts) {\n if (count >= required) matches.add(id);\n }\n this.tagFilteredListIds = matches;\n } catch (e) {\n // On failure, fall back to \"no match\" so the user sees an empty\n // state rather than every list — avoids leaking unfiltered data\n // when the filter intent failed silently.\n this.tagFilteredListIds = new Set();\n }\n this.applyFilters();\n }\n\n /**\n * Load the current user's favorite lists into `favoriteListIds`.\n * Cheap — typically <100 rows per user. Driven by the `MJ: User\n * Favorites` entity scoped by the Lists EntityID. Best-effort: on\n * failure the star icons just stay dim.\n */\n private async loadFavorites(): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');\n if (!listsEntity || !md.CurrentUser) return;\n const rv = RunView.FromMetadataProvider(md);\n const result = await rv.RunView<{ RecordID: string }>({\n EntityName: 'MJ: User Favorites',\n ExtraFilter: `UserID='${md.CurrentUser.ID}' AND EntityID='${listsEntity.ID}'`,\n Fields: ['RecordID'],\n ResultType: 'simple',\n });\n this.FavoriteListIds = new Set((result.Results ?? []).map((r) => String(r.RecordID)));\n } catch {\n // Silent — favorites are a polish feature, not load-bearing.\n this.FavoriteListIds = new Set();\n }\n }\n\n /**\n * Toggle a list's favorite state. Optimistic: flips the local Set\n * first, then writes through. Reverts on failure.\n */\n async ToggleFavorite(event: Event, item: BrowseListItem): Promise<void> {\n event.stopPropagation();\n const wasFav = this.FavoriteListIds.has(item.list.ID);\n // Optimistic update.\n if (wasFav) this.FavoriteListIds.delete(item.list.ID);\n else this.FavoriteListIds.add(item.list.ID);\n // Re-trigger filter recompute since the favorites-only toggle\n // may be on.\n this.applyFilters();\n\n try {\n const md = this.ProviderToUse;\n const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');\n if (!listsEntity || !md.CurrentUser) throw new Error('Cannot resolve user favorites entity');\n\n if (wasFav) {\n // Find + delete the existing favorite row.\n const rv = RunView.FromMetadataProvider(md);\n const result = await rv.RunView<MJUserFavoriteEntity>({\n EntityName: 'MJ: User Favorites',\n ExtraFilter:\n `UserID='${md.CurrentUser.ID}' AND EntityID='${listsEntity.ID}' AND RecordID='${item.list.ID}'`,\n ResultType: 'entity_object',\n });\n for (const row of result.Results ?? []) await row.Delete();\n } else {\n const fav = await md.GetEntityObject<MJUserFavoriteEntity>('MJ: User Favorites', md.CurrentUser);\n fav.NewRecord();\n fav.UserID = md.CurrentUser.ID;\n fav.EntityID = listsEntity.ID;\n fav.RecordID = item.list.ID;\n await fav.Save();\n }\n } catch {\n // Revert on failure.\n if (wasFav) this.FavoriteListIds.add(item.list.ID);\n else this.FavoriteListIds.delete(item.list.ID);\n this.applyFilters();\n }\n }\n\n /** @deprecated Use {@link ToggleFavorite}. */\n async toggleFavorite(event: Event, item: BrowseListItem): Promise<void> {\n return this.ToggleFavorite(event, item);\n }\n\n IsFavorite(listId: string): boolean {\n return this.FavoriteListIds.has(listId);\n }\n\n /** @deprecated Use {@link IsFavorite}. */\n isFavorite(listId: string): boolean {\n return this.IsFavorite(listId);\n }\n\n ToggleShowOnlyFavorites(): void {\n this.ShowOnlyFavorites = !this.ShowOnlyFavorites;\n this.applyFilters();\n }\n\n /** @deprecated Use {@link ToggleShowOnlyFavorites}. */\n toggleShowOnlyFavorites(): void {\n return this.ToggleShowOnlyFavorites();\n }\n\n OpenListMenu(event: Event, item: BrowseListItem) {\n event.stopPropagation();\n const mouseEvent = event as MouseEvent;\n this.SelectedContextItem = item;\n this.ContextMenuX = mouseEvent.clientX;\n this.ContextMenuY = mouseEvent.clientY;\n // Fast path: owners always have full capabilities. Avoid an extra\n // permission-resolve round trip for the common case.\n if (item.isOwner) {\n this.ContextItemCapabilities = CapabilitiesForLevel('Owner');\n this.ShowContextMenu = true;\n return;\n }\n // Render the menu immediately with a conservative viewer-level cap\n // set, then refine via async resolve. The flicker is a single tick\n // — and viewers/editors stay correctly gated even if resolve fails.\n const cached = this.capabilityCache.get(item.list.ID);\n if (cached !== undefined) {\n this.ContextItemCapabilities = CapabilitiesForLevel(cached);\n } else {\n this.ContextItemCapabilities = CapabilitiesForLevel('View');\n void this.refineContextCapabilities(item.list.ID);\n }\n this.ShowContextMenu = true;\n }\n\n /** @deprecated Use {@link OpenListMenu}. */\n openListMenu(event: Event, item: BrowseListItem) {\n return this.OpenListMenu(event, item);\n }\n\n /** Resolve the current user's permission level for a list and update\n * the open context menu in place. Cached so re-opening the same menu\n * doesn't re-hit the resolver. */\n private async refineContextCapabilities(listId: string): Promise<void> {\n try {\n const currentUserId = this.ProviderToUse.CurrentUser?.ID;\n if (!currentUserId) {\n // No user context — leave the conservative fallback in place.\n return;\n }\n // Go through the Angular sharing service rather than instantiating the\n // server-side `ListSharing` class directly. The service hits the GraphQL\n // surface, which is the only sanctioned client→server path; the server\n // package writes audit logs + permission rows that have no business\n // running in a browser bundle.\n const level = (await this.listSharingService.getUserPermissionLevel(listId, currentUserId)) as SharePermissionLevel | null;\n this.capabilityCache.set(listId, level);\n // Only mutate state if the user is still on this same menu — they\n // may have closed it before resolve finished.\n if (this.ShowContextMenu && this.SelectedContextItem && UUIDsEqual(this.SelectedContextItem.list.ID, listId)) {\n this.ContextItemCapabilities = CapabilitiesForLevel(level);\n this.cdr.detectChanges();\n }\n } catch {\n // Conservative fallback already applied at menu open time.\n }\n }\n\n CloseContextMenu() {\n this.ShowContextMenu = false;\n this.SelectedContextItem = null;\n }\n\n /** @deprecated Use {@link CloseContextMenu}. */\n closeContextMenu() {\n return this.CloseContextMenu();\n }\n\n CreateNewList() {\n this.EditingList = null;\n this.NewListName = '';\n this.NewListDescription = '';\n this.SelectedEntityId = '';\n this.EntitySearchTerm = '';\n this.SelectedCategoryId = null;\n this.ShowEntityDropdown = false;\n this.showCreateDialog = true;\n // Refresh categories so newly-created ones appear without a page\n // reload. Cheap RunView; runs in the background while the user is\n // typing the list name.\n void this.refreshCategoriesForDialog();\n }\n\n /** @deprecated Use {@link CreateNewList}. */\n createNewList() {\n return this.CreateNewList();\n }\n\n EditList() {\n if (!this.SelectedContextItem) return;\n\n const list = this.SelectedContextItem.list;\n this.EditingList = list;\n this.NewListName = list.Name;\n this.NewListDescription = list.Description || '';\n this.SelectedEntityId = list.EntityID;\n this.EntitySearchTerm = list.Entity || '';\n this.SelectedCategoryId = list.CategoryID || null;\n // Ensure no stale state from a previous Create attempt — the entity\n // dropdown portal renders at z-index 10002 and could otherwise sit on\n // top of the edit dialog and block interaction.\n this.ShowEntityDropdown = false;\n // Close the context menu BEFORE opening the dialog. Doing it after\n // leaves a one-tick window where both the menu and the modal-overlay\n // are stacked, and the menu's outer click-overlay can swallow the\n // first click into the form fields below it.\n this.CloseContextMenu();\n this.showCreateDialog = true;\n this.cdr.detectChanges();\n void this.refreshCategoriesForDialog();\n }\n\n /** @deprecated Use {@link EditList}. */\n editList() {\n return this.EditList();\n }\n\n /** Re-pull MJ: List Categories so the dropdown reflects any\n * newly-created categories. Skips the round trip when nothing has\n * changed since the last load — `categoriesDirty` is flipped on\n * by the BaseEntity event subscription whenever a category row\n * is saved/deleted, so the only times this actually fetches are\n * (a) the first dialog open, and (b) after the user touched a\n * category somewhere else. */\n private async refreshCategoriesForDialog(): Promise<void> {\n if (!this.categoriesDirty) return;\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJListCategoryEntity>({\n EntityName: 'MJ: List Categories',\n OrderBy: 'Name',\n ResultType: 'simple',\n });\n if (!result.Success) return;\n this.Categories = (result.Results ?? []) as MJListCategoryEntity[];\n this.categoryMap.clear();\n for (const cat of this.Categories) this.categoryMap.set(cat.ID, cat);\n this.FlatCategories = this.buildFlatCategories(this.Categories);\n this.categoriesDirty = false;\n this.cdr.detectChanges();\n } catch {\n // Best-effort — the dialog still works with the previously-loaded list.\n }\n }\n\n SelectEntity(entity: { ID: string; Name: string; DisplayName: string }) {\n this.SelectedEntityId = entity.ID;\n this.EntitySearchTerm = entity.DisplayName;\n this.ShowEntityDropdown = false;\n }\n\n /** @deprecated Use {@link SelectEntity}. */\n selectEntity(entity: { ID: string; Name: string; DisplayName: string }) {\n return this.SelectEntity(entity);\n }\n\n FilterEntities(term: string) {\n const lowerTerm = term.toLowerCase();\n this.FilteredEntitiesList = this.AvailableEntities.filter(e =>\n e.DisplayName.toLowerCase().includes(lowerTerm) ||\n e.Name.toLowerCase().includes(lowerTerm)\n );\n // Ensure dropdown is visible while typing\n if (!this.ShowEntityDropdown && term) {\n this.ShowEntityDropdown = true;\n }\n // Clear selection when user modifies the search text\n this.SelectedEntityId = '';\n }\n\n /** @deprecated Use {@link FilterEntities}. */\n filterEntities(term: string) {\n return this.FilterEntities(term);\n }\n\n OpenEntityDropdown(inputElement: HTMLInputElement) {\n const rect = inputElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const dropdownHeight = 200;\n const spaceBelow = viewportHeight - rect.bottom;\n const openAbove = spaceBelow < dropdownHeight && rect.top > dropdownHeight;\n\n this.EntityDropdownPosition = {\n top: openAbove ? rect.top - dropdownHeight : rect.bottom,\n left: rect.left,\n width: rect.width,\n openAbove\n };\n this.ShowEntityDropdown = true;\n this.FilteredEntitiesList = [...this.AvailableEntities];\n }\n\n /** @deprecated Use {@link OpenEntityDropdown}. */\n openEntityDropdown(inputElement: HTMLInputElement) {\n return this.OpenEntityDropdown(inputElement);\n }\n\n CloseEntityDropdown() {\n this.ShowEntityDropdown = false;\n }\n\n /** @deprecated Use {@link CloseEntityDropdown}. */\n closeEntityDropdown() {\n return this.CloseEntityDropdown();\n }\n\n async DuplicateList() {\n if (!this.SelectedContextItem) return;\n\n const listToDuplicate = this.SelectedContextItem.list;\n this.CloseContextMenu();\n\n this.isLoading = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n const newList = await md.GetEntityObject<MJListEntity>('MJ: Lists', md.CurrentUser);\n newList.Name = `${listToDuplicate.Name} (Copy)`;\n newList.Description = listToDuplicate.Description;\n newList.EntityID = listToDuplicate.EntityID;\n newList.CategoryID = listToDuplicate.CategoryID;\n newList.UserID = md.CurrentUser!.ID;\n\n const listSaved = await newList.Save();\n if (!listSaved) {\n this.notificationService.CreateSimpleNotification('Failed to duplicate list', 'error', 4000);\n return;\n }\n\n // BypassCache to avoid any stale RunView cache that might mask members.\n // High MaxRows to cover large lists; entity_object so we have typed access.\n const itemsResult = await rv.RunView<MJListDetailEntity>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID = '${listToDuplicate.ID}'`,\n ResultType: 'entity_object',\n MaxRows: 100000,\n BypassCache: true\n });\n\n if (!itemsResult.Success) {\n console.error('Duplicate: failed to load source list members', itemsResult.ErrorMessage);\n this.notificationService.CreateSimpleNotification(\n `Could not load source list members: ${itemsResult.ErrorMessage || 'unknown'}`,\n 'error', 6000\n );\n return;\n }\n\n const sourceItems = itemsResult.Results ?? [];\n if (sourceItems.length === 0) {\n this.notificationService.CreateSimpleNotification('List duplicated (source had no records)', 'success', 3000);\n } else {\n // Batch all detail inserts into one transaction group so this is\n // a single round-trip instead of 1-per-row. All-or-nothing: if any\n // row fails server-side validation the whole group rolls back.\n const tg = await md.CreateTransactionGroup();\n for (const item of sourceItems) {\n const newItem = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details', md.CurrentUser);\n newItem.ListID = newList.ID;\n newItem.RecordID = item.RecordID;\n newItem.Sequence = item.Sequence;\n newItem.TransactionGroup = tg;\n await newItem.Save(); // queued into tg, not sent yet\n }\n const submitted = await tg.Submit();\n if (submitted) {\n this.notificationService.CreateSimpleNotification(\n `List duplicated with ${sourceItems.length} item${sourceItems.length !== 1 ? 's' : ''}`,\n 'success', 3000\n );\n } else {\n console.error('Duplicate: transaction group submit failed');\n this.notificationService.CreateSimpleNotification(\n `Duplicated list but failed to copy ${sourceItems.length} items — see console`,\n 'error', 6000\n );\n }\n }\n\n await this.loadData();\n } catch (error) {\n console.error('Error duplicating list:', error);\n this.notificationService.CreateSimpleNotification('Error duplicating list. Please try again.', 'error', 4000);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link DuplicateList}. */\n async duplicateList() {\n return this.DuplicateList();\n }\n\n ConfirmDeleteList() {\n if (!this.SelectedContextItem) return;\n this.ListToDelete = this.SelectedContextItem.list;\n this.DeleteListName = this.SelectedContextItem.list.Name;\n this.ShowDeleteConfirm = true;\n this.CloseContextMenu();\n }\n\n /** @deprecated Use {@link ConfirmDeleteList}. */\n confirmDeleteList() {\n return this.ConfirmDeleteList();\n }\n\n CancelDelete() {\n this.ShowDeleteConfirm = false;\n this.ListToDelete = null;\n this.DeleteListName = '';\n }\n\n /** @deprecated Use {@link CancelDelete}. */\n cancelDelete() {\n return this.CancelDelete();\n }\n\n async DeleteList() {\n if (!this.ListToDelete) return;\n\n const listToDelete = this.ListToDelete;\n const listName = listToDelete.Name;\n\n // Defense-in-depth: re-check the ownership rule before deleting so a stale/forced menu can't\n // bypass the gate. The server (MJListEntityServer.Delete) is the true enforcement point, but\n // failing fast here gives a clean message instead of a rejected server round-trip.\n if (!MJListEntityExtended.UserCanDelete(listToDelete.UserID, this.ProviderToUse.CurrentUser)) {\n this.notificationService.CreateSimpleNotification(\n `You don't have permission to delete \"${listName}\".`,\n 'error', 6000,\n );\n return;\n }\n\n this.IsDeleting = true;\n this.cdr.detectChanges();\n\n try {\n // spDeleteList doesn't cascade to MJ: List Details, so the FK\n // constraint (FK_ListDetail_List) blocks the delete if the list\n // has any members. Cascade-delete the details first in a\n // transaction group so the whole thing rolls back if any single\n // delete fails. The proper long-term fix is a migration that\n // adds ON DELETE CASCADE (or extends the SP); this keeps the UI\n // unblocked in the meantime.\n const cascadeOk = await this.cascadeDeleteListMembers(listToDelete.ID);\n if (!cascadeOk) {\n this.notificationService.CreateSimpleNotification(\n `Failed to delete list members for \"${listName}\" — list not deleted`,\n 'error', 6000,\n );\n return;\n }\n\n const deleted = await listToDelete.Delete();\n if (deleted) {\n this.notificationService.CreateSimpleNotification(`\"${listName}\" deleted`, 'success', 3000);\n // Optimistic removal from local state so the card disappears\n // immediately. Without this, the user sees the just-deleted list\n // until loadData() rebuilds — and worse, can click Delete on it\n // again (which hangs because the in-memory entity still has the\n // now-deleted record's ID).\n const deletedId = listToDelete.ID;\n this.AllLists = this.AllLists.filter(item => !UUIDsEqual(item.list.ID, deletedId));\n this.applyFilters();\n this.buildCategoryTree();\n this.cdr.detectChanges();\n } else {\n const errorMessage = listToDelete.LatestResult?.Message || 'Unknown error occurred';\n console.error('Failed to delete list:', listToDelete.LatestResult);\n this.notificationService.CreateSimpleNotification(`Failed to delete list: ${errorMessage}`, 'error', 6000);\n }\n this.CancelDelete();\n // Authoritative refresh — loadData() now sets BypassCache: true on\n // the 'MJ: Lists' RunView, so this no longer races the optimistic\n // local removal against a stale cache.\n void this.loadData();\n } catch (error) {\n console.error('Error deleting list:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error deleting list: ${errorMessage}`, 'error', 6000);\n } finally {\n this.IsDeleting = false;\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link DeleteList}. */\n async deleteList() {\n return this.DeleteList();\n }\n\n /** Delete every MJ: List Details row for a given list in a single\n * transaction group. Returns true if everything succeeded (including\n * the trivial \"no members\" case). */\n private async cascadeDeleteListMembers(listId: string): Promise<boolean> {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(md);\n const lookup = await rv.RunView<MJListDetailEntity>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID='${listId}'`,\n ResultType: 'entity_object',\n });\n if (!lookup.Success) {\n console.error('Failed to load list details for cascade-delete:', lookup.ErrorMessage);\n return false;\n }\n const details = lookup.Results ?? [];\n if (details.length === 0) return true;\n\n const tg = await md.CreateTransactionGroup();\n for (const d of details) {\n d.TransactionGroup = tg;\n await d.Delete();\n }\n const ok = await tg.Submit();\n if (!ok) {\n console.error('Cascade-delete transaction failed for list', listId);\n }\n return ok;\n }\n\n CloseCreateDialog() {\n this.showCreateDialog = false;\n this.EditingList = null;\n this.ShowEntityDropdown = false;\n }\n\n /** @deprecated Use {@link CloseCreateDialog}. */\n closeCreateDialog() {\n return this.CloseCreateDialog();\n }\n\n async SaveList() {\n this.IsSaving = true;\n this.cdr.detectChanges();\n\n const isEditing = !!this.EditingList;\n const listName = this.NewListName;\n\n try {\n const md = this.ProviderToUse;\n let list: MJListEntity;\n\n if (this.EditingList) {\n list = this.EditingList;\n } else {\n list = await md.GetEntityObject<MJListEntity>('MJ: Lists', md.CurrentUser);\n list.UserID = md.CurrentUser!.ID;\n list.EntityID = this.SelectedEntityId;\n }\n\n list.Name = this.NewListName;\n list.Description = this.NewListDescription || null;\n list.CategoryID = this.SelectedCategoryId || null;\n\n const saved = await list.Save();\n if (saved) {\n this.notificationService.CreateSimpleNotification(\n isEditing ? `\"${listName}\" updated` : `\"${listName}\" created`,\n 'success',\n 3000\n );\n this.CloseCreateDialog();\n await this.loadData();\n } else {\n const errorMessage = list.LatestResult?.Message || 'Unknown error occurred';\n const action = isEditing ? 'update' : 'create';\n console.error(`Failed to ${action} list:`, list.LatestResult);\n this.notificationService.CreateSimpleNotification(\n `Failed to ${action} list: ${errorMessage}`,\n 'error',\n 6000\n );\n }\n } catch (error) {\n console.error('Error saving list:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error saving list: ${errorMessage}`, 'error', 6000);\n } finally {\n this.IsSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link SaveList}. */\n async saveList() {\n return this.SaveList();\n }\n\n // Sharing methods\n OpenShareDialog() {\n if (!this.SelectedContextItem) return;\n\n const item = this.SelectedContextItem;\n this.ShareDialogConfig = {\n listId: item.list.ID,\n listName: item.list.Name,\n currentUserId: this.currentUserId,\n isOwner: item.isOwner\n };\n this.ShowShareDialog = true;\n this.CloseContextMenu();\n }\n\n /** @deprecated Use {@link OpenShareDialog}. */\n openShareDialog() {\n return this.OpenShareDialog();\n }\n\n OnShareComplete(_result: ListShareDialogResult) {\n this.ShowShareDialog = false;\n this.ShareDialogConfig = null;\n // Reload sharing info for all lists\n this.loadSharingInfo();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnShareComplete}. */\n onShareComplete(_result: ListShareDialogResult) {\n return this.OnShareComplete(_result);\n }\n\n OnShareCancel() {\n this.ShowShareDialog = false;\n this.ShareDialogConfig = null;\n }\n\n /** @deprecated Use {@link OnShareCancel}. */\n onShareCancel() {\n return this.OnShareCancel();\n }\n\n /** \"Manage Invitations\" clicked inside the share dialog — opens a\n * modal hosting `<mj-list-invitations>` for the same list. The\n * share dialog is closed so dialogs don't visually stack. */\n OnManageInvitations() {\n if (!this.ShareDialogConfig) return;\n this.ActiveShareListId = this.ShareDialogConfig.listId;\n this.ActiveShareListName = this.ShareDialogConfig.listName;\n this.ShowShareDialog = false;\n this.ShowInvitationsDialog = true;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnManageInvitations}. */\n onManageInvitations() {\n return this.OnManageInvitations();\n }\n\n CloseInvitationsDialog() {\n this.ShowInvitationsDialog = false;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link CloseInvitationsDialog}. */\n closeInvitationsDialog() {\n return this.CloseInvitationsDialog();\n }\n\n /** \"View audit log\" link in share dialog. */\n OnViewAuditLog() {\n if (!this.ShareDialogConfig) return;\n this.ActiveShareListId = this.ShareDialogConfig.listId;\n this.ActiveShareListName = this.ShareDialogConfig.listName;\n this.ShowShareDialog = false;\n this.ShowAuditLogDialog = true;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnViewAuditLog}. */\n onViewAuditLog() {\n return this.OnViewAuditLog();\n }\n\n CloseAuditLogDialog() {\n this.ShowAuditLogDialog = false;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link CloseAuditLogDialog}. */\n closeAuditLogDialog() {\n return this.CloseAuditLogDialog();\n }\n\n private async loadSharingInfo() {\n // Load sharing summaries for all lists that the user owns\n const ownedLists = this.AllLists.filter(item => item.isOwner);\n\n for (const item of ownedLists) {\n try {\n const summary = await this.listSharingService.getListSharingSummary(item.list.ID);\n item.sharingInfo = summary;\n } catch (error) {\n console.error(`Error loading sharing info for list ${item.list.ID}:`, error);\n }\n }\n\n this.cdr.detectChanges();\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Lists';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-list-check';\n }\n}\n"]}
|