@memberjunction/ng-dashboards 5.28.0 → 5.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  2. package/dist/AI/components/agents/agent-configuration.component.js +11 -9
  3. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  4. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.js +21 -19
  6. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  7. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +154 -154
  8. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  9. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  10. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +8 -0
  11. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  12. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +1 -1
  13. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  14. package/dist/AI/components/vectors/vector-management-resource.component.js +2 -2
  15. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  16. package/dist/APIKeys/api-applications-panel.component.d.ts +1 -1
  17. package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
  18. package/dist/APIKeys/api-applications-panel.component.js +15 -2
  19. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  20. package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
  21. package/dist/APIKeys/api-key-edit-panel.component.js +17 -5
  22. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  23. package/dist/Archiving/components/archive-config-resource.component.d.ts +20 -0
  24. package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -0
  25. package/dist/Archiving/components/archive-config-resource.component.js +46 -0
  26. package/dist/Archiving/components/archive-config-resource.component.js.map +1 -0
  27. package/dist/Archiving/components/archive-runs-resource.component.d.ts +20 -0
  28. package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -0
  29. package/dist/Archiving/components/archive-runs-resource.component.js +46 -0
  30. package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -0
  31. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  32. package/dist/Credentials/components/credentials-list-resource.component.js +56 -71
  33. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  34. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +0 -8
  35. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  36. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +73 -74
  37. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  38. package/dist/DashboardBrowser/dashboard-share-adapter.d.ts +25 -0
  39. package/dist/DashboardBrowser/dashboard-share-adapter.d.ts.map +1 -0
  40. package/dist/DashboardBrowser/dashboard-share-adapter.js +99 -0
  41. package/dist/DashboardBrowser/dashboard-share-adapter.js.map +1 -0
  42. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +21 -104
  43. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
  44. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +48 -530
  45. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  46. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +5 -0
  47. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  48. package/dist/DataExplorer/data-explorer-dashboard.component.js +17 -0
  49. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  50. package/dist/Integration/components/connections/connections.component.d.ts +18 -1
  51. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  52. package/dist/Integration/components/connections/connections.component.js +251 -199
  53. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  54. package/dist/Integration/services/integration-data.service.d.ts +7 -2
  55. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  56. package/dist/Integration/services/integration-data.service.js +10 -2
  57. package/dist/Integration/services/integration-data.service.js.map +1 -1
  58. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +144 -144
  59. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  60. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  61. package/dist/Lists/components/lists-operations-resource.component.js +12 -14
  62. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  63. package/dist/MCP/components/mcp-connection-dialog.component.js +1 -1
  64. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  65. package/dist/MCP/mcp-dashboard.component.d.ts +170 -0
  66. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  67. package/dist/MCP/mcp-dashboard.component.js +2521 -758
  68. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  69. package/dist/MCP/mcp-filter-panel.component.d.ts +16 -1
  70. package/dist/MCP/mcp-filter-panel.component.d.ts.map +1 -1
  71. package/dist/MCP/mcp-filter-panel.component.js +187 -60
  72. package/dist/MCP/mcp-filter-panel.component.js.map +1 -1
  73. package/dist/MCP/mcp-resource.component.d.ts +0 -9
  74. package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
  75. package/dist/MCP/mcp-resource.component.js +1 -10
  76. package/dist/MCP/mcp-resource.component.js.map +1 -1
  77. package/dist/MCP/mcp.module.d.ts +7 -6
  78. package/dist/MCP/mcp.module.d.ts.map +1 -1
  79. package/dist/MCP/mcp.module.js +4 -8
  80. package/dist/MCP/mcp.module.js.map +1 -1
  81. package/dist/Permissions/audit-log-resource.component.d.ts +38 -0
  82. package/dist/Permissions/audit-log-resource.component.d.ts.map +1 -0
  83. package/dist/Permissions/audit-log-resource.component.js +380 -0
  84. package/dist/Permissions/audit-log-resource.component.js.map +1 -0
  85. package/dist/Permissions/permissions-shared.d.ts +51 -0
  86. package/dist/Permissions/permissions-shared.d.ts.map +1 -0
  87. package/dist/Permissions/permissions-shared.js +91 -0
  88. package/dist/Permissions/permissions-shared.js.map +1 -0
  89. package/dist/Permissions/resource-access-resource.component.d.ts +45 -0
  90. package/dist/Permissions/resource-access-resource.component.d.ts.map +1 -0
  91. package/dist/Permissions/resource-access-resource.component.js +342 -0
  92. package/dist/Permissions/resource-access-resource.component.js.map +1 -0
  93. package/dist/Permissions/user-access-resource.component.d.ts +39 -0
  94. package/dist/Permissions/user-access-resource.component.d.ts.map +1 -0
  95. package/dist/Permissions/user-access-resource.component.js +346 -0
  96. package/dist/Permissions/user-access-resource.component.js.map +1 -0
  97. package/dist/QueryBrowser/query-browser-resource.component.d.ts +13 -3
  98. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  99. package/dist/QueryBrowser/query-browser-resource.component.js +186 -139
  100. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  101. package/dist/archiving-dashboards.module.d.ts +19 -0
  102. package/dist/archiving-dashboards.module.d.ts.map +1 -0
  103. package/dist/archiving-dashboards.module.js +52 -0
  104. package/dist/archiving-dashboards.module.js.map +1 -0
  105. package/dist/component-studio-dashboards.module.d.ts +1 -0
  106. package/dist/component-studio-dashboards.module.d.ts.map +1 -1
  107. package/dist/component-studio-dashboards.module.js +7 -0
  108. package/dist/component-studio-dashboards.module.js.map +1 -1
  109. package/dist/core-dashboards.module.d.ts +24 -19
  110. package/dist/core-dashboards.module.d.ts.map +1 -1
  111. package/dist/core-dashboards.module.js +30 -1
  112. package/dist/core-dashboards.module.js.map +1 -1
  113. package/dist/module.d.ts +13 -12
  114. package/dist/module.d.ts.map +1 -1
  115. package/dist/module.js +7 -0
  116. package/dist/module.js.map +1 -1
  117. package/dist/public-api.d.ts +7 -1
  118. package/dist/public-api.d.ts.map +1 -1
  119. package/dist/public-api.js +8 -0
  120. package/dist/public-api.js.map +1 -1
  121. package/dist/shared/pipes/highlight-search.pipe.d.ts +1 -1
  122. package/dist/shared/pipes/highlight-search.pipe.d.ts.map +1 -1
  123. package/dist/shared/pipes/highlight-search.pipe.js +14 -4
  124. package/dist/shared/pipes/highlight-search.pipe.js.map +1 -1
  125. package/package.json +52 -48
