@memberjunction/ng-dashboards 5.35.0 → 5.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/agents/agent-configuration.component.js +3 -3
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +22 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +157 -137
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +28 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2075 -2068
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +4 -4
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +3 -3
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +15 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +1411 -1424
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts +12 -8
- package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +329 -371
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +137 -142
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +111 -116
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +13 -65
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +13 -65
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +13 -65
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +13 -65
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/Admin/base-admin-container.component.d.ts +9 -7
- package/dist/Admin/base-admin-container.component.d.ts.map +1 -1
- package/dist/Admin/base-admin-container.component.js +26 -17
- package/dist/Admin/base-admin-container.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +74 -67
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Communication/communication-new-message-resource.component.d.ts +93 -0
- package/dist/Communication/communication-new-message-resource.component.d.ts.map +1 -0
- package/dist/Communication/communication-new-message-resource.component.js +661 -0
- package/dist/Communication/communication-new-message-resource.component.js.map +1 -0
- package/dist/Credentials/components/credentials-categories-resource.component.js +152 -159
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +151 -155
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +20 -21
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts +2 -0
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +131 -125
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +7 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/DevTools/app-state-inspector.component.d.ts +5 -0
- package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/app-state-inspector.component.js +46 -72
- package/dist/DevTools/app-state-inspector.component.js.map +1 -1
- package/dist/DevTools/class-registry.component.js +88 -100
- package/dist/DevTools/class-registry.component.js.map +1 -1
- package/dist/DevTools/event-monitor.component.js +158 -168
- package/dist/DevTools/event-monitor.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +257 -264
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/DevTools/layout-inspector.component.d.ts +5 -0
- package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/layout-inspector.component.js +46 -64
- package/dist/DevTools/layout-inspector.component.js.map +1 -1
- package/dist/DevTools/lazy-module-status.component.js +75 -84
- package/dist/DevTools/lazy-module-status.component.js.map +1 -1
- package/dist/DevTools/settings-explorer.component.js +76 -85
- package/dist/DevTools/settings-explorer.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +2 -0
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +7 -3
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +97 -99
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +842 -855
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +502 -517
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +78 -89
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +5 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1120 -1128
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +11 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +606 -661
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +102 -0
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +1179 -504
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts +133 -3
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +1527 -327
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts +29 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts.map +1 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.js +77 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.js.map +1 -0
- package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts +6 -0
- package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts.map +1 -1
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js +35 -7
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
- package/dist/Lists/index.d.ts +1 -0
- package/dist/Lists/index.d.ts.map +1 -1
- package/dist/Lists/index.js +1 -0
- package/dist/Lists/index.js.map +1 -1
- package/dist/Lists/services/list-set-operations.service.d.ts +93 -2
- package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
- package/dist/Lists/services/list-set-operations.service.js +236 -10
- package/dist/Lists/services/list-set-operations.service.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +19 -19
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +58 -60
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +13 -3
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +1007 -1252
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +31 -6
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +543 -629
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +50 -49
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +1 -1
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +16 -1
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +9 -7
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +13 -4
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +1 -1
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +16 -1
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/lists-dashboards.module.d.ts +10 -9
- package/dist/lists-dashboards.module.d.ts.map +1 -1
- package/dist/lists-dashboards.module.js +13 -2
- package/dist/lists-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -0
- package/dist/public-api.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +1 -1
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +13 -1
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +53 -52
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lists-operations-resource.component.js","sourceRoot":"","sources":["../../../src/Lists/components/lists-operations-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, ChangeDetectorRef, OnDestroy } from '@angular/core';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent, SharedService } from '@memberjunction/ng-shared';\nimport { ResourceData, MJListEntity, MJListDetailEntity, MJUserSettingEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { Metadata, RunView, EntityInfo, CompositeKey } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { ListSetOperationsService, VennData, VennIntersection, SetOperation, SetOperationResult } from '../services/list-set-operations.service';\nimport { VennRegionClickEvent } from './venn-diagram/venn-diagram.component';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\ninterface ListSelection {\n list: MJListEntity;\n entityName: string;\n color: string;\n}\n\n/**\n * Preview record with meaningful display fields\n */\ninterface PreviewRecord {\n id: string;\n displayName: string;\n secondaryInfo?: string;\n entityName: string;\n}\n\n/**\n * Entity option for filtering\n */\ninterface EntityOption {\n id: string;\n name: string;\n listCount: number;\n}\n\n@RegisterClass(BaseResourceComponent, 'ListsOperationsResource')\n@Component({\n standalone: false,\n selector: 'mj-lists-operations-resource',\n template: `\n <mj-page-layout>\n <mj-page-header\n Title=\"List Operations\"\n Icon=\"fa-solid fa-diagram-project\"\n Subtitle=\"Visualize overlaps and perform set operations on your lists\">\n @if (selectedLists.length > 0 || selectedEntityId) {\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"clearAllSelections()\" title=\"Clear all selections\">\n <i class=\"fa-solid fa-xmark\"></i> Clear\n </button>\n </div>\n }\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\" [Padding]=\"false\">\n <!-- Main Content -->\n <div class=\"operations-content\">\n <!-- Left Panel: List Selection -->\n <div class=\"selection-panel\">\n <div class=\"panel-header\">\n <h3>Selected Lists</h3>\n @if (selectedLists.length > 0) {\n <span class=\"list-count\">\n {{selectedLists.length}}/{{maxLists}}\n </span>\n }\n </div>\n \n <!-- Entity Filter Selector -->\n <div class=\"entity-filter-section\">\n <label class=\"filter-label\">Filter by Entity</label>\n <div class=\"entity-selector\">\n <select\n [(ngModel)]=\"selectedEntityId\"\n (ngModelChange)=\"onEntityFilterChange()\"\n class=\"entity-select\">\n <option value=\"\">All Entities</option>\n @for (entity of entityOptions; track entity) {\n <option [value]=\"entity.id\">\n {{entity.name}} ({{entity.listCount}})\n </option>\n }\n </select>\n </div>\n </div>\n \n <!-- Selected lists -->\n <div class=\"selected-lists\">\n @for (item of selectedLists; track item; let i = $index) {\n <div class=\"selected-item\">\n <div class=\"item-color\" [style.background-color]=\"item.color\"></div>\n <div class=\"item-info\">\n <span class=\"item-name\">{{item.list.Name}}</span>\n <span class=\"item-entity\">{{item.entityName}}</span>\n </div>\n <button class=\"remove-btn\" (click)=\"removeList(i)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n \n @if (selectedLists.length < maxLists) {\n <div class=\"add-list-area\">\n <div class=\"add-list-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n [(ngModel)]=\"listSearchTerm\"\n (ngModelChange)=\"filterAvailableLists()\"\n placeholder=\"Search lists to add...\"\n (focus)=\"showListDropdown = true\" />\n </div>\n <!-- Available lists dropdown -->\n @if (showListDropdown && filteredAvailableLists.length > 0) {\n <div class=\"list-dropdown\">\n <div class=\"dropdown-backdrop\" (click)=\"showListDropdown = false\"></div>\n <div class=\"dropdown-content\">\n @for (list of filteredAvailableLists; track list) {\n <div\n class=\"dropdown-item\"\n (click)=\"addList(list)\">\n <span class=\"dropdown-name\">{{list.Name}}</span>\n <span class=\"dropdown-entity\">{{list.Entity}}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n \n @if (selectedLists.length >= maxLists) {\n <div class=\"lists-full\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Maximum {{maxLists}} lists can be compared\n </div>\n }\n </div>\n \n <!-- Entity consistency note -->\n @if (selectedLists.length > 0) {\n <div class=\"entity-note\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>Comparing lists of type: <strong>{{selectedLists[0].entityName}}</strong></span>\n </div>\n }\n \n <!-- Quick Operations -->\n @if (selectedLists.length >= 2) {\n <div class=\"quick-operations\">\n <h4>Quick Operations</h4>\n <div class=\"operation-buttons\">\n <button class=\"op-btn\" (click)=\"performOperation('union')\" [disabled]=\"isCalculating\">\n <i class=\"fa-solid fa-layer-group\"></i>\n <span>Union All</span>\n </button>\n <button class=\"op-btn\" (click)=\"performOperation('intersection')\" [disabled]=\"isCalculating\">\n <i class=\"fa-solid fa-circle-notch\"></i>\n <span>Intersection</span>\n </button>\n <button class=\"op-btn\" (click)=\"performOperation('symmetric_difference')\" [disabled]=\"isCalculating\">\n <i class=\"fa-solid fa-arrows-split-up-and-left\"></i>\n <span>Unique Each</span>\n </button>\n </div>\n </div>\n }\n </div>\n \n <!-- Center: Venn Diagram -->\n <div class=\"venn-panel\">\n @if (selectedLists.length > 0) {\n <mj-venn-diagram\n [data]=\"vennData\"\n [selectedRegion]=\"selectedRegion\"\n (regionClick)=\"onRegionClick($event)\">\n </mj-venn-diagram>\n }\n \n @if (selectedLists.length === 0) {\n <div class=\"venn-empty\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-circle-nodes\"></i>\n </div>\n <h3>Add Lists to Compare</h3>\n <p>Select 2-4 lists from the same entity to visualize their overlaps and perform set operations.</p>\n </div>\n }\n \n @if (isCalculating) {\n <div class=\"loading-overlay\">\n <mj-loading text=\"Calculating...\"></mj-loading>\n </div>\n }\n </div>\n \n <!-- Right Panel: Selected Region / Results -->\n <div class=\"results-panel\">\n <div class=\"panel-header\">\n <h3>\n <i class=\"fa-solid fa-crosshairs\"></i>\n {{selectedRegion ? 'Selected Region' : 'Results'}}\n </h3>\n </div>\n \n <!-- Selected region details -->\n @if (selectedRegion) {\n <div class=\"region-details\">\n <div class=\"region-header\">\n <span class=\"region-label\">{{selectedRegion.label}}</span>\n <span class=\"region-count\">{{selectedRegion.size}} records</span>\n </div>\n <div class=\"region-actions\">\n <button mjButton variant=\"primary\" (click)=\"createListFromSelection()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New List\n </button>\n <button mjButton (click)=\"addToExistingList()\">\n <i class=\"fa-solid fa-folder-plus\"></i>\n Add to List\n </button>\n <button mjButton (click)=\"exportToExcel()\">\n <i class=\"fa-solid fa-file-excel\"></i>\n Export\n </button>\n </div>\n @if (previewRecordsDisplay.length > 0) {\n <div class=\"record-preview\">\n <h5>Preview (first 10)</h5>\n <div class=\"preview-list\">\n @for (record of previewRecordsDisplay; track record) {\n <div class=\"preview-card\">\n <div class=\"preview-card-content\">\n <span class=\"preview-name\">{{record.displayName}}</span>\n @if (record.secondaryInfo) {\n <span class=\"preview-secondary\">{{record.secondaryInfo}}</span>\n }\n </div>\n <button class=\"preview-open-btn\" (click)=\"openRecord(record)\" title=\"Open record\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n </button>\n </div>\n }\n </div>\n @if (loadingPreview) {\n <div class=\"preview-loading\">\n <mj-loading text=\"Loading preview...\" size=\"small\"></mj-loading>\n </div>\n }\n </div>\n }\n </div>\n }\n \n <!-- Operation result -->\n @if (lastOperationResult && !selectedRegion) {\n <div class=\"operation-result\">\n <div class=\"result-header\">\n <span class=\"result-operation\">{{getOperationLabel(lastOperationResult.operation)}}</span>\n <span class=\"result-count\">{{lastOperationResult.resultCount}} records</span>\n </div>\n <div class=\"region-actions\">\n <button mjButton variant=\"primary\" (click)=\"createListFromResult()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New List\n </button>\n <button mjButton (click)=\"addResultToExistingList()\">\n <i class=\"fa-solid fa-folder-plus\"></i>\n Add to List\n </button>\n </div>\n </div>\n }\n \n <!-- Empty state -->\n @if (!selectedRegion && !lastOperationResult) {\n <div class=\"results-empty\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n <p>Click a region in the diagram or run an operation to see results</p>\n </div>\n }\n </div>\n </div>\n \n <!-- Create List Dialog -->\n @if (showCreateDialog) {\n <div class=\"modal-overlay\" (click)=\"cancelCreateDialog()\"></div>\n }\n @if (showCreateDialog) {\n <div class=\"modal-dialog\">\n <div class=\"modal-header\">\n <h3>Create New List from Selection</h3>\n <button class=\"modal-close\" (click)=\"cancelCreateDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"form-group\">\n <label>List 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-info\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{recordsToAdd.length}} record{{recordsToAdd.length !== 1 ? 's' : ''}} will be added to this list\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn-primary\" (click)=\"confirmCreateList()\" [disabled]=\"!newListName || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isSaving ? 'Creating...' : 'Create List'}}\n </button>\n <button class=\"btn-secondary\" (click)=\"cancelCreateDialog()\">Cancel</button>\n </div>\n </div>\n }\n \n <!-- Add to Existing List Dialog -->\n @if (showAddToListDialog) {\n <div class=\"modal-overlay\" (click)=\"cancelAddToListDialog()\"></div>\n }\n @if (showAddToListDialog) {\n <div class=\"modal-dialog add-to-list-dialog\">\n <div class=\"modal-header\">\n <h3>Add to Existing List</h3>\n <button class=\"modal-close\" (click)=\"cancelAddToListDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"form-info\" style=\"margin-bottom: 16px;\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{recordsToAdd.length}} record{{recordsToAdd.length !== 1 ? 's' : ''}} will be added\n </div>\n <!-- Search input -->\n <div class=\"list-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n [(ngModel)]=\"addToListSearchTerm\"\n (ngModelChange)=\"filterAddToListOptions()\"\n placeholder=\"Search lists...\"\n class=\"form-input\" />\n </div>\n <!-- List options -->\n <div class=\"list-options\">\n @for (list of filteredAddToListOptions; track list) {\n <div\n class=\"list-option\"\n [class.selected]=\"IsTargetListSelected(list)\"\n (click)=\"selectTargetList(list.ID)\">\n <div class=\"list-option-radio\">\n <input\n type=\"radio\"\n [checked]=\"IsTargetListSelected(list)\"\n name=\"targetList\" />\n </div>\n <div class=\"list-option-info\">\n <span class=\"list-option-name\">{{list.Name}}</span>\n <span class=\"list-option-entity\">{{list.Entity}}</span>\n </div>\n </div>\n }\n @if (filteredAddToListOptions.length === 0) {\n <div class=\"list-options-empty\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>{{addToListSearchTerm ? 'No lists match your search' : 'No other lists available'}}</p>\n </div>\n }\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn-primary\" (click)=\"confirmAddToList()\" [disabled]=\"!selectedTargetListId || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isSaving ? 'Adding...' : 'Add to List'}}\n </button>\n <button class=\"btn-secondary\" (click)=\"cancelAddToListDialog()\">Cancel</button>\n </div>\n </div>\n }\n </mj-page-body>\n </mj-page-layout>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .operations-header {\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .header-top {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 4px;\n }\n\n .header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .clear-all-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .clear-all-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n }\n\n .clear-all-btn i {\n font-size: 12px;\n }\n\n .header-title i {\n font-size: 24px;\n color: var(--mj-brand-primary);\n }\n\n .header-title h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .header-subtitle {\n color: var(--mj-text-secondary);\n font-size: 14px;\n }\n\n .operations-content {\n display: grid;\n grid-template-columns: 280px 1fr 300px;\n gap: 16px;\n flex: 1;\n padding: 16px;\n overflow: hidden;\n }\n\n /* Panels */\n .selection-panel,\n .results-panel {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .venn-panel {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n position: relative;\n min-height: 400px;\n }\n\n .panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .panel-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .list-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 /* Entity Filter */\n .entity-filter-section {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .filter-label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n }\n\n .entity-select {\n width: 100%;\n padding: 8px 12px;\n font-size: 13px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n outline: none;\n transition: border-color 0.2s;\n }\n\n .entity-select:focus {\n border-color: var(--mj-brand-primary);\n }\n\n .entity-note {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 8px 12px;\n padding: 8px 10px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-radius: 6px;\n font-size: 12px;\n color: var(--mj-status-success);\n }\n\n .entity-note i {\n color: var(--mj-status-success);\n }\n\n /* Selected Lists */\n .selected-lists {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n }\n\n .selected-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n margin-bottom: 8px;\n }\n\n .item-color {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n flex-shrink: 0;\n }\n\n .item-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n }\n\n .item-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .item-entity {\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .remove-btn {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n }\n\n .remove-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Add list area */\n .add-list-area {\n position: relative;\n }\n\n .add-list-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border: 1px dashed var(--mj-border-default);\n border-radius: 6px;\n transition: border-color 0.2s;\n }\n\n .add-list-search:focus-within {\n border-color: var(--mj-brand-primary);\n }\n\n .add-list-search i {\n color: var(--mj-text-muted);\n }\n\n .add-list-search input {\n flex: 1;\n border: none;\n outline: none;\n font-size: 13px;\n }\n\n .list-dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: 100;\n margin-top: 4px;\n }\n\n .dropdown-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n .dropdown-content {\n position: relative;\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 max-height: 200px;\n overflow-y: auto;\n }\n\n .dropdown-item {\n display: flex;\n flex-direction: column;\n padding: 10px 12px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .dropdown-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .dropdown-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .dropdown-entity {\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .lists-full {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n }\n\n .entity-warning {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin: 12px;\n padding: 10px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-radius: 6px;\n font-size: 12px;\n color: var(--mj-status-warning);\n }\n\n .entity-warning i {\n color: var(--mj-status-warning);\n margin-top: 2px;\n }\n\n /* Quick Operations */\n .quick-operations {\n padding: 12px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .quick-operations h4 {\n margin: 0 0 10px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .operation-buttons {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .op-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .op-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n }\n\n .op-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n /* Venn Panel */\n .venn-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n padding: 40px;\n }\n\n .empty-icon {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-radius: 50%;\n margin-bottom: 20px;\n }\n\n .empty-icon i {\n font-size: 36px;\n color: var(--mj-brand-primary);\n }\n\n .venn-empty h3 {\n margin: 0 0 8px;\n font-size: 18px;\n color: var(--mj-text-primary);\n }\n\n .venn-empty p {\n margin: 0;\n color: var(--mj-text-secondary);\n font-size: 14px;\n max-width: 300px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: color-mix(in srgb, var(--mj-bg-surface-card) 90%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n /* Results Panel */\n .region-details,\n .operation-result {\n padding: 16px;\n }\n\n .region-header,\n .result-header {\n margin-bottom: 16px;\n }\n\n .region-label,\n .result-operation {\n display: block;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n }\n\n .region-count,\n .result-count {\n font-size: 13px;\n color: var(--mj-brand-primary);\n font-weight: 500;\n }\n\n .region-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 16px;\n }\n\n .action-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .action-btn:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .action-btn.primary {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .action-btn.primary:hover {\n background: var(--mj-brand-primary-hover);\n }\n\n .record-preview h5 {\n margin: 0 0 8px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .preview-list {\n max-height: 200px;\n overflow-y: auto;\n }\n\n .preview-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n margin-bottom: 6px;\n transition: all 0.15s ease;\n }\n\n .preview-card:hover {\n background: var(--mj-bg-surface-sunken);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .preview-card-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .preview-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .preview-secondary {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .preview-open-btn {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n cursor: pointer;\n padding: 6px 8px;\n border-radius: 4px;\n opacity: 0.6;\n transition: all 0.15s ease;\n flex-shrink: 0;\n }\n\n .preview-open-btn:hover {\n opacity: 1;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .preview-loading {\n padding: 12px;\n text-align: center;\n }\n\n .results-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 200px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .results-empty i {\n font-size: 32px;\n margin-bottom: 12px;\n opacity: 0.5;\n }\n\n .results-empty p {\n font-size: 13px;\n margin: 0;\n max-width: 200px;\n }\n\n /* Modal */\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 width: 420px;\n max-width: 90vw;\n z-index: 1001;\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: 16px;\n color: var(--mj-text-primary);\n }\n\n .modal-close {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px 8px;\n }\n\n .modal-body {\n padding: 20px;\n }\n\n .form-group {\n margin-bottom: 16px;\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 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 textarea.form-input {\n resize: vertical;\n }\n\n .form-info {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .form-info i {\n color: var(--mj-brand-primary);\n }\n\n .modal-footer {\n display: flex;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\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 }\n\n .btn-secondary:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n /* Add to List Dialog */\n .add-to-list-dialog {\n width: 480px;\n }\n\n .add-to-list-dialog .modal-body {\n max-height: 400px;\n overflow-y: auto;\n }\n\n .list-search {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n margin-bottom: 12px;\n }\n\n .list-search i {\n color: var(--mj-text-muted);\n flex-shrink: 0;\n }\n\n .list-search .form-input {\n flex: 1;\n border: none;\n background: transparent;\n padding: 0;\n font-size: 14px;\n }\n\n .list-search .form-input:focus {\n box-shadow: none;\n outline: none;\n }\n\n .list-options {\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n max-height: 250px;\n overflow-y: auto;\n }\n\n .list-option {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n cursor: pointer;\n transition: background 0.15s;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .list-option:last-child {\n border-bottom: none;\n }\n\n .list-option:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-option.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .list-option-radio {\n flex-shrink: 0;\n }\n\n .list-option-radio input[type=\"radio\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n }\n\n .list-option-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .list-option-name {\n font-size: 14px;\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-option-entity {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .list-options-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 30px 20px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .list-options-empty i {\n font-size: 28px;\n margin-bottom: 10px;\n opacity: 0.5;\n }\n\n .list-options-empty p {\n margin: 0;\n font-size: 13px;\n }\n\n /* Responsive */\n @media (max-width: 1024px) {\n .operations-content {\n grid-template-columns: 1fr;\n grid-template-rows: auto 1fr auto;\n }\n\n .selection-panel {\n order: 1;\n }\n\n .venn-panel {\n order: 2;\n min-height: 300px;\n }\n\n .results-panel {\n order: 3;\n }\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ListsOperationsResource extends BaseResourceComponent implements OnDestroy {\n protected override destroy$ = new Subject<void>();\n\n maxLists = 4;\n selectedLists: ListSelection[] = [];\n availableLists: MJListEntity[] = [];\n filteredAvailableLists: MJListEntity[] = [];\n listSearchTerm = '';\n showListDropdown = false;\n\n // Entity filter\n entityOptions: EntityOption[] = [];\n selectedEntityId = '';\n\n vennData: VennData | null = null;\n selectedRegion: VennIntersection | null = null;\n lastOperationResult: SetOperationResult | null = null;\n previewRecords: string[] = [];\n previewRecordsDisplay: PreviewRecord[] = [];\n loadingPreview = false;\n\n isCalculating = false;\n isSaving = false;\n\n // Create dialog\n showCreateDialog = false;\n newListName = '';\n newListDescription = '';\n recordsToAdd: string[] = [];\n\n // Add to existing list dialog\n showAddToListDialog = false;\n addToListSearchTerm = '';\n filteredAddToListOptions: MJListEntity[] = [];\n selectedTargetListId: string | null = null;\n\n private entityIdFromSelectedLists: string | null = null;\n private currentEntityInfo: EntityInfo | null = null;\n\n // User Settings persistence\n private readonly USER_SETTING_KEY = 'ListsOperations.State';\n private saveSettingsTimeout: ReturnType<typeof setTimeout> | null = null;\n private isLoadingSettings = false;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private setOperationsService: ListSetOperationsService,\n private notificationService: MJNotificationService\n ) {\n super();\n }\n\n get hasMultipleEntities(): boolean {\n if (this.selectedLists.length < 2) return false;\n const entities = new Set(this.selectedLists.map(s => s.list.EntityID));\n return entities.size > 1;\n }\n\n async ngOnInit() {\n super.ngOnInit();\n this.setOperationsService.Provider = this.ProviderToUse;\n await this.loadAvailableLists();\n await this.loadSavedState();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy() {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n\n // Clear any pending save timeout\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n }\n\n async loadAvailableLists() {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const md = this.ProviderToUse;\n\n const result = await rv.RunView<MJListEntity>({\n EntityName: 'MJ: Lists',\n ExtraFilter: `UserID = '${md.CurrentUser?.ID}'`,\n OrderBy: 'Name',\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.availableLists = result.Results || [];\n this.buildEntityOptions();\n this.filterAvailableLists();\n }\n }\n\n /**\n * Build entity options for the filter dropdown\n */\n private buildEntityOptions(): void {\n const entityCounts = new Map<string, { name: string; count: number }>();\n\n for (const list of this.availableLists) {\n const existing = entityCounts.get(list.EntityID);\n if (existing) {\n existing.count++;\n } else {\n entityCounts.set(list.EntityID, { name: list.Entity || 'Unknown', count: 1 });\n }\n }\n\n this.entityOptions = Array.from(entityCounts.entries())\n .map(([id, data]) => ({\n id,\n name: data.name,\n listCount: data.count\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n }\n\n /**\n * Handle entity filter change\n */\n onEntityFilterChange(): void {\n // Clear selected lists if changing entity filter\n if (this.selectedLists.length > 0) {\n const firstEntityId = this.selectedLists[0].list.EntityID;\n if (this.selectedEntityId && this.selectedEntityId !== firstEntityId) {\n // Entity changed - clear selections\n this.selectedLists = [];\n this.vennData = null;\n this.selectedRegion = null;\n this.lastOperationResult = null;\n this.previewRecordsDisplay = [];\n }\n }\n this.filterAvailableLists();\n this.saveState();\n }\n\n filterAvailableLists() {\n const selectedIds = new Set(this.selectedLists.map(s => s.list.ID));\n let filtered = this.availableLists.filter(l => !selectedIds.has(l.ID));\n\n // Apply entity filter from dropdown\n if (this.selectedEntityId) {\n filtered = filtered.filter(l => UUIDsEqual(l.EntityID, this.selectedEntityId));\n }\n\n // If we have selected lists, restrict to same entity\n if (this.selectedLists.length > 0) {\n this.entityIdFromSelectedLists = this.selectedLists[0].list.EntityID;\n filtered = filtered.filter(l => UUIDsEqual(l.EntityID, this.entityIdFromSelectedLists));\n }\n\n if (this.listSearchTerm) {\n const term = this.listSearchTerm.toLowerCase();\n filtered = filtered.filter(l =>\n l.Name.toLowerCase().includes(term) ||\n (l.Entity && l.Entity.toLowerCase().includes(term))\n );\n }\n\n this.filteredAvailableLists = filtered.slice(0, 10);\n }\n\n addList(list: MJListEntity) {\n const color = this.setOperationsService.getColorForIndex(this.selectedLists.length);\n\n this.selectedLists.push({\n list,\n entityName: list.Entity || 'Unknown',\n color\n });\n\n this.listSearchTerm = '';\n this.showListDropdown = false;\n this.filterAvailableLists();\n this.recalculateVenn();\n this.saveState();\n }\n\n removeList(index: number) {\n this.selectedLists.splice(index, 1);\n\n // Reassign colors\n this.selectedLists.forEach((item, i) => {\n item.color = this.setOperationsService.getColorForIndex(i);\n });\n\n this.filterAvailableLists();\n this.recalculateVenn();\n this.saveState();\n }\n\n async recalculateVenn() {\n if (this.selectedLists.length === 0) {\n this.vennData = null;\n this.selectedRegion = null;\n this.lastOperationResult = null;\n return;\n }\n\n this.isCalculating = true;\n this.cdr.detectChanges();\n\n try {\n const lists = this.selectedLists.map(s => s.list);\n this.vennData = await this.setOperationsService.calculateVennData(lists);\n this.selectedRegion = null;\n this.lastOperationResult = null;\n } catch (error) {\n console.error('Error calculating Venn data:', error);\n } finally {\n this.isCalculating = false;\n this.cdr.detectChanges();\n }\n }\n\n onRegionClick(event: VennRegionClickEvent) {\n this.selectedRegion = event.intersection;\n this.lastOperationResult = null;\n this.previewRecords = event.recordIds.slice(0, 10);\n this.loadPreviewRecords(event.recordIds.slice(0, 10));\n this.cdr.detectChanges();\n }\n\n /**\n * Load preview records with meaningful display fields\n */\n private async loadPreviewRecords(recordIds: string[]): Promise<void> {\n if (recordIds.length === 0 || this.selectedLists.length === 0) {\n this.previewRecordsDisplay = [];\n return;\n }\n\n this.loadingPreview = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const entityId = this.selectedLists[0].list.EntityID;\n const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, entityId));\n\n if (!entityInfo) {\n // Fallback to showing just IDs\n this.previewRecordsDisplay = recordIds.map(id => ({\n id,\n displayName: id,\n entityName: this.selectedLists[0].entityName\n }));\n return;\n }\n\n this.currentEntityInfo = entityInfo;\n\n // Find the best display fields\n const displayFields = this.getDisplayFields(entityInfo);\n\n // Build filter for the records\n const primaryKeyFields = entityInfo.PrimaryKeys;\n const primaryKeyField = primaryKeyFields.length > 0 ? primaryKeyFields[0].Name : 'ID';\n const recordIdFilter = recordIds.map(id => `'${id}'`).join(',');\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<Record<string, unknown>>({\n EntityName: entityInfo.Name,\n ExtraFilter: `${primaryKeyField} IN (${recordIdFilter})`,\n Fields: [primaryKeyField, ...displayFields],\n ResultType: 'simple'\n });\n\n if (result.Success && result.Results) {\n this.previewRecordsDisplay = result.Results.map(record => {\n const id = String(record[primaryKeyField] || '');\n const displayName = this.getDisplayValue(record, displayFields[0]) || id;\n const secondaryInfo = displayFields.length > 1\n ? this.getDisplayValue(record, displayFields[1])\n : undefined;\n\n return {\n id,\n displayName,\n secondaryInfo,\n entityName: entityInfo.Name\n };\n });\n } else {\n // Fallback\n this.previewRecordsDisplay = recordIds.map(id => ({\n id,\n displayName: id,\n entityName: entityInfo.Name\n }));\n }\n } catch (error) {\n console.error('Error loading preview records:', error);\n this.previewRecordsDisplay = recordIds.map(id => ({\n id,\n displayName: id,\n entityName: this.selectedLists[0]?.entityName || 'Unknown'\n }));\n } finally {\n this.loadingPreview = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Get the best display fields for an entity based on metadata\n */\n private getDisplayFields(entityInfo: EntityInfo): string[] {\n const fields: string[] = [];\n\n // First priority: NameField (IsNameField = true)\n const nameField = entityInfo.Fields.find(f => f.IsNameField);\n if (nameField) {\n fields.push(nameField.Name);\n }\n\n // Second priority: DefaultInView fields (excluding primary key unless it's also the name field)\n const defaultViewFields = entityInfo.Fields\n .filter(f => f.DefaultInView && !f.IsPrimaryKey && f.Name !== nameField?.Name)\n .slice(0, 2); // Take up to 2 more fields\n\n for (const field of defaultViewFields) {\n if (!fields.includes(field.Name)) {\n fields.push(field.Name);\n }\n }\n\n // If we still don't have any fields, use common field names\n if (fields.length === 0) {\n const commonNames = ['Name', 'Title', 'Subject', 'Description', 'Email', 'FirstName'];\n for (const name of commonNames) {\n const field = entityInfo.Fields.find(f => f.Name === name);\n if (field) {\n fields.push(field.Name);\n break;\n }\n }\n }\n\n // If still nothing, include primary key\n if (fields.length === 0 && entityInfo.PrimaryKeys.length > 0) {\n fields.push(entityInfo.PrimaryKeys[0].Name);\n }\n\n return fields.slice(0, 3); // Max 3 fields\n }\n\n /**\n * Get a display value from a record\n */\n private getDisplayValue(record: Record<string, unknown>, fieldName: string): string | undefined {\n const value = record[fieldName];\n if (value === null || value === undefined) return undefined;\n if (value instanceof Date) {\n return value.toLocaleDateString();\n }\n return String(value);\n }\n\n /**\n * Open a record in the entity viewer\n */\n openRecord(record: PreviewRecord): void {\n if (!this.currentEntityInfo) {\n // Try to get entity info\n const md = this.ProviderToUse;\n const entityId = this.selectedLists[0]?.list.EntityID;\n if (entityId) {\n this.currentEntityInfo = md.Entities.find(e => UUIDsEqual(e.ID, entityId)) || null;\n }\n }\n\n if (this.currentEntityInfo) {\n SharedService.Instance.InvokeManualResize();\n // Create composite key for navigation\n const primaryKeyField = this.currentEntityInfo.PrimaryKeys.length > 0\n ? this.currentEntityInfo.PrimaryKeys[0].Name\n : 'ID';\n const compositeKey = new CompositeKey([{ FieldName: primaryKeyField, Value: record.id }]);\n SharedService.Instance.OpenEntityRecord(this.currentEntityInfo.Name, compositeKey);\n } else {\n this.notificationService.CreateSimpleNotification('Unable to open record', 'error', 3000);\n }\n }\n\n async performOperation(operation: SetOperation) {\n if (this.selectedLists.length < 2) return;\n\n this.isCalculating = true;\n this.selectedRegion = null;\n this.cdr.detectChanges();\n\n try {\n const listIds = this.selectedLists.map(s => s.list.ID);\n this.lastOperationResult = await this.setOperationsService.performOperation(operation, listIds);\n this.previewRecords = this.lastOperationResult.resultRecordIds.slice(0, 10);\n } catch (error) {\n console.error('Error performing operation:', error);\n } finally {\n this.isCalculating = false;\n this.cdr.detectChanges();\n }\n }\n\n getOperationLabel(operation: SetOperation): string {\n switch (operation) {\n case 'union': return 'Union (All Records)';\n case 'intersection': return 'Intersection (Common Records)';\n case 'difference': return 'Difference';\n case 'symmetric_difference': return 'Unique to Each List';\n case 'complement': return 'Complement';\n default: return operation;\n }\n }\n\n createListFromSelection() {\n if (!this.selectedRegion || this.selectedRegion.size === 0) return;\n this.recordsToAdd = [...this.selectedRegion.recordIds];\n this.newListName = '';\n this.newListDescription = `Created from: ${this.selectedRegion.label}`;\n this.showCreateDialog = true;\n }\n\n createListFromResult() {\n if (!this.lastOperationResult || this.lastOperationResult.resultCount === 0) return;\n this.recordsToAdd = [...this.lastOperationResult.resultRecordIds];\n this.newListName = '';\n this.newListDescription = `Created from: ${this.getOperationLabel(this.lastOperationResult.operation)}`;\n this.showCreateDialog = true;\n }\n\n cancelCreateDialog() {\n this.showCreateDialog = false;\n this.newListName = '';\n this.newListDescription = '';\n this.recordsToAdd = [];\n }\n\n async confirmCreateList() {\n if (!this.newListName || this.recordsToAdd.length === 0) return;\n\n // Get entity ID from selected lists\n if (this.selectedLists.length === 0) return;\n const entityId = this.selectedLists[0].list.EntityID;\n\n this.isSaving = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const tg = await md.CreateTransactionGroup();\n\n // Queue the list plus all of its initial detail records in a single transaction.\n // NewRecord() assigns a client-side UUID so the details can reference list.ID\n // before the list actually persists.\n const list = await md.GetEntityObject<MJListEntity>('MJ: Lists', md.CurrentUser);\n list.NewRecord();\n list.Name = this.newListName;\n list.Description = this.newListDescription || null;\n list.EntityID = entityId;\n list.UserID = md.CurrentUser!.ID;\n list.TransactionGroup = tg;\n await list.Save();\n\n for (const recordId of this.recordsToAdd) {\n const detail = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details', md.CurrentUser);\n detail.NewRecord();\n detail.ListID = list.ID;\n detail.RecordID = recordId;\n detail.Sequence = 0;\n detail.TransactionGroup = tg;\n await detail.Save();\n }\n\n if (!await tg.Submit()) {\n this.notificationService.CreateSimpleNotification(\n 'Failed to create list — all changes have been rolled back',\n 'error',\n 4000\n );\n return;\n }\n\n this.notificationService.CreateSimpleNotification(\n `Created \"${this.newListName}\" with ${this.recordsToAdd.length} items`,\n 'success',\n 3000\n );\n\n this.cancelCreateDialog();\n\n // Refresh available lists\n await this.loadAvailableLists();\n } catch (error) {\n console.error('Error creating list:', error);\n this.notificationService.CreateSimpleNotification('Error creating list', 'error', 4000);\n } finally {\n this.isSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n addToExistingList() {\n if (!this.selectedRegion || this.selectedRegion.size === 0) return;\n this.recordsToAdd = [...this.selectedRegion.recordIds];\n this.openAddToListDialog();\n }\n\n addResultToExistingList() {\n if (!this.lastOperationResult || this.lastOperationResult.resultCount === 0) return;\n this.recordsToAdd = [...this.lastOperationResult.resultRecordIds];\n this.openAddToListDialog();\n }\n\n /**\n * Open the Add to Existing List dialog\n */\n private openAddToListDialog(): void {\n this.showAddToListDialog = true;\n this.addToListSearchTerm = '';\n this.selectedTargetListId = null;\n this.filterAddToListOptions();\n }\n\n /**\n * Filter available lists for add-to-list dialog\n */\n filterAddToListOptions(): void {\n // Get entity ID from selected lists to filter to same entity type\n if (this.selectedLists.length === 0) {\n this.filteredAddToListOptions = [];\n return;\n }\n\n const entityId = this.selectedLists[0].list.EntityID;\n\n // Filter to same entity, exclude already selected lists\n const selectedIds = new Set(this.selectedLists.map(s => s.list.ID));\n let filtered = this.availableLists.filter(l =>\n UUIDsEqual(l.EntityID, entityId) && !selectedIds.has(l.ID)\n );\n\n // Apply search filter\n if (this.addToListSearchTerm) {\n const term = this.addToListSearchTerm.toLowerCase();\n filtered = filtered.filter(l =>\n l.Name.toLowerCase().includes(term)\n );\n }\n\n this.filteredAddToListOptions = filtered;\n }\n\n /**\n * Select a target list for adding records\n */\n IsTargetListSelected(list: MJListEntity): boolean {\n return UUIDsEqual(this.selectedTargetListId, list.ID);\n }\n\n selectTargetList(listId: string): void {\n this.selectedTargetListId = listId;\n }\n\n /**\n * Cancel the add to list dialog\n */\n cancelAddToListDialog(): void {\n this.showAddToListDialog = false;\n this.addToListSearchTerm = '';\n this.selectedTargetListId = null;\n this.recordsToAdd = [];\n }\n\n /**\n * Confirm adding records to selected list\n */\n async confirmAddToList(): Promise<void> {\n if (!this.selectedTargetListId || this.recordsToAdd.length === 0) return;\n\n this.isSaving = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const tg = await md.CreateTransactionGroup();\n\n for (const recordId of this.recordsToAdd) {\n const detail = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details', md.CurrentUser);\n detail.ListID = this.selectedTargetListId;\n detail.RecordID = recordId;\n detail.Sequence = 0;\n detail.TransactionGroup = tg;\n await detail.Save();\n }\n\n const success = await tg.Submit();\n\n if (success) {\n const targetList = this.availableLists.find(l => UUIDsEqual(l.ID, this.selectedTargetListId));\n this.notificationService.CreateSimpleNotification(\n `Added ${this.recordsToAdd.length} records to \"${targetList?.Name || 'list'}\"`,\n 'success',\n 3000\n );\n } else {\n this.notificationService.CreateSimpleNotification(\n 'Failed to add some records',\n 'warning',\n 4000\n );\n }\n\n this.cancelAddToListDialog();\n } catch (error) {\n console.error('Error adding to list:', error);\n this.notificationService.CreateSimpleNotification('Error adding records to list', 'error', 4000);\n } finally {\n this.isSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n exportToExcel() {\n // TODO: Implement Excel export\n this.notificationService.CreateSimpleNotification('Export to Excel - coming soon', 'info', 2000);\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Operations';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-diagram-project';\n }\n\n /**\n * Clear all selections and reset state\n */\n clearAllSelections(): void {\n this.selectedLists = [];\n this.selectedEntityId = '';\n this.vennData = null;\n this.selectedRegion = null;\n this.lastOperationResult = null;\n this.previewRecordsDisplay = [];\n this.filterAvailableLists();\n this.saveState();\n this.cdr.detectChanges();\n }\n\n /**\n * Save state to User Settings (debounced to avoid excessive writes)\n */\n private saveState(): void {\n // Don't save during initial load\n if (this.isLoadingSettings) return;\n\n // Debounce the server save\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n this.saveSettingsTimeout = setTimeout(() => {\n this.saveStateToServer();\n }, 1000); // 1 second debounce\n }\n\n /**\n * Save state to User Settings entity on server\n */\n private async saveStateToServer(): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const userId = md.CurrentUser?.ID;\n if (!userId) return;\n\n const stateToSave = {\n entityId: this.selectedEntityId,\n listIds: this.selectedLists.map(s => s.list.ID)\n };\n\n const engine = UserInfoEngine.Instance;\n\n // Find existing setting from cached user settings\n let setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_KEY);\n\n if (!setting) {\n // Create new setting\n setting = await md.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n setting.UserID = userId;\n setting.Setting = this.USER_SETTING_KEY;\n }\n\n setting.Value = JSON.stringify(stateToSave);\n await setting.Save();\n } catch (error) {\n console.warn('Failed to save operations state to User Settings:', error);\n }\n }\n\n /**\n * Load saved state from User Settings\n */\n private async loadSavedState(): Promise<void> {\n this.isLoadingSettings = true;\n\n try {\n const md = this.ProviderToUse;\n const userId = md.CurrentUser?.ID;\n if (!userId) {\n this.isLoadingSettings = false;\n return;\n }\n\n // Load from cached User Settings\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_KEY);\n\n if (setting?.Value) {\n const state = JSON.parse(setting.Value) as { entityId?: string; listIds?: string[] };\n\n // Restore entity filter\n if (state.entityId) {\n this.selectedEntityId = state.entityId;\n }\n\n // Restore selected lists\n if (state.listIds && state.listIds.length > 0) {\n for (const listId of state.listIds) {\n const list = this.availableLists.find(l => UUIDsEqual(l.ID, listId));\n if (list) {\n const color = this.setOperationsService.getColorForIndex(this.selectedLists.length);\n this.selectedLists.push({\n list,\n entityName: list.Entity || 'Unknown',\n color\n });\n }\n }\n\n // If we restored lists, recalculate venn\n if (this.selectedLists.length > 0) {\n this.filterAvailableLists();\n await this.recalculateVenn();\n }\n }\n\n this.cdr.detectChanges();\n }\n } catch (error) {\n console.warn('Failed to load operations state from User Settings:', error);\n } finally {\n this.isLoadingSettings = false;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"lists-operations-resource.component.js","sourceRoot":"","sources":["../../../src/Lists/components/lists-operations-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, ChangeDetectorRef, OnDestroy } from '@angular/core';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent, SharedService } from '@memberjunction/ng-shared';\nimport { ResourceData, MJListEntity, MJListDetailEntity, MJUserSettingEntity, MJUserViewEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { Metadata, RunView, EntityInfo, CompositeKey } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { ListSetOperationsService, SetOperand, VennData, VennIntersection, SetOperation, SetOperationResult, OperandCacheKey } from '../services/list-set-operations.service';\nimport { VennRegionClickEvent } from './venn-diagram/venn-diagram.component';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { ExportService } from '@memberjunction/ng-export-service';\nimport { GraphQLDataProvider, GraphQLListsClient } from '@memberjunction/graphql-dataprovider';\nimport type { ListDelta, ListSource } from '@memberjunction/lists-base';\ninterface ListSelection {\n list: MJListEntity;\n entityName: string;\n color: string;\n}\n\n/**\n * Parallel structure for view operands. Views resolve to record IDs the\n * same way lists do (via the operations service's cache), but are tracked\n * separately in component state so existing list-only flows keep working.\n */\ninterface ViewSelection {\n view: MJUserViewEntity;\n entityName: string;\n entityID: string;\n color: string;\n}\n\n/**\n * Preview record with meaningful display fields\n */\ninterface PreviewRecord {\n id: string;\n displayName: string;\n secondaryInfo?: string;\n entityName: string;\n}\n\n/**\n * Entity option for filtering\n */\ninterface EntityOption {\n id: string;\n name: string;\n listCount: number;\n}\n\n@RegisterClass(BaseResourceComponent, 'ListsOperationsResource')\n@Component({\n standalone: false,\n selector: 'mj-lists-operations-resource',\n template: `\n <div class=\"operations-container\">\n <!-- Header -->\n <div class=\"operations-header\">\n <div class=\"header-top\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-diagram-project\"></i>\n <h2>List Operations</h2>\n </div>\n @if (totalOperandCount > 0 || selectedEntityId) {\n <button\n class=\"clear-all-btn\"\n (click)=\"clearAllSelections()\"\n title=\"Clear all selections\">\n <i class=\"fa-solid fa-xmark\"></i>\n Clear\n </button>\n }\n </div>\n <div class=\"header-subtitle\">\n Visualize overlaps and perform set operations on your lists\n </div>\n </div>\n \n <!-- Main Content -->\n <div class=\"operations-content\">\n <!-- Left Panel: List Selection -->\n <div class=\"selection-panel\">\n <div class=\"panel-header\">\n <h3>Selected Operands</h3>\n @if (totalOperandCount > 0) {\n <span class=\"list-count\">\n {{totalOperandCount}}/{{maxLists}}\n </span>\n }\n </div>\n \n <!-- Entity Filter Selector -->\n <div class=\"entity-filter-section\">\n <label class=\"filter-label\">Filter by Entity</label>\n <div class=\"entity-selector\">\n <select\n [(ngModel)]=\"selectedEntityId\"\n (ngModelChange)=\"onEntityFilterChange()\"\n class=\"entity-select\">\n <option value=\"\">All Entities</option>\n @for (entity of entityOptions; track entity.id) {\n <option [value]=\"entity.id\">\n {{entity.name}} ({{entity.listCount}})\n </option>\n }\n </select>\n </div>\n </div>\n \n <!-- Selected lists -->\n <div class=\"selected-lists\">\n @for (item of selectedLists; track item; let i = $index) {\n <div class=\"selected-item\">\n <div class=\"item-color\" [style.background-color]=\"item.color\"></div>\n <div class=\"item-info\">\n <span class=\"item-name\">{{item.list.Name}}</span>\n <span class=\"item-entity\">{{item.entityName}}</span>\n </div>\n <button class=\"remove-btn\" (click)=\"removeList(i)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n \n @if (totalOperandCount < maxLists) {\n <div class=\"add-list-area\">\n <div class=\"add-list-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n [(ngModel)]=\"listSearchTerm\"\n (ngModelChange)=\"filterAvailableLists()\"\n placeholder=\"Search lists to add...\"\n (focus)=\"showListDropdown = true\" />\n </div>\n <!-- Available lists dropdown -->\n @if (showListDropdown && filteredAvailableLists.length > 0) {\n <div class=\"list-dropdown\">\n <div class=\"dropdown-backdrop\" (click)=\"showListDropdown = false\"></div>\n <div class=\"dropdown-content\">\n @for (list of filteredAvailableLists; track list) {\n <div\n class=\"dropdown-item\"\n (click)=\"addList(list)\">\n <span class=\"dropdown-name\">{{list.Name}}</span>\n <span class=\"dropdown-entity\">{{list.Entity}}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n \n @if (totalOperandCount >= maxLists) {\n <div class=\"lists-full\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Maximum {{maxLists}} operands can be compared\n </div>\n }\n </div>\n\n <!-- Selected views (Phase 1.8). Tracked separately from lists\n so the existing list flows stay untouched, but combined at\n compute time via SetOperand[]. Dashed-style icon flags them\n as dynamic-at-resolution. -->\n <div class=\"selected-views\">\n @for (item of selectedViews; track item; let i = $index) {\n <div class=\"selected-item selected-item--view\">\n <div class=\"item-color item-color--view\" [style.border-color]=\"item.color\"></div>\n <div class=\"item-info\">\n <span class=\"item-name\">\n <i class=\"fa-solid fa-eye\" [title]=\"'View'\"></i>\n {{item.view.Name}}\n </span>\n <span class=\"item-entity\">{{item.entityName}}</span>\n </div>\n <button class=\"remove-btn\" (click)=\"removeView(i)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n\n @if (totalOperandCount < maxLists) {\n <div class=\"add-list-area\">\n <div class=\"add-list-search\">\n <i class=\"fa-solid fa-eye\"></i>\n <input\n type=\"text\"\n [(ngModel)]=\"viewSearchTerm\"\n (ngModelChange)=\"filterAvailableViews()\"\n placeholder=\"Search views to add...\"\n (focus)=\"showViewDropdown = true\" />\n </div>\n @if (showViewDropdown && filteredAvailableViews.length > 0) {\n <div class=\"list-dropdown\">\n <div class=\"dropdown-backdrop\" (click)=\"showViewDropdown = false\"></div>\n <div class=\"dropdown-content\">\n @for (view of filteredAvailableViews; track view) {\n <div\n class=\"dropdown-item\"\n (click)=\"addView(view)\">\n <span class=\"dropdown-name\">\n <i class=\"fa-solid fa-eye\"></i>\n {{view.Name}}\n </span>\n <span class=\"dropdown-entity\">{{view.Entity}}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Entity consistency note -->\n @if (totalOperandCount > 0 && lockedEntityName) {\n <div class=\"entity-note\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>Comparing operands of type: <strong>{{lockedEntityName}}</strong></span>\n </div>\n }\n\n <!-- Quick Operations -->\n @if (totalOperandCount >= 2) {\n <div class=\"quick-operations\">\n <h4>Quick Operations</h4>\n <div class=\"operation-buttons\">\n <button class=\"op-btn\" (click)=\"performOperation('union')\" [disabled]=\"isCalculating\">\n <i class=\"fa-solid fa-layer-group\"></i>\n <span>Union All</span>\n </button>\n <button class=\"op-btn\" (click)=\"performOperation('intersection')\" [disabled]=\"isCalculating\">\n <i class=\"fa-solid fa-circle-notch\"></i>\n <span>Intersection</span>\n </button>\n <button class=\"op-btn\" (click)=\"performOperation('symmetric_difference')\" [disabled]=\"isCalculating\">\n <i class=\"fa-solid fa-arrows-split-up-and-left\"></i>\n <span>Unique Each</span>\n </button>\n </div>\n </div>\n }\n </div>\n\n <!-- Center: Venn Diagram -->\n <div class=\"venn-panel\">\n @if (totalOperandCount > 0) {\n <mj-venn-diagram\n [data]=\"vennData\"\n [selectedRegion]=\"selectedRegion\"\n (regionClick)=\"onRegionClick($event)\">\n </mj-venn-diagram>\n }\n\n @if (totalOperandCount === 0) {\n <div class=\"venn-empty\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-circle-nodes\"></i>\n </div>\n <h3>Add Lists or Views to Compare</h3>\n <p>Select 2-4 lists or views from the same entity to visualize their overlaps and perform set operations.</p>\n </div>\n }\n \n @if (isCalculating) {\n <div class=\"loading-overlay\">\n <mj-loading text=\"Calculating...\"></mj-loading>\n </div>\n }\n </div>\n \n <!-- Right Panel: Selected Region / Results -->\n <div class=\"results-panel\">\n <div class=\"panel-header\">\n <h3>\n <i class=\"fa-solid fa-crosshairs\"></i>\n {{selectedRegion ? 'Selected Region' : 'Results'}}\n </h3>\n </div>\n \n <!-- Selected region details -->\n @if (selectedRegion) {\n <div class=\"region-details\">\n <div class=\"region-header\">\n <span class=\"region-label\">{{selectedRegion.label}}</span>\n <span class=\"region-count\">{{selectedRegion.size}} records</span>\n </div>\n <div class=\"region-actions\">\n <button mjButton variant=\"primary\" (click)=\"createListFromSelection()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New List\n </button>\n <button mjButton (click)=\"addToExistingList()\">\n <i class=\"fa-solid fa-folder-plus\"></i>\n Add to List\n </button>\n <button mjButton (click)=\"openExportDialog()\">\n <i class=\"fa-solid fa-file-excel\"></i>\n Export…\n </button>\n </div>\n @if (previewRecordsDisplay.length > 0) {\n <div class=\"record-preview\">\n <h5>Preview (first 10)</h5>\n <div class=\"preview-list\">\n @for (record of previewRecordsDisplay; track record) {\n <div class=\"preview-card\">\n <div class=\"preview-card-content\">\n <span class=\"preview-name\">{{record.displayName}}</span>\n @if (record.secondaryInfo) {\n <span class=\"preview-secondary\">{{record.secondaryInfo}}</span>\n }\n </div>\n <button class=\"preview-open-btn\" (click)=\"openRecord(record)\" title=\"Open record\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n </button>\n </div>\n }\n </div>\n @if (loadingPreview) {\n <div class=\"preview-loading\">\n <mj-loading text=\"Loading preview...\" size=\"small\"></mj-loading>\n </div>\n }\n </div>\n }\n </div>\n }\n \n <!-- Operation result -->\n @if (lastOperationResult && !selectedRegion) {\n <div class=\"operation-result\">\n <div class=\"result-header\">\n <span class=\"result-operation\">{{getOperationLabel(lastOperationResult.operation)}}</span>\n <span class=\"result-count\">{{lastOperationResult.resultCount}} records</span>\n </div>\n <div class=\"region-actions\">\n <button mjButton variant=\"primary\" (click)=\"createListFromResult()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New List\n </button>\n <button mjButton (click)=\"addResultToExistingList()\">\n <i class=\"fa-solid fa-folder-plus\"></i>\n Add to List\n </button>\n </div>\n </div>\n }\n \n <!-- Empty state -->\n @if (!selectedRegion && !lastOperationResult) {\n <div class=\"results-empty\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n <p>Click a region in the diagram or run an operation to see results</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Compose-into-target panel (Phase 1.10). Lives outside operations-content\n so it spans the full panel width per mockup 11. Only shows once\n the user has at least 2 operands selected. -->\n @if (totalOperandCount >= 2) {\n <div class=\"compose-panel\">\n <div class=\"compose-panel__header\">\n <i class=\"fa-solid fa-shapes\"></i>\n <h3>Compose into a Target List</h3>\n </div>\n <div class=\"compose-panel__body\">\n <div class=\"compose-grid\">\n <!-- Sources column (read-only — reflects the chips above) -->\n <div class=\"compose-column\">\n <div class=\"compose-column__label\">Sources ({{ totalOperandCount }})</div>\n <div class=\"compose-sources\">\n @for (s of selectedLists; track s.list.ID) {\n <div class=\"compose-source-chip\">\n <i class=\"fa-solid fa-list\" [style.color]=\"s.color\"></i>\n <span class=\"compose-source-name\">{{ s.list.Name }}</span>\n <span class=\"compose-source-badge\">List</span>\n </div>\n }\n @for (s of selectedViews; track s.view.ID) {\n <div class=\"compose-source-chip compose-source-chip--view\">\n <i class=\"fa-solid fa-eye\" [style.color]=\"s.color\"></i>\n <span class=\"compose-source-name\">{{ s.view.Name }}</span>\n <span class=\"compose-source-badge compose-source-badge--view\">View</span>\n </div>\n }\n </div>\n </div>\n\n <div class=\"compose-arrow\">→</div>\n\n <!-- Operation column -->\n <div class=\"compose-column\">\n <div class=\"compose-column__label\">Operation</div>\n <div class=\"compose-options\">\n <label class=\"compose-option\" [class.compose-option--selected]=\"composeOp === 'union'\">\n <input type=\"radio\" name=\"composeOp\" [checked]=\"composeOp === 'union'\" (change)=\"composeOp = 'union'\" />\n <i class=\"fa-solid fa-layer-group\"></i>\n <div>\n <div class=\"compose-option__title\">Union</div>\n <div class=\"compose-option__desc\">Combine all sources, dedupe</div>\n </div>\n </label>\n <label class=\"compose-option\" [class.compose-option--selected]=\"composeOp === 'intersection'\">\n <input type=\"radio\" name=\"composeOp\" [checked]=\"composeOp === 'intersection'\" (change)=\"composeOp = 'intersection'\" />\n <i class=\"fa-solid fa-circle-notch\"></i>\n <div>\n <div class=\"compose-option__title\">Intersection</div>\n <div class=\"compose-option__desc\">Only records in all sources</div>\n </div>\n </label>\n <label class=\"compose-option\" [class.compose-option--selected]=\"composeOp === 'difference'\">\n <input type=\"radio\" name=\"composeOp\" [checked]=\"composeOp === 'difference'\" (change)=\"composeOp = 'difference'\" />\n <i class=\"fa-solid fa-minus-circle\"></i>\n <div>\n <div class=\"compose-option__title\">Difference</div>\n <div class=\"compose-option__desc\">First minus the rest</div>\n </div>\n </label>\n </div>\n </div>\n\n <div class=\"compose-arrow\">→</div>\n\n <!-- Target column -->\n <div class=\"compose-column\">\n <div class=\"compose-column__label\">Target</div>\n <div class=\"compose-options\">\n <label class=\"compose-option\" [class.compose-option--selected]=\"composeTarget === 'new'\">\n <input type=\"radio\" name=\"composeTarget\" [checked]=\"composeTarget === 'new'\" (change)=\"composeTarget = 'new'\" />\n <div class=\"compose-option__title\">Create New List</div>\n </label>\n <label class=\"compose-option\" [class.compose-option--selected]=\"composeTarget === 'existing'\">\n <input type=\"radio\" name=\"composeTarget\" [checked]=\"composeTarget === 'existing'\" (change)=\"composeTarget = 'existing'\" />\n <div class=\"compose-option__title\">Existing List…</div>\n </label>\n\n @if (composeTarget === 'new') {\n <input\n class=\"compose-input\"\n type=\"text\"\n [(ngModel)]=\"composeNewListName\"\n placeholder=\"New list name…\" />\n } @else {\n <div class=\"compose-target-search\">\n <input\n class=\"compose-input\"\n type=\"text\"\n [(ngModel)]=\"composeTargetSearch\"\n (focus)=\"showComposeTargetDropdown = true\"\n placeholder=\"Search lists…\" />\n @if (showComposeTargetDropdown && filteredComposeTargets.length > 0) {\n <div class=\"compose-target-dropdown\">\n <div class=\"dropdown-backdrop\" (click)=\"showComposeTargetDropdown = false\"></div>\n <div class=\"dropdown-content\">\n @for (l of filteredComposeTargets; track l.ID) {\n <div class=\"dropdown-item\" (click)=\"selectComposeTarget(l)\">\n <span class=\"dropdown-name\">{{ l.Name }}</span>\n <span class=\"dropdown-entity\">{{ l.Entity }}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n\n <div class=\"compose-footer\">\n <button class=\"op-btn\" (click)=\"previewCompose()\" [disabled]=\"isCalculating || isComposing\">\n <i class=\"fa-solid fa-eye\"></i>\n <span>Preview Result</span>\n </button>\n <button class=\"op-btn op-btn--primary\" (click)=\"composeAndSave()\" [disabled]=\"!canCompose || isCalculating || isComposing\">\n @if (isComposing) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-bolt\"></i>\n }\n <span>{{ isComposing ? 'Composing…' : 'Compute & Save' }}</span>\n </button>\n <div class=\"compose-footer__spacer\"></div>\n @if (lastOperationResult) {\n <div class=\"compose-footer__hint\">\n Expected output: <strong>{{ lastOperationResult.resultCount }} records</strong>\n ({{ getOperationLabel(lastOperationResult.operation) }})\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Compose-into-existing-list delta-confirm -->\n <mj-list-delta-confirm\n [Visible]=\"composeConfirmVisible && !!composeDelta\"\n [Delta]=\"composeDelta\"\n [TargetListName]=\"composeTargetDisplayName()\"\n [SourceLabel]=\"'compose result'\"\n (Confirm)=\"onComposeConfirmCommit($event)\"\n (Cancel)=\"onComposeConfirmCancel()\">\n </mj-list-delta-confirm>\n\n <!-- Export Dialog (mockup 26) -->\n @if (showExportDialog) {\n <div class=\"modal-overlay\" (click)=\"closeExportDialog()\"></div>\n <div class=\"modal-dialog export-dialog\">\n <div class=\"modal-header\">\n <h3><i class=\"fa-solid fa-file-excel\"></i> Export {{ exportRecordCount }} Record{{ exportRecordCount === 1 ? '' : 's' }}</h3>\n <button class=\"modal-close\" (click)=\"closeExportDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"export-format-row\">\n <label class=\"export-format-option\"\n [class.export-format-option--selected]=\"exportFormat === 'excel'\"\n (click)=\"exportFormat = 'excel'\">\n <input type=\"radio\" name=\"exportFormat\" value=\"excel\" [(ngModel)]=\"exportFormat\">\n <i class=\"fa-solid fa-file-excel\" style=\"color: var(--mj-status-success);\"></i>\n <span>Excel (.xlsx)</span>\n </label>\n <label class=\"export-format-option\"\n [class.export-format-option--selected]=\"exportFormat === 'csv'\"\n (click)=\"exportFormat = 'csv'\">\n <input type=\"radio\" name=\"exportFormat\" value=\"csv\" [(ngModel)]=\"exportFormat\">\n <i class=\"fa-solid fa-file-csv\" style=\"color: var(--mj-text-secondary);\"></i>\n <span>CSV</span>\n </label>\n <label class=\"export-format-option\"\n [class.export-format-option--selected]=\"exportFormat === 'json'\"\n (click)=\"exportFormat = 'json'\">\n <input type=\"radio\" name=\"exportFormat\" value=\"json\" [(ngModel)]=\"exportFormat\">\n <i class=\"fa-solid fa-file-code\" style=\"color: var(--mj-brand-primary);\"></i>\n <span>JSON</span>\n </label>\n </div>\n\n <div class=\"export-section-divider\"></div>\n\n <label class=\"export-section-label\">Columns to include</label>\n <div class=\"export-fields-list\">\n @for (f of exportFields; track f.Name) {\n <label class=\"export-field-row\">\n <input type=\"checkbox\" [(ngModel)]=\"f.Selected\">\n <span>{{ f.DisplayName }}</span>\n </label>\n }\n </div>\n <div class=\"export-field-actions\">\n <a href=\"#\" (click)=\"selectAllExportFields(); $event.preventDefault()\">Select All</a>\n <a href=\"#\" (click)=\"selectNoneExportFields(); $event.preventDefault()\">Select None</a>\n <span class=\"muted\">{{ selectedExportFieldCount }} of {{ exportFields.length }} selected</span>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button mjButton variant=\"primary\"\n [disabled]=\"selectedExportFieldCount === 0 || isExporting\"\n (click)=\"executeExport()\">\n @if (isExporting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Exporting…\n } @else {\n <i class=\"fa-solid fa-download\"></i>\n Export {{ exportRecordCount }} Record{{ exportRecordCount === 1 ? '' : 's' }}\n }\n </button>\n <button mjButton variant=\"outline\" [disabled]=\"isExporting\" (click)=\"closeExportDialog()\">Cancel</button>\n </div>\n </div>\n }\n\n <!-- Create List Dialog -->\n @if (showCreateDialog) {\n <div class=\"modal-overlay\" (click)=\"cancelCreateDialog()\"></div>\n }\n @if (showCreateDialog) {\n <div class=\"modal-dialog\">\n <div class=\"modal-header\">\n <h3>Create New List from Selection</h3>\n <button class=\"modal-close\" (click)=\"cancelCreateDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"form-group\">\n <label>List 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-info\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{recordsToAdd.length}} record{{recordsToAdd.length !== 1 ? 's' : ''}} will be added to this list\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn-primary\" (click)=\"confirmCreateList()\" [disabled]=\"!newListName || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isSaving ? 'Creating...' : 'Create List'}}\n </button>\n <button class=\"btn-secondary\" (click)=\"cancelCreateDialog()\">Cancel</button>\n </div>\n </div>\n }\n \n <!-- Add to Existing List Dialog -->\n @if (showAddToListDialog) {\n <div class=\"modal-overlay\" (click)=\"cancelAddToListDialog()\"></div>\n }\n @if (showAddToListDialog) {\n <div class=\"modal-dialog add-to-list-dialog\">\n <div class=\"modal-header\">\n <h3>Add to Existing List</h3>\n <button class=\"modal-close\" (click)=\"cancelAddToListDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"form-info\" style=\"margin-bottom: 16px;\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{recordsToAdd.length}} record{{recordsToAdd.length !== 1 ? 's' : ''}} will be added\n </div>\n <!-- Search input -->\n <div class=\"list-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n [(ngModel)]=\"addToListSearchTerm\"\n (ngModelChange)=\"filterAddToListOptions()\"\n placeholder=\"Search lists...\"\n class=\"form-input\" />\n </div>\n <!-- List options -->\n <div class=\"list-options\">\n @for (list of filteredAddToListOptions; track list) {\n <div\n class=\"list-option\"\n [class.selected]=\"IsTargetListSelected(list)\"\n (click)=\"selectTargetList(list.ID)\">\n <div class=\"list-option-radio\">\n <input\n type=\"radio\"\n [checked]=\"IsTargetListSelected(list)\"\n name=\"targetList\" />\n </div>\n <div class=\"list-option-info\">\n <span class=\"list-option-name\">{{list.Name}}</span>\n <span class=\"list-option-entity\">{{list.Entity}}</span>\n </div>\n </div>\n }\n @if (filteredAddToListOptions.length === 0) {\n <div class=\"list-options-empty\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>{{addToListSearchTerm ? 'No lists match your search' : 'No other lists available'}}</p>\n </div>\n }\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn-primary\" (click)=\"confirmAddToList()\" [disabled]=\"!selectedTargetListId || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isSaving ? 'Adding...' : 'Add to List'}}\n </button>\n <button class=\"btn-secondary\" (click)=\"cancelAddToListDialog()\">Cancel</button>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .operations-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n }\n\n .operations-header {\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .header-top {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 4px;\n }\n\n .header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .clear-all-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .clear-all-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n }\n\n .clear-all-btn i {\n font-size: 12px;\n }\n\n .header-title i {\n font-size: 24px;\n color: var(--mj-brand-primary);\n }\n\n .header-title h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .header-subtitle {\n color: var(--mj-text-secondary);\n font-size: 14px;\n }\n\n .operations-content {\n display: grid;\n grid-template-columns: 280px 1fr 300px;\n gap: 16px;\n flex: 1;\n padding: 16px;\n overflow: hidden;\n }\n\n /* Panels */\n .selection-panel,\n .results-panel {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .venn-panel {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n position: relative;\n min-height: 400px;\n }\n\n .panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .panel-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .list-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 /* Entity Filter */\n .entity-filter-section {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .filter-label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n }\n\n .entity-select {\n width: 100%;\n padding: 8px 12px;\n font-size: 13px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n outline: none;\n transition: border-color 0.2s;\n }\n\n .entity-select:focus {\n border-color: var(--mj-brand-primary);\n }\n\n .entity-note {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 8px 12px;\n padding: 8px 10px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-radius: 6px;\n font-size: 12px;\n color: var(--mj-status-success);\n }\n\n .entity-note i {\n color: var(--mj-status-success);\n }\n\n /* Selected Lists */\n .selected-lists {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n }\n\n /* Selected Views (sibling section) */\n .selected-views {\n overflow-y: auto;\n padding: 0 12px 12px 12px;\n }\n\n .selected-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n margin-bottom: 8px;\n }\n\n /* View operands get a dashed outline so they read distinctly from\n list operands. The fill stays muted because views are dynamic. */\n .selected-item--view {\n border: 1px dashed var(--mj-border-default);\n background: var(--mj-bg-surface);\n }\n\n .item-color {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n flex-shrink: 0;\n }\n\n /* View color swatch is a ring around a hollow centre — mirrors the\n dashed-stroke convention from the Venn diagram. */\n .item-color--view {\n background: transparent !important;\n border: 2px dashed currentColor;\n border-radius: 50%;\n }\n\n .item-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n }\n\n .item-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .item-entity {\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .remove-btn {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n }\n\n .remove-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Add list area */\n .add-list-area {\n position: relative;\n }\n\n .add-list-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border: 1px dashed var(--mj-border-default);\n border-radius: 6px;\n transition: border-color 0.2s;\n }\n\n .add-list-search:focus-within {\n border-color: var(--mj-brand-primary);\n }\n\n .add-list-search i {\n color: var(--mj-text-muted);\n }\n\n .add-list-search input {\n flex: 1;\n border: none;\n outline: none;\n font-size: 13px;\n }\n\n .list-dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: 100;\n margin-top: 4px;\n }\n\n .dropdown-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n .dropdown-content {\n position: relative;\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 max-height: 200px;\n overflow-y: auto;\n }\n\n .dropdown-item {\n display: flex;\n flex-direction: column;\n padding: 10px 12px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .dropdown-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .dropdown-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .dropdown-entity {\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .lists-full {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n }\n\n .entity-warning {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin: 12px;\n padding: 10px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-radius: 6px;\n font-size: 12px;\n color: var(--mj-status-warning);\n }\n\n .entity-warning i {\n color: var(--mj-status-warning);\n margin-top: 2px;\n }\n\n /* Quick Operations */\n .quick-operations {\n padding: 12px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .quick-operations h4 {\n margin: 0 0 10px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .operation-buttons {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .op-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .op-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n }\n\n .op-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n /* Venn Panel */\n .venn-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n padding: 40px;\n }\n\n .empty-icon {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-radius: 50%;\n margin-bottom: 20px;\n }\n\n .empty-icon i {\n font-size: 36px;\n color: var(--mj-brand-primary);\n }\n\n .venn-empty h3 {\n margin: 0 0 8px;\n font-size: 18px;\n color: var(--mj-text-primary);\n }\n\n .venn-empty p {\n margin: 0;\n color: var(--mj-text-secondary);\n font-size: 14px;\n max-width: 300px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: color-mix(in srgb, var(--mj-bg-surface-card) 90%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n /* Results Panel */\n .region-details,\n .operation-result {\n padding: 16px;\n }\n\n .region-header,\n .result-header {\n margin-bottom: 16px;\n }\n\n .region-label,\n .result-operation {\n display: block;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n }\n\n .region-count,\n .result-count {\n font-size: 13px;\n color: var(--mj-brand-primary);\n font-weight: 500;\n }\n\n .region-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 16px;\n }\n\n .action-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .action-btn:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .action-btn.primary {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .action-btn.primary:hover {\n background: var(--mj-brand-primary-hover);\n }\n\n .record-preview h5 {\n margin: 0 0 8px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .preview-list {\n max-height: 200px;\n overflow-y: auto;\n }\n\n .preview-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n margin-bottom: 6px;\n transition: all 0.15s ease;\n }\n\n .preview-card:hover {\n background: var(--mj-bg-surface-sunken);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .preview-card-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .preview-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .preview-secondary {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .preview-open-btn {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n cursor: pointer;\n padding: 6px 8px;\n border-radius: 4px;\n opacity: 0.6;\n transition: all 0.15s ease;\n flex-shrink: 0;\n }\n\n .preview-open-btn:hover {\n opacity: 1;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .preview-loading {\n padding: 12px;\n text-align: center;\n }\n\n .results-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 200px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .results-empty i {\n font-size: 32px;\n margin-bottom: 12px;\n opacity: 0.5;\n }\n\n .results-empty p {\n font-size: 13px;\n margin: 0;\n max-width: 200px;\n }\n\n /* Modal */\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 width: 420px;\n max-width: 90vw;\n z-index: 1001;\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: 16px;\n color: var(--mj-text-primary);\n }\n\n .modal-close {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px 8px;\n }\n\n .modal-body {\n padding: 20px;\n }\n\n .form-group {\n margin-bottom: 16px;\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 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 textarea.form-input {\n resize: vertical;\n }\n\n .form-info {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .form-info i {\n color: var(--mj-brand-primary);\n }\n\n .modal-footer {\n display: flex;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\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 }\n\n .btn-secondary:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n /* Add to List Dialog */\n .add-to-list-dialog {\n width: 480px;\n }\n\n .add-to-list-dialog .modal-body {\n max-height: 400px;\n overflow-y: auto;\n }\n\n /* Export dialog (mockup 26) */\n .export-dialog .modal-body { max-height: 60vh; overflow-y: auto; }\n .export-format-row { display: flex; gap: 8px; margin-top: 8px; }\n .export-format-option {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n cursor: pointer;\n font-size: 13px;\n background: var(--mj-bg-surface);\n }\n .export-format-option--selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, transparent);\n }\n .export-format-option input[type=\"radio\"] { margin: 0; }\n .export-section-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 16px 0;\n }\n .export-section-label {\n display: block;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n margin-bottom: 8px;\n }\n .export-fields-list {\n max-height: 220px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n }\n .export-field-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 13px;\n cursor: pointer;\n }\n .export-field-row:last-child { border-bottom: none; }\n .export-field-row:hover { background: var(--mj-bg-surface-hover); }\n .export-field-actions {\n display: flex;\n gap: 12px;\n margin-top: 8px;\n align-items: center;\n font-size: 11.5px;\n }\n .export-field-actions a { color: var(--mj-text-link); }\n .export-field-actions .muted {\n margin-left: auto;\n color: var(--mj-text-muted);\n }\n\n .list-search {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n margin-bottom: 12px;\n }\n\n .list-search i {\n color: var(--mj-text-muted);\n flex-shrink: 0;\n }\n\n .list-search .form-input {\n flex: 1;\n border: none;\n background: transparent;\n padding: 0;\n font-size: 14px;\n }\n\n .list-search .form-input:focus {\n box-shadow: none;\n outline: none;\n }\n\n .list-options {\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n max-height: 250px;\n overflow-y: auto;\n }\n\n .list-option {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n cursor: pointer;\n transition: background 0.15s;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .list-option:last-child {\n border-bottom: none;\n }\n\n .list-option:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-option.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .list-option-radio {\n flex-shrink: 0;\n }\n\n .list-option-radio input[type=\"radio\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n }\n\n .list-option-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .list-option-name {\n font-size: 14px;\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-option-entity {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .list-options-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 30px 20px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .list-options-empty i {\n font-size: 28px;\n margin-bottom: 10px;\n opacity: 0.5;\n }\n\n .list-options-empty p {\n margin: 0;\n font-size: 13px;\n }\n\n /* Responsive */\n @media (max-width: 1024px) {\n .operations-content {\n grid-template-columns: 1fr;\n grid-template-rows: auto 1fr auto;\n }\n\n .selection-panel {\n order: 1;\n }\n\n .venn-panel {\n order: 2;\n min-height: 300px;\n }\n\n .results-panel {\n order: 3;\n }\n }\n\n /* Compose-into-target panel (Phase 1.10) */\n .compose-panel {\n margin: 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n overflow: hidden;\n }\n\n .compose-panel__header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .compose-panel__header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .compose-panel__body {\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .compose-grid {\n display: grid;\n grid-template-columns: 1.2fr auto 1fr auto 1fr;\n gap: 16px;\n align-items: flex-start;\n }\n\n .compose-arrow {\n align-self: center;\n font-size: 24px;\n color: var(--mj-text-muted);\n }\n\n .compose-column {\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-width: 0;\n }\n\n .compose-column__label {\n font-size: 11px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n }\n\n .compose-sources {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .compose-source-chip {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n font-size: 12.5px;\n }\n\n .compose-source-chip--view {\n border: 1px dashed var(--mj-border-default);\n background: var(--mj-bg-surface);\n }\n\n .compose-source-name {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .compose-source-badge {\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 999px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n\n .compose-source-badge--view {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .compose-options {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .compose-option {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n font-size: 12.5px;\n }\n\n .compose-option--selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, var(--mj-bg-surface));\n }\n\n .compose-option__title {\n font-weight: 600;\n }\n\n .compose-option__desc {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n }\n\n .compose-input {\n width: 100%;\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n font-size: 12.5px;\n }\n\n .compose-target-search {\n position: relative;\n }\n\n .compose-target-dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: 50;\n }\n\n .compose-footer {\n display: flex;\n align-items: center;\n gap: 10px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .compose-footer__spacer { flex: 1; }\n\n .compose-footer__hint {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .op-btn--primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .op-btn--primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ListsOperationsResource extends BaseResourceComponent implements OnDestroy {\n protected override destroy$ = new Subject<void>();\n\n maxLists = 4;\n selectedLists: ListSelection[] = [];\n availableLists: MJListEntity[] = [];\n filteredAvailableLists: MJListEntity[] = [];\n listSearchTerm = '';\n showListDropdown = false;\n\n // View operands (new in Phase 1.8). Tracked separately from selectedLists\n // so the existing list-only logic keeps working; the operand-aware\n // service combines both into a single computation.\n selectedViews: ViewSelection[] = [];\n availableViews: MJUserViewEntity[] = [];\n filteredAvailableViews: MJUserViewEntity[] = [];\n viewSearchTerm = '';\n showViewDropdown = false;\n\n // Entity filter\n entityOptions: EntityOption[] = [];\n selectedEntityId = '';\n\n vennData: VennData | null = null;\n selectedRegion: VennIntersection | null = null;\n lastOperationResult: SetOperationResult | null = null;\n previewRecords: string[] = [];\n previewRecordsDisplay: PreviewRecord[] = [];\n loadingPreview = false;\n\n isCalculating = false;\n isSaving = false;\n\n // Create dialog\n showCreateDialog = false;\n newListName = '';\n newListDescription = '';\n recordsToAdd: string[] = [];\n\n // Add to existing list dialog\n showAddToListDialog = false;\n addToListSearchTerm = '';\n filteredAddToListOptions: MJListEntity[] = [];\n selectedTargetListId: string | null = null;\n\n // Compose-into-target panel (Phase 1.10) — picks an op + target for\n // committing the result of the selected operands.\n composeOp: SetOperation = 'union';\n composeTarget: 'new' | 'existing' = 'new';\n composeNewListName = '';\n composeTargetListId: string | null = null;\n composeTargetSearch = '';\n showComposeTargetDropdown = false;\n isComposing = false;\n composeDelta: ListDelta | null = null;\n composeConfirmVisible = false;\n\n // Export dialog (mockup 26). Opens before any export; lets the user\n // pick format + which entity fields to include. Fields are resolved\n // from EntityInfo when the dialog opens — no separate fetch.\n showExportDialog = false;\n exportFormat: 'excel' | 'csv' | 'json' = 'excel';\n exportFields: Array<{ Name: string; DisplayName: string; Selected: boolean }> = [];\n exportRecordCount = 0;\n isExporting = false;\n\n private entityIdFromSelectedLists: string | null = null;\n private currentEntityInfo: EntityInfo | null = null;\n\n // User Settings persistence\n private readonly USER_SETTING_KEY = 'ListsOperations.State';\n private saveSettingsTimeout: ReturnType<typeof setTimeout> | null = null;\n private isLoadingSettings = false;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private setOperationsService: ListSetOperationsService,\n private notificationService: MJNotificationService,\n private exportService: ExportService\n ) {\n super();\n }\n\n get hasMultipleEntities(): boolean {\n if (this.totalOperandCount < 2) return false;\n const entities = new Set<string>();\n for (const s of this.selectedLists) entities.add(s.list.EntityID);\n for (const s of this.selectedViews) entities.add(s.entityID);\n return entities.size > 1;\n }\n\n async ngOnInit() {\n super.ngOnInit();\n this.setOperationsService.Provider = this.ProviderToUse;\n await this.loadAvailableLists();\n await this.loadSavedState();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy() {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n\n // Clear any pending save timeout\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n }\n\n async loadAvailableLists() {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const md = this.ProviderToUse;\n\n // RunViews's typed overload doesn't express tuple positions, so we\n // run them as two parallel single-typed RunView calls — same number\n // of round trips, cleaner typing.\n const [listResult, viewResult] = await Promise.all([\n rv.RunView<MJListEntity>({\n EntityName: 'MJ: Lists',\n ExtraFilter: `UserID = '${md.CurrentUser?.ID}'`,\n OrderBy: 'Name',\n ResultType: 'entity_object',\n }),\n rv.RunView<MJUserViewEntity>({\n EntityName: 'MJ: User Views',\n ExtraFilter: `UserID = '${md.CurrentUser?.ID}'`,\n OrderBy: 'Name',\n ResultType: 'entity_object',\n }),\n ]);\n\n if (listResult.Success) {\n this.availableLists = listResult.Results || [];\n this.buildEntityOptions();\n this.filterAvailableLists();\n }\n if (viewResult.Success) {\n this.availableViews = viewResult.Results || [];\n this.filterAvailableViews();\n }\n }\n\n /**\n * Build entity options for the filter dropdown\n */\n private buildEntityOptions(): void {\n const entityCounts = new Map<string, { name: string; count: number }>();\n\n for (const list of this.availableLists) {\n const existing = entityCounts.get(list.EntityID);\n if (existing) {\n existing.count++;\n } else {\n entityCounts.set(list.EntityID, { name: list.Entity || 'Unknown', count: 1 });\n }\n }\n\n this.entityOptions = Array.from(entityCounts.entries())\n .map(([id, data]) => ({\n id,\n name: data.name,\n listCount: data.count\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n }\n\n /**\n * Handle entity filter change\n */\n onEntityFilterChange(): void {\n // If we're locked to an entity and the filter changes to a different\n // one, wipe both list AND view selections — the entity invariant\n // applies to all operands.\n const lockedEntityId = this.lockedEntityID;\n if (lockedEntityId && this.selectedEntityId && this.selectedEntityId !== lockedEntityId) {\n this.selectedLists = [];\n this.selectedViews = [];\n this.vennData = null;\n this.selectedRegion = null;\n this.lastOperationResult = null;\n this.previewRecordsDisplay = [];\n }\n this.filterAvailableLists();\n this.filterAvailableViews();\n this.saveState();\n }\n\n filterAvailableLists() {\n const selectedIds = new Set(this.selectedLists.map(s => s.list.ID));\n let filtered = this.availableLists.filter(l => !selectedIds.has(l.ID));\n\n // Apply entity filter from dropdown\n if (this.selectedEntityId) {\n filtered = filtered.filter(l => UUIDsEqual(l.EntityID, this.selectedEntityId));\n }\n\n // If we have any operands selected (list or view), restrict to same entity.\n const lockedEntityId = this.lockedEntityID;\n if (lockedEntityId) {\n filtered = filtered.filter(l => UUIDsEqual(l.EntityID, lockedEntityId));\n }\n\n if (this.listSearchTerm) {\n const term = this.listSearchTerm.toLowerCase();\n filtered = filtered.filter(l =>\n l.Name.toLowerCase().includes(term) ||\n (l.Entity && l.Entity.toLowerCase().includes(term))\n );\n }\n\n this.filteredAvailableLists = filtered.slice(0, 10);\n }\n\n /**\n * Same logic as `filterAvailableLists` for the view picker. Views are\n * locked to the same entity as any already-selected list or view.\n */\n filterAvailableViews() {\n const selectedIds = new Set(this.selectedViews.map(s => s.view.ID));\n let filtered = this.availableViews.filter(v => !selectedIds.has(v.ID));\n\n if (this.selectedEntityId) {\n filtered = filtered.filter(v => UUIDsEqual(v.EntityID, this.selectedEntityId));\n }\n\n const lockedEntityId = this.lockedEntityID;\n if (lockedEntityId) {\n filtered = filtered.filter(v => UUIDsEqual(v.EntityID, lockedEntityId));\n }\n\n if (this.viewSearchTerm) {\n const term = this.viewSearchTerm.toLowerCase();\n filtered = filtered.filter(v =>\n v.Name.toLowerCase().includes(term) ||\n (v.Entity && v.Entity.toLowerCase().includes(term))\n );\n }\n\n this.filteredAvailableViews = filtered.slice(0, 10);\n }\n\n /**\n * Returns the entity ID that operands are currently locked to, or null\n * if no operands are selected. Lists win over views purely because they\n * come first in the operand list; either source is authoritative.\n */\n private get lockedEntityID(): string | null {\n if (this.selectedLists.length > 0) return this.selectedLists[0].list.EntityID;\n if (this.selectedViews.length > 0) return this.selectedViews[0].entityID;\n return null;\n }\n\n /**\n * Display name of the entity currently locking the picker — drives the\n * \"Comparing operands of type: …\" hint in the UI. Falls back to the\n * first available denormalized name we have.\n */\n public get lockedEntityName(): string | null {\n if (this.selectedLists.length > 0) return this.selectedLists[0].entityName;\n if (this.selectedViews.length > 0) return this.selectedViews[0].entityName;\n return null;\n }\n\n addList(list: MJListEntity) {\n const color = this.setOperationsService.getColorForIndex(this.totalOperandCount);\n\n this.selectedLists.push({\n list,\n entityName: list.Entity || 'Unknown',\n color\n });\n\n this.listSearchTerm = '';\n this.showListDropdown = false;\n this.filterAvailableLists();\n this.filterAvailableViews();\n this.recalculateVenn();\n this.saveState();\n }\n\n removeList(index: number) {\n this.selectedLists.splice(index, 1);\n\n // Reassign colors across BOTH lists and views so the palette stays in order.\n this.reassignOperandColors();\n\n this.filterAvailableLists();\n this.filterAvailableViews();\n this.recalculateVenn();\n this.saveState();\n }\n\n addView(view: MJUserViewEntity) {\n const color = this.setOperationsService.getColorForIndex(this.totalOperandCount);\n this.selectedViews.push({\n view,\n entityName: view.Entity || 'Unknown',\n entityID: view.EntityID,\n color,\n });\n this.viewSearchTerm = '';\n this.showViewDropdown = false;\n this.filterAvailableLists();\n this.filterAvailableViews();\n this.recalculateVenn();\n this.saveState();\n }\n\n removeView(index: number) {\n this.selectedViews.splice(index, 1);\n this.reassignOperandColors();\n this.filterAvailableLists();\n this.filterAvailableViews();\n this.recalculateVenn();\n this.saveState();\n }\n\n private reassignOperandColors(): void {\n let i = 0;\n for (const s of this.selectedLists) {\n s.color = this.setOperationsService.getColorForIndex(i++);\n }\n for (const s of this.selectedViews) {\n s.color = this.setOperationsService.getColorForIndex(i++);\n }\n }\n\n async recalculateVenn() {\n if (this.totalOperandCount === 0) {\n this.vennData = null;\n this.selectedRegion = null;\n this.lastOperationResult = null;\n return;\n }\n\n this.isCalculating = true;\n this.cdr.detectChanges();\n\n try {\n const operands = this.buildAllOperands();\n this.vennData = await this.setOperationsService.calculateVennDataForOperands(operands);\n this.selectedRegion = null;\n this.lastOperationResult = null;\n } catch (error) {\n console.error('Error calculating Venn data:', error);\n } finally {\n this.isCalculating = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Combined operand count — drives \"≥ 2 operands\" checks for showing\n * operation buttons + the Venn diagram empty-state.\n */\n get totalOperandCount(): number {\n return this.selectedLists.length + this.selectedViews.length;\n }\n\n /**\n * Build the unified `SetOperand[]` for the service. Lists come first\n * (preserving the existing color order); views follow. Each view's\n * color is picked sequentially from the same palette.\n */\n private buildAllOperands(): SetOperand[] {\n const fromLists: SetOperand[] = this.selectedLists.map((s) => ({\n kind: 'list',\n id: s.list.ID,\n name: s.list.Name,\n entityID: s.list.EntityID,\n entityName: s.entityName,\n color: s.color,\n }));\n const fromViews: SetOperand[] = this.selectedViews.map((s) => ({\n kind: 'view',\n id: s.view.ID,\n name: s.view.Name,\n entityID: s.entityID,\n entityName: s.entityName,\n color: s.color,\n }));\n return [...fromLists, ...fromViews];\n }\n\n onRegionClick(event: VennRegionClickEvent) {\n this.selectedRegion = event.intersection;\n this.lastOperationResult = null;\n this.previewRecords = event.recordIds.slice(0, 10);\n this.loadPreviewRecords(event.recordIds.slice(0, 10));\n this.cdr.detectChanges();\n }\n\n /**\n * Load preview records with meaningful display fields\n */\n private async loadPreviewRecords(recordIds: string[]): Promise<void> {\n if (recordIds.length === 0 || this.selectedLists.length === 0) {\n this.previewRecordsDisplay = [];\n return;\n }\n\n this.loadingPreview = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const entityId = this.selectedLists[0].list.EntityID;\n const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, entityId));\n\n if (!entityInfo) {\n // Fallback to showing just IDs\n this.previewRecordsDisplay = recordIds.map(id => ({\n id,\n displayName: id,\n entityName: this.selectedLists[0].entityName\n }));\n return;\n }\n\n this.currentEntityInfo = entityInfo;\n\n // Find the best display fields\n const displayFields = this.getDisplayFields(entityInfo);\n\n // Build filter for the records\n const primaryKeyFields = entityInfo.PrimaryKeys;\n const primaryKeyField = primaryKeyFields.length > 0 ? primaryKeyFields[0].Name : 'ID';\n const recordIdFilter = recordIds.map(id => `'${id}'`).join(',');\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<Record<string, unknown>>({\n EntityName: entityInfo.Name,\n ExtraFilter: `${primaryKeyField} IN (${recordIdFilter})`,\n Fields: [primaryKeyField, ...displayFields],\n ResultType: 'simple'\n });\n\n if (result.Success && result.Results) {\n this.previewRecordsDisplay = result.Results.map(record => {\n const id = String(record[primaryKeyField] || '');\n const displayName = this.getDisplayValue(record, displayFields[0]) || id;\n const secondaryInfo = displayFields.length > 1\n ? this.getDisplayValue(record, displayFields[1])\n : undefined;\n\n return {\n id,\n displayName,\n secondaryInfo,\n entityName: entityInfo.Name\n };\n });\n } else {\n // Fallback\n this.previewRecordsDisplay = recordIds.map(id => ({\n id,\n displayName: id,\n entityName: entityInfo.Name\n }));\n }\n } catch (error) {\n console.error('Error loading preview records:', error);\n this.previewRecordsDisplay = recordIds.map(id => ({\n id,\n displayName: id,\n entityName: this.selectedLists[0]?.entityName || 'Unknown'\n }));\n } finally {\n this.loadingPreview = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Get the best display fields for an entity based on metadata\n */\n private getDisplayFields(entityInfo: EntityInfo): string[] {\n const fields: string[] = [];\n\n // First priority: NameField (IsNameField = true)\n const nameField = entityInfo.Fields.find(f => f.IsNameField);\n if (nameField) {\n fields.push(nameField.Name);\n }\n\n // Second priority: DefaultInView fields (excluding primary key unless it's also the name field)\n const defaultViewFields = entityInfo.Fields\n .filter(f => f.DefaultInView && !f.IsPrimaryKey && f.Name !== nameField?.Name)\n .slice(0, 2); // Take up to 2 more fields\n\n for (const field of defaultViewFields) {\n if (!fields.includes(field.Name)) {\n fields.push(field.Name);\n }\n }\n\n // If we still don't have any fields, use common field names\n if (fields.length === 0) {\n const commonNames = ['Name', 'Title', 'Subject', 'Description', 'Email', 'FirstName'];\n for (const name of commonNames) {\n const field = entityInfo.Fields.find(f => f.Name === name);\n if (field) {\n fields.push(field.Name);\n break;\n }\n }\n }\n\n // If still nothing, include primary key\n if (fields.length === 0 && entityInfo.PrimaryKeys.length > 0) {\n fields.push(entityInfo.PrimaryKeys[0].Name);\n }\n\n return fields.slice(0, 3); // Max 3 fields\n }\n\n /**\n * Get a display value from a record\n */\n private getDisplayValue(record: Record<string, unknown>, fieldName: string): string | undefined {\n const value = record[fieldName];\n if (value === null || value === undefined) return undefined;\n if (value instanceof Date) {\n return value.toLocaleDateString();\n }\n return String(value);\n }\n\n /**\n * Open a record in the entity viewer\n */\n openRecord(record: PreviewRecord): void {\n if (!this.currentEntityInfo) {\n // Try to get entity info\n const md = this.ProviderToUse;\n const entityId = this.selectedLists[0]?.list.EntityID;\n if (entityId) {\n this.currentEntityInfo = md.Entities.find(e => UUIDsEqual(e.ID, entityId)) || null;\n }\n }\n\n if (this.currentEntityInfo) {\n SharedService.Instance.InvokeManualResize();\n // Create composite key for navigation\n const primaryKeyField = this.currentEntityInfo.PrimaryKeys.length > 0\n ? this.currentEntityInfo.PrimaryKeys[0].Name\n : 'ID';\n const compositeKey = new CompositeKey([{ FieldName: primaryKeyField, Value: record.id }]);\n SharedService.Instance.OpenEntityRecord(this.currentEntityInfo.Name, compositeKey);\n } else {\n this.notificationService.CreateSimpleNotification('Unable to open record', 'error', 3000);\n }\n }\n\n async performOperation(operation: SetOperation) {\n if (this.totalOperandCount < 2) return;\n\n this.isCalculating = true;\n this.selectedRegion = null;\n this.cdr.detectChanges();\n\n try {\n const operands = this.buildAllOperands();\n this.lastOperationResult = await this.setOperationsService.performOperationForOperands(operation, operands);\n this.previewRecords = this.lastOperationResult.resultRecordIds.slice(0, 10);\n } catch (error) {\n console.error('Error performing operation:', error);\n } finally {\n this.isCalculating = false;\n this.cdr.detectChanges();\n }\n }\n\n // -------------------------------------------------------------------\n // Compose-into-target (Phase 1.10)\n //\n // The \"Compose\" panel sits below the Venn diagram. It mirrors the\n // operand list already chosen above but adds the explicit target step:\n // either materialize the result into a brand-new List, or merge into an\n // existing one (which routes through the delta-confirm dialog because\n // existing-target operations can produce drops).\n //\n // The op selector here only supports the three set-ops the server\n // exposes (union / intersection / difference). The Quick Operations\n // panel above still has `symmetric_difference` for preview, but that\n // doesn't map to a server compose op — and a target commit needs the\n // server side for the delta + drop-guard.\n // -------------------------------------------------------------------\n\n /**\n * Server-side compose preview — builds inputs from the currently selected\n * operands (lists + views) and calls `ComposeLists`. Returns the signed\n * delta so `composeAndSave` can route through `ApplyListDelta` when the\n * target is an existing list.\n */\n private buildComposeInputs(): ListSource[] {\n const inputs: ListSource[] = this.selectedLists.map<ListSource>((s) => ({\n kind: 'list',\n listId: s.list.ID,\n }));\n for (const s of this.selectedViews) {\n inputs.push({ kind: 'view', viewId: s.view.ID });\n }\n return inputs;\n }\n\n public get canCompose(): boolean {\n if (this.totalOperandCount < 2) return false;\n if (this.composeTarget === 'new') return this.composeNewListName.trim().length > 0;\n return !!this.composeTargetListId;\n }\n\n /**\n * \"Preview Result\" — re-runs the Quick-Operation path with the compose\n * panel's chosen op so the user can see the expected output count\n * before committing. We use the local set-op service rather than the\n * server here because preview is a read-only operation that doesn't\n * need a delta token (target is null) — staying local keeps it fast.\n */\n public async previewCompose(): Promise<void> {\n if (this.totalOperandCount < 2) return;\n await this.performOperation(this.composeOp);\n }\n\n /**\n * Commit the compose: either materialize a new list (client-side using\n * the previewed record IDs) or merge into an existing list via the\n * server's ComposeLists + ApplyListDelta flow.\n */\n public async composeAndSave(): Promise<void> {\n if (!this.canCompose || this.isComposing) return;\n this.isComposing = true;\n this.cdr.detectChanges();\n try {\n if (this.composeTarget === 'new') {\n await this.composeToNewList();\n } else {\n await this.composeToExistingList();\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.notificationService.CreateSimpleNotification(`Compose failed: ${message}`, 'error', 5000);\n } finally {\n this.isComposing = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * New-list path: ensure preview is fresh, then route through the\n * existing \"create list from selection\" machinery using the result's\n * record IDs. This keeps materialization + naming in one place.\n */\n private async composeToNewList(): Promise<void> {\n // Refresh preview so result reflects the compose-panel's op (the user\n // may have run a different op via Quick Operations).\n await this.performOperation(this.composeOp);\n if (!this.lastOperationResult || this.lastOperationResult.resultCount === 0) {\n this.notificationService.CreateSimpleNotification(\n 'Compose produced zero records — nothing to save.',\n 'warning',\n 3000,\n );\n return;\n }\n this.newListName = this.composeNewListName.trim();\n this.newListDescription = `Composed via ${this.getOperationLabel(this.composeOp)} of ${this.totalOperandCount} source(s).`;\n this.recordsToAdd = this.lastOperationResult.resultRecordIds;\n await this.confirmCreateList();\n // Clear the compose form on success.\n this.composeNewListName = '';\n this.cdr.detectChanges();\n }\n\n /**\n * Existing-list path: compose server-side to get a signed delta, then\n * surface the delta-confirm dialog. Sync semantics (replace contents)\n * apply implicitly — the server returns ToRemove for any records that\n * are in the target but not in the compose result.\n */\n private async composeToExistingList(): Promise<void> {\n if (!this.composeTargetListId) return;\n const provider = this.ProviderToUse as unknown as GraphQLDataProvider;\n const client = new GraphQLListsClient(provider);\n const delta = await client.ComposeLists({\n Op: this.composeOp as 'union' | 'intersection' | 'difference',\n Inputs: this.buildComposeInputs(),\n Target: { kind: 'list', listId: this.composeTargetListId },\n });\n this.composeDelta = delta;\n this.composeConfirmVisible = true;\n }\n\n public onComposeConfirmCancel(): void {\n this.composeConfirmVisible = false;\n this.composeDelta = null;\n this.cdr.detectChanges();\n }\n\n public async onComposeConfirmCommit(deltaToken: string): Promise<void> {\n if (!this.composeDelta) return;\n const provider = this.ProviderToUse as unknown as GraphQLDataProvider;\n const client = new GraphQLListsClient(provider);\n try {\n const result = await client.ApplyListDelta({\n Delta: { ...this.composeDelta, DeltaToken: deltaToken },\n ConfirmDrops: (this.composeDelta.Counts.Remove ?? 0) > 0,\n });\n if (result.Success) {\n this.composeConfirmVisible = false;\n this.composeDelta = null;\n this.notificationService.CreateSimpleNotification(\n `Target updated: +${result.Counts?.Added ?? 0} / -${result.Counts?.Removed ?? 0}`,\n 'success',\n 3000,\n );\n } else {\n this.notificationService.CreateSimpleNotification(\n `Compose apply failed: ${result.Message}`,\n 'error',\n 5000,\n );\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.notificationService.CreateSimpleNotification(`Compose apply failed: ${message}`, 'error', 5000);\n } finally {\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Filtered list of existing lists eligible as compose targets. We\n * exclude lists already in the selected operands (committing to a\n * source list would be a self-referential compose) and lists from\n * other entities (the entity invariant still applies).\n */\n public get filteredComposeTargets(): MJListEntity[] {\n const operandListIds = new Set(this.selectedLists.map((s) => s.list.ID));\n const lockedEntityId = this.lockedEntityID;\n let pool = this.availableLists.filter((l) => !operandListIds.has(l.ID));\n if (lockedEntityId) {\n pool = pool.filter((l) => UUIDsEqual(l.EntityID, lockedEntityId));\n }\n if (this.composeTargetSearch.trim().length > 0) {\n const term = this.composeTargetSearch.toLowerCase();\n pool = pool.filter((l) => l.Name.toLowerCase().includes(term));\n }\n return pool.slice(0, 10);\n }\n\n public selectComposeTarget(list: MJListEntity): void {\n this.composeTargetListId = list.ID;\n this.composeTargetSearch = list.Name;\n this.showComposeTargetDropdown = false;\n }\n\n public composeTargetDisplayName(): string {\n if (!this.composeTargetListId) return '';\n const found = this.availableLists.find((l) => UUIDsEqual(l.ID, this.composeTargetListId!));\n return found?.Name ?? '';\n }\n\n getOperationLabel(operation: SetOperation): string {\n switch (operation) {\n case 'union': return 'Union (All Records)';\n case 'intersection': return 'Intersection (Common Records)';\n case 'difference': return 'Difference';\n case 'symmetric_difference': return 'Unique to Each List';\n case 'complement': return 'Complement';\n default: return operation;\n }\n }\n\n createListFromSelection() {\n if (!this.selectedRegion || this.selectedRegion.size === 0) return;\n this.recordsToAdd = [...this.selectedRegion.recordIds];\n this.newListName = '';\n this.newListDescription = `Created from: ${this.selectedRegion.label}`;\n this.showCreateDialog = true;\n }\n\n createListFromResult() {\n if (!this.lastOperationResult || this.lastOperationResult.resultCount === 0) return;\n this.recordsToAdd = [...this.lastOperationResult.resultRecordIds];\n this.newListName = '';\n this.newListDescription = `Created from: ${this.getOperationLabel(this.lastOperationResult.operation)}`;\n this.showCreateDialog = true;\n }\n\n cancelCreateDialog() {\n this.showCreateDialog = false;\n this.newListName = '';\n this.newListDescription = '';\n this.recordsToAdd = [];\n }\n\n async confirmCreateList() {\n if (!this.newListName || this.recordsToAdd.length === 0) return;\n\n // Get entity ID from selected lists\n if (this.selectedLists.length === 0) return;\n const entityId = this.selectedLists[0].list.EntityID;\n\n this.isSaving = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const tg = await md.CreateTransactionGroup();\n\n // Queue the list plus all of its initial detail records in a single transaction.\n // NewRecord() assigns a client-side UUID so the details can reference list.ID\n // before the list actually persists.\n const list = await md.GetEntityObject<MJListEntity>('MJ: Lists', md.CurrentUser);\n list.NewRecord();\n list.Name = this.newListName;\n list.Description = this.newListDescription || null;\n list.EntityID = entityId;\n list.UserID = md.CurrentUser!.ID;\n list.TransactionGroup = tg;\n await list.Save();\n\n for (const recordId of this.recordsToAdd) {\n const detail = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details', md.CurrentUser);\n detail.NewRecord();\n detail.ListID = list.ID;\n detail.RecordID = recordId;\n detail.Sequence = 0;\n detail.TransactionGroup = tg;\n await detail.Save();\n }\n\n if (!await tg.Submit()) {\n this.notificationService.CreateSimpleNotification(\n 'Failed to create list — all changes have been rolled back',\n 'error',\n 4000\n );\n return;\n }\n\n this.notificationService.CreateSimpleNotification(\n `Created \"${this.newListName}\" with ${this.recordsToAdd.length} items`,\n 'success',\n 3000\n );\n\n this.cancelCreateDialog();\n\n // Refresh available lists\n await this.loadAvailableLists();\n } catch (error) {\n console.error('Error creating list:', error);\n this.notificationService.CreateSimpleNotification('Error creating list', 'error', 4000);\n } finally {\n this.isSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n addToExistingList() {\n if (!this.selectedRegion || this.selectedRegion.size === 0) return;\n this.recordsToAdd = [...this.selectedRegion.recordIds];\n this.openAddToListDialog();\n }\n\n addResultToExistingList() {\n if (!this.lastOperationResult || this.lastOperationResult.resultCount === 0) return;\n this.recordsToAdd = [...this.lastOperationResult.resultRecordIds];\n this.openAddToListDialog();\n }\n\n /**\n * Open the Add to Existing List dialog\n */\n private openAddToListDialog(): void {\n this.showAddToListDialog = true;\n this.addToListSearchTerm = '';\n this.selectedTargetListId = null;\n this.filterAddToListOptions();\n }\n\n /**\n * Filter available lists for add-to-list dialog\n */\n filterAddToListOptions(): void {\n // Get entity ID from selected lists to filter to same entity type\n if (this.selectedLists.length === 0) {\n this.filteredAddToListOptions = [];\n return;\n }\n\n const entityId = this.selectedLists[0].list.EntityID;\n\n // Filter to same entity, exclude already selected lists\n const selectedIds = new Set(this.selectedLists.map(s => s.list.ID));\n let filtered = this.availableLists.filter(l =>\n UUIDsEqual(l.EntityID, entityId) && !selectedIds.has(l.ID)\n );\n\n // Apply search filter\n if (this.addToListSearchTerm) {\n const term = this.addToListSearchTerm.toLowerCase();\n filtered = filtered.filter(l =>\n l.Name.toLowerCase().includes(term)\n );\n }\n\n this.filteredAddToListOptions = filtered;\n }\n\n /**\n * Select a target list for adding records\n */\n IsTargetListSelected(list: MJListEntity): boolean {\n return UUIDsEqual(this.selectedTargetListId, list.ID);\n }\n\n selectTargetList(listId: string): void {\n this.selectedTargetListId = listId;\n }\n\n /**\n * Cancel the add to list dialog\n */\n cancelAddToListDialog(): void {\n this.showAddToListDialog = false;\n this.addToListSearchTerm = '';\n this.selectedTargetListId = null;\n this.recordsToAdd = [];\n }\n\n /**\n * Confirm adding records to selected list\n */\n async confirmAddToList(): Promise<void> {\n if (!this.selectedTargetListId || this.recordsToAdd.length === 0) return;\n\n this.isSaving = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const tg = await md.CreateTransactionGroup();\n\n for (const recordId of this.recordsToAdd) {\n const detail = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details', md.CurrentUser);\n detail.ListID = this.selectedTargetListId;\n detail.RecordID = recordId;\n detail.Sequence = 0;\n detail.TransactionGroup = tg;\n await detail.Save();\n }\n\n const success = await tg.Submit();\n\n if (success) {\n const targetList = this.availableLists.find(l => UUIDsEqual(l.ID, this.selectedTargetListId));\n this.notificationService.CreateSimpleNotification(\n `Added ${this.recordsToAdd.length} records to \"${targetList?.Name || 'list'}\"`,\n 'success',\n 3000\n );\n } else {\n this.notificationService.CreateSimpleNotification(\n 'Failed to add some records',\n 'warning',\n 4000\n );\n }\n\n this.cancelAddToListDialog();\n } catch (error) {\n console.error('Error adding to list:', error);\n this.notificationService.CreateSimpleNotification('Error adding records to list', 'error', 4000);\n } finally {\n this.isSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Open the export-format-and-columns picker (mockup 26). Resolves the\n * candidate field list from EntityInfo on the loaded metadata — no\n * extra RunView. Default selection mirrors what the previous\n * \"export all\" behavior produced.\n */\n public openExportDialog(): void {\n const recordIds = this.selectedRegion?.recordIds ?? this.lastOperationResult?.resultRecordIds ?? [];\n if (recordIds.length === 0) {\n this.notificationService.CreateSimpleNotification('Nothing to export — pick a region first.', 'info', 3000);\n return;\n }\n const entityName = this.selectedLists[0]?.entityName ?? this.selectedViews[0]?.entityName ?? null;\n if (!entityName) {\n this.notificationService.CreateSimpleNotification('Cannot determine entity for export.', 'error', 4000);\n return;\n }\n const md = this.ProviderToUse;\n const entityInfo = md.EntityByName(entityName);\n if (!entityInfo) {\n this.notificationService.CreateSimpleNotification(`Entity '${entityName}' not found.`, 'error', 4000);\n return;\n }\n if (entityInfo.PrimaryKeys.length !== 1) {\n this.notificationService.CreateSimpleNotification(\n `Composite-PK entities ('${entityName}') aren't yet supported for Operations export.`,\n 'warning', 5000,\n );\n return;\n }\n // Build the candidate field list from the loaded EntityInfo. Hide\n // virtual / not-queryable fields so users can't pick them and get\n // a confusing empty column. Default-select everything to match the\n // previous \"export all\" behavior.\n this.exportFields = entityInfo.Fields\n .filter((f) => f.IsVirtual !== true)\n .map((f) => ({\n Name: f.Name,\n DisplayName: f.DisplayName || f.Name,\n Selected: true,\n }));\n this.exportRecordCount = recordIds.length;\n this.exportFormat = 'excel';\n this.showExportDialog = true;\n this.cdr.detectChanges();\n }\n\n public closeExportDialog(): void {\n this.showExportDialog = false;\n this.cdr.detectChanges();\n }\n\n public selectAllExportFields(): void {\n for (const f of this.exportFields) f.Selected = true;\n }\n public selectNoneExportFields(): void {\n for (const f of this.exportFields) f.Selected = false;\n }\n public get selectedExportFieldCount(): number {\n return this.exportFields.filter((f) => f.Selected).length;\n }\n\n /**\n * Run the export with the user's selected format + columns. Bulk-load\n * via RunView restricted to the chosen Fields so we don't shuttle\n * data we'll then throw away.\n */\n public async executeExport(): Promise<void> {\n const recordIds = this.selectedRegion?.recordIds ?? this.lastOperationResult?.resultRecordIds ?? [];\n if (recordIds.length === 0) return;\n const entityName = this.selectedLists[0]?.entityName ?? this.selectedViews[0]?.entityName ?? null;\n if (!entityName) return;\n const selectedFields = this.exportFields.filter((f) => f.Selected).map((f) => f.Name);\n if (selectedFields.length === 0) return;\n\n this.isExporting = true;\n this.cdr.detectChanges();\n try {\n const md = this.ProviderToUse;\n const entityInfo = md.EntityByName(entityName)!;\n const pk = entityInfo.PrimaryKeys[0].Name;\n // Always include the PK in the SELECT — RunView won't filter on\n // a column it didn't pull, and downstream lookups expect it.\n const fieldsForQuery = Array.from(new Set([pk, ...selectedFields]));\n const escaped = recordIds.map((id) => `'${String(id).replace(/'/g, \"''\")}'`).join(',');\n const rv = RunView.FromMetadataProvider(md);\n const result = await rv.RunView<Record<string, unknown>>({\n EntityName: entityName,\n ExtraFilter: `${pk} IN (${escaped})`,\n Fields: fieldsForQuery,\n ResultType: 'simple',\n });\n if (!result.Success) {\n this.notificationService.CreateSimpleNotification(`Export failed: ${result.ErrorMessage}`, 'error', 5000);\n return;\n }\n // Project rows to exactly the user's selected columns + ordering\n // so the file matches what they checked. Skips the PK if they\n // didn't pick it.\n const rows = (result.Results ?? []).map((row) => {\n const projected: Record<string, unknown> = {};\n for (const f of selectedFields) projected[f] = row[f];\n return projected;\n });\n const dateStamp = new Date().toISOString().slice(0, 10);\n const ext = this.exportFormat === 'excel' ? 'xlsx' : this.exportFormat;\n const fileName = `lists-operations-${dateStamp}.${ext}`;\n const exportResult = this.exportFormat === 'excel'\n ? await this.exportService.toExcel(rows, { fileName, includeHeaders: true })\n : this.exportFormat === 'csv'\n ? await this.exportService.toCSV(rows, { fileName, includeHeaders: true })\n : await this.exportService.toJSON(rows, { fileName });\n if (exportResult.success) {\n this.exportService.downloadResult(exportResult);\n this.notificationService.CreateSimpleNotification(`Exported ${rows.length} record(s)`, 'success', 3000);\n this.showExportDialog = false;\n } else {\n this.notificationService.CreateSimpleNotification('Export failed', 'error', 5000);\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.notificationService.CreateSimpleNotification(`Export error: ${message}`, 'error', 5000);\n } finally {\n this.isExporting = false;\n this.cdr.detectChanges();\n }\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Operations';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-diagram-project';\n }\n\n /**\n * Clear all selections and reset state\n */\n clearAllSelections(): void {\n this.selectedLists = [];\n this.selectedViews = [];\n this.selectedEntityId = '';\n this.vennData = null;\n this.selectedRegion = null;\n this.lastOperationResult = null;\n this.previewRecordsDisplay = [];\n this.filterAvailableLists();\n this.filterAvailableViews();\n this.saveState();\n this.cdr.detectChanges();\n }\n\n /**\n * Save state to User Settings (debounced to avoid excessive writes)\n */\n private saveState(): void {\n // Don't save during initial load\n if (this.isLoadingSettings) return;\n\n // Debounce the server save\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n this.saveSettingsTimeout = setTimeout(() => {\n this.saveStateToServer();\n }, 1000); // 1 second debounce\n }\n\n /**\n * Save state to User Settings entity on server\n */\n private async saveStateToServer(): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const userId = md.CurrentUser?.ID;\n if (!userId) return;\n\n const stateToSave = {\n entityId: this.selectedEntityId,\n listIds: this.selectedLists.map(s => s.list.ID)\n };\n\n const engine = UserInfoEngine.Instance;\n\n // Find existing setting from cached user settings\n let setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_KEY);\n\n if (!setting) {\n // Create new setting\n setting = await md.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n setting.UserID = userId;\n setting.Setting = this.USER_SETTING_KEY;\n }\n\n setting.Value = JSON.stringify(stateToSave);\n await setting.Save();\n } catch (error) {\n console.warn('Failed to save operations state to User Settings:', error);\n }\n }\n\n /**\n * Load saved state from User Settings\n */\n private async loadSavedState(): Promise<void> {\n this.isLoadingSettings = true;\n\n try {\n const md = this.ProviderToUse;\n const userId = md.CurrentUser?.ID;\n if (!userId) {\n this.isLoadingSettings = false;\n return;\n }\n\n // Load from cached User Settings\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_KEY);\n\n if (setting?.Value) {\n const state = JSON.parse(setting.Value) as { entityId?: string; listIds?: string[] };\n\n // Restore entity filter\n if (state.entityId) {\n this.selectedEntityId = state.entityId;\n }\n\n // Restore selected lists\n if (state.listIds && state.listIds.length > 0) {\n for (const listId of state.listIds) {\n const list = this.availableLists.find(l => UUIDsEqual(l.ID, listId));\n if (list) {\n const color = this.setOperationsService.getColorForIndex(this.selectedLists.length);\n this.selectedLists.push({\n list,\n entityName: list.Entity || 'Unknown',\n color\n });\n }\n }\n\n // If we restored lists, recalculate venn\n if (this.selectedLists.length > 0) {\n this.filterAvailableLists();\n await this.recalculateVenn();\n }\n }\n\n this.cdr.detectChanges();\n }\n } catch (error) {\n console.warn('Failed to load operations state from User Settings:', error);\n } finally {\n this.isLoadingSettings = false;\n }\n }\n}\n"]}
|