@memberjunction/ng-dashboards 5.49.0 → 5.50.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.
@@ -1 +1 @@
1
- {"version":3,"file":"lists-my-lists-resource.component.js","sourceRoot":"","sources":["../../../src/Lists/components/lists-my-lists-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, ChangeDetectorRef, OnDestroy, ElementRef, HostListener } from '@angular/core';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { MJListEntity, MJListCategoryEntity, MJListDetailEntity } from '@memberjunction/core-entities';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { TabService } from '@memberjunction/ng-base-application';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { validateEnumParam, validateStringParam } from '../../shared/agent-tool-validation';\nimport { buildListBrowseAgentContext, resolveNamedRecord, buildNotFoundError } from '../lists-agent-context';\ninterface ListViewModel {\n list: MJListEntity;\n itemCount: number;\n entityName: string;\n}\n\ninterface CategoryNode {\n category: MJListCategoryEntity | null;\n lists: ListViewModel[];\n children: CategoryNode[];\n isExpanded: boolean;\n}\n\n@RegisterClass(BaseResourceComponent, 'ListsMyListsResource')\n@Component({\n standalone: false,\n selector: 'mj-lists-my-lists-resource',\n template: `\n <mj-page-layout>\n <mj-page-header\n Title=\"My Lists\"\n Icon=\"fa-solid fa-list-check\"\n Subtitle=\"Lists you've created or have access to\">\n <div meta>\n <mj-stat-badge [Count]=\"filteredLists.length\" [Total]=\"allLists.length\" Label=\"lists\"></mj-stat-badge>\n </div>\n <div actions>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createNewList()\">\n <i class=\"fa-solid fa-plus\"></i> <span class=\"action-btn-label\">New List</span>\n </button>\n </div>\n <div toolbar>\n <mj-page-search\n Placeholder=\"Search lists...\"\n [Value]=\"searchTerm\"\n (ValueChange)=\"onSearchChange($event)\">\n </mj-page-search>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading lists...\" size=\"medium\"></mj-loading>\n </div>\n }\n \n <!-- Empty State -->\n @if (!isLoading && filteredLists.length === 0 && !searchTerm) {\n <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 <!-- No Results State -->\n @if (!isLoading && filteredLists.length === 0 && searchTerm) {\n <mj-empty-state Variant=\"no-results\"\n Title=\"No Results Found\"\n [Message]=\"NoResultsMessage\"\n ActionText=\"Clear search\"\n ActionIcon=\"fa-solid fa-rotate-left\"\n (Action)=\"clearSearch()\" />\n }\n \n <!-- Lists Grid -->\n @if (!isLoading && filteredLists.length > 0) {\n <div class=\"lists-content\">\n <!-- View Toggle -->\n <div class=\"view-controls\">\n <button\n class=\"view-toggle\"\n [class.active]=\"viewMode === 'grid'\"\n (click)=\"setViewMode('grid')\"\n title=\"Grid view\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button\n class=\"view-toggle\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"setViewMode('list')\"\n title=\"List view\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n <span class=\"list-count\">{{filteredLists.length}} list{{filteredLists.length !== 1 ? 's' : ''}}</span>\n </div>\n <!-- Category Tree View -->\n @if (viewMode === 'list') {\n <div class=\"category-tree\">\n @for (node of categoryTree; track node) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { node: node, depth: 0 }\"></ng-container>\n }\n </div>\n }\n <!-- Grid View -->\n @if (viewMode === 'grid') {\n <div class=\"lists-grid\" role=\"list\" aria-label=\"My Lists\">\n @for (item of filteredLists; track item) {\n <div\n class=\"list-card\"\n (click)=\"openList(item.list)\"\n (keydown.enter)=\"openList(item.list)\"\n (keydown.space)=\"openList(item.list); $event.preventDefault()\"\n tabindex=\"0\"\n role=\"listitem\"\n [attr.aria-label]=\"item.list.Name + ' - ' + item.entityName + ' - ' + item.itemCount + ' items'\">\n <div class=\"card-header\">\n <div class=\"card-icon\" [style.background-color]=\"getEntityColor(item.list.Entity)\" aria-hidden=\"true\">\n <i [class]=\"getEntityIcon(item.list.Entity)\"></i>\n </div>\n <div class=\"card-menu\">\n <button class=\"menu-btn\" (click)=\"openListMenu($event, item.list)\" [attr.aria-label]=\"'More options for ' + item.list.Name\">\n <i class=\"fa-solid fa-ellipsis-v\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"card-body\">\n <h3 class=\"card-title\">{{item.list.Name}}</h3>\n @if (item.list.Description) {\n <p class=\"card-description\">{{item.list.Description}}</p>\n }\n <div class=\"card-meta\">\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-database\"></i>\n {{item.entityName}}\n </span>\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-hashtag\"></i>\n {{item.itemCount}} item{{item.itemCount !== 1 ? 's' : ''}}\n </span>\n </div>\n </div>\n <div class=\"card-footer\">\n @if (item.list.CategoryID) {\n <span class=\"category-tag\">\n <i class=\"fa-solid fa-folder\"></i>\n {{getCategoryName(item.list.CategoryID)}}\n </span>\n }\n <span class=\"date-info\">Updated {{formatDate(item.list.__mj_UpdatedAt)}}</span>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n \n <!-- Category Node Template -->\n <ng-template #categoryNodeTemplate let-node=\"node\" let-depth=\"depth\">\n <div class=\"category-section\" [style.margin-left.px]=\"depth * 20\">\n <!-- Category Header -->\n @if (node.category) {\n <div\n class=\"category-header\"\n (click)=\"toggleCategory(node)\">\n <i [class]=\"node.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n <i class=\"fa-solid fa-folder\" [class.fa-folder-open]=\"node.isExpanded\"></i>\n <span class=\"category-name\">{{node.category.Name}}</span>\n <span class=\"category-count\">{{getListCountInCategory(node)}}</span>\n </div>\n }\n \n <!-- Uncategorized Header -->\n @if (!node.category && node.lists.length > 0) {\n <div\n class=\"category-header uncategorized\"\n (click)=\"toggleCategory(node)\">\n <i [class]=\"node.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n <i class=\"fa-solid fa-inbox\"></i>\n <span class=\"category-name\">Uncategorized</span>\n <span class=\"category-count\">{{node.lists.length}}</span>\n </div>\n }\n \n <!-- Lists in this category -->\n @if (node.isExpanded) {\n <div class=\"category-lists\" role=\"list\">\n @for (item of node.lists; track item) {\n <div\n class=\"list-row\"\n (click)=\"openList(item.list)\"\n (keydown.enter)=\"openList(item.list)\"\n (keydown.space)=\"openList(item.list); $event.preventDefault()\"\n tabindex=\"0\"\n role=\"listitem\"\n [attr.aria-label]=\"item.list.Name + ' - ' + item.entityName + ' - ' + item.itemCount + ' items'\">\n <div class=\"list-icon\" [style.background-color]=\"getEntityColor(item.list.Entity)\" aria-hidden=\"true\">\n <i [class]=\"getEntityIcon(item.list.Entity)\"></i>\n </div>\n <div class=\"list-info\">\n <span class=\"list-name\">{{item.list.Name}}</span>\n <span class=\"list-meta\">{{item.entityName}} &middot; {{item.itemCount}} items</span>\n </div>\n <div class=\"list-actions\">\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"openListMenu($event, item.list)\" [attr.aria-label]=\"'More options for ' + item.list.Name\">\n <i class=\"fa-solid fa-ellipsis-v\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n \n <!-- Child categories -->\n @if (node.isExpanded) {\n @for (child of node.children; track child) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { node: child, depth: depth + 1 }\"></ng-container>\n }\n }\n </div>\n </ng-template>\n \n <!-- Context Menu (native) -->\n @if (showContextMenu) {\n <div class=\"context-menu-overlay\" (click)=\"closeContextMenu()\"></div>\n }\n @if (showContextMenu) {\n <div class=\"context-menu\" [style.top.px]=\"contextMenuY\" [style.left.px]=\"contextMenuX\">\n <button class=\"menu-item\" (click)=\"editList()\">\n <i class=\"fa-solid fa-pen\"></i>\n Edit\n </button>\n <button class=\"menu-item\" (click)=\"duplicateList()\">\n <i class=\"fa-solid fa-copy\"></i>\n Duplicate\n </button>\n <div class=\"menu-divider\"></div>\n <button class=\"menu-item danger\" (click)=\"confirmDeleteList()\">\n <i class=\"fa-solid fa-trash\"></i>\n Delete\n </button>\n </div>\n }\n \n <!-- Create/Edit List Dialog (native modal) -->\n @if (showCreateDialog) {\n <div class=\"modal-overlay\" (click)=\"closeCreateDialog()\"></div>\n }\n @if (showCreateDialog) {\n <div class=\"modal-dialog\">\n <div class=\"modal-header\">\n <h3>{{editingList ? 'Edit List' : 'Create New List'}}</h3>\n <button class=\"modal-close\" (click)=\"closeCreateDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"form-group\">\n <label>Name *</label>\n <input\n type=\"text\"\n [(ngModel)]=\"newListName\"\n placeholder=\"Enter list name\"\n class=\"form-input\" />\n </div>\n <div class=\"form-group\">\n <label>Description</label>\n <textarea\n [(ngModel)]=\"newListDescription\"\n placeholder=\"Optional description\"\n class=\"form-input\"\n rows=\"3\"></textarea>\n </div>\n <div class=\"form-group\">\n <label>Entity *</label>\n <div class=\"custom-select-wrapper\">\n <input\n #entityInput\n type=\"text\"\n [(ngModel)]=\"entitySearchTerm\"\n (ngModelChange)=\"filterEntities($event)\"\n (focus)=\"openEntityDropdown(entityInput)\"\n placeholder=\"Search and select an entity\"\n class=\"form-input\"\n [disabled]=\"!!editingList\" />\n </div>\n </div>\n <div class=\"form-group\">\n <label>Category</label>\n <select [(ngModel)]=\"selectedCategoryId\" class=\"form-input\">\n <option [ngValue]=\"null\">No category</option>\n @for (cat of flatCategories; track cat) {\n <option [ngValue]=\"cat.ID\">{{cat.displayName}}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn-primary\"\n (click)=\"saveList()\"\n [disabled]=\"!newListName || !selectedEntityId || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isSaving ? 'Saving...' : (editingList ? 'Save' : 'Create')}}\n </button>\n <button class=\"btn-secondary\" (click)=\"closeCreateDialog()\" [disabled]=\"isSaving\">Cancel</button>\n </div>\n </div>\n }\n \n <!-- Delete Confirmation Dialog -->\n @if (showDeleteConfirm) {\n <div class=\"modal-overlay\" (click)=\"cancelDelete()\"></div>\n }\n @if (showDeleteConfirm) {\n <div class=\"modal-dialog confirm-dialog\">\n <div class=\"modal-header\">\n <h3>Delete List</h3>\n <button class=\"modal-close\" (click)=\"cancelDelete()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <p>Are you sure you want to delete \"<strong>{{deleteListName}}</strong>\"?</p>\n <p class=\"warning-text\">This will also remove all items in the list.</p>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn-danger\" (click)=\"deleteList()\">\n @if (isDeleting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isDeleting ? 'Deleting...' : 'Delete'}}\n </button>\n <button class=\"btn-secondary\" (click)=\"cancelDelete()\">Cancel</button>\n </div>\n </div>\n }\n \n <!-- Entity Dropdown Portal (fixed positioning) -->\n @if (showEntityDropdown && !editingList) {\n <div\n class=\"entity-dropdown-portal\"\n [style.top.px]=\"entityDropdownPosition.top\"\n [style.left.px]=\"entityDropdownPosition.left\"\n [style.width.px]=\"entityDropdownPosition.width\"\n [class.dropdown-above]=\"entityDropdownPosition.openAbove\">\n <div class=\"entity-dropdown-content\" [class.open-above]=\"entityDropdownPosition.openAbove\">\n @for (entity of filteredEntities; track entity) {\n <div\n class=\"dropdown-item\"\n (mousedown)=\"selectEntity(entity); $event.preventDefault()\">\n {{entity.Name}}\n </div>\n }\n @if (filteredEntities.length === 0) {\n <div class=\"dropdown-empty\">\n No entities found\n </div>\n }\n </div>\n </div>\n }\n </mj-page-body>\n </mj-page-layout>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n /* Loading */\n .loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n }\n\n /* 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 .lists-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px 24px;\n }\n\n .view-controls {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 16px;\n }\n\n .view-toggle {\n padding: 8px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .view-toggle:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .view-toggle.active {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .list-count {\n margin-left: auto;\n color: var(--mj-text-muted);\n font-size: 14px;\n }\n\n /* Grid View */\n .lists-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n }\n\n .list-card {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n cursor: pointer;\n transition: transform 0.2s, box-shadow 0.2s, outline 0.1s;\n outline: 2px solid transparent;\n }\n\n .list-card:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-md);\n }\n\n .list-card:focus {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .list-card:focus:not(:focus-visible) {\n outline: none;\n }\n\n .list-card:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 16px 16px 0;\n }\n\n .card-icon {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 18px;\n }\n\n .menu-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .menu-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .card-body {\n padding: 12px 16px;\n }\n\n .card-title {\n margin: 0 0 4px;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .card-description {\n margin: 0 0 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .card-meta {\n display: flex;\n gap: 16px;\n }\n\n .meta-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .card-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .category-tag {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n padding: 2px 8px;\n border-radius: 4px;\n }\n\n .date-info {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n /* Category Tree */\n .category-tree {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .category-section {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .category-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .category-header:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .category-header i:first-child {\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .category-header .fa-folder,\n .category-header .fa-folder-open {\n color: var(--mj-status-warning);\n }\n\n .category-header.uncategorized .fa-inbox {\n color: var(--mj-text-muted);\n }\n\n .category-name {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .category-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n .category-lists {\n border-top: 1px solid var(--mj-border-default);\n }\n\n .list-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px 12px 40px;\n cursor: pointer;\n transition: background 0.2s;\n outline: none;\n }\n\n .list-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .list-row:focus-visible {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n }\n\n .list-icon {\n width: 32px;\n height: 32px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .list-info {\n flex: 1;\n min-width: 0;\n }\n\n .list-name {\n display: block;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-meta {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .list-actions {\n display: flex;\n gap: 4px;\n }\n\n .action-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n opacity: 0;\n transition: opacity 0.2s;\n }\n\n .list-row:hover .action-btn {\n opacity: 1;\n }\n\n .action-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Context Menu (native) */\n .context-menu-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n }\n\n .context-menu {\n position: fixed;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-md);\n min-width: 160px;\n padding: 4px 0;\n z-index: 1000;\n }\n\n .menu-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 16px;\n background: none;\n border: none;\n text-align: left;\n font-size: 14px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .menu-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .menu-item.danger {\n color: var(--mj-status-error);\n }\n\n .menu-item.danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n }\n\n .menu-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }\n\n /* Modal Styles */\n .modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n }\n\n .modal-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-lg);\n width: 500px;\n max-width: 90vw;\n max-height: 90vh;\n overflow: hidden;\n z-index: 1001;\n }\n\n .confirm-dialog {\n width: 400px;\n }\n\n .modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .modal-close {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .modal-close:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .modal-body {\n padding: 20px;\n max-height: 60vh;\n overflow-y: auto;\n }\n\n .modal-body p {\n margin: 0 0 8px;\n color: var(--mj-text-primary);\n }\n\n .warning-text {\n color: var(--mj-status-error) !important;\n font-size: 13px;\n }\n\n .modal-footer {\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-secondary {\n padding: 10px 20px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-danger {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-danger:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-status-error) 85%, black);\n }\n\n /* Form Styles */\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group:last-child {\n margin-bottom: 0;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .form-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.2s, box-shadow 0.2s;\n box-sizing: border-box;\n }\n\n .form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .form-input:disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n textarea.form-input {\n resize: vertical;\n min-height: 80px;\n }\n\n select.form-input {\n cursor: pointer;\n }\n\n .custom-select-wrapper {\n position: relative;\n }\n\n /* Portal Dropdown - Fixed positioning to escape modal z-index */\n .entity-dropdown-portal {\n position: fixed;\n z-index: 10002; /* Above modal (1001) */\n }\n\n .entity-dropdown-content {\n max-height: 200px;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: var(--mj-shadow-md);\n }\n\n .entity-dropdown-content.open-above {\n position: absolute;\n bottom: 0;\n }\n\n .dropdown-item {\n padding: 10px 12px;\n cursor: pointer;\n transition: background 0.15s;\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .dropdown-item:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .dropdown-item:first-child {\n border-radius: 6px 6px 0 0;\n }\n\n .dropdown-item:last-child {\n border-radius: 0 0 6px 6px;\n }\n\n .dropdown-empty {\n padding: 10px 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .lists-header {\n flex-direction: column;\n gap: 16px;\n align-items: stretch;\n }\n\n .header-actions {\n flex-direction: column;\n }\n\n .search-box input {\n width: 100%;\n }\n\n .btn-create {\n width: 100%;\n justify-content: center;\n }\n\n .lists-grid {\n grid-template-columns: 1fr;\n }\n\n .modal-dialog {\n width: 95vw;\n }\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ListsMyListsResource extends BaseResourceComponent implements OnDestroy {\n protected override destroy$ = new Subject<void>();\n\n isLoading = true;\n searchTerm = '';\n viewMode: 'grid' | 'list' = 'grid';\n\n allLists: ListViewModel[] = [];\n filteredLists: ListViewModel[] = [];\n categories: MJListCategoryEntity[] = [];\n categoryTree: CategoryNode[] = [];\n flatCategories: Array<{ ID: string | null; displayName: string }> = [];\n availableEntities: Array<{ ID: string; Name: string }> = [];\n filteredEntities: Array<{ ID: string; Name: string }> = [];\n\n // Context menu\n showContextMenu = false;\n contextMenuX = 0;\n contextMenuY = 0;\n selectedContextList: MJListEntity | null = null;\n\n // Create/Edit dialog\n showCreateDialog = false;\n editingList: MJListEntity | null = null;\n newListName = '';\n newListDescription = '';\n selectedEntityId = '';\n selectedCategoryId: string | null = null;\n entitySearchTerm = '';\n showEntityDropdown = false;\n entityDropdownPosition = { top: 0, left: 0, width: 0, openAbove: false };\n\n // Delete confirmation\n showDeleteConfirm = false;\n deleteListName = '';\n listToDelete: MJListEntity | null = null;\n\n // Operation states\n isSaving = false;\n isDeleting = false;\n\n private categoryMap: Map<string, MJListCategoryEntity> = new Map();\n private entityColorMap: Map<string, string> = new Map();\n private entityIconMap: Map<string, string> = new Map();\n\n constructor(\n private cdr: ChangeDetectorRef,\n private tabService: TabService,\n private notificationService: MJNotificationService,\n private elementRef: ElementRef\n ) {\n super();\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent) {\n // Close entity dropdown when clicking outside the input or dropdown\n if (this.showEntityDropdown) {\n const target = event.target as HTMLElement;\n if (!target.closest('.custom-select-wrapper') && !target.closest('.entity-dropdown-portal')) {\n this.showEntityDropdown = false;\n }\n }\n }\n\n @HostListener('document:keydown.escape')\n onEscapeKey() {\n if (this.showContextMenu) {\n this.closeContextMenu();\n }\n if (this.showCreateDialog) {\n this.closeCreateDialog();\n }\n if (this.showDeleteConfirm) {\n this.cancelDelete();\n }\n }\n\n async ngOnInit() {\n super.ngOnInit();\n await this.loadData();\n this.registerAgentTools();\n this.publishAgentContext();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy() {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ================================================================\n // AI Agent Context & Client Tools\n //\n // SAFETY BOUNDARY: SAFE (open / search / view) operations plus ONE\n // bounded-mutation tool (CreateList) that opens the dialog-validated\n // create flow. INTENTIONALLY EXCLUDED — must NOT be wired in:\n // - EditList (editList) — mutates an existing record\n // - DeleteList (confirmDeleteList) — destructive\n // ================================================================\n\n /** Report the My-Lists surface's salient state to the AI agent. */\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 user's currently-visible lists (bounded),\n // so the agent can open them by name rather than an opaque GUID.\n VisibleListNames: this.filteredLists.map(i => i.list.Name),\n }));\n }\n\n /**\n * Resolve an agent-supplied reference (a list ID or NAME, exact or partial) to\n * one of the user's loaded lists via the pure {@link resolveNamedRecord} helper.\n */\n private resolveMyListItem(input: string): ListViewModel | 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 /** Register the My-Lists surface's agent-actionable tools. */\n private registerAgentTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'OpenList',\n Description: 'Open one of my lists 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 check = validateStringParam(params['list'] ?? params['listId'], 'list');\n if (!check.ok) return check.result;\n const item = this.resolveMyListItem(check.value);\n if (!item) return { Success: false, ErrorMessage: buildNotFoundError(check.value, this.allLists.map(i => ({ ID: i.list.ID, Name: i.list.Name })), 'list') };\n this.openList(item.list);\n return { Success: true, Data: { listName: item.list.Name } };\n },\n },\n {\n Name: 'SearchLists',\n Description: 'Set the search term that filters my lists.',\n ParameterSchema: { type: 'object', properties: { searchTerm: { type: 'string' } }, 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.searchTerm = check.value;\n this.onSearchChange(check.value);\n this.publishAgentContext();\n return { Success: true, Data: { resultCount: this.filteredLists.length } };\n },\n },\n {\n Name: 'SetViewMode',\n Description: 'Set the view mode: \"grid\" or \"list\".',\n ParameterSchema: { type: 'object', properties: { mode: { type: 'string', enum: ['grid', 'list'] } }, required: ['mode'] },\n Handler: async (params: Record<string, unknown>) => {\n const check = validateEnumParam(params['mode'], ['grid', 'list'] as const, 'mode');\n if (!check.ok) return check.result;\n this.setViewMode(check.value);\n return { Success: true };\n },\n },\n {\n // BOUNDED MUTATION: opens the dialog-validated create flow only.\n Name: 'CreateList',\n Description: 'Open the \"Create New List\" dialog. Nothing is saved until the user confirms the name and entity.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.createNewList();\n return { Success: true };\n },\n },\n ]);\n }\n\n async loadData() {\n this.isLoading = true;\n\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const userId = md.CurrentUser?.ID;\n\n if (!userId) {\n console.error('No current user');\n return;\n }\n\n // Load lists and categories in parallel; item counts follow as a\n // batched set of count_only queries (index-seek COUNTs server-side)\n // instead of transferring every membership row to the client.\n const [listsResult, categoriesResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Lists',\n ExtraFilter: `UserID = '${userId}'`,\n OrderBy: 'Name',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: List Categories',\n OrderBy: 'Name',\n ResultType: 'entity_object'\n }\n ]);\n\n if (!listsResult.Success || !categoriesResult.Success) {\n console.error('Failed to load lists data');\n return;\n }\n\n const lists = listsResult.Results as MJListEntity[];\n this.categories = categoriesResult.Results as MJListCategoryEntity[];\n\n // Build category map\n this.categoryMap.clear();\n for (const cat of this.categories) {\n this.categoryMap.set(cat.ID, cat);\n }\n\n // Count items per list — one batched round trip\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 })));\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 for (const entity of entities) {\n this.entityColorMap.set(entity.Name, this.generateEntityColor(entity.Name));\n this.entityIconMap.set(entity.Name, entity.Icon || 'fa-solid fa-table');\n }\n\n // Build list view models\n this.allLists = lists.map(list => ({\n list,\n itemCount: itemCounts.get(list.ID) || 0,\n entityName: list.Entity || 'Unknown'\n }));\n\n // Build available entities for dropdown\n this.availableEntities = entities\n .filter(e => e.IncludeInAPI)\n .map(e => ({ ID: e.ID, Name: e.Name }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n this.filteredEntities = [...this.availableEntities];\n\n // Build flat categories for dropdown\n this.flatCategories = this.buildFlatCategories(this.categories);\n\n this.applyFilter();\n this.buildCategoryTree();\n } catch (error) {\n console.error('Error loading lists:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private buildFlatCategories(categories: MJListCategoryEntity[]): Array<{ ID: string; displayName: string }> {\n const result: Array<{ ID: string; displayName: string }> = [];\n const topLevel = categories.filter(c => !c.ParentID);\n\n const processCategory = (cat: MJListCategoryEntity, level: number) => {\n const indent = '\\u00A0\\u00A0'.repeat(level);\n result.push({ ID: cat.ID, displayName: `${indent}${cat.Name}` });\n\n const children = categories.filter(c => UUIDsEqual(c.ParentID, cat.ID));\n for (const child of children) {\n processCategory(child, level + 1);\n }\n };\n\n for (const cat of topLevel) {\n processCategory(cat, 0);\n }\n\n return result;\n }\n\n private buildCategoryTree() {\n const rootNodes: CategoryNode[] = [];\n const categoryNodes = new Map<string, CategoryNode>();\n\n // Create nodes for all categories\n for (const cat of this.categories) {\n categoryNodes.set(cat.ID, {\n category: cat,\n lists: [],\n children: [],\n isExpanded: true\n });\n }\n\n // Build tree structure\n for (const cat of this.categories) {\n const node = categoryNodes.get(cat.ID)!;\n if (cat.ParentID && categoryNodes.has(cat.ParentID)) {\n categoryNodes.get(cat.ParentID)!.children.push(node);\n } else {\n rootNodes.push(node);\n }\n }\n\n // Assign lists to categories\n const uncategorizedLists: ListViewModel[] = [];\n for (const item of this.filteredLists) {\n if (item.list.CategoryID && categoryNodes.has(item.list.CategoryID)) {\n categoryNodes.get(item.list.CategoryID)!.lists.push(item);\n } else {\n uncategorizedLists.push(item);\n }\n }\n\n // Add uncategorized node if there are uncategorized lists\n if (uncategorizedLists.length > 0) {\n rootNodes.unshift({\n category: null,\n lists: uncategorizedLists,\n children: [],\n isExpanded: true\n });\n }\n\n this.categoryTree = rootNodes;\n }\n\n onSearchChange(_term: string) {\n this.applyFilter();\n this.buildCategoryTree();\n this.publishAgentContext();\n }\n\n /** Set the grid/list view mode and refresh agent context. */\n setViewMode(mode: 'grid' | 'list') {\n this.viewMode = mode;\n this.publishAgentContext();\n }\n\n clearSearch() {\n this.searchTerm = '';\n this.applyFilter();\n this.buildCategoryTree();\n }\n\n /** Message for the no-results empty state, echoing the active search term. */\n public get NoResultsMessage(): string {\n return `No lists match \"${this.searchTerm}\". Try a different search term or clear your search.`;\n }\n\n private applyFilter() {\n if (!this.searchTerm) {\n this.filteredLists = [...this.allLists];\n } else {\n const term = this.searchTerm.toLowerCase();\n this.filteredLists = this.allLists.filter(item =>\n item.list.Name.toLowerCase().includes(term) ||\n (item.list.Description && item.list.Description.toLowerCase().includes(term)) ||\n item.entityName.toLowerCase().includes(term)\n );\n }\n }\n\n toggleCategory(node: CategoryNode) {\n node.isExpanded = !node.isExpanded;\n }\n\n getListCountInCategory(node: CategoryNode): number {\n let count = node.lists.length;\n for (const child of node.children) {\n count += this.getListCountInCategory(child);\n }\n return count;\n }\n\n getCategoryName(categoryId: string): string {\n return this.categoryMap.get(categoryId)?.Name || 'Unknown';\n }\n\n getEntityColor(entityName: string): string {\n return this.entityColorMap.get(entityName) || '#607D8B';\n }\n\n getEntityIcon(entityName: string): string {\n return this.entityIconMap.get(entityName) || 'fa-solid fa-table';\n }\n\n private generateEntityColor(entityName: string): string {\n let hash = 0;\n for (let i = 0; i < entityName.length; i++) {\n hash = entityName.charCodeAt(i) + ((hash << 5) - hash);\n }\n const colors = [\n '#2196F3', '#4CAF50', '#FF9800', '#9C27B0', '#F44336',\n '#00BCD4', '#795548', '#607D8B', '#E91E63', '#3F51B5'\n ];\n return colors[Math.abs(hash) % colors.length];\n }\n\n formatDate(date: Date): string {\n if (!date) return '';\n const now = new Date();\n const d = new Date(date);\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) return 'today';\n if (diffDays === 1) return 'yesterday';\n if (diffDays < 7) return `${diffDays} days ago`;\n if (diffDays < 30) return `${Math.floor(diffDays / 7)} weeks ago`;\n return d.toLocaleDateString();\n }\n\n openList(list: MJListEntity) {\n const appId = this.Data?.Configuration?.applicationId || '';\n this.tabService.OpenList(list.ID, list.Name, appId);\n }\n\n openListMenu(event: Event, list: MJListEntity) {\n event.stopPropagation();\n const mouseEvent = event as MouseEvent;\n this.selectedContextList = list;\n this.contextMenuX = mouseEvent.clientX;\n this.contextMenuY = mouseEvent.clientY;\n this.showContextMenu = true;\n }\n\n closeContextMenu() {\n this.showContextMenu = false;\n this.selectedContextList = null;\n }\n\n createNewList() {\n this.editingList = null;\n this.newListName = '';\n this.newListDescription = '';\n this.selectedEntityId = '';\n this.entitySearchTerm = '';\n this.selectedCategoryId = null;\n this.showEntityDropdown = false;\n this.showCreateDialog = true;\n }\n\n editList() {\n if (!this.selectedContextList) return;\n\n this.editingList = this.selectedContextList;\n this.newListName = this.selectedContextList.Name;\n this.newListDescription = this.selectedContextList.Description || '';\n this.selectedEntityId = this.selectedContextList.EntityID;\n this.entitySearchTerm = this.selectedContextList.Entity || '';\n this.selectedCategoryId = this.selectedContextList.CategoryID || null;\n this.showCreateDialog = true;\n this.closeContextMenu();\n }\n\n selectEntity(entity: { ID: string; Name: string }) {\n this.selectedEntityId = entity.ID;\n this.entitySearchTerm = entity.Name;\n this.showEntityDropdown = false;\n }\n\n filterEntities(term: string) {\n const lowerTerm = term.toLowerCase();\n this.filteredEntities = this.availableEntities.filter(e =>\n e.Name.toLowerCase().includes(lowerTerm)\n );\n // Ensure dropdown is visible while typing\n if (!this.showEntityDropdown && term) {\n this.showEntityDropdown = true;\n }\n // Clear selection when user modifies the search text\n this.selectedEntityId = '';\n }\n\n openEntityDropdown(inputElement: HTMLInputElement) {\n const rect = inputElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const dropdownHeight = 200; // estimated max height\n const spaceBelow = viewportHeight - rect.bottom;\n const openAbove = spaceBelow < dropdownHeight && rect.top > dropdownHeight;\n\n this.entityDropdownPosition = {\n top: openAbove ? rect.top - dropdownHeight : rect.bottom,\n left: rect.left,\n width: rect.width,\n openAbove\n };\n this.showEntityDropdown = true;\n this.filteredEntities = [...this.availableEntities];\n }\n\n closeEntityDropdown() {\n this.showEntityDropdown = false;\n }\n\n async duplicateList() {\n if (!this.selectedContextList) return;\n\n const listToDuplicate = this.selectedContextList;\n this.closeContextMenu();\n\n this.isLoading = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n const newList = await md.GetEntityObject<MJListEntity>('MJ: Lists');\n newList.Name = `${listToDuplicate.Name} (Copy)`;\n newList.Description = listToDuplicate.Description;\n newList.EntityID = listToDuplicate.EntityID;\n newList.CategoryID = listToDuplicate.CategoryID;\n newList.UserID = md.CurrentUser!.ID;\n\n const listSaved = await newList.Save();\n if (!listSaved) {\n this.notificationService.CreateSimpleNotification('Failed to duplicate list', 'error', 4000);\n return;\n }\n\n const itemsResult = await rv.RunView<MJListDetailEntity>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID = '${listToDuplicate.ID}'`,\n ResultType: 'entity_object'\n });\n\n if (itemsResult.Success && itemsResult.Results.length > 0) {\n let copiedCount = 0;\n for (const item of itemsResult.Results) {\n const newItem = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details');\n newItem.ListID = newList.ID;\n newItem.RecordID = item.RecordID;\n newItem.Sequence = item.Sequence;\n const itemSaved = await newItem.Save();\n if (itemSaved) copiedCount++;\n }\n this.notificationService.CreateSimpleNotification(\n `List duplicated with ${copiedCount} item${copiedCount !== 1 ? 's' : ''}`,\n 'success',\n 3000\n );\n } else {\n this.notificationService.CreateSimpleNotification('List duplicated successfully', 'success', 3000);\n }\n\n await this.loadData();\n } catch (error) {\n console.error('Error duplicating list:', error);\n this.notificationService.CreateSimpleNotification('Error duplicating list. Please try again.', 'error', 4000);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n confirmDeleteList() {\n if (!this.selectedContextList) return;\n this.listToDelete = this.selectedContextList;\n this.deleteListName = this.selectedContextList.Name;\n this.showDeleteConfirm = true;\n this.closeContextMenu();\n }\n\n cancelDelete() {\n this.showDeleteConfirm = false;\n this.listToDelete = null;\n this.deleteListName = '';\n }\n\n async deleteList() {\n if (!this.listToDelete) return;\n\n const listToDelete = this.listToDelete;\n const listName = listToDelete.Name;\n\n this.isDeleting = true;\n this.cdr.detectChanges();\n\n try {\n const deleted = await listToDelete.Delete();\n if (deleted) {\n this.notificationService.CreateSimpleNotification(`\"${listName}\" deleted`, 'success', 3000);\n } else {\n // Get the detailed error message from LatestResult\n const errorMessage = listToDelete.LatestResult?.Message || 'Unknown error occurred';\n console.error('Failed to delete list:', listToDelete.LatestResult);\n this.notificationService.CreateSimpleNotification(`Failed to delete list: ${errorMessage}`, 'error', 6000);\n }\n this.cancelDelete();\n await this.loadData();\n } catch (error) {\n console.error('Error deleting list:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error deleting list: ${errorMessage}`, 'error', 6000);\n } finally {\n this.isDeleting = false;\n this.cdr.detectChanges();\n }\n }\n\n closeCreateDialog() {\n this.showCreateDialog = false;\n this.editingList = null;\n this.showEntityDropdown = false;\n }\n\n async saveList() {\n this.isSaving = true;\n this.cdr.detectChanges();\n\n const isEditing = !!this.editingList;\n const listName = this.newListName;\n\n try {\n const md = this.ProviderToUse;\n let list: MJListEntity;\n\n if (this.editingList) {\n list = this.editingList;\n } else {\n list = await md.GetEntityObject<MJListEntity>('MJ: Lists');\n list.UserID = md.CurrentUser!.ID;\n list.EntityID = this.selectedEntityId;\n }\n\n list.Name = this.newListName;\n list.Description = this.newListDescription || null;\n list.CategoryID = this.selectedCategoryId || null;\n\n const saved = await list.Save();\n if (saved) {\n this.notificationService.CreateSimpleNotification(\n isEditing ? `\"${listName}\" updated` : `\"${listName}\" created`,\n 'success',\n 3000\n );\n this.closeCreateDialog();\n await this.loadData();\n } else {\n // Get the detailed error message from LatestResult\n const errorMessage = list.LatestResult?.Message || 'Unknown error occurred';\n const action = isEditing ? 'update' : 'create';\n console.error(`Failed to ${action} list:`, list.LatestResult);\n this.notificationService.CreateSimpleNotification(\n `Failed to ${action} list: ${errorMessage}`,\n 'error',\n 6000\n );\n }\n } catch (error) {\n console.error('Error saving list:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error saving list: ${errorMessage}`, 'error', 6000);\n } finally {\n this.isSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'My Lists';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-list-check';\n }\n}\n"]}
1
+ {"version":3,"file":"lists-my-lists-resource.component.js","sourceRoot":"","sources":["../../../src/Lists/components/lists-my-lists-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, ChangeDetectorRef, OnDestroy, ElementRef, HostListener } from '@angular/core';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { MJListEntity, MJListEntityExtended, MJListCategoryEntity, MJListDetailEntity } from '@memberjunction/core-entities';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { TabService } from '@memberjunction/ng-base-application';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { validateEnumParam, validateStringParam } from '../../shared/agent-tool-validation';\nimport { buildListBrowseAgentContext, resolveNamedRecord, buildNotFoundError } from '../lists-agent-context';\ninterface ListViewModel {\n list: MJListEntity;\n itemCount: number;\n entityName: string;\n}\n\ninterface CategoryNode {\n category: MJListCategoryEntity | null;\n lists: ListViewModel[];\n children: CategoryNode[];\n isExpanded: boolean;\n}\n\n@RegisterClass(BaseResourceComponent, 'ListsMyListsResource')\n@Component({\n standalone: false,\n selector: 'mj-lists-my-lists-resource',\n template: `\n <mj-page-layout>\n <mj-page-header\n Title=\"My Lists\"\n Icon=\"fa-solid fa-list-check\"\n Subtitle=\"Lists you've created or have access to\">\n <div meta>\n <mj-stat-badge [Count]=\"filteredLists.length\" [Total]=\"allLists.length\" Label=\"lists\"></mj-stat-badge>\n </div>\n <div actions>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createNewList()\">\n <i class=\"fa-solid fa-plus\"></i> <span class=\"action-btn-label\">New List</span>\n </button>\n </div>\n <div toolbar>\n <mj-page-search\n Placeholder=\"Search lists...\"\n [Value]=\"searchTerm\"\n (ValueChange)=\"onSearchChange($event)\">\n </mj-page-search>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading lists...\" size=\"medium\"></mj-loading>\n </div>\n }\n \n <!-- Empty State -->\n @if (!isLoading && filteredLists.length === 0 && !searchTerm) {\n <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 <!-- No Results State -->\n @if (!isLoading && filteredLists.length === 0 && searchTerm) {\n <mj-empty-state Variant=\"no-results\"\n Title=\"No Results Found\"\n [Message]=\"NoResultsMessage\"\n ActionText=\"Clear search\"\n ActionIcon=\"fa-solid fa-rotate-left\"\n (Action)=\"clearSearch()\" />\n }\n \n <!-- Lists Grid -->\n @if (!isLoading && filteredLists.length > 0) {\n <div class=\"lists-content\">\n <!-- View Toggle -->\n <div class=\"view-controls\">\n <button\n class=\"view-toggle\"\n [class.active]=\"viewMode === 'grid'\"\n (click)=\"setViewMode('grid')\"\n title=\"Grid view\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button\n class=\"view-toggle\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"setViewMode('list')\"\n title=\"List view\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n <span class=\"list-count\">{{filteredLists.length}} list{{filteredLists.length !== 1 ? 's' : ''}}</span>\n </div>\n <!-- Category Tree View -->\n @if (viewMode === 'list') {\n <div class=\"category-tree\">\n @for (node of categoryTree; track node) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { node: node, depth: 0 }\"></ng-container>\n }\n </div>\n }\n <!-- Grid View -->\n @if (viewMode === 'grid') {\n <div class=\"lists-grid\" role=\"list\" aria-label=\"My Lists\">\n @for (item of filteredLists; track item) {\n <div\n class=\"list-card\"\n (click)=\"openList(item.list)\"\n (keydown.enter)=\"openList(item.list)\"\n (keydown.space)=\"openList(item.list); $event.preventDefault()\"\n tabindex=\"0\"\n role=\"listitem\"\n [attr.aria-label]=\"item.list.Name + ' - ' + item.entityName + ' - ' + item.itemCount + ' items'\">\n <div class=\"card-header\">\n <div class=\"card-icon\" [style.background-color]=\"getEntityColor(item.list.Entity)\" aria-hidden=\"true\">\n <i [class]=\"getEntityIcon(item.list.Entity)\"></i>\n </div>\n <div class=\"card-menu\">\n <button class=\"menu-btn\" (click)=\"openListMenu($event, item.list)\" [attr.aria-label]=\"'More options for ' + item.list.Name\">\n <i class=\"fa-solid fa-ellipsis-v\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"card-body\">\n <h3 class=\"card-title\">{{item.list.Name}}</h3>\n @if (item.list.Description) {\n <p class=\"card-description\">{{item.list.Description}}</p>\n }\n <div class=\"card-meta\">\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-database\"></i>\n {{item.entityName}}\n </span>\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-hashtag\"></i>\n {{item.itemCount}} item{{item.itemCount !== 1 ? 's' : ''}}\n </span>\n </div>\n </div>\n <div class=\"card-footer\">\n @if (item.list.CategoryID) {\n <span class=\"category-tag\">\n <i class=\"fa-solid fa-folder\"></i>\n {{getCategoryName(item.list.CategoryID)}}\n </span>\n }\n <span class=\"date-info\">Updated {{formatDate(item.list.__mj_UpdatedAt)}}</span>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n \n <!-- Category Node Template -->\n <ng-template #categoryNodeTemplate let-node=\"node\" let-depth=\"depth\">\n <div class=\"category-section\" [style.margin-left.px]=\"depth * 20\">\n <!-- Category Header -->\n @if (node.category) {\n <div\n class=\"category-header\"\n (click)=\"toggleCategory(node)\">\n <i [class]=\"node.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n <i class=\"fa-solid fa-folder\" [class.fa-folder-open]=\"node.isExpanded\"></i>\n <span class=\"category-name\">{{node.category.Name}}</span>\n <span class=\"category-count\">{{getListCountInCategory(node)}}</span>\n </div>\n }\n \n <!-- Uncategorized Header -->\n @if (!node.category && node.lists.length > 0) {\n <div\n class=\"category-header uncategorized\"\n (click)=\"toggleCategory(node)\">\n <i [class]=\"node.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n <i class=\"fa-solid fa-inbox\"></i>\n <span class=\"category-name\">Uncategorized</span>\n <span class=\"category-count\">{{node.lists.length}}</span>\n </div>\n }\n \n <!-- Lists in this category -->\n @if (node.isExpanded) {\n <div class=\"category-lists\" role=\"list\">\n @for (item of node.lists; track item) {\n <div\n class=\"list-row\"\n (click)=\"openList(item.list)\"\n (keydown.enter)=\"openList(item.list)\"\n (keydown.space)=\"openList(item.list); $event.preventDefault()\"\n tabindex=\"0\"\n role=\"listitem\"\n [attr.aria-label]=\"item.list.Name + ' - ' + item.entityName + ' - ' + item.itemCount + ' items'\">\n <div class=\"list-icon\" [style.background-color]=\"getEntityColor(item.list.Entity)\" aria-hidden=\"true\">\n <i [class]=\"getEntityIcon(item.list.Entity)\"></i>\n </div>\n <div class=\"list-info\">\n <span class=\"list-name\">{{item.list.Name}}</span>\n <span class=\"list-meta\">{{item.entityName}} &middot; {{item.itemCount}} items</span>\n </div>\n <div class=\"list-actions\">\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"openListMenu($event, item.list)\" [attr.aria-label]=\"'More options for ' + item.list.Name\">\n <i class=\"fa-solid fa-ellipsis-v\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n \n <!-- Child categories -->\n @if (node.isExpanded) {\n @for (child of node.children; track child) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { node: child, depth: depth + 1 }\"></ng-container>\n }\n }\n </div>\n </ng-template>\n \n <!-- Context Menu (native) -->\n @if (showContextMenu) {\n <div class=\"context-menu-overlay\" (click)=\"closeContextMenu()\"></div>\n }\n @if (showContextMenu) {\n <div class=\"context-menu\" [style.top.px]=\"contextMenuY\" [style.left.px]=\"contextMenuX\">\n <button class=\"menu-item\" (click)=\"editList()\">\n <i class=\"fa-solid fa-pen\"></i>\n Edit\n </button>\n <button class=\"menu-item\" (click)=\"duplicateList()\">\n <i class=\"fa-solid fa-copy\"></i>\n Duplicate\n </button>\n @if (CanDeleteSelectedList) {\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 </div>\n }\n \n <!-- Create/Edit List Dialog (native modal) -->\n @if (showCreateDialog) {\n <div class=\"modal-overlay\" (click)=\"closeCreateDialog()\"></div>\n }\n @if (showCreateDialog) {\n <div class=\"modal-dialog\">\n <div class=\"modal-header\">\n <h3>{{editingList ? 'Edit List' : 'Create New List'}}</h3>\n <button class=\"modal-close\" (click)=\"closeCreateDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"form-group\">\n <label>Name *</label>\n <input\n type=\"text\"\n [(ngModel)]=\"newListName\"\n placeholder=\"Enter list name\"\n class=\"form-input\" />\n </div>\n <div class=\"form-group\">\n <label>Description</label>\n <textarea\n [(ngModel)]=\"newListDescription\"\n placeholder=\"Optional description\"\n class=\"form-input\"\n rows=\"3\"></textarea>\n </div>\n <div class=\"form-group\">\n <label>Entity *</label>\n <div class=\"custom-select-wrapper\">\n <input\n #entityInput\n type=\"text\"\n [(ngModel)]=\"entitySearchTerm\"\n (ngModelChange)=\"filterEntities($event)\"\n (focus)=\"openEntityDropdown(entityInput)\"\n placeholder=\"Search and select an entity\"\n class=\"form-input\"\n [disabled]=\"!!editingList\" />\n </div>\n </div>\n <div class=\"form-group\">\n <label>Category</label>\n <select [(ngModel)]=\"selectedCategoryId\" class=\"form-input\">\n <option [ngValue]=\"null\">No category</option>\n @for (cat of flatCategories; track cat) {\n <option [ngValue]=\"cat.ID\">{{cat.displayName}}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn-primary\"\n (click)=\"saveList()\"\n [disabled]=\"!newListName || !selectedEntityId || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isSaving ? 'Saving...' : (editingList ? 'Save' : 'Create')}}\n </button>\n <button class=\"btn-secondary\" (click)=\"closeCreateDialog()\" [disabled]=\"isSaving\">Cancel</button>\n </div>\n </div>\n }\n \n <!-- Delete Confirmation Dialog -->\n @if (showDeleteConfirm) {\n <div class=\"modal-overlay\" (click)=\"cancelDelete()\"></div>\n }\n @if (showDeleteConfirm) {\n <div class=\"modal-dialog confirm-dialog\">\n <div class=\"modal-header\">\n <h3>Delete List</h3>\n <button class=\"modal-close\" (click)=\"cancelDelete()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <p>Are you sure you want to delete \"<strong>{{deleteListName}}</strong>\"?</p>\n <p class=\"warning-text\">This will also remove all items in the list.</p>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn-danger\" (click)=\"deleteList()\">\n @if (isDeleting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isDeleting ? 'Deleting...' : 'Delete'}}\n </button>\n <button class=\"btn-secondary\" (click)=\"cancelDelete()\">Cancel</button>\n </div>\n </div>\n }\n \n <!-- Entity Dropdown Portal (fixed positioning) -->\n @if (showEntityDropdown && !editingList) {\n <div\n class=\"entity-dropdown-portal\"\n [style.top.px]=\"entityDropdownPosition.top\"\n [style.left.px]=\"entityDropdownPosition.left\"\n [style.width.px]=\"entityDropdownPosition.width\"\n [class.dropdown-above]=\"entityDropdownPosition.openAbove\">\n <div class=\"entity-dropdown-content\" [class.open-above]=\"entityDropdownPosition.openAbove\">\n @for (entity of filteredEntities; track entity) {\n <div\n class=\"dropdown-item\"\n (mousedown)=\"selectEntity(entity); $event.preventDefault()\">\n {{entity.Name}}\n </div>\n }\n @if (filteredEntities.length === 0) {\n <div class=\"dropdown-empty\">\n No entities found\n </div>\n }\n </div>\n </div>\n }\n </mj-page-body>\n </mj-page-layout>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n /* Loading */\n .loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n }\n\n /* 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 .lists-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px 24px;\n }\n\n .view-controls {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 16px;\n }\n\n .view-toggle {\n padding: 8px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .view-toggle:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .view-toggle.active {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .list-count {\n margin-left: auto;\n color: var(--mj-text-muted);\n font-size: 14px;\n }\n\n /* Grid View */\n .lists-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n }\n\n .list-card {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n cursor: pointer;\n transition: transform 0.2s, box-shadow 0.2s, outline 0.1s;\n outline: 2px solid transparent;\n }\n\n .list-card:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-md);\n }\n\n .list-card:focus {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .list-card:focus:not(:focus-visible) {\n outline: none;\n }\n\n .list-card:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 16px 16px 0;\n }\n\n .card-icon {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 18px;\n }\n\n .menu-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .menu-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .card-body {\n padding: 12px 16px;\n }\n\n .card-title {\n margin: 0 0 4px;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .card-description {\n margin: 0 0 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .card-meta {\n display: flex;\n gap: 16px;\n }\n\n .meta-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .card-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .category-tag {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n padding: 2px 8px;\n border-radius: 4px;\n }\n\n .date-info {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n /* Category Tree */\n .category-tree {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .category-section {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .category-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .category-header:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .category-header i:first-child {\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .category-header .fa-folder,\n .category-header .fa-folder-open {\n color: var(--mj-status-warning);\n }\n\n .category-header.uncategorized .fa-inbox {\n color: var(--mj-text-muted);\n }\n\n .category-name {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .category-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n .category-lists {\n border-top: 1px solid var(--mj-border-default);\n }\n\n .list-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px 12px 40px;\n cursor: pointer;\n transition: background 0.2s;\n outline: none;\n }\n\n .list-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .list-row:focus-visible {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n }\n\n .list-icon {\n width: 32px;\n height: 32px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .list-info {\n flex: 1;\n min-width: 0;\n }\n\n .list-name {\n display: block;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-meta {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .list-actions {\n display: flex;\n gap: 4px;\n }\n\n .action-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n opacity: 0;\n transition: opacity 0.2s;\n }\n\n .list-row:hover .action-btn {\n opacity: 1;\n }\n\n .action-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Context Menu (native) */\n .context-menu-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n }\n\n .context-menu {\n position: fixed;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-md);\n min-width: 160px;\n padding: 4px 0;\n z-index: 1000;\n }\n\n .menu-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 16px;\n background: none;\n border: none;\n text-align: left;\n font-size: 14px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .menu-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .menu-item.danger {\n color: var(--mj-status-error);\n }\n\n .menu-item.danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n }\n\n .menu-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }\n\n /* Modal Styles */\n .modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n }\n\n .modal-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-lg);\n width: 500px;\n max-width: 90vw;\n max-height: 90vh;\n overflow: hidden;\n z-index: 1001;\n }\n\n .confirm-dialog {\n width: 400px;\n }\n\n .modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .modal-close {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .modal-close:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .modal-body {\n padding: 20px;\n max-height: 60vh;\n overflow-y: auto;\n }\n\n .modal-body p {\n margin: 0 0 8px;\n color: var(--mj-text-primary);\n }\n\n .warning-text {\n color: var(--mj-status-error) !important;\n font-size: 13px;\n }\n\n .modal-footer {\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-secondary {\n padding: 10px 20px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-danger {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-danger:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-status-error) 85%, black);\n }\n\n /* Form Styles */\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group:last-child {\n margin-bottom: 0;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .form-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.2s, box-shadow 0.2s;\n box-sizing: border-box;\n }\n\n .form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .form-input:disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n textarea.form-input {\n resize: vertical;\n min-height: 80px;\n }\n\n select.form-input {\n cursor: pointer;\n }\n\n .custom-select-wrapper {\n position: relative;\n }\n\n /* Portal Dropdown - Fixed positioning to escape modal z-index */\n .entity-dropdown-portal {\n position: fixed;\n z-index: 10002; /* Above modal (1001) */\n }\n\n .entity-dropdown-content {\n max-height: 200px;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: var(--mj-shadow-md);\n }\n\n .entity-dropdown-content.open-above {\n position: absolute;\n bottom: 0;\n }\n\n .dropdown-item {\n padding: 10px 12px;\n cursor: pointer;\n transition: background 0.15s;\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .dropdown-item:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .dropdown-item:first-child {\n border-radius: 6px 6px 0 0;\n }\n\n .dropdown-item:last-child {\n border-radius: 0 0 6px 6px;\n }\n\n .dropdown-empty {\n padding: 10px 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .lists-header {\n flex-direction: column;\n gap: 16px;\n align-items: stretch;\n }\n\n .header-actions {\n flex-direction: column;\n }\n\n .search-box input {\n width: 100%;\n }\n\n .btn-create {\n width: 100%;\n justify-content: center;\n }\n\n .lists-grid {\n grid-template-columns: 1fr;\n }\n\n .modal-dialog {\n width: 95vw;\n }\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ListsMyListsResource extends BaseResourceComponent implements OnDestroy {\n protected override destroy$ = new Subject<void>();\n\n isLoading = true;\n searchTerm = '';\n viewMode: 'grid' | 'list' = 'grid';\n\n allLists: ListViewModel[] = [];\n filteredLists: ListViewModel[] = [];\n categories: MJListCategoryEntity[] = [];\n categoryTree: CategoryNode[] = [];\n flatCategories: Array<{ ID: string | null; displayName: string }> = [];\n availableEntities: Array<{ ID: string; Name: string }> = [];\n filteredEntities: Array<{ ID: string; Name: string }> = [];\n\n // Context menu\n showContextMenu = false;\n contextMenuX = 0;\n contextMenuY = 0;\n selectedContextList: MJListEntity | null = null;\n\n /**\n * Whether the current user may DELETE the context-menu's list — the same shared ownership rule\n * the server enforces (owner, or a Developer/Integration user). This \"My Lists\" view is\n * owner-scoped, so for the standard case it's the owner and resolves true; the gate makes it\n * correct-by-construction (and consistent with the Browse view) rather than an unconditional button.\n */\n public get CanDeleteSelectedList(): boolean {\n const list = this.selectedContextList;\n if (!list) {\n return false;\n }\n return MJListEntityExtended.UserCanDelete(list.UserID, this.ProviderToUse.CurrentUser);\n }\n\n // Create/Edit dialog\n showCreateDialog = false;\n editingList: MJListEntity | null = null;\n newListName = '';\n newListDescription = '';\n selectedEntityId = '';\n selectedCategoryId: string | null = null;\n entitySearchTerm = '';\n showEntityDropdown = false;\n entityDropdownPosition = { top: 0, left: 0, width: 0, openAbove: false };\n\n // Delete confirmation\n showDeleteConfirm = false;\n deleteListName = '';\n listToDelete: MJListEntity | null = null;\n\n // Operation states\n isSaving = false;\n isDeleting = false;\n\n private categoryMap: Map<string, MJListCategoryEntity> = new Map();\n private entityColorMap: Map<string, string> = new Map();\n private entityIconMap: Map<string, string> = new Map();\n\n constructor(\n private cdr: ChangeDetectorRef,\n private tabService: TabService,\n private notificationService: MJNotificationService,\n private elementRef: ElementRef\n ) {\n super();\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent) {\n // Close entity dropdown when clicking outside the input or dropdown\n if (this.showEntityDropdown) {\n const target = event.target as HTMLElement;\n if (!target.closest('.custom-select-wrapper') && !target.closest('.entity-dropdown-portal')) {\n this.showEntityDropdown = false;\n }\n }\n }\n\n @HostListener('document:keydown.escape')\n onEscapeKey() {\n if (this.showContextMenu) {\n this.closeContextMenu();\n }\n if (this.showCreateDialog) {\n this.closeCreateDialog();\n }\n if (this.showDeleteConfirm) {\n this.cancelDelete();\n }\n }\n\n async ngOnInit() {\n super.ngOnInit();\n await this.loadData();\n this.registerAgentTools();\n this.publishAgentContext();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy() {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ================================================================\n // AI Agent Context & Client Tools\n //\n // SAFETY BOUNDARY: SAFE (open / search / view) operations plus ONE\n // bounded-mutation tool (CreateList) that opens the dialog-validated\n // create flow. INTENTIONALLY EXCLUDED — must NOT be wired in:\n // - EditList (editList) — mutates an existing record\n // - DeleteList (confirmDeleteList) — destructive\n // ================================================================\n\n /** Report the My-Lists surface's salient state to the AI agent. */\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 user's currently-visible lists (bounded),\n // so the agent can open them by name rather than an opaque GUID.\n VisibleListNames: this.filteredLists.map(i => i.list.Name),\n }));\n }\n\n /**\n * Resolve an agent-supplied reference (a list ID or NAME, exact or partial) to\n * one of the user's loaded lists via the pure {@link resolveNamedRecord} helper.\n */\n private resolveMyListItem(input: string): ListViewModel | 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 /** Register the My-Lists surface's agent-actionable tools. */\n private registerAgentTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'OpenList',\n Description: 'Open one of my lists 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 check = validateStringParam(params['list'] ?? params['listId'], 'list');\n if (!check.ok) return check.result;\n const item = this.resolveMyListItem(check.value);\n if (!item) return { Success: false, ErrorMessage: buildNotFoundError(check.value, this.allLists.map(i => ({ ID: i.list.ID, Name: i.list.Name })), 'list') };\n this.openList(item.list);\n return { Success: true, Data: { listName: item.list.Name } };\n },\n },\n {\n Name: 'SearchLists',\n Description: 'Set the search term that filters my lists.',\n ParameterSchema: { type: 'object', properties: { searchTerm: { type: 'string' } }, 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.searchTerm = check.value;\n this.onSearchChange(check.value);\n this.publishAgentContext();\n return { Success: true, Data: { resultCount: this.filteredLists.length } };\n },\n },\n {\n Name: 'SetViewMode',\n Description: 'Set the view mode: \"grid\" or \"list\".',\n ParameterSchema: { type: 'object', properties: { mode: { type: 'string', enum: ['grid', 'list'] } }, required: ['mode'] },\n Handler: async (params: Record<string, unknown>) => {\n const check = validateEnumParam(params['mode'], ['grid', 'list'] as const, 'mode');\n if (!check.ok) return check.result;\n this.setViewMode(check.value);\n return { Success: true };\n },\n },\n {\n // BOUNDED MUTATION: opens the dialog-validated create flow only.\n Name: 'CreateList',\n Description: 'Open the \"Create New List\" dialog. Nothing is saved until the user confirms the name and entity.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.createNewList();\n return { Success: true };\n },\n },\n ]);\n }\n\n async loadData() {\n this.isLoading = true;\n\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const userId = md.CurrentUser?.ID;\n\n if (!userId) {\n console.error('No current user');\n return;\n }\n\n // Load lists and categories in parallel; item counts follow as a\n // batched set of count_only queries (index-seek COUNTs server-side)\n // instead of transferring every membership row to the client.\n const [listsResult, categoriesResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Lists',\n ExtraFilter: `UserID = '${userId}'`,\n OrderBy: 'Name',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: List Categories',\n OrderBy: 'Name',\n ResultType: 'entity_object'\n }\n ]);\n\n if (!listsResult.Success || !categoriesResult.Success) {\n console.error('Failed to load lists data');\n return;\n }\n\n const lists = listsResult.Results as MJListEntity[];\n this.categories = categoriesResult.Results as MJListCategoryEntity[];\n\n // Build category map\n this.categoryMap.clear();\n for (const cat of this.categories) {\n this.categoryMap.set(cat.ID, cat);\n }\n\n // Count items per list — one batched round trip\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 })));\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 for (const entity of entities) {\n this.entityColorMap.set(entity.Name, this.generateEntityColor(entity.Name));\n this.entityIconMap.set(entity.Name, entity.Icon || 'fa-solid fa-table');\n }\n\n // Build list view models\n this.allLists = lists.map(list => ({\n list,\n itemCount: itemCounts.get(list.ID) || 0,\n entityName: list.Entity || 'Unknown'\n }));\n\n // Build available entities for dropdown\n this.availableEntities = entities\n .filter(e => e.IncludeInAPI)\n .map(e => ({ ID: e.ID, Name: e.Name }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n this.filteredEntities = [...this.availableEntities];\n\n // Build flat categories for dropdown\n this.flatCategories = this.buildFlatCategories(this.categories);\n\n this.applyFilter();\n this.buildCategoryTree();\n } catch (error) {\n console.error('Error loading lists:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private buildFlatCategories(categories: MJListCategoryEntity[]): Array<{ ID: string; displayName: string }> {\n const result: Array<{ ID: string; displayName: string }> = [];\n const topLevel = categories.filter(c => !c.ParentID);\n\n const processCategory = (cat: MJListCategoryEntity, level: number) => {\n const indent = '\\u00A0\\u00A0'.repeat(level);\n result.push({ ID: cat.ID, displayName: `${indent}${cat.Name}` });\n\n const children = categories.filter(c => UUIDsEqual(c.ParentID, cat.ID));\n for (const child of children) {\n processCategory(child, level + 1);\n }\n };\n\n for (const cat of topLevel) {\n processCategory(cat, 0);\n }\n\n return result;\n }\n\n private buildCategoryTree() {\n const rootNodes: CategoryNode[] = [];\n const categoryNodes = new Map<string, CategoryNode>();\n\n // Create nodes for all categories\n for (const cat of this.categories) {\n categoryNodes.set(cat.ID, {\n category: cat,\n lists: [],\n children: [],\n isExpanded: true\n });\n }\n\n // Build tree structure\n for (const cat of this.categories) {\n const node = categoryNodes.get(cat.ID)!;\n if (cat.ParentID && categoryNodes.has(cat.ParentID)) {\n categoryNodes.get(cat.ParentID)!.children.push(node);\n } else {\n rootNodes.push(node);\n }\n }\n\n // Assign lists to categories\n const uncategorizedLists: ListViewModel[] = [];\n for (const item of this.filteredLists) {\n if (item.list.CategoryID && categoryNodes.has(item.list.CategoryID)) {\n categoryNodes.get(item.list.CategoryID)!.lists.push(item);\n } else {\n uncategorizedLists.push(item);\n }\n }\n\n // Add uncategorized node if there are uncategorized lists\n if (uncategorizedLists.length > 0) {\n rootNodes.unshift({\n category: null,\n lists: uncategorizedLists,\n children: [],\n isExpanded: true\n });\n }\n\n this.categoryTree = rootNodes;\n }\n\n onSearchChange(_term: string) {\n this.applyFilter();\n this.buildCategoryTree();\n this.publishAgentContext();\n }\n\n /** Set the grid/list view mode and refresh agent context. */\n setViewMode(mode: 'grid' | 'list') {\n this.viewMode = mode;\n this.publishAgentContext();\n }\n\n clearSearch() {\n this.searchTerm = '';\n this.applyFilter();\n this.buildCategoryTree();\n }\n\n /** Message for the no-results empty state, echoing the active search term. */\n public get NoResultsMessage(): string {\n return `No lists match \"${this.searchTerm}\". Try a different search term or clear your search.`;\n }\n\n private applyFilter() {\n if (!this.searchTerm) {\n this.filteredLists = [...this.allLists];\n } else {\n const term = this.searchTerm.toLowerCase();\n this.filteredLists = this.allLists.filter(item =>\n item.list.Name.toLowerCase().includes(term) ||\n (item.list.Description && item.list.Description.toLowerCase().includes(term)) ||\n item.entityName.toLowerCase().includes(term)\n );\n }\n }\n\n toggleCategory(node: CategoryNode) {\n node.isExpanded = !node.isExpanded;\n }\n\n getListCountInCategory(node: CategoryNode): number {\n let count = node.lists.length;\n for (const child of node.children) {\n count += this.getListCountInCategory(child);\n }\n return count;\n }\n\n getCategoryName(categoryId: string): string {\n return this.categoryMap.get(categoryId)?.Name || 'Unknown';\n }\n\n getEntityColor(entityName: string): string {\n return this.entityColorMap.get(entityName) || '#607D8B';\n }\n\n getEntityIcon(entityName: string): string {\n return this.entityIconMap.get(entityName) || 'fa-solid fa-table';\n }\n\n private generateEntityColor(entityName: string): string {\n let hash = 0;\n for (let i = 0; i < entityName.length; i++) {\n hash = entityName.charCodeAt(i) + ((hash << 5) - hash);\n }\n const colors = [\n '#2196F3', '#4CAF50', '#FF9800', '#9C27B0', '#F44336',\n '#00BCD4', '#795548', '#607D8B', '#E91E63', '#3F51B5'\n ];\n return colors[Math.abs(hash) % colors.length];\n }\n\n formatDate(date: Date): string {\n if (!date) return '';\n const now = new Date();\n const d = new Date(date);\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) return 'today';\n if (diffDays === 1) return 'yesterday';\n if (diffDays < 7) return `${diffDays} days ago`;\n if (diffDays < 30) return `${Math.floor(diffDays / 7)} weeks ago`;\n return d.toLocaleDateString();\n }\n\n openList(list: MJListEntity) {\n const appId = this.Data?.Configuration?.applicationId || '';\n this.tabService.OpenList(list.ID, list.Name, appId);\n }\n\n openListMenu(event: Event, list: MJListEntity) {\n event.stopPropagation();\n const mouseEvent = event as MouseEvent;\n this.selectedContextList = list;\n this.contextMenuX = mouseEvent.clientX;\n this.contextMenuY = mouseEvent.clientY;\n this.showContextMenu = true;\n }\n\n closeContextMenu() {\n this.showContextMenu = false;\n this.selectedContextList = null;\n }\n\n createNewList() {\n this.editingList = null;\n this.newListName = '';\n this.newListDescription = '';\n this.selectedEntityId = '';\n this.entitySearchTerm = '';\n this.selectedCategoryId = null;\n this.showEntityDropdown = false;\n this.showCreateDialog = true;\n }\n\n editList() {\n if (!this.selectedContextList) return;\n\n this.editingList = this.selectedContextList;\n this.newListName = this.selectedContextList.Name;\n this.newListDescription = this.selectedContextList.Description || '';\n this.selectedEntityId = this.selectedContextList.EntityID;\n this.entitySearchTerm = this.selectedContextList.Entity || '';\n this.selectedCategoryId = this.selectedContextList.CategoryID || null;\n this.showCreateDialog = true;\n this.closeContextMenu();\n }\n\n selectEntity(entity: { ID: string; Name: string }) {\n this.selectedEntityId = entity.ID;\n this.entitySearchTerm = entity.Name;\n this.showEntityDropdown = false;\n }\n\n filterEntities(term: string) {\n const lowerTerm = term.toLowerCase();\n this.filteredEntities = this.availableEntities.filter(e =>\n e.Name.toLowerCase().includes(lowerTerm)\n );\n // Ensure dropdown is visible while typing\n if (!this.showEntityDropdown && term) {\n this.showEntityDropdown = true;\n }\n // Clear selection when user modifies the search text\n this.selectedEntityId = '';\n }\n\n openEntityDropdown(inputElement: HTMLInputElement) {\n const rect = inputElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const dropdownHeight = 200; // estimated max height\n const spaceBelow = viewportHeight - rect.bottom;\n const openAbove = spaceBelow < dropdownHeight && rect.top > dropdownHeight;\n\n this.entityDropdownPosition = {\n top: openAbove ? rect.top - dropdownHeight : rect.bottom,\n left: rect.left,\n width: rect.width,\n openAbove\n };\n this.showEntityDropdown = true;\n this.filteredEntities = [...this.availableEntities];\n }\n\n closeEntityDropdown() {\n this.showEntityDropdown = false;\n }\n\n async duplicateList() {\n if (!this.selectedContextList) return;\n\n const listToDuplicate = this.selectedContextList;\n this.closeContextMenu();\n\n this.isLoading = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n const newList = await md.GetEntityObject<MJListEntity>('MJ: Lists');\n newList.Name = `${listToDuplicate.Name} (Copy)`;\n newList.Description = listToDuplicate.Description;\n newList.EntityID = listToDuplicate.EntityID;\n newList.CategoryID = listToDuplicate.CategoryID;\n newList.UserID = md.CurrentUser!.ID;\n\n const listSaved = await newList.Save();\n if (!listSaved) {\n this.notificationService.CreateSimpleNotification('Failed to duplicate list', 'error', 4000);\n return;\n }\n\n const itemsResult = await rv.RunView<MJListDetailEntity>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID = '${listToDuplicate.ID}'`,\n ResultType: 'entity_object'\n });\n\n if (itemsResult.Success && itemsResult.Results.length > 0) {\n let copiedCount = 0;\n for (const item of itemsResult.Results) {\n const newItem = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details');\n newItem.ListID = newList.ID;\n newItem.RecordID = item.RecordID;\n newItem.Sequence = item.Sequence;\n const itemSaved = await newItem.Save();\n if (itemSaved) copiedCount++;\n }\n this.notificationService.CreateSimpleNotification(\n `List duplicated with ${copiedCount} item${copiedCount !== 1 ? 's' : ''}`,\n 'success',\n 3000\n );\n } else {\n this.notificationService.CreateSimpleNotification('List duplicated successfully', 'success', 3000);\n }\n\n await this.loadData();\n } catch (error) {\n console.error('Error duplicating list:', error);\n this.notificationService.CreateSimpleNotification('Error duplicating list. Please try again.', 'error', 4000);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n confirmDeleteList() {\n if (!this.selectedContextList) return;\n this.listToDelete = this.selectedContextList;\n this.deleteListName = this.selectedContextList.Name;\n this.showDeleteConfirm = true;\n this.closeContextMenu();\n }\n\n cancelDelete() {\n this.showDeleteConfirm = false;\n this.listToDelete = null;\n this.deleteListName = '';\n }\n\n async deleteList() {\n if (!this.listToDelete) return;\n\n const listToDelete = this.listToDelete;\n const listName = listToDelete.Name;\n\n // Defense-in-depth: re-check the shared ownership rule before deleting (the server is the true\n // enforcement point, but this fails fast with a clean message).\n if (!MJListEntityExtended.UserCanDelete(listToDelete.UserID, this.ProviderToUse.CurrentUser)) {\n this.notificationService.CreateSimpleNotification(\n `You don't have permission to delete \"${listName}\".`, 'error', 6000,\n );\n return;\n }\n\n this.isDeleting = true;\n this.cdr.detectChanges();\n\n try {\n const deleted = await listToDelete.Delete();\n if (deleted) {\n this.notificationService.CreateSimpleNotification(`\"${listName}\" deleted`, 'success', 3000);\n } else {\n // Get the detailed error message from LatestResult\n const errorMessage = listToDelete.LatestResult?.Message || 'Unknown error occurred';\n console.error('Failed to delete list:', listToDelete.LatestResult);\n this.notificationService.CreateSimpleNotification(`Failed to delete list: ${errorMessage}`, 'error', 6000);\n }\n this.cancelDelete();\n await this.loadData();\n } catch (error) {\n console.error('Error deleting list:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error deleting list: ${errorMessage}`, 'error', 6000);\n } finally {\n this.isDeleting = false;\n this.cdr.detectChanges();\n }\n }\n\n closeCreateDialog() {\n this.showCreateDialog = false;\n this.editingList = null;\n this.showEntityDropdown = false;\n }\n\n async saveList() {\n this.isSaving = true;\n this.cdr.detectChanges();\n\n const isEditing = !!this.editingList;\n const listName = this.newListName;\n\n try {\n const md = this.ProviderToUse;\n let list: MJListEntity;\n\n if (this.editingList) {\n list = this.editingList;\n } else {\n list = await md.GetEntityObject<MJListEntity>('MJ: Lists');\n list.UserID = md.CurrentUser!.ID;\n list.EntityID = this.selectedEntityId;\n }\n\n list.Name = this.newListName;\n list.Description = this.newListDescription || null;\n list.CategoryID = this.selectedCategoryId || null;\n\n const saved = await list.Save();\n if (saved) {\n this.notificationService.CreateSimpleNotification(\n isEditing ? `\"${listName}\" updated` : `\"${listName}\" created`,\n 'success',\n 3000\n );\n this.closeCreateDialog();\n await this.loadData();\n } else {\n // Get the detailed error message from LatestResult\n const errorMessage = list.LatestResult?.Message || 'Unknown error occurred';\n const action = isEditing ? 'update' : 'create';\n console.error(`Failed to ${action} list:`, list.LatestResult);\n this.notificationService.CreateSimpleNotification(\n `Failed to ${action} list: ${errorMessage}`,\n 'error',\n 6000\n );\n }\n } catch (error) {\n console.error('Error saving list:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error saving list: ${errorMessage}`, 'error', 6000);\n } finally {\n this.isSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'My Lists';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-list-check';\n }\n}\n"]}