@@ -1 +1 @@
1
- {"version":3,"file":"lists-operations-resource.component.d.ts","sourceRoot":"","sources":["../../../src/Lists/components/lists-operations-resource.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lists-operations-resource.component.d.ts","sourceRoot":"","sources":["../../../src/Lists/components/lists-operations-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,iBAAiB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE3F,OAAO,EAAE,qBAAqB,EAAiB,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,YAAY,EAA2D,MAAM,+BAA+B,CAAC;AAEpI,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,wBAAwB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AACjJ,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;;AACzE,UAAU,aAAa;IACrB,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAuuCa,uBAAwB,SAAQ,qBAAsB,YAAW,SAAS;IA6CnF,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,mBAAmB;IA9C7B,UAAmB,QAAQ,gBAAuB;IAElD,QAAQ,SAAK;IACb,aAAa,EAAE,aAAa,EAAE,CAAM;IACpC,cAAc,EAAE,YAAY,EAAE,CAAM;IACpC,sBAAsB,EAAE,YAAY,EAAE,CAAM;IAC5C,cAAc,SAAM;IACpB,gBAAgB,UAAS;IAGzB,aAAa,EAAE,YAAY,EAAE,CAAM;IACnC,gBAAgB,SAAM;IAEtB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAQ;IACjC,cAAc,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAC/C,mBAAmB,EAAE,kBAAkB,GAAG,IAAI,CAAQ;IACtD,cAAc,EAAE,MAAM,EAAE,CAAM;IAC9B,qBAAqB,EAAE,aAAa,EAAE,CAAM;IAC5C,cAAc,UAAS;IAEvB,aAAa,UAAS;IACtB,QAAQ,UAAS;IAGjB,gBAAgB,UAAS;IACzB,WAAW,SAAM;IACjB,kBAAkB,SAAM;IACxB,YAAY,EAAE,MAAM,EAAE,CAAM;IAG5B,mBAAmB,UAAS;IAC5B,mBAAmB,SAAM;IACzB,wBAAwB,EAAE,YAAY,EAAE,CAAM;IAC9C,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE3C,OAAO,CAAC,yBAAyB,CAAuB;IACxD,OAAO,CAAC,iBAAiB,CAA2B;IAGpD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA2B;IAC5D,OAAO,CAAC,mBAAmB,CAA8C;IACzE,OAAO,CAAC,iBAAiB,CAAS;gBAGxB,GAAG,EAAE,iBAAiB,EACtB,oBAAoB,EAAE,wBAAwB,EAC9C,mBAAmB,EAAE,qBAAqB;IAKpD,IAAI,mBAAmB,IAAI,OAAO,CAIjC;IAEK,QAAQ;IAOd,WAAW;IAWL,kBAAkB;IAkBxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,oBAAoB,IAAI,IAAI;IAiB5B,oBAAoB;IA0BpB,OAAO,CAAC,IAAI,EAAE,YAAY;IAgB1B,UAAU,CAAC,KAAK,EAAE,MAAM;IAalB,eAAe;IAwBrB,aAAa,CAAC,KAAK,EAAE,oBAAoB;IAQzC;;OAEG;YACW,kBAAkB;IA8EhC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAwCxB;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAuBjC,gBAAgB,CAAC,SAAS,EAAE,YAAY;IAmB9C,iBAAiB,CAAC,SAAS,EAAE,YAAY,GAAG,MAAM;IAWlD,uBAAuB;IAQvB,oBAAoB;IAQpB,kBAAkB;IAOZ,iBAAiB;IAgEvB,iBAAiB;IAMjB,uBAAuB;IAMvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,sBAAsB,IAAI,IAAI;IA0B9B;;OAEG;IACH,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO;IAIjD,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAItC;;OAEG;IACH,qBAAqB,IAAI,IAAI;IAO7B;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IA8CvC,aAAa;IAKP,sBAAsB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5D,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAIhE;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAY1B;;OAEG;IACH,OAAO,CAAC,SAAS;IAajB;;OAEG;YACW,iBAAiB;IA8B/B;;OAEG;YACW,cAAc;yCAjsBjB,uBAAuB;2CAAvB,uBAAuB;CAqvBnC"}
@@ -861,34 +861,32 @@ let ListsOperationsResource = class ListsOperationsResource extends BaseResource
861
861
  this.cdr.detectChanges();
862
862
  try {
863
863
  const md = new Metadata();
864
- // Create the list
864
+ const tg = await md.CreateTransactionGroup();
865
+ // Queue the list plus all of its initial detail records in a single transaction.
866
+ // NewRecord() assigns a client-side UUID so the details can reference list.ID
867
+ // before the list actually persists.
865
868
  const list = await md.GetEntityObject('MJ: Lists', md.CurrentUser);
869
+ list.NewRecord();
866
870
  list.Name = this.newListName;
867
871
  list.Description = this.newListDescription || null;
868
872
  list.EntityID = entityId;
869
873
  list.UserID = md.CurrentUser.ID;
870
- const saved = await list.Save();
871
- if (!saved) {
872
- this.notificationService.CreateSimpleNotification('Failed to create list', 'error', 4000);
873
- return;
874
- }
875
- // Add records to the list using transaction group
876
- const tg = await md.CreateTransactionGroup();
874
+ list.TransactionGroup = tg;
875
+ await list.Save();
877
876
  for (const recordId of this.recordsToAdd) {
878
877
  const detail = await md.GetEntityObject('MJ: List Details', md.CurrentUser);
878
+ detail.NewRecord();
879
879
  detail.ListID = list.ID;
880
880
  detail.RecordID = recordId;
881
881
  detail.Sequence = 0;
882
882
  detail.TransactionGroup = tg;
883
883
  await detail.Save();
884
884
  }
885
- const success = await tg.Submit();
886
- if (success) {
887
- this.notificationService.CreateSimpleNotification(`Created "${this.newListName}" with ${this.recordsToAdd.length} items`, 'success', 3000);
888
- }
889
- else {
890
- this.notificationService.CreateSimpleNotification(`Created list but failed to add some records`, 'warning', 4000);
885
+ if (!await tg.Submit()) {
886
+ this.notificationService.CreateSimpleNotification('Failed to create list — all changes have been rolled back', 'error', 4000);
887
+ return;
891
888
  }
889
+ this.notificationService.CreateSimpleNotification(`Created "${this.newListName}" with ${this.recordsToAdd.length} items`, 'success', 3000);
892
890
  this.cancelCreateDialog();
893
891
  // Refresh available lists
894
892
  await this.loadAvailableLists();
@@ -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 <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 (selectedLists.length > 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 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 </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-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 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 = new RunView();\n const md = new Metadata();\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 = new Metadata();\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 = new RunView();\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 = new Metadata();\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 = new Metadata();\n\n // Create the list\n const list = await md.GetEntityObject<MJListEntity>('MJ: Lists', md.CurrentUser);\n list.Name = this.newListName;\n list.Description = this.newListDescription || null;\n list.EntityID = entityId;\n list.UserID = md.CurrentUser!.ID;\n\n const saved = await list.Save();\n if (!saved) {\n this.notificationService.CreateSimpleNotification('Failed to create list', 'error', 4000);\n return;\n }\n\n // Add records to the list using transaction group\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 = list.ID;\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 this.notificationService.CreateSimpleNotification(\n `Created \"${this.newListName}\" with ${this.recordsToAdd.length} items`,\n 'success',\n 3000\n );\n } else {\n this.notificationService.CreateSimpleNotification(\n `Created list but failed to add some records`,\n 'warning',\n 4000\n );\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 = new Metadata();\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 = new Metadata();\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 = new Metadata();\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, 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 <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 (selectedLists.length > 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 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 </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-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 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 = new RunView();\n const md = new Metadata();\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 = new Metadata();\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 = new RunView();\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 = new Metadata();\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 = new Metadata();\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 = new Metadata();\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 = new Metadata();\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 = new Metadata();\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"]}
@@ -330,7 +330,7 @@ export class MCPConnectionDialogComponent {
330
330
  Name: this.connection.Name,
331
331
  Description: this.connection.Description ?? '',
332
332
  CompanyID: this.connection.CompanyID ?? '',
333
- CredentialID: '', // Would need to load from entity
333
+ CredentialID: this.connection.CredentialID ?? '',
334
334
  AutoSyncTools: this.connection.AutoSyncTools,
335
335
  LogToolCalls: this.connection.LogToolCalls,
336
336
  LogInputParameters: true,