@memberjunction/ng-dashboards 5.47.0 → 5.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +15 -4
  2. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  3. package/dist/DataExplorer/data-explorer-dashboard.component.js +45 -35
  4. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  5. package/dist/DataExplorer/models/explorer-state.interface.d.ts +7 -0
  6. package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
  7. package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
  8. package/dist/Lists/components/lists-browse-resource.component.d.ts +4 -0
  9. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  10. package/dist/Lists/components/lists-browse-resource.component.js +39 -30
  11. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  12. package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
  13. package/dist/Lists/components/lists-my-lists-resource.component.js +14 -12
  14. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  15. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  16. package/dist/Lists/components/lists-operations-resource.component.js +6 -1
  17. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  18. package/dist/Lists/services/list-set-operations.service.d.ts +11 -0
  19. package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
  20. package/dist/Lists/services/list-set-operations.service.js +27 -2
  21. package/dist/Lists/services/list-set-operations.service.js.map +1 -1
  22. package/package.json +59 -59
@@ -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, MJListDetailEntity, MJUserFavoriteEntity } 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}} &middot; {{item.itemCount}} items\n @if (!item.isOwner) {\n <span> &middot; {{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 (contextItemCapabilities.CanDelete) {\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 && !contextItemCapabilities.CanDelete) {\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.Name}}\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 viewMode: ViewMode = 'card';\n selectedEntity = 'all';\n selectedOwner = 'mine';\n selectedSort = 'name';\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 /**\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 /** When true, only favorited lists appear in the grid. */\n showOnlyFavorites = false;\n\n allLists: BrowseListItem[] = [];\n filteredLists: BrowseListItem[] = [];\n categories: MJListCategoryEntity[] = [];\n categoryTree: CategoryNode[] = [];\n flatCategories: Array<{ ID: string; displayName: string }> = [];\n availableEntities: Array<{ ID: string; Name: string }> = [];\n filteredEntitiesList: Array<{ ID: string; Name: string }> = [];\n\n entityOptions: Array<{ name: string; value: string }> = [{ name: 'All Entities', value: 'all' }];\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 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 // Context menu state\n showContextMenu = false;\n contextMenuX = 0;\n contextMenuY = 0;\n selectedContextItem: BrowseListItem | null = null;\n\n // Create/Edit dialog state\n showCreateDialog = false;\n editingList: MJListEntity | null = null;\n newListName = '';\n newListDescription = '';\n selectedEntityId = '';\n selectedCategoryId: string | null = null;\n entitySearchTerm = '';\n showEntityDropdown = false;\n entityDropdownPosition = { top: 0, left: 0, width: 0, openAbove: false };\n\n // Delete confirmation state\n showDeleteConfirm = false;\n deleteListName = '';\n listToDelete: MJListEntity | null = null;\n\n // Operation states\n isSaving = false;\n isDeleting = false;\n\n // Sharing dialog state\n showShareDialog = false;\n shareDialogConfig: ListShareDialogConfig | null = null;\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 private capabilityCache = new Map<string, SharePermissionLevel | null>();\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 showAuditLogDialog = false;\n activeShareListId: string | null = null;\n activeShareListName: string | null = null;\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 async ngOnInit() {\n super.ngOnInit();\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 + List Details: after a delete/duplicate, the\n // RunView cache for these entities doesn't always reflect the latest\n // state in time (event-driven invalidation races the immediate\n // refresh). Trading a small perf hit for correctness here is worth\n // it — categories and users stay cache-warm.\n const [listsResult, categoriesResult, detailsResult, usersResult] = 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 EntityName: 'MJ: List Details',\n Fields: ['ListID'],\n ResultType: 'simple',\n BypassCache: true\n },\n {\n EntityName: 'MJ: Users',\n Fields: ['ID', 'Name'],\n ResultType: 'simple'\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 const details = (detailsResult.Results || []) as Array<{ ListID: string }>;\n const users = (usersResult.Results || []) as Array<{ ID: string; Name: string }>;\n\n // Build category map\n this.categoryMap.clear();\n for (const cat of this.categories) {\n this.categoryMap.set(cat.ID, cat);\n }\n\n // 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 // Build user map\n const userMap = new Map<string, string>();\n for (const user of users) {\n userMap.set(user.ID, user.Name);\n }\n\n // Count items per list\n const itemCounts = new Map<string, number>();\n for (const detail of details) {\n const count = itemCounts.get(detail.ListID) || 0;\n itemCounts.set(detail.ListID, count + 1);\n }\n\n // Build entity info\n const entities = md.Entities;\n 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 }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\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: userMap.get(list.UserID) || '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 /** 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 /** 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 /** 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 /** 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.applyFilters();\n this.buildCategoryTree();\n this.publishAgentContext();\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.applyFilters();\n this.buildCategoryTree();\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.tagFilters = [];\n void this.recomputeTagMembership();\n this.buildCategoryTree();\n this.publishAgentContext();\n }\n\n onSearchChange(term: string) {\n this.searchTerm = term;\n this.applyFilters();\n this.buildCategoryTree();\n this.publishAgentContext();\n }\n\n onEntityFilterChange(_value: string) {\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n onOwnerFilterChange(_value: string) {\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n onSortChange(_value: string) {\n this.applyFilters();\n this.buildCategoryTree();\n this.publishAgentContext();\n }\n\n clearSearch() {\n this.searchTerm = '';\n this.applyFilters();\n this.buildCategoryTree();\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.tagFilters = [];\n void this.recomputeTagMembership(); // empty tagFilters → clears tagFilteredListIds + re-applies\n this.buildCategoryTree();\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 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 getEntityColor(entityName: string): string {\n return this.entityColorMap.get(entityName) || '#607D8B';\n }\n\n getEntityIcon(entityName: string): string {\n return this.entityIconMap.get(entityName) || 'fa-solid fa-table';\n }\n\n private generateEntityColor(entityName: string): string {\n let hash = 0;\n for (let i = 0; i < entityName.length; i++) {\n hash = entityName.charCodeAt(i) + ((hash << 5) - hash);\n }\n const colors = [\n '#2196F3', '#4CAF50', '#FF9800', '#9C27B0', '#F44336',\n '#00BCD4', '#795548', '#607D8B', '#E91E63', '#3F51B5'\n ];\n return colors[Math.abs(hash) % colors.length];\n }\n\n formatDate(date: Date): string {\n if (!date) return '';\n const now = new Date();\n const d = new Date(date);\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) return 'Today';\n if (diffDays === 1) return 'Yesterday';\n if (diffDays < 7) return `${diffDays} days ago`;\n 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 /**\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 /** 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 /** Clear all active tag filters. */\n clearTagFilters(): void {\n this.tagFilters = [];\n this.tagFilteredListIds = null;\n this.applyFilters();\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 isFavorite(listId: string): boolean {\n return this.favoriteListIds.has(listId);\n }\n\n toggleShowOnlyFavorites(): void {\n this.showOnlyFavorites = !this.showOnlyFavorites;\n this.applyFilters();\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 /** 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 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 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 /** 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 }) {\n this.selectedEntityId = entity.ID;\n this.entitySearchTerm = entity.Name;\n this.showEntityDropdown = false;\n }\n\n filterEntities(term: string) {\n const lowerTerm = term.toLowerCase();\n this.filteredEntitiesList = this.availableEntities.filter(e =>\n e.Name.toLowerCase().includes(lowerTerm)\n );\n // Ensure dropdown is visible while typing\n if (!this.showEntityDropdown && term) {\n this.showEntityDropdown = true;\n }\n // Clear selection when user modifies the search text\n this.selectedEntityId = '';\n }\n\n openEntityDropdown(inputElement: HTMLInputElement) {\n const rect = inputElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const dropdownHeight = 200;\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 closeEntityDropdown() {\n this.showEntityDropdown = false;\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 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 cancelDelete() {\n this.showDeleteConfirm = false;\n this.listToDelete = null;\n this.deleteListName = '';\n }\n\n async deleteList() {\n if (!this.listToDelete) return;\n\n const listToDelete = this.listToDelete;\n const listName = listToDelete.Name;\n\n this.isDeleting = true;\n this.cdr.detectChanges();\n\n try {\n // 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 /** 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 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 // 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 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 onShareCancel() {\n this.showShareDialog = false;\n this.shareDialogConfig = null;\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 closeInvitationsDialog() {\n this.showInvitationsDialog = false;\n this.cdr.detectChanges();\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 closeAuditLogDialog() {\n this.showAuditLogDialog = false;\n this.cdr.detectChanges();\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, 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}} &middot; {{item.itemCount}} items\n @if (!item.isOwner) {\n <span> &middot; {{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 (contextItemCapabilities.CanDelete) {\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 && !contextItemCapabilities.CanDelete) {\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.Name}}\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 viewMode: ViewMode = 'card';\n selectedEntity = 'all';\n selectedOwner = 'mine';\n selectedSort = 'name';\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 /**\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 /** When true, only favorited lists appear in the grid. */\n showOnlyFavorites = false;\n\n allLists: BrowseListItem[] = [];\n filteredLists: BrowseListItem[] = [];\n categories: MJListCategoryEntity[] = [];\n categoryTree: CategoryNode[] = [];\n flatCategories: Array<{ ID: string; displayName: string }> = [];\n availableEntities: Array<{ ID: string; Name: string }> = [];\n filteredEntitiesList: Array<{ ID: string; Name: string }> = [];\n\n entityOptions: Array<{ name: string; value: string }> = [{ name: 'All Entities', value: 'all' }];\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 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 // Context menu state\n showContextMenu = false;\n contextMenuX = 0;\n contextMenuY = 0;\n selectedContextItem: BrowseListItem | null = null;\n\n // Create/Edit dialog state\n showCreateDialog = false;\n editingList: MJListEntity | null = null;\n newListName = '';\n newListDescription = '';\n selectedEntityId = '';\n selectedCategoryId: string | null = null;\n entitySearchTerm = '';\n showEntityDropdown = false;\n entityDropdownPosition = { top: 0, left: 0, width: 0, openAbove: false };\n\n // Delete confirmation state\n showDeleteConfirm = false;\n deleteListName = '';\n listToDelete: MJListEntity | null = null;\n\n // Operation states\n isSaving = false;\n isDeleting = false;\n\n // Sharing dialog state\n showShareDialog = false;\n shareDialogConfig: ListShareDialogConfig | null = null;\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 private capabilityCache = new Map<string, SharePermissionLevel | null>();\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 showAuditLogDialog = false;\n activeShareListId: string | null = null;\n activeShareListName: string | null = null;\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 }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\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 /** 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 /** 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 /** 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 /** 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 /** 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 /** 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 onSearchChange(term: string) {\n this.searchTerm = term;\n this.applyFilters();\n this.buildCategoryTree();\n this.publishAgentContext();\n }\n\n onEntityFilterChange(_value: string) {\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n onOwnerFilterChange(_value: string) {\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n onSortChange(_value: string) {\n this.applyFilters();\n this.buildCategoryTree();\n this.publishAgentContext();\n }\n\n clearSearch() {\n this.searchTerm = '';\n this.applyFilters();\n this.buildCategoryTree();\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 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 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 getEntityColor(entityName: string): string {\n return this.entityColorMap.get(entityName) || '#607D8B';\n }\n\n getEntityIcon(entityName: string): string {\n return this.entityIconMap.get(entityName) || 'fa-solid fa-table';\n }\n\n private generateEntityColor(entityName: string): string {\n let hash = 0;\n for (let i = 0; i < entityName.length; i++) {\n hash = entityName.charCodeAt(i) + ((hash << 5) - hash);\n }\n const colors = [\n '#2196F3', '#4CAF50', '#FF9800', '#9C27B0', '#F44336',\n '#00BCD4', '#795548', '#607D8B', '#E91E63', '#3F51B5'\n ];\n return colors[Math.abs(hash) % colors.length];\n }\n\n formatDate(date: Date): string {\n if (!date) return '';\n const now = new Date();\n const d = new Date(date);\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) return 'Today';\n if (diffDays === 1) return 'Yesterday';\n if (diffDays < 7) return `${diffDays} days ago`;\n 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 /**\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 /** 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 /** Clear all active tag filters. */\n clearTagFilters(): void {\n this.tagFilters = [];\n this.tagFilteredListIds = null;\n this.applyFilters();\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 isFavorite(listId: string): boolean {\n return this.favoriteListIds.has(listId);\n }\n\n toggleShowOnlyFavorites(): void {\n this.showOnlyFavorites = !this.showOnlyFavorites;\n this.applyFilters();\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 /** 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 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 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 /** 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 }) {\n this.selectedEntityId = entity.ID;\n this.entitySearchTerm = entity.Name;\n this.showEntityDropdown = false;\n }\n\n filterEntities(term: string) {\n const lowerTerm = term.toLowerCase();\n this.filteredEntitiesList = this.availableEntities.filter(e =>\n e.Name.toLowerCase().includes(lowerTerm)\n );\n // Ensure dropdown is visible while typing\n if (!this.showEntityDropdown && term) {\n this.showEntityDropdown = true;\n }\n // Clear selection when user modifies the search text\n this.selectedEntityId = '';\n }\n\n openEntityDropdown(inputElement: HTMLInputElement) {\n const rect = inputElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const dropdownHeight = 200;\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 closeEntityDropdown() {\n this.showEntityDropdown = false;\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 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 cancelDelete() {\n this.showDeleteConfirm = false;\n this.listToDelete = null;\n this.deleteListName = '';\n }\n\n async deleteList() {\n if (!this.listToDelete) return;\n\n const listToDelete = this.listToDelete;\n const listName = listToDelete.Name;\n\n this.isDeleting = true;\n this.cdr.detectChanges();\n\n try {\n // 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 /** 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 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 // 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 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 onShareCancel() {\n this.showShareDialog = false;\n this.shareDialogConfig = null;\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 closeInvitationsDialog() {\n this.showInvitationsDialog = false;\n this.cdr.detectChanges();\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 closeAuditLogDialog() {\n this.showAuditLogDialog = false;\n this.cdr.detectChanges();\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"]}