@memberjunction/ng-dashboards 5.35.0 → 5.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.js +3 -3
  2. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  3. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +22 -1
  4. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  5. package/dist/AI/components/analytics/ai-analytics-resource.component.js +157 -137
  6. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  7. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +28 -0
  8. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  9. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2075 -2068
  10. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  11. package/dist/AI/components/models/model-management.component.js +4 -4
  12. package/dist/AI/components/models/model-management.component.js.map +1 -1
  13. package/dist/AI/components/prompts/prompt-management.component.js +3 -3
  14. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  15. package/dist/AI/components/tags/tags-resource.component.d.ts +15 -0
  16. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  17. package/dist/AI/components/tags/tags-resource.component.js +1411 -1424
  18. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  19. package/dist/APIKeys/api-keys-resource.component.d.ts +12 -8
  20. package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
  21. package/dist/APIKeys/api-keys-resource.component.js +329 -371
  22. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  23. package/dist/Actions/components/actions-overview.component.js +137 -142
  24. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  25. package/dist/Actions/components/execution-monitoring.component.js +111 -116
  26. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  27. package/dist/Admin/admin-data-schema.component.js +13 -65
  28. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  29. package/dist/Admin/admin-dev-tools-resource.component.js +13 -65
  30. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  31. package/dist/Admin/admin-identity-access.component.js +13 -65
  32. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  33. package/dist/Admin/admin-monitoring.component.js +13 -65
  34. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  35. package/dist/Admin/base-admin-container.component.d.ts +9 -7
  36. package/dist/Admin/base-admin-container.component.d.ts.map +1 -1
  37. package/dist/Admin/base-admin-container.component.js +26 -17
  38. package/dist/Admin/base-admin-container.component.js.map +1 -1
  39. package/dist/ApplicationRoles/application-roles-resource.component.js +74 -67
  40. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  41. package/dist/Communication/communication-new-message-resource.component.d.ts +93 -0
  42. package/dist/Communication/communication-new-message-resource.component.d.ts.map +1 -0
  43. package/dist/Communication/communication-new-message-resource.component.js +661 -0
  44. package/dist/Communication/communication-new-message-resource.component.js.map +1 -0
  45. package/dist/Credentials/components/credentials-categories-resource.component.js +152 -159
  46. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  47. package/dist/Credentials/components/credentials-types-resource.component.js +151 -155
  48. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  49. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +20 -21
  50. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
  51. package/dist/DatabaseDesigner/components/entity-list.component.d.ts +2 -0
  52. package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -1
  53. package/dist/DatabaseDesigner/components/entity-list.component.js +131 -125
  54. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  55. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
  56. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  57. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +7 -1
  58. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  59. package/dist/DevTools/app-state-inspector.component.d.ts +5 -0
  60. package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -1
  61. package/dist/DevTools/app-state-inspector.component.js +46 -72
  62. package/dist/DevTools/app-state-inspector.component.js.map +1 -1
  63. package/dist/DevTools/class-registry.component.js +88 -100
  64. package/dist/DevTools/class-registry.component.js.map +1 -1
  65. package/dist/DevTools/event-monitor.component.js +158 -168
  66. package/dist/DevTools/event-monitor.component.js.map +1 -1
  67. package/dist/DevTools/graphql-console.component.js +257 -264
  68. package/dist/DevTools/graphql-console.component.js.map +1 -1
  69. package/dist/DevTools/layout-inspector.component.d.ts +5 -0
  70. package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
  71. package/dist/DevTools/layout-inspector.component.js +46 -64
  72. package/dist/DevTools/layout-inspector.component.js.map +1 -1
  73. package/dist/DevTools/lazy-module-status.component.js +75 -84
  74. package/dist/DevTools/lazy-module-status.component.js.map +1 -1
  75. package/dist/DevTools/settings-explorer.component.js +76 -85
  76. package/dist/DevTools/settings-explorer.component.js.map +1 -1
  77. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +2 -0
  78. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  79. package/dist/EntityAdmin/entity-admin-dashboard.component.js +7 -3
  80. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  81. package/dist/Integration/components/activity/activity.component.js +97 -99
  82. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  83. package/dist/Integration/components/connections/connections.component.js +842 -855
  84. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  85. package/dist/Integration/components/pipelines/pipelines.component.js +502 -517
  86. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  87. package/dist/Integration/components/schedules/schedules.component.js +78 -89
  88. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  89. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +5 -0
  90. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
  91. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1120 -1128
  92. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  93. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +11 -0
  94. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
  95. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +606 -661
  96. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  97. package/dist/Lists/components/lists-browse-resource.component.d.ts +102 -0
  98. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  99. package/dist/Lists/components/lists-browse-resource.component.js +1179 -504
  100. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  101. package/dist/Lists/components/lists-operations-resource.component.d.ts +133 -3
  102. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  103. package/dist/Lists/components/lists-operations-resource.component.js +1527 -327
  104. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  105. package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts +29 -0
  106. package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts.map +1 -0
  107. package/dist/Lists/components/lists-shared-with-me-resource.component.js +77 -0
  108. package/dist/Lists/components/lists-shared-with-me-resource.component.js.map +1 -0
  109. package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts +6 -0
  110. package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts.map +1 -1
  111. package/dist/Lists/components/venn-diagram/venn-diagram.component.js +35 -7
  112. package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
  113. package/dist/Lists/index.d.ts +1 -0
  114. package/dist/Lists/index.d.ts.map +1 -1
  115. package/dist/Lists/index.js +1 -0
  116. package/dist/Lists/index.js.map +1 -1
  117. package/dist/Lists/services/list-set-operations.service.d.ts +93 -2
  118. package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
  119. package/dist/Lists/services/list-set-operations.service.js +236 -10
  120. package/dist/Lists/services/list-set-operations.service.js.map +1 -1
  121. package/dist/MCP/mcp-dashboard.component.js +19 -19
  122. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  123. package/dist/Scheduling/scheduling-dashboard.component.js +58 -60
  124. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  125. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +13 -3
  126. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  127. package/dist/SystemDiagnostics/system-diagnostics.component.js +1007 -1252
  128. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  129. package/dist/Testing/components/testing-explorer.component.d.ts +31 -6
  130. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  131. package/dist/Testing/components/testing-explorer.component.js +543 -629
  132. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  133. package/dist/Testing/testing-dashboard.component.js +50 -49
  134. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  135. package/dist/ai-dashboards.module.d.ts +1 -1
  136. package/dist/ai-dashboards.module.d.ts.map +1 -1
  137. package/dist/ai-dashboards.module.js +16 -1
  138. package/dist/ai-dashboards.module.js.map +1 -1
  139. package/dist/communication-dashboards.module.d.ts +9 -7
  140. package/dist/communication-dashboards.module.d.ts.map +1 -1
  141. package/dist/communication-dashboards.module.js +13 -4
  142. package/dist/communication-dashboards.module.js.map +1 -1
  143. package/dist/core-dashboards.module.d.ts +1 -1
  144. package/dist/core-dashboards.module.d.ts.map +1 -1
  145. package/dist/core-dashboards.module.js +16 -1
  146. package/dist/core-dashboards.module.js.map +1 -1
  147. package/dist/lists-dashboards.module.d.ts +10 -9
  148. package/dist/lists-dashboards.module.d.ts.map +1 -1
  149. package/dist/lists-dashboards.module.js +13 -2
  150. package/dist/lists-dashboards.module.js.map +1 -1
  151. package/dist/public-api.d.ts +1 -0
  152. package/dist/public-api.d.ts.map +1 -1
  153. package/dist/public-api.js +1 -0
  154. package/dist/public-api.js.map +1 -1
  155. package/dist/testing-dashboards.module.d.ts +1 -1
  156. package/dist/testing-dashboards.module.d.ts.map +1 -1
  157. package/dist/testing-dashboards.module.js +13 -1
  158. package/dist/testing-dashboards.module.js.map +1 -1
  159. package/package.json +53 -52
@@ -10,32 +10,40 @@ import { BaseResourceComponent, SharedService } from '@memberjunction/ng-shared'
10
10
  import { UserInfoEngine } from '@memberjunction/core-entities';
11
11
  import { RunView, CompositeKey } from '@memberjunction/core';
12
12
  import { Subject } from 'rxjs';
13
+ import { GraphQLListsClient } from '@memberjunction/graphql-dataprovider';
13
14
  import * as i0 from "@angular/core";
14
15
  import * as i1 from "../services/list-set-operations.service";
15
16
  import * as i2 from "@memberjunction/ng-notifications";
16
- import * as i3 from "@angular/forms";
17
- import * as i4 from "@memberjunction/ng-ui-components";
18
- import * as i5 from "@memberjunction/ng-shared-generic";
19
- import * as i6 from "./venn-diagram/venn-diagram.component";
20
- function ListsOperationsResource_Conditional_2_Template(rf, ctx) { if (rf & 1) {
17
+ import * as i3 from "@memberjunction/ng-export-service";
18
+ import * as i4 from "@angular/forms";
19
+ import * as i5 from "@memberjunction/ng-ui-components";
20
+ import * as i6 from "@memberjunction/ng-shared-generic";
21
+ import * as i7 from "@memberjunction/ng-list-management";
22
+ import * as i8 from "./venn-diagram/venn-diagram.component";
23
+ const _forTrack0 = ($index, $item) => $item.id;
24
+ const _forTrack1 = ($index, $item) => $item.list.ID;
25
+ const _forTrack2 = ($index, $item) => $item.view.ID;
26
+ const _forTrack3 = ($index, $item) => $item.ID;
27
+ const _forTrack4 = ($index, $item) => $item.Name;
28
+ function ListsOperationsResource_Conditional_7_Template(rf, ctx) { if (rf & 1) {
21
29
  const _r1 = i0.ɵɵgetCurrentView();
22
- i0.ɵɵelementStart(0, "div", 1)(1, "button", 31);
23
- i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_2_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.clearAllSelections()); });
24
- i0.ɵɵelement(2, "i", 32);
25
- i0.ɵɵtext(3, " Clear ");
26
- i0.ɵɵelementEnd()();
30
+ i0.ɵɵelementStart(0, "button", 39);
31
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.clearAllSelections()); });
32
+ i0.ɵɵelement(1, "i", 40);
33
+ i0.ɵɵtext(2, " Clear ");
34
+ i0.ɵɵelementEnd();
27
35
  } }
28
- function ListsOperationsResource_Conditional_9_Template(rf, ctx) { if (rf & 1) {
29
- i0.ɵɵelementStart(0, "span", 6);
36
+ function ListsOperationsResource_Conditional_15_Template(rf, ctx) { if (rf & 1) {
37
+ i0.ɵɵelementStart(0, "span", 10);
30
38
  i0.ɵɵtext(1);
31
39
  i0.ɵɵelementEnd();
32
40
  } if (rf & 2) {
33
41
  const ctx_r1 = i0.ɵɵnextContext();
34
42
  i0.ɵɵadvance();
35
- i0.ɵɵtextInterpolate2(" ", ctx_r1.selectedLists.length, "/", ctx_r1.maxLists, " ");
43
+ i0.ɵɵtextInterpolate2(" ", ctx_r1.totalOperandCount, "/", ctx_r1.maxLists, " ");
36
44
  } }
37
- function ListsOperationsResource_For_18_Template(rf, ctx) { if (rf & 1) {
38
- i0.ɵɵelementStart(0, "option", 12);
45
+ function ListsOperationsResource_For_24_Template(rf, ctx) { if (rf & 1) {
46
+ i0.ɵɵelementStart(0, "option", 16);
39
47
  i0.ɵɵtext(1);
40
48
  i0.ɵɵelementEnd();
41
49
  } if (rf & 2) {
@@ -44,19 +52,19 @@ function ListsOperationsResource_For_18_Template(rf, ctx) { if (rf & 1) {
44
52
  i0.ɵɵadvance();
45
53
  i0.ɵɵtextInterpolate2(" ", entity_r3.name, " (", entity_r3.listCount, ") ");
46
54
  } }
47
- function ListsOperationsResource_For_21_Template(rf, ctx) { if (rf & 1) {
55
+ function ListsOperationsResource_For_27_Template(rf, ctx) { if (rf & 1) {
48
56
  const _r4 = i0.ɵɵgetCurrentView();
49
- i0.ɵɵelementStart(0, "div", 14);
50
- i0.ɵɵelement(1, "div", 33);
51
- i0.ɵɵelementStart(2, "div", 34)(3, "span", 35);
57
+ i0.ɵɵelementStart(0, "div", 18);
58
+ i0.ɵɵelement(1, "div", 41);
59
+ i0.ɵɵelementStart(2, "div", 42)(3, "span", 43);
52
60
  i0.ɵɵtext(4);
53
61
  i0.ɵɵelementEnd();
54
- i0.ɵɵelementStart(5, "span", 36);
62
+ i0.ɵɵelementStart(5, "span", 44);
55
63
  i0.ɵɵtext(6);
56
64
  i0.ɵɵelementEnd()();
57
- i0.ɵɵelementStart(7, "button", 37);
58
- i0.ɵɵlistener("click", function ListsOperationsResource_For_21_Template_button_click_7_listener() { const ɵ$index_46_r5 = i0.ɵɵrestoreView(_r4).$index; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.removeList(ɵ$index_46_r5)); });
59
- i0.ɵɵelement(8, "i", 38);
65
+ i0.ɵɵelementStart(7, "button", 45);
66
+ i0.ɵɵlistener("click", function ListsOperationsResource_For_27_Template_button_click_7_listener() { const ɵ$index_54_r5 = i0.ɵɵrestoreView(_r4).$index; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.removeList(ɵ$index_54_r5)); });
67
+ i0.ɵɵelement(8, "i", 46);
60
68
  i0.ɵɵelementEnd()();
61
69
  } if (rf & 2) {
62
70
  const item_r6 = ctx.$implicit;
@@ -67,14 +75,14 @@ function ListsOperationsResource_For_21_Template(rf, ctx) { if (rf & 1) {
67
75
  i0.ɵɵadvance(2);
68
76
  i0.ɵɵtextInterpolate(item_r6.entityName);
69
77
  } }
70
- function ListsOperationsResource_Conditional_22_Conditional_4_For_4_Template(rf, ctx) { if (rf & 1) {
78
+ function ListsOperationsResource_Conditional_28_Conditional_4_For_4_Template(rf, ctx) { if (rf & 1) {
71
79
  const _r9 = i0.ɵɵgetCurrentView();
72
- i0.ɵɵelementStart(0, "div", 46);
73
- i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_22_Conditional_4_For_4_Template_div_click_0_listener() { const list_r10 = i0.ɵɵrestoreView(_r9).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.addList(list_r10)); });
74
- i0.ɵɵelementStart(1, "span", 47);
80
+ i0.ɵɵelementStart(0, "div", 54);
81
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_28_Conditional_4_For_4_Template_div_click_0_listener() { const list_r10 = i0.ɵɵrestoreView(_r9).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.addList(list_r10)); });
82
+ i0.ɵɵelementStart(1, "span", 55);
75
83
  i0.ɵɵtext(2);
76
84
  i0.ɵɵelementEnd();
77
- i0.ɵɵelementStart(3, "span", 48);
85
+ i0.ɵɵelementStart(3, "span", 56);
78
86
  i0.ɵɵtext(4);
79
87
  i0.ɵɵelementEnd()();
80
88
  } if (rf & 2) {
@@ -84,28 +92,28 @@ function ListsOperationsResource_Conditional_22_Conditional_4_For_4_Template(rf,
84
92
  i0.ɵɵadvance(2);
85
93
  i0.ɵɵtextInterpolate(list_r10.Entity);
86
94
  } }
87
- function ListsOperationsResource_Conditional_22_Conditional_4_Template(rf, ctx) { if (rf & 1) {
95
+ function ListsOperationsResource_Conditional_28_Conditional_4_Template(rf, ctx) { if (rf & 1) {
88
96
  const _r8 = i0.ɵɵgetCurrentView();
89
- i0.ɵɵelementStart(0, "div", 42)(1, "div", 43);
90
- i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_22_Conditional_4_Template_div_click_1_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.showListDropdown = false); });
97
+ i0.ɵɵelementStart(0, "div", 50)(1, "div", 51);
98
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_28_Conditional_4_Template_div_click_1_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.showListDropdown = false); });
91
99
  i0.ɵɵelementEnd();
92
- i0.ɵɵelementStart(2, "div", 44);
93
- i0.ɵɵrepeaterCreate(3, ListsOperationsResource_Conditional_22_Conditional_4_For_4_Template, 5, 2, "div", 45, i0.ɵɵrepeaterTrackByIdentity);
100
+ i0.ɵɵelementStart(2, "div", 52);
101
+ i0.ɵɵrepeaterCreate(3, ListsOperationsResource_Conditional_28_Conditional_4_For_4_Template, 5, 2, "div", 53, i0.ɵɵrepeaterTrackByIdentity);
94
102
  i0.ɵɵelementEnd()();
95
103
  } if (rf & 2) {
96
104
  const ctx_r1 = i0.ɵɵnextContext(2);
97
105
  i0.ɵɵadvance(3);
98
106
  i0.ɵɵrepeater(ctx_r1.filteredAvailableLists);
99
107
  } }
100
- function ListsOperationsResource_Conditional_22_Template(rf, ctx) { if (rf & 1) {
108
+ function ListsOperationsResource_Conditional_28_Template(rf, ctx) { if (rf & 1) {
101
109
  const _r7 = i0.ɵɵgetCurrentView();
102
- i0.ɵɵelementStart(0, "div", 15)(1, "div", 39);
103
- i0.ɵɵelement(2, "i", 40);
104
- i0.ɵɵelementStart(3, "input", 41);
105
- i0.ɵɵtwoWayListener("ngModelChange", function ListsOperationsResource_Conditional_22_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.listSearchTerm, $event) || (ctx_r1.listSearchTerm = $event); return i0.ɵɵresetView($event); });
106
- i0.ɵɵlistener("ngModelChange", function ListsOperationsResource_Conditional_22_Template_input_ngModelChange_3_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.filterAvailableLists()); })("focus", function ListsOperationsResource_Conditional_22_Template_input_focus_3_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.showListDropdown = true); });
110
+ i0.ɵɵelementStart(0, "div", 19)(1, "div", 47);
111
+ i0.ɵɵelement(2, "i", 48);
112
+ i0.ɵɵelementStart(3, "input", 49);
113
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsOperationsResource_Conditional_28_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.listSearchTerm, $event) || (ctx_r1.listSearchTerm = $event); return i0.ɵɵresetView($event); });
114
+ i0.ɵɵlistener("ngModelChange", function ListsOperationsResource_Conditional_28_Template_input_ngModelChange_3_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.filterAvailableLists()); })("focus", function ListsOperationsResource_Conditional_28_Template_input_focus_3_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.showListDropdown = true); });
107
115
  i0.ɵɵelementEnd()();
108
- i0.ɵɵconditionalCreate(4, ListsOperationsResource_Conditional_22_Conditional_4_Template, 5, 0, "div", 42);
116
+ i0.ɵɵconditionalCreate(4, ListsOperationsResource_Conditional_28_Conditional_4_Template, 5, 0, "div", 50);
109
117
  i0.ɵɵelementEnd();
110
118
  } if (rf & 2) {
111
119
  const ctx_r1 = i0.ɵɵnextContext();
@@ -114,49 +122,123 @@ function ListsOperationsResource_Conditional_22_Template(rf, ctx) { if (rf & 1)
114
122
  i0.ɵɵadvance();
115
123
  i0.ɵɵconditional(ctx_r1.showListDropdown && ctx_r1.filteredAvailableLists.length > 0 ? 4 : -1);
116
124
  } }
117
- function ListsOperationsResource_Conditional_23_Template(rf, ctx) { if (rf & 1) {
118
- i0.ɵɵelementStart(0, "div", 16);
119
- i0.ɵɵelement(1, "i", 49);
125
+ function ListsOperationsResource_Conditional_29_Template(rf, ctx) { if (rf & 1) {
126
+ i0.ɵɵelementStart(0, "div", 20);
127
+ i0.ɵɵelement(1, "i", 57);
120
128
  i0.ɵɵtext(2);
121
129
  i0.ɵɵelementEnd();
122
130
  } if (rf & 2) {
123
131
  const ctx_r1 = i0.ɵɵnextContext();
124
132
  i0.ɵɵadvance(2);
125
- i0.ɵɵtextInterpolate1(" Maximum ", ctx_r1.maxLists, " lists can be compared ");
133
+ i0.ɵɵtextInterpolate1(" Maximum ", ctx_r1.maxLists, " operands can be compared ");
134
+ } }
135
+ function ListsOperationsResource_For_32_Template(rf, ctx) { if (rf & 1) {
136
+ const _r11 = i0.ɵɵgetCurrentView();
137
+ i0.ɵɵelementStart(0, "div", 22);
138
+ i0.ɵɵelement(1, "div", 58);
139
+ i0.ɵɵelementStart(2, "div", 42)(3, "span", 43);
140
+ i0.ɵɵelement(4, "i", 59);
141
+ i0.ɵɵtext(5);
142
+ i0.ɵɵelementEnd();
143
+ i0.ɵɵelementStart(6, "span", 44);
144
+ i0.ɵɵtext(7);
145
+ i0.ɵɵelementEnd()();
146
+ i0.ɵɵelementStart(8, "button", 45);
147
+ i0.ɵɵlistener("click", function ListsOperationsResource_For_32_Template_button_click_8_listener() { const ɵ$index_104_r12 = i0.ɵɵrestoreView(_r11).$index; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.removeView(ɵ$index_104_r12)); });
148
+ i0.ɵɵelement(9, "i", 46);
149
+ i0.ɵɵelementEnd()();
150
+ } if (rf & 2) {
151
+ const item_r13 = ctx.$implicit;
152
+ i0.ɵɵadvance();
153
+ i0.ɵɵstyleProp("border-color", item_r13.color);
154
+ i0.ɵɵadvance(3);
155
+ i0.ɵɵproperty("title", "View");
156
+ i0.ɵɵadvance();
157
+ i0.ɵɵtextInterpolate1(" ", item_r13.view.Name, " ");
158
+ i0.ɵɵadvance(2);
159
+ i0.ɵɵtextInterpolate(item_r13.entityName);
160
+ } }
161
+ function ListsOperationsResource_Conditional_33_Conditional_4_For_4_Template(rf, ctx) { if (rf & 1) {
162
+ const _r16 = i0.ɵɵgetCurrentView();
163
+ i0.ɵɵelementStart(0, "div", 54);
164
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_33_Conditional_4_For_4_Template_div_click_0_listener() { const view_r17 = i0.ɵɵrestoreView(_r16).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.addView(view_r17)); });
165
+ i0.ɵɵelementStart(1, "span", 55);
166
+ i0.ɵɵelement(2, "i", 60);
167
+ i0.ɵɵtext(3);
168
+ i0.ɵɵelementEnd();
169
+ i0.ɵɵelementStart(4, "span", 56);
170
+ i0.ɵɵtext(5);
171
+ i0.ɵɵelementEnd()();
172
+ } if (rf & 2) {
173
+ const view_r17 = ctx.$implicit;
174
+ i0.ɵɵadvance(3);
175
+ i0.ɵɵtextInterpolate1(" ", view_r17.Name, " ");
176
+ i0.ɵɵadvance(2);
177
+ i0.ɵɵtextInterpolate(view_r17.Entity);
178
+ } }
179
+ function ListsOperationsResource_Conditional_33_Conditional_4_Template(rf, ctx) { if (rf & 1) {
180
+ const _r15 = i0.ɵɵgetCurrentView();
181
+ i0.ɵɵelementStart(0, "div", 50)(1, "div", 51);
182
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_33_Conditional_4_Template_div_click_1_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.showViewDropdown = false); });
183
+ i0.ɵɵelementEnd();
184
+ i0.ɵɵelementStart(2, "div", 52);
185
+ i0.ɵɵrepeaterCreate(3, ListsOperationsResource_Conditional_33_Conditional_4_For_4_Template, 6, 2, "div", 53, i0.ɵɵrepeaterTrackByIdentity);
186
+ i0.ɵɵelementEnd()();
187
+ } if (rf & 2) {
188
+ const ctx_r1 = i0.ɵɵnextContext(2);
189
+ i0.ɵɵadvance(3);
190
+ i0.ɵɵrepeater(ctx_r1.filteredAvailableViews);
191
+ } }
192
+ function ListsOperationsResource_Conditional_33_Template(rf, ctx) { if (rf & 1) {
193
+ const _r14 = i0.ɵɵgetCurrentView();
194
+ i0.ɵɵelementStart(0, "div", 19)(1, "div", 47);
195
+ i0.ɵɵelement(2, "i", 60);
196
+ i0.ɵɵelementStart(3, "input", 61);
197
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsOperationsResource_Conditional_33_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.viewSearchTerm, $event) || (ctx_r1.viewSearchTerm = $event); return i0.ɵɵresetView($event); });
198
+ i0.ɵɵlistener("ngModelChange", function ListsOperationsResource_Conditional_33_Template_input_ngModelChange_3_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.filterAvailableViews()); })("focus", function ListsOperationsResource_Conditional_33_Template_input_focus_3_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.showViewDropdown = true); });
199
+ i0.ɵɵelementEnd()();
200
+ i0.ɵɵconditionalCreate(4, ListsOperationsResource_Conditional_33_Conditional_4_Template, 5, 0, "div", 50);
201
+ i0.ɵɵelementEnd();
202
+ } if (rf & 2) {
203
+ const ctx_r1 = i0.ɵɵnextContext();
204
+ i0.ɵɵadvance(3);
205
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.viewSearchTerm);
206
+ i0.ɵɵadvance();
207
+ i0.ɵɵconditional(ctx_r1.showViewDropdown && ctx_r1.filteredAvailableViews.length > 0 ? 4 : -1);
126
208
  } }
127
- function ListsOperationsResource_Conditional_24_Template(rf, ctx) { if (rf & 1) {
128
- i0.ɵɵelementStart(0, "div", 17);
129
- i0.ɵɵelement(1, "i", 49);
209
+ function ListsOperationsResource_Conditional_34_Template(rf, ctx) { if (rf & 1) {
210
+ i0.ɵɵelementStart(0, "div", 23);
211
+ i0.ɵɵelement(1, "i", 57);
130
212
  i0.ɵɵelementStart(2, "span");
131
- i0.ɵɵtext(3, "Comparing lists of type: ");
213
+ i0.ɵɵtext(3, "Comparing operands of type: ");
132
214
  i0.ɵɵelementStart(4, "strong");
133
215
  i0.ɵɵtext(5);
134
216
  i0.ɵɵelementEnd()()();
135
217
  } if (rf & 2) {
136
218
  const ctx_r1 = i0.ɵɵnextContext();
137
219
  i0.ɵɵadvance(5);
138
- i0.ɵɵtextInterpolate(ctx_r1.selectedLists[0].entityName);
220
+ i0.ɵɵtextInterpolate(ctx_r1.lockedEntityName);
139
221
  } }
140
- function ListsOperationsResource_Conditional_25_Template(rf, ctx) { if (rf & 1) {
141
- const _r11 = i0.ɵɵgetCurrentView();
142
- i0.ɵɵelementStart(0, "div", 18)(1, "h4");
222
+ function ListsOperationsResource_Conditional_35_Template(rf, ctx) { if (rf & 1) {
223
+ const _r18 = i0.ɵɵgetCurrentView();
224
+ i0.ɵɵelementStart(0, "div", 24)(1, "h4");
143
225
  i0.ɵɵtext(2, "Quick Operations");
144
226
  i0.ɵɵelementEnd();
145
- i0.ɵɵelementStart(3, "div", 50)(4, "button", 51);
146
- i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_25_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.performOperation("union")); });
147
- i0.ɵɵelement(5, "i", 52);
227
+ i0.ɵɵelementStart(3, "div", 62)(4, "button", 63);
228
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_35_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.performOperation("union")); });
229
+ i0.ɵɵelement(5, "i", 64);
148
230
  i0.ɵɵelementStart(6, "span");
149
231
  i0.ɵɵtext(7, "Union All");
150
232
  i0.ɵɵelementEnd()();
151
- i0.ɵɵelementStart(8, "button", 51);
152
- i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_25_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.performOperation("intersection")); });
153
- i0.ɵɵelement(9, "i", 53);
233
+ i0.ɵɵelementStart(8, "button", 63);
234
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_35_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.performOperation("intersection")); });
235
+ i0.ɵɵelement(9, "i", 65);
154
236
  i0.ɵɵelementStart(10, "span");
155
237
  i0.ɵɵtext(11, "Intersection");
156
238
  i0.ɵɵelementEnd()();
157
- i0.ɵɵelementStart(12, "button", 51);
158
- i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_25_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.performOperation("symmetric_difference")); });
159
- i0.ɵɵelement(13, "i", 54);
239
+ i0.ɵɵelementStart(12, "button", 63);
240
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_35_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.performOperation("symmetric_difference")); });
241
+ i0.ɵɵelement(13, "i", 66);
160
242
  i0.ɵɵelementStart(14, "span");
161
243
  i0.ɵɵtext(15, "Unique Each");
162
244
  i0.ɵɵelementEnd()()()();
@@ -169,71 +251,71 @@ function ListsOperationsResource_Conditional_25_Template(rf, ctx) { if (rf & 1)
169
251
  i0.ɵɵadvance(4);
170
252
  i0.ɵɵproperty("disabled", ctx_r1.isCalculating);
171
253
  } }
172
- function ListsOperationsResource_Conditional_27_Template(rf, ctx) { if (rf & 1) {
173
- const _r12 = i0.ɵɵgetCurrentView();
174
- i0.ɵɵelementStart(0, "mj-venn-diagram", 55);
175
- i0.ɵɵlistener("regionClick", function ListsOperationsResource_Conditional_27_Template_mj_venn_diagram_regionClick_0_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onRegionClick($event)); });
254
+ function ListsOperationsResource_Conditional_37_Template(rf, ctx) { if (rf & 1) {
255
+ const _r19 = i0.ɵɵgetCurrentView();
256
+ i0.ɵɵelementStart(0, "mj-venn-diagram", 67);
257
+ i0.ɵɵlistener("regionClick", function ListsOperationsResource_Conditional_37_Template_mj_venn_diagram_regionClick_0_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onRegionClick($event)); });
176
258
  i0.ɵɵelementEnd();
177
259
  } if (rf & 2) {
178
260
  const ctx_r1 = i0.ɵɵnextContext();
179
261
  i0.ɵɵproperty("data", ctx_r1.vennData)("selectedRegion", ctx_r1.selectedRegion);
180
262
  } }
181
- function ListsOperationsResource_Conditional_28_Template(rf, ctx) { if (rf & 1) {
182
- i0.ɵɵelementStart(0, "div", 21)(1, "div", 56);
183
- i0.ɵɵelement(2, "i", 57);
263
+ function ListsOperationsResource_Conditional_38_Template(rf, ctx) { if (rf & 1) {
264
+ i0.ɵɵelementStart(0, "div", 27)(1, "div", 68);
265
+ i0.ɵɵelement(2, "i", 69);
184
266
  i0.ɵɵelementEnd();
185
267
  i0.ɵɵelementStart(3, "h3");
186
- i0.ɵɵtext(4, "Add Lists to Compare");
268
+ i0.ɵɵtext(4, "Add Lists or Views to Compare");
187
269
  i0.ɵɵelementEnd();
188
270
  i0.ɵɵelementStart(5, "p");
189
- i0.ɵɵtext(6, "Select 2-4 lists from the same entity to visualize their overlaps and perform set operations.");
271
+ i0.ɵɵtext(6, "Select 2-4 lists or views from the same entity to visualize their overlaps and perform set operations.");
190
272
  i0.ɵɵelementEnd()();
191
273
  } }
192
- function ListsOperationsResource_Conditional_29_Template(rf, ctx) { if (rf & 1) {
193
- i0.ɵɵelementStart(0, "div", 22);
194
- i0.ɵɵelement(1, "mj-loading", 58);
274
+ function ListsOperationsResource_Conditional_39_Template(rf, ctx) { if (rf & 1) {
275
+ i0.ɵɵelementStart(0, "div", 28);
276
+ i0.ɵɵelement(1, "mj-loading", 70);
195
277
  i0.ɵɵelementEnd();
196
278
  } }
197
- function ListsOperationsResource_Conditional_35_Conditional_16_For_5_Conditional_4_Template(rf, ctx) { if (rf & 1) {
198
- i0.ɵɵelementStart(0, "span", 74);
279
+ function ListsOperationsResource_Conditional_45_Conditional_16_For_5_Conditional_4_Template(rf, ctx) { if (rf & 1) {
280
+ i0.ɵɵelementStart(0, "span", 86);
199
281
  i0.ɵɵtext(1);
200
282
  i0.ɵɵelementEnd();
201
283
  } if (rf & 2) {
202
- const record_r15 = i0.ɵɵnextContext().$implicit;
284
+ const record_r22 = i0.ɵɵnextContext().$implicit;
203
285
  i0.ɵɵadvance();
204
- i0.ɵɵtextInterpolate(record_r15.secondaryInfo);
286
+ i0.ɵɵtextInterpolate(record_r22.secondaryInfo);
205
287
  } }
206
- function ListsOperationsResource_Conditional_35_Conditional_16_For_5_Template(rf, ctx) { if (rf & 1) {
207
- const _r14 = i0.ɵɵgetCurrentView();
208
- i0.ɵɵelementStart(0, "div", 70)(1, "div", 72)(2, "span", 73);
288
+ function ListsOperationsResource_Conditional_45_Conditional_16_For_5_Template(rf, ctx) { if (rf & 1) {
289
+ const _r21 = i0.ɵɵgetCurrentView();
290
+ i0.ɵɵelementStart(0, "div", 82)(1, "div", 84)(2, "span", 85);
209
291
  i0.ɵɵtext(3);
210
292
  i0.ɵɵelementEnd();
211
- i0.ɵɵconditionalCreate(4, ListsOperationsResource_Conditional_35_Conditional_16_For_5_Conditional_4_Template, 2, 1, "span", 74);
293
+ i0.ɵɵconditionalCreate(4, ListsOperationsResource_Conditional_45_Conditional_16_For_5_Conditional_4_Template, 2, 1, "span", 86);
212
294
  i0.ɵɵelementEnd();
213
- i0.ɵɵelementStart(5, "button", 75);
214
- i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_35_Conditional_16_For_5_Template_button_click_5_listener() { const record_r15 = i0.ɵɵrestoreView(_r14).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.openRecord(record_r15)); });
215
- i0.ɵɵelement(6, "i", 76);
295
+ i0.ɵɵelementStart(5, "button", 87);
296
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_45_Conditional_16_For_5_Template_button_click_5_listener() { const record_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.openRecord(record_r22)); });
297
+ i0.ɵɵelement(6, "i", 88);
216
298
  i0.ɵɵelementEnd()();
217
299
  } if (rf & 2) {
218
- const record_r15 = ctx.$implicit;
300
+ const record_r22 = ctx.$implicit;
219
301
  i0.ɵɵadvance(3);
220
- i0.ɵɵtextInterpolate(record_r15.displayName);
302
+ i0.ɵɵtextInterpolate(record_r22.displayName);
221
303
  i0.ɵɵadvance();
222
- i0.ɵɵconditional(record_r15.secondaryInfo ? 4 : -1);
304
+ i0.ɵɵconditional(record_r22.secondaryInfo ? 4 : -1);
223
305
  } }
224
- function ListsOperationsResource_Conditional_35_Conditional_16_Conditional_6_Template(rf, ctx) { if (rf & 1) {
225
- i0.ɵɵelementStart(0, "div", 71);
226
- i0.ɵɵelement(1, "mj-loading", 77);
306
+ function ListsOperationsResource_Conditional_45_Conditional_16_Conditional_6_Template(rf, ctx) { if (rf & 1) {
307
+ i0.ɵɵelementStart(0, "div", 83);
308
+ i0.ɵɵelement(1, "mj-loading", 89);
227
309
  i0.ɵɵelementEnd();
228
310
  } }
229
- function ListsOperationsResource_Conditional_35_Conditional_16_Template(rf, ctx) { if (rf & 1) {
230
- i0.ɵɵelementStart(0, "div", 68)(1, "h5");
311
+ function ListsOperationsResource_Conditional_45_Conditional_16_Template(rf, ctx) { if (rf & 1) {
312
+ i0.ɵɵelementStart(0, "div", 80)(1, "h5");
231
313
  i0.ɵɵtext(2, "Preview (first 10)");
232
314
  i0.ɵɵelementEnd();
233
- i0.ɵɵelementStart(3, "div", 69);
234
- i0.ɵɵrepeaterCreate(4, ListsOperationsResource_Conditional_35_Conditional_16_For_5_Template, 7, 2, "div", 70, i0.ɵɵrepeaterTrackByIdentity);
315
+ i0.ɵɵelementStart(3, "div", 81);
316
+ i0.ɵɵrepeaterCreate(4, ListsOperationsResource_Conditional_45_Conditional_16_For_5_Template, 7, 2, "div", 82, i0.ɵɵrepeaterTrackByIdentity);
235
317
  i0.ɵɵelementEnd();
236
- i0.ɵɵconditionalCreate(6, ListsOperationsResource_Conditional_35_Conditional_16_Conditional_6_Template, 2, 0, "div", 71);
318
+ i0.ɵɵconditionalCreate(6, ListsOperationsResource_Conditional_45_Conditional_16_Conditional_6_Template, 2, 0, "div", 83);
237
319
  i0.ɵɵelementEnd();
238
320
  } if (rf & 2) {
239
321
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -242,30 +324,30 @@ function ListsOperationsResource_Conditional_35_Conditional_16_Template(rf, ctx)
242
324
  i0.ɵɵadvance(2);
243
325
  i0.ɵɵconditional(ctx_r1.loadingPreview ? 6 : -1);
244
326
  } }
245
- function ListsOperationsResource_Conditional_35_Template(rf, ctx) { if (rf & 1) {
246
- const _r13 = i0.ɵɵgetCurrentView();
247
- i0.ɵɵelementStart(0, "div", 25)(1, "div", 59)(2, "span", 60);
327
+ function ListsOperationsResource_Conditional_45_Template(rf, ctx) { if (rf & 1) {
328
+ const _r20 = i0.ɵɵgetCurrentView();
329
+ i0.ɵɵelementStart(0, "div", 31)(1, "div", 71)(2, "span", 72);
248
330
  i0.ɵɵtext(3);
249
331
  i0.ɵɵelementEnd();
250
- i0.ɵɵelementStart(4, "span", 61);
332
+ i0.ɵɵelementStart(4, "span", 73);
251
333
  i0.ɵɵtext(5);
252
334
  i0.ɵɵelementEnd()();
253
- i0.ɵɵelementStart(6, "div", 62)(7, "button", 63);
254
- i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_35_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.createListFromSelection()); });
255
- i0.ɵɵelement(8, "i", 64);
335
+ i0.ɵɵelementStart(6, "div", 74)(7, "button", 75);
336
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_45_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.createListFromSelection()); });
337
+ i0.ɵɵelement(8, "i", 76);
256
338
  i0.ɵɵtext(9, " Create New List ");
257
339
  i0.ɵɵelementEnd();
258
- i0.ɵɵelementStart(10, "button", 65);
259
- i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_35_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.addToExistingList()); });
260
- i0.ɵɵelement(11, "i", 66);
340
+ i0.ɵɵelementStart(10, "button", 77);
341
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_45_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.addToExistingList()); });
342
+ i0.ɵɵelement(11, "i", 78);
261
343
  i0.ɵɵtext(12, " Add to List ");
262
344
  i0.ɵɵelementEnd();
263
- i0.ɵɵelementStart(13, "button", 65);
264
- i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_35_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.exportToExcel()); });
265
- i0.ɵɵelement(14, "i", 67);
266
- i0.ɵɵtext(15, " Export ");
345
+ i0.ɵɵelementStart(13, "button", 77);
346
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_45_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.openExportDialog()); });
347
+ i0.ɵɵelement(14, "i", 79);
348
+ i0.ɵɵtext(15, " Export\u2026 ");
267
349
  i0.ɵɵelementEnd()();
268
- i0.ɵɵconditionalCreate(16, ListsOperationsResource_Conditional_35_Conditional_16_Template, 7, 1, "div", 68);
350
+ i0.ɵɵconditionalCreate(16, ListsOperationsResource_Conditional_45_Conditional_16_Template, 7, 1, "div", 80);
269
351
  i0.ɵɵelementEnd();
270
352
  } if (rf & 2) {
271
353
  const ctx_r1 = i0.ɵɵnextContext();
@@ -276,22 +358,22 @@ function ListsOperationsResource_Conditional_35_Template(rf, ctx) { if (rf & 1)
276
358
  i0.ɵɵadvance(11);
277
359
  i0.ɵɵconditional(ctx_r1.previewRecordsDisplay.length > 0 ? 16 : -1);
278
360
  } }
279
- function ListsOperationsResource_Conditional_36_Template(rf, ctx) { if (rf & 1) {
280
- const _r16 = i0.ɵɵgetCurrentView();
281
- i0.ɵɵelementStart(0, "div", 26)(1, "div", 78)(2, "span", 79);
361
+ function ListsOperationsResource_Conditional_46_Template(rf, ctx) { if (rf & 1) {
362
+ const _r23 = i0.ɵɵgetCurrentView();
363
+ i0.ɵɵelementStart(0, "div", 32)(1, "div", 90)(2, "span", 91);
282
364
  i0.ɵɵtext(3);
283
365
  i0.ɵɵelementEnd();
284
- i0.ɵɵelementStart(4, "span", 80);
366
+ i0.ɵɵelementStart(4, "span", 92);
285
367
  i0.ɵɵtext(5);
286
368
  i0.ɵɵelementEnd()();
287
- i0.ɵɵelementStart(6, "div", 62)(7, "button", 63);
288
- i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_36_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.createListFromResult()); });
289
- i0.ɵɵelement(8, "i", 64);
369
+ i0.ɵɵelementStart(6, "div", 74)(7, "button", 75);
370
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_46_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.createListFromResult()); });
371
+ i0.ɵɵelement(8, "i", 76);
290
372
  i0.ɵɵtext(9, " Create New List ");
291
373
  i0.ɵɵelementEnd();
292
- i0.ɵɵelementStart(10, "button", 65);
293
- i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_36_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.addResultToExistingList()); });
294
- i0.ɵɵelement(11, "i", 66);
374
+ i0.ɵɵelementStart(10, "button", 77);
375
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_46_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.addResultToExistingList()); });
376
+ i0.ɵɵelement(11, "i", 78);
295
377
  i0.ɵɵtext(12, " Add to List ");
296
378
  i0.ɵɵelementEnd()()();
297
379
  } if (rf & 2) {
@@ -301,54 +383,407 @@ function ListsOperationsResource_Conditional_36_Template(rf, ctx) { if (rf & 1)
301
383
  i0.ɵɵadvance(2);
302
384
  i0.ɵɵtextInterpolate1("", ctx_r1.lastOperationResult.resultCount, " records");
303
385
  } }
304
- function ListsOperationsResource_Conditional_37_Template(rf, ctx) { if (rf & 1) {
305
- i0.ɵɵelementStart(0, "div", 27);
306
- i0.ɵɵelement(1, "i", 81);
386
+ function ListsOperationsResource_Conditional_47_Template(rf, ctx) { if (rf & 1) {
387
+ i0.ɵɵelementStart(0, "div", 33);
388
+ i0.ɵɵelement(1, "i", 93);
307
389
  i0.ɵɵelementStart(2, "p");
308
390
  i0.ɵɵtext(3, "Click a region in the diagram or run an operation to see results");
309
391
  i0.ɵɵelementEnd()();
310
392
  } }
311
- function ListsOperationsResource_Conditional_38_Template(rf, ctx) { if (rf & 1) {
312
- const _r17 = i0.ɵɵgetCurrentView();
313
- i0.ɵɵelementStart(0, "div", 82);
314
- i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_38_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelCreateDialog()); });
393
+ function ListsOperationsResource_Conditional_48_For_12_Template(rf, ctx) { if (rf & 1) {
394
+ i0.ɵɵelementStart(0, "div", 101);
395
+ i0.ɵɵelement(1, "i", 119);
396
+ i0.ɵɵelementStart(2, "span", 120);
397
+ i0.ɵɵtext(3);
315
398
  i0.ɵɵelementEnd();
399
+ i0.ɵɵelementStart(4, "span", 121);
400
+ i0.ɵɵtext(5, "List");
401
+ i0.ɵɵelementEnd()();
402
+ } if (rf & 2) {
403
+ const s_r25 = ctx.$implicit;
404
+ i0.ɵɵadvance();
405
+ i0.ɵɵstyleProp("color", s_r25.color);
406
+ i0.ɵɵadvance(2);
407
+ i0.ɵɵtextInterpolate(s_r25.list.Name);
316
408
  } }
317
- function ListsOperationsResource_Conditional_39_Conditional_20_Template(rf, ctx) { if (rf & 1) {
318
- i0.ɵɵelement(0, "i", 92);
409
+ function ListsOperationsResource_Conditional_48_For_14_Template(rf, ctx) { if (rf & 1) {
410
+ i0.ɵɵelementStart(0, "div", 102);
411
+ i0.ɵɵelement(1, "i", 60);
412
+ i0.ɵɵelementStart(2, "span", 120);
413
+ i0.ɵɵtext(3);
414
+ i0.ɵɵelementEnd();
415
+ i0.ɵɵelementStart(4, "span", 122);
416
+ i0.ɵɵtext(5, "View");
417
+ i0.ɵɵelementEnd()();
418
+ } if (rf & 2) {
419
+ const s_r26 = ctx.$implicit;
420
+ i0.ɵɵadvance();
421
+ i0.ɵɵstyleProp("color", s_r26.color);
422
+ i0.ɵɵadvance(2);
423
+ i0.ɵɵtextInterpolate(s_r26.view.Name);
319
424
  } }
320
- function ListsOperationsResource_Conditional_39_Template(rf, ctx) { if (rf & 1) {
321
- const _r18 = i0.ɵɵgetCurrentView();
322
- i0.ɵɵelementStart(0, "div", 29)(1, "div", 83)(2, "h3");
425
+ function ListsOperationsResource_Conditional_48_Conditional_59_Template(rf, ctx) { if (rf & 1) {
426
+ const _r27 = i0.ɵɵgetCurrentView();
427
+ i0.ɵɵelementStart(0, "input", 123);
428
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsOperationsResource_Conditional_48_Conditional_59_Template_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.composeNewListName, $event) || (ctx_r1.composeNewListName = $event); return i0.ɵɵresetView($event); });
429
+ i0.ɵɵelementEnd();
430
+ } if (rf & 2) {
431
+ const ctx_r1 = i0.ɵɵnextContext(2);
432
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.composeNewListName);
433
+ } }
434
+ function ListsOperationsResource_Conditional_48_Conditional_60_Conditional_2_For_4_Template(rf, ctx) { if (rf & 1) {
435
+ const _r30 = i0.ɵɵgetCurrentView();
436
+ i0.ɵɵelementStart(0, "div", 54);
437
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_48_Conditional_60_Conditional_2_For_4_Template_div_click_0_listener() { const l_r31 = i0.ɵɵrestoreView(_r30).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.selectComposeTarget(l_r31)); });
438
+ i0.ɵɵelementStart(1, "span", 55);
439
+ i0.ɵɵtext(2);
440
+ i0.ɵɵelementEnd();
441
+ i0.ɵɵelementStart(3, "span", 56);
442
+ i0.ɵɵtext(4);
443
+ i0.ɵɵelementEnd()();
444
+ } if (rf & 2) {
445
+ const l_r31 = ctx.$implicit;
446
+ i0.ɵɵadvance(2);
447
+ i0.ɵɵtextInterpolate(l_r31.Name);
448
+ i0.ɵɵadvance(2);
449
+ i0.ɵɵtextInterpolate(l_r31.Entity);
450
+ } }
451
+ function ListsOperationsResource_Conditional_48_Conditional_60_Conditional_2_Template(rf, ctx) { if (rf & 1) {
452
+ const _r29 = i0.ɵɵgetCurrentView();
453
+ i0.ɵɵelementStart(0, "div", 125)(1, "div", 51);
454
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_48_Conditional_60_Conditional_2_Template_div_click_1_listener() { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.showComposeTargetDropdown = false); });
455
+ i0.ɵɵelementEnd();
456
+ i0.ɵɵelementStart(2, "div", 52);
457
+ i0.ɵɵrepeaterCreate(3, ListsOperationsResource_Conditional_48_Conditional_60_Conditional_2_For_4_Template, 5, 2, "div", 53, _forTrack3);
458
+ i0.ɵɵelementEnd()();
459
+ } if (rf & 2) {
460
+ const ctx_r1 = i0.ɵɵnextContext(3);
461
+ i0.ɵɵadvance(3);
462
+ i0.ɵɵrepeater(ctx_r1.filteredComposeTargets);
463
+ } }
464
+ function ListsOperationsResource_Conditional_48_Conditional_60_Template(rf, ctx) { if (rf & 1) {
465
+ const _r28 = i0.ɵɵgetCurrentView();
466
+ i0.ɵɵelementStart(0, "div", 112)(1, "input", 124);
467
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsOperationsResource_Conditional_48_Conditional_60_Template_input_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.composeTargetSearch, $event) || (ctx_r1.composeTargetSearch = $event); return i0.ɵɵresetView($event); });
468
+ i0.ɵɵlistener("focus", function ListsOperationsResource_Conditional_48_Conditional_60_Template_input_focus_1_listener() { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.showComposeTargetDropdown = true); });
469
+ i0.ɵɵelementEnd();
470
+ i0.ɵɵconditionalCreate(2, ListsOperationsResource_Conditional_48_Conditional_60_Conditional_2_Template, 5, 0, "div", 125);
471
+ i0.ɵɵelementEnd();
472
+ } if (rf & 2) {
473
+ const ctx_r1 = i0.ɵɵnextContext(2);
474
+ i0.ɵɵadvance();
475
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.composeTargetSearch);
476
+ i0.ɵɵadvance();
477
+ i0.ɵɵconditional(ctx_r1.showComposeTargetDropdown && ctx_r1.filteredComposeTargets.length > 0 ? 2 : -1);
478
+ } }
479
+ function ListsOperationsResource_Conditional_48_Conditional_67_Template(rf, ctx) { if (rf & 1) {
480
+ i0.ɵɵelement(0, "i", 115);
481
+ } }
482
+ function ListsOperationsResource_Conditional_48_Conditional_68_Template(rf, ctx) { if (rf & 1) {
483
+ i0.ɵɵelement(0, "i", 116);
484
+ } }
485
+ function ListsOperationsResource_Conditional_48_Conditional_72_Template(rf, ctx) { if (rf & 1) {
486
+ i0.ɵɵelementStart(0, "div", 118);
487
+ i0.ɵɵtext(1, " Expected output: ");
488
+ i0.ɵɵelementStart(2, "strong");
489
+ i0.ɵɵtext(3);
490
+ i0.ɵɵelementEnd();
491
+ i0.ɵɵtext(4);
492
+ i0.ɵɵelementEnd();
493
+ } if (rf & 2) {
494
+ const ctx_r1 = i0.ɵɵnextContext(2);
495
+ i0.ɵɵadvance(3);
496
+ i0.ɵɵtextInterpolate1("", ctx_r1.lastOperationResult.resultCount, " records");
497
+ i0.ɵɵadvance();
498
+ i0.ɵɵtextInterpolate1(" (", ctx_r1.getOperationLabel(ctx_r1.lastOperationResult.operation), ") ");
499
+ } }
500
+ function ListsOperationsResource_Conditional_48_Template(rf, ctx) { if (rf & 1) {
501
+ const _r24 = i0.ɵɵgetCurrentView();
502
+ i0.ɵɵelementStart(0, "div", 34)(1, "div", 94);
503
+ i0.ɵɵelement(2, "i", 95);
504
+ i0.ɵɵelementStart(3, "h3");
505
+ i0.ɵɵtext(4, "Compose into a Target List");
506
+ i0.ɵɵelementEnd()();
507
+ i0.ɵɵelementStart(5, "div", 96)(6, "div", 97)(7, "div", 98)(8, "div", 99);
508
+ i0.ɵɵtext(9);
509
+ i0.ɵɵelementEnd();
510
+ i0.ɵɵelementStart(10, "div", 100);
511
+ i0.ɵɵrepeaterCreate(11, ListsOperationsResource_Conditional_48_For_12_Template, 6, 3, "div", 101, _forTrack1);
512
+ i0.ɵɵrepeaterCreate(13, ListsOperationsResource_Conditional_48_For_14_Template, 6, 3, "div", 102, _forTrack2);
513
+ i0.ɵɵelementEnd()();
514
+ i0.ɵɵelementStart(15, "div", 103);
515
+ i0.ɵɵtext(16, "\u2192");
516
+ i0.ɵɵelementEnd();
517
+ i0.ɵɵelementStart(17, "div", 98)(18, "div", 99);
518
+ i0.ɵɵtext(19, "Operation");
519
+ i0.ɵɵelementEnd();
520
+ i0.ɵɵelementStart(20, "div", 104)(21, "label", 105)(22, "input", 106);
521
+ i0.ɵɵlistener("change", function ListsOperationsResource_Conditional_48_Template_input_change_22_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.composeOp = "union"); });
522
+ i0.ɵɵelementEnd();
523
+ i0.ɵɵelement(23, "i", 64);
524
+ i0.ɵɵelementStart(24, "div")(25, "div", 107);
525
+ i0.ɵɵtext(26, "Union");
526
+ i0.ɵɵelementEnd();
527
+ i0.ɵɵelementStart(27, "div", 108);
528
+ i0.ɵɵtext(28, "Combine all sources, dedupe");
529
+ i0.ɵɵelementEnd()()();
530
+ i0.ɵɵelementStart(29, "label", 105)(30, "input", 106);
531
+ i0.ɵɵlistener("change", function ListsOperationsResource_Conditional_48_Template_input_change_30_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.composeOp = "intersection"); });
532
+ i0.ɵɵelementEnd();
533
+ i0.ɵɵelement(31, "i", 65);
534
+ i0.ɵɵelementStart(32, "div")(33, "div", 107);
535
+ i0.ɵɵtext(34, "Intersection");
536
+ i0.ɵɵelementEnd();
537
+ i0.ɵɵelementStart(35, "div", 108);
538
+ i0.ɵɵtext(36, "Only records in all sources");
539
+ i0.ɵɵelementEnd()()();
540
+ i0.ɵɵelementStart(37, "label", 105)(38, "input", 106);
541
+ i0.ɵɵlistener("change", function ListsOperationsResource_Conditional_48_Template_input_change_38_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.composeOp = "difference"); });
542
+ i0.ɵɵelementEnd();
543
+ i0.ɵɵelement(39, "i", 109);
544
+ i0.ɵɵelementStart(40, "div")(41, "div", 107);
545
+ i0.ɵɵtext(42, "Difference");
546
+ i0.ɵɵelementEnd();
547
+ i0.ɵɵelementStart(43, "div", 108);
548
+ i0.ɵɵtext(44, "First minus the rest");
549
+ i0.ɵɵelementEnd()()()()();
550
+ i0.ɵɵelementStart(45, "div", 103);
551
+ i0.ɵɵtext(46, "\u2192");
552
+ i0.ɵɵelementEnd();
553
+ i0.ɵɵelementStart(47, "div", 98)(48, "div", 99);
554
+ i0.ɵɵtext(49, "Target");
555
+ i0.ɵɵelementEnd();
556
+ i0.ɵɵelementStart(50, "div", 104)(51, "label", 105)(52, "input", 110);
557
+ i0.ɵɵlistener("change", function ListsOperationsResource_Conditional_48_Template_input_change_52_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.composeTarget = "new"); });
558
+ i0.ɵɵelementEnd();
559
+ i0.ɵɵelementStart(53, "div", 107);
560
+ i0.ɵɵtext(54, "Create New List");
561
+ i0.ɵɵelementEnd()();
562
+ i0.ɵɵelementStart(55, "label", 105)(56, "input", 110);
563
+ i0.ɵɵlistener("change", function ListsOperationsResource_Conditional_48_Template_input_change_56_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.composeTarget = "existing"); });
564
+ i0.ɵɵelementEnd();
565
+ i0.ɵɵelementStart(57, "div", 107);
566
+ i0.ɵɵtext(58, "Existing List\u2026");
567
+ i0.ɵɵelementEnd()();
568
+ i0.ɵɵconditionalCreate(59, ListsOperationsResource_Conditional_48_Conditional_59_Template, 1, 1, "input", 111)(60, ListsOperationsResource_Conditional_48_Conditional_60_Template, 3, 2, "div", 112);
569
+ i0.ɵɵelementEnd()()();
570
+ i0.ɵɵelementStart(61, "div", 113)(62, "button", 63);
571
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_48_Template_button_click_62_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.previewCompose()); });
572
+ i0.ɵɵelement(63, "i", 60);
573
+ i0.ɵɵelementStart(64, "span");
574
+ i0.ɵɵtext(65, "Preview Result");
575
+ i0.ɵɵelementEnd()();
576
+ i0.ɵɵelementStart(66, "button", 114);
577
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_48_Template_button_click_66_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.composeAndSave()); });
578
+ i0.ɵɵconditionalCreate(67, ListsOperationsResource_Conditional_48_Conditional_67_Template, 1, 0, "i", 115)(68, ListsOperationsResource_Conditional_48_Conditional_68_Template, 1, 0, "i", 116);
579
+ i0.ɵɵelementStart(69, "span");
580
+ i0.ɵɵtext(70);
581
+ i0.ɵɵelementEnd()();
582
+ i0.ɵɵelement(71, "div", 117);
583
+ i0.ɵɵconditionalCreate(72, ListsOperationsResource_Conditional_48_Conditional_72_Template, 5, 2, "div", 118);
584
+ i0.ɵɵelementEnd()()();
585
+ } if (rf & 2) {
586
+ const ctx_r1 = i0.ɵɵnextContext();
587
+ i0.ɵɵadvance(9);
588
+ i0.ɵɵtextInterpolate1("Sources (", ctx_r1.totalOperandCount, ")");
589
+ i0.ɵɵadvance(2);
590
+ i0.ɵɵrepeater(ctx_r1.selectedLists);
591
+ i0.ɵɵadvance(2);
592
+ i0.ɵɵrepeater(ctx_r1.selectedViews);
593
+ i0.ɵɵadvance(8);
594
+ i0.ɵɵclassProp("compose-option--selected", ctx_r1.composeOp === "union");
595
+ i0.ɵɵadvance();
596
+ i0.ɵɵproperty("checked", ctx_r1.composeOp === "union");
597
+ i0.ɵɵadvance(7);
598
+ i0.ɵɵclassProp("compose-option--selected", ctx_r1.composeOp === "intersection");
599
+ i0.ɵɵadvance();
600
+ i0.ɵɵproperty("checked", ctx_r1.composeOp === "intersection");
601
+ i0.ɵɵadvance(7);
602
+ i0.ɵɵclassProp("compose-option--selected", ctx_r1.composeOp === "difference");
603
+ i0.ɵɵadvance();
604
+ i0.ɵɵproperty("checked", ctx_r1.composeOp === "difference");
605
+ i0.ɵɵadvance(13);
606
+ i0.ɵɵclassProp("compose-option--selected", ctx_r1.composeTarget === "new");
607
+ i0.ɵɵadvance();
608
+ i0.ɵɵproperty("checked", ctx_r1.composeTarget === "new");
609
+ i0.ɵɵadvance(3);
610
+ i0.ɵɵclassProp("compose-option--selected", ctx_r1.composeTarget === "existing");
611
+ i0.ɵɵadvance();
612
+ i0.ɵɵproperty("checked", ctx_r1.composeTarget === "existing");
613
+ i0.ɵɵadvance(3);
614
+ i0.ɵɵconditional(ctx_r1.composeTarget === "new" ? 59 : 60);
615
+ i0.ɵɵadvance(3);
616
+ i0.ɵɵproperty("disabled", ctx_r1.isCalculating || ctx_r1.isComposing);
617
+ i0.ɵɵadvance(4);
618
+ i0.ɵɵproperty("disabled", !ctx_r1.canCompose || ctx_r1.isCalculating || ctx_r1.isComposing);
619
+ i0.ɵɵadvance();
620
+ i0.ɵɵconditional(ctx_r1.isComposing ? 67 : 68);
621
+ i0.ɵɵadvance(3);
622
+ i0.ɵɵtextInterpolate(ctx_r1.isComposing ? "Composing\u2026" : "Compute & Save");
623
+ i0.ɵɵadvance(2);
624
+ i0.ɵɵconditional(ctx_r1.lastOperationResult ? 72 : -1);
625
+ } }
626
+ function ListsOperationsResource_Conditional_50_For_30_Template(rf, ctx) { if (rf & 1) {
627
+ const _r33 = i0.ɵɵgetCurrentView();
628
+ i0.ɵɵelementStart(0, "label", 142)(1, "input", 149);
629
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsOperationsResource_Conditional_50_For_30_Template_input_ngModelChange_1_listener($event) { const f_r34 = i0.ɵɵrestoreView(_r33).$implicit; i0.ɵɵtwoWayBindingSet(f_r34.Selected, $event) || (f_r34.Selected = $event); return i0.ɵɵresetView($event); });
630
+ i0.ɵɵelementEnd();
631
+ i0.ɵɵelementStart(2, "span");
632
+ i0.ɵɵtext(3);
633
+ i0.ɵɵelementEnd()();
634
+ } if (rf & 2) {
635
+ const f_r34 = ctx.$implicit;
636
+ i0.ɵɵadvance();
637
+ i0.ɵɵtwoWayProperty("ngModel", f_r34.Selected);
638
+ i0.ɵɵadvance(2);
639
+ i0.ɵɵtextInterpolate(f_r34.DisplayName);
640
+ } }
641
+ function ListsOperationsResource_Conditional_50_Conditional_40_Template(rf, ctx) { if (rf & 1) {
642
+ i0.ɵɵelement(0, "i", 115);
643
+ i0.ɵɵtext(1, " Exporting\u2026 ");
644
+ } }
645
+ function ListsOperationsResource_Conditional_50_Conditional_41_Template(rf, ctx) { if (rf & 1) {
646
+ i0.ɵɵelement(0, "i", 150);
647
+ i0.ɵɵtext(1);
648
+ } if (rf & 2) {
649
+ const ctx_r1 = i0.ɵɵnextContext(2);
650
+ i0.ɵɵadvance();
651
+ i0.ɵɵtextInterpolate2(" Export ", ctx_r1.exportRecordCount, " Record", ctx_r1.exportRecordCount === 1 ? "" : "s", " ");
652
+ } }
653
+ function ListsOperationsResource_Conditional_50_Template(rf, ctx) { if (rf & 1) {
654
+ const _r32 = i0.ɵɵgetCurrentView();
655
+ i0.ɵɵelementStart(0, "div", 126);
656
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_50_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.closeExportDialog()); });
657
+ i0.ɵɵelementEnd();
658
+ i0.ɵɵelementStart(1, "div", 127)(2, "div", 128)(3, "h3");
659
+ i0.ɵɵelement(4, "i", 79);
660
+ i0.ɵɵtext(5);
661
+ i0.ɵɵelementEnd();
662
+ i0.ɵɵelementStart(6, "button", 129);
663
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_50_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.closeExportDialog()); });
664
+ i0.ɵɵelement(7, "i", 46);
665
+ i0.ɵɵelementEnd()();
666
+ i0.ɵɵelementStart(8, "div", 130)(9, "div", 131)(10, "label", 132);
667
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_50_Template_label_click_10_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.exportFormat = "excel"); });
668
+ i0.ɵɵelementStart(11, "input", 133);
669
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsOperationsResource_Conditional_50_Template_input_ngModelChange_11_listener($event) { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.exportFormat, $event) || (ctx_r1.exportFormat = $event); return i0.ɵɵresetView($event); });
670
+ i0.ɵɵelementEnd();
671
+ i0.ɵɵelement(12, "i", 134);
672
+ i0.ɵɵelementStart(13, "span");
673
+ i0.ɵɵtext(14, "Excel (.xlsx)");
674
+ i0.ɵɵelementEnd()();
675
+ i0.ɵɵelementStart(15, "label", 132);
676
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_50_Template_label_click_15_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.exportFormat = "csv"); });
677
+ i0.ɵɵelementStart(16, "input", 135);
678
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsOperationsResource_Conditional_50_Template_input_ngModelChange_16_listener($event) { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.exportFormat, $event) || (ctx_r1.exportFormat = $event); return i0.ɵɵresetView($event); });
679
+ i0.ɵɵelementEnd();
680
+ i0.ɵɵelement(17, "i", 136);
681
+ i0.ɵɵelementStart(18, "span");
682
+ i0.ɵɵtext(19, "CSV");
683
+ i0.ɵɵelementEnd()();
684
+ i0.ɵɵelementStart(20, "label", 132);
685
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_50_Template_label_click_20_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.exportFormat = "json"); });
686
+ i0.ɵɵelementStart(21, "input", 137);
687
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsOperationsResource_Conditional_50_Template_input_ngModelChange_21_listener($event) { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.exportFormat, $event) || (ctx_r1.exportFormat = $event); return i0.ɵɵresetView($event); });
688
+ i0.ɵɵelementEnd();
689
+ i0.ɵɵelement(22, "i", 138);
690
+ i0.ɵɵelementStart(23, "span");
691
+ i0.ɵɵtext(24, "JSON");
692
+ i0.ɵɵelementEnd()()();
693
+ i0.ɵɵelement(25, "div", 139);
694
+ i0.ɵɵelementStart(26, "label", 140);
695
+ i0.ɵɵtext(27, "Columns to include");
696
+ i0.ɵɵelementEnd();
697
+ i0.ɵɵelementStart(28, "div", 141);
698
+ i0.ɵɵrepeaterCreate(29, ListsOperationsResource_Conditional_50_For_30_Template, 4, 2, "label", 142, _forTrack4);
699
+ i0.ɵɵelementEnd();
700
+ i0.ɵɵelementStart(31, "div", 143)(32, "a", 144);
701
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_50_Template_a_click_32_listener($event) { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(); ctx_r1.selectAllExportFields(); return i0.ɵɵresetView($event.preventDefault()); });
702
+ i0.ɵɵtext(33, "Select All");
703
+ i0.ɵɵelementEnd();
704
+ i0.ɵɵelementStart(34, "a", 144);
705
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_50_Template_a_click_34_listener($event) { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(); ctx_r1.selectNoneExportFields(); return i0.ɵɵresetView($event.preventDefault()); });
706
+ i0.ɵɵtext(35, "Select None");
707
+ i0.ɵɵelementEnd();
708
+ i0.ɵɵelementStart(36, "span", 145);
709
+ i0.ɵɵtext(37);
710
+ i0.ɵɵelementEnd()()();
711
+ i0.ɵɵelementStart(38, "div", 146)(39, "button", 147);
712
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_50_Template_button_click_39_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.executeExport()); });
713
+ i0.ɵɵconditionalCreate(40, ListsOperationsResource_Conditional_50_Conditional_40_Template, 2, 0)(41, ListsOperationsResource_Conditional_50_Conditional_41_Template, 2, 2);
714
+ i0.ɵɵelementEnd();
715
+ i0.ɵɵelementStart(42, "button", 148);
716
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_50_Template_button_click_42_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.closeExportDialog()); });
717
+ i0.ɵɵtext(43, "Cancel");
718
+ i0.ɵɵelementEnd()()();
719
+ } if (rf & 2) {
720
+ const ctx_r1 = i0.ɵɵnextContext();
721
+ i0.ɵɵadvance(5);
722
+ i0.ɵɵtextInterpolate2(" Export ", ctx_r1.exportRecordCount, " Record", ctx_r1.exportRecordCount === 1 ? "" : "s");
723
+ i0.ɵɵadvance(5);
724
+ i0.ɵɵclassProp("export-format-option--selected", ctx_r1.exportFormat === "excel");
725
+ i0.ɵɵadvance();
726
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.exportFormat);
727
+ i0.ɵɵadvance(4);
728
+ i0.ɵɵclassProp("export-format-option--selected", ctx_r1.exportFormat === "csv");
729
+ i0.ɵɵadvance();
730
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.exportFormat);
731
+ i0.ɵɵadvance(4);
732
+ i0.ɵɵclassProp("export-format-option--selected", ctx_r1.exportFormat === "json");
733
+ i0.ɵɵadvance();
734
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.exportFormat);
735
+ i0.ɵɵadvance(8);
736
+ i0.ɵɵrepeater(ctx_r1.exportFields);
737
+ i0.ɵɵadvance(8);
738
+ i0.ɵɵtextInterpolate2("", ctx_r1.selectedExportFieldCount, " of ", ctx_r1.exportFields.length, " selected");
739
+ i0.ɵɵadvance(2);
740
+ i0.ɵɵproperty("disabled", ctx_r1.selectedExportFieldCount === 0 || ctx_r1.isExporting);
741
+ i0.ɵɵadvance();
742
+ i0.ɵɵconditional(ctx_r1.isExporting ? 40 : 41);
743
+ i0.ɵɵadvance(2);
744
+ i0.ɵɵproperty("disabled", ctx_r1.isExporting);
745
+ } }
746
+ function ListsOperationsResource_Conditional_51_Template(rf, ctx) { if (rf & 1) {
747
+ const _r35 = i0.ɵɵgetCurrentView();
748
+ i0.ɵɵelementStart(0, "div", 126);
749
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_51_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r35); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelCreateDialog()); });
750
+ i0.ɵɵelementEnd();
751
+ } }
752
+ function ListsOperationsResource_Conditional_52_Conditional_20_Template(rf, ctx) { if (rf & 1) {
753
+ i0.ɵɵelement(0, "i", 115);
754
+ } }
755
+ function ListsOperationsResource_Conditional_52_Template(rf, ctx) { if (rf & 1) {
756
+ const _r36 = i0.ɵɵgetCurrentView();
757
+ i0.ɵɵelementStart(0, "div", 37)(1, "div", 128)(2, "h3");
323
758
  i0.ɵɵtext(3, "Create New List from Selection");
324
759
  i0.ɵɵelementEnd();
325
- i0.ɵɵelementStart(4, "button", 84);
326
- i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_39_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelCreateDialog()); });
327
- i0.ɵɵelement(5, "i", 38);
760
+ i0.ɵɵelementStart(4, "button", 129);
761
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_52_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r36); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelCreateDialog()); });
762
+ i0.ɵɵelement(5, "i", 46);
328
763
  i0.ɵɵelementEnd()();
329
- i0.ɵɵelementStart(6, "div", 85)(7, "div", 86)(8, "label");
764
+ i0.ɵɵelementStart(6, "div", 130)(7, "div", 151)(8, "label");
330
765
  i0.ɵɵtext(9, "List Name *");
331
766
  i0.ɵɵelementEnd();
332
- i0.ɵɵelementStart(10, "input", 87);
333
- i0.ɵɵtwoWayListener("ngModelChange", function ListsOperationsResource_Conditional_39_Template_input_ngModelChange_10_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.newListName, $event) || (ctx_r1.newListName = $event); return i0.ɵɵresetView($event); });
767
+ i0.ɵɵelementStart(10, "input", 152);
768
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsOperationsResource_Conditional_52_Template_input_ngModelChange_10_listener($event) { i0.ɵɵrestoreView(_r36); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.newListName, $event) || (ctx_r1.newListName = $event); return i0.ɵɵresetView($event); });
334
769
  i0.ɵɵelementEnd()();
335
- i0.ɵɵelementStart(11, "div", 86)(12, "label");
770
+ i0.ɵɵelementStart(11, "div", 151)(12, "label");
336
771
  i0.ɵɵtext(13, "Description");
337
772
  i0.ɵɵelementEnd();
338
- i0.ɵɵelementStart(14, "textarea", 88);
339
- i0.ɵɵtwoWayListener("ngModelChange", function ListsOperationsResource_Conditional_39_Template_textarea_ngModelChange_14_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.newListDescription, $event) || (ctx_r1.newListDescription = $event); return i0.ɵɵresetView($event); });
773
+ i0.ɵɵelementStart(14, "textarea", 153);
774
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsOperationsResource_Conditional_52_Template_textarea_ngModelChange_14_listener($event) { i0.ɵɵrestoreView(_r36); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.newListDescription, $event) || (ctx_r1.newListDescription = $event); return i0.ɵɵresetView($event); });
340
775
  i0.ɵɵelementEnd()();
341
- i0.ɵɵelementStart(15, "div", 89);
342
- i0.ɵɵelement(16, "i", 49);
776
+ i0.ɵɵelementStart(15, "div", 154);
777
+ i0.ɵɵelement(16, "i", 57);
343
778
  i0.ɵɵtext(17);
344
779
  i0.ɵɵelementEnd()();
345
- i0.ɵɵelementStart(18, "div", 90)(19, "button", 91);
346
- i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_39_Template_button_click_19_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.confirmCreateList()); });
347
- i0.ɵɵconditionalCreate(20, ListsOperationsResource_Conditional_39_Conditional_20_Template, 1, 0, "i", 92);
780
+ i0.ɵɵelementStart(18, "div", 146)(19, "button", 155);
781
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_52_Template_button_click_19_listener() { i0.ɵɵrestoreView(_r36); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.confirmCreateList()); });
782
+ i0.ɵɵconditionalCreate(20, ListsOperationsResource_Conditional_52_Conditional_20_Template, 1, 0, "i", 115);
348
783
  i0.ɵɵtext(21);
349
784
  i0.ɵɵelementEnd();
350
- i0.ɵɵelementStart(22, "button", 93);
351
- i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_39_Template_button_click_22_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelCreateDialog()); });
785
+ i0.ɵɵelementStart(22, "button", 156);
786
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_52_Template_button_click_22_listener() { i0.ɵɵrestoreView(_r36); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelCreateDialog()); });
352
787
  i0.ɵɵtext(23, "Cancel");
353
788
  i0.ɵɵelementEnd()()();
354
789
  } if (rf & 2) {
@@ -366,39 +801,39 @@ function ListsOperationsResource_Conditional_39_Template(rf, ctx) { if (rf & 1)
366
801
  i0.ɵɵadvance();
367
802
  i0.ɵɵtextInterpolate1(" ", ctx_r1.isSaving ? "Creating..." : "Create List", " ");
368
803
  } }
369
- function ListsOperationsResource_Conditional_40_Template(rf, ctx) { if (rf & 1) {
370
- const _r19 = i0.ɵɵgetCurrentView();
371
- i0.ɵɵelementStart(0, "div", 82);
372
- i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_40_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelAddToListDialog()); });
804
+ function ListsOperationsResource_Conditional_53_Template(rf, ctx) { if (rf & 1) {
805
+ const _r37 = i0.ɵɵgetCurrentView();
806
+ i0.ɵɵelementStart(0, "div", 126);
807
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_53_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r37); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelAddToListDialog()); });
373
808
  i0.ɵɵelementEnd();
374
809
  } }
375
- function ListsOperationsResource_Conditional_41_For_15_Template(rf, ctx) { if (rf & 1) {
376
- const _r21 = i0.ɵɵgetCurrentView();
377
- i0.ɵɵelementStart(0, "div", 100);
378
- i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_41_For_15_Template_div_click_0_listener() { const list_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.selectTargetList(list_r22.ID)); });
379
- i0.ɵɵelementStart(1, "div", 101);
380
- i0.ɵɵelement(2, "input", 102);
810
+ function ListsOperationsResource_Conditional_54_For_15_Template(rf, ctx) { if (rf & 1) {
811
+ const _r39 = i0.ɵɵgetCurrentView();
812
+ i0.ɵɵelementStart(0, "div", 163);
813
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_54_For_15_Template_div_click_0_listener() { const list_r40 = i0.ɵɵrestoreView(_r39).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.selectTargetList(list_r40.ID)); });
814
+ i0.ɵɵelementStart(1, "div", 164);
815
+ i0.ɵɵelement(2, "input", 165);
381
816
  i0.ɵɵelementEnd();
382
- i0.ɵɵelementStart(3, "div", 103)(4, "span", 104);
817
+ i0.ɵɵelementStart(3, "div", 166)(4, "span", 167);
383
818
  i0.ɵɵtext(5);
384
819
  i0.ɵɵelementEnd();
385
- i0.ɵɵelementStart(6, "span", 105);
820
+ i0.ɵɵelementStart(6, "span", 168);
386
821
  i0.ɵɵtext(7);
387
822
  i0.ɵɵelementEnd()()();
388
823
  } if (rf & 2) {
389
- const list_r22 = ctx.$implicit;
824
+ const list_r40 = ctx.$implicit;
390
825
  const ctx_r1 = i0.ɵɵnextContext(2);
391
- i0.ɵɵclassProp("selected", ctx_r1.IsTargetListSelected(list_r22));
826
+ i0.ɵɵclassProp("selected", ctx_r1.IsTargetListSelected(list_r40));
392
827
  i0.ɵɵadvance(2);
393
- i0.ɵɵproperty("checked", ctx_r1.IsTargetListSelected(list_r22));
828
+ i0.ɵɵproperty("checked", ctx_r1.IsTargetListSelected(list_r40));
394
829
  i0.ɵɵadvance(3);
395
- i0.ɵɵtextInterpolate(list_r22.Name);
830
+ i0.ɵɵtextInterpolate(list_r40.Name);
396
831
  i0.ɵɵadvance(2);
397
- i0.ɵɵtextInterpolate(list_r22.Entity);
832
+ i0.ɵɵtextInterpolate(list_r40.Entity);
398
833
  } }
399
- function ListsOperationsResource_Conditional_41_Conditional_16_Template(rf, ctx) { if (rf & 1) {
400
- i0.ɵɵelementStart(0, "div", 99);
401
- i0.ɵɵelement(1, "i", 106);
834
+ function ListsOperationsResource_Conditional_54_Conditional_16_Template(rf, ctx) { if (rf & 1) {
835
+ i0.ɵɵelementStart(0, "div", 162);
836
+ i0.ɵɵelement(1, "i", 169);
402
837
  i0.ɵɵelementStart(2, "p");
403
838
  i0.ɵɵtext(3);
404
839
  i0.ɵɵelementEnd()();
@@ -407,39 +842,39 @@ function ListsOperationsResource_Conditional_41_Conditional_16_Template(rf, ctx)
407
842
  i0.ɵɵadvance(3);
408
843
  i0.ɵɵtextInterpolate(ctx_r1.addToListSearchTerm ? "No lists match your search" : "No other lists available");
409
844
  } }
410
- function ListsOperationsResource_Conditional_41_Conditional_19_Template(rf, ctx) { if (rf & 1) {
411
- i0.ɵɵelement(0, "i", 92);
845
+ function ListsOperationsResource_Conditional_54_Conditional_19_Template(rf, ctx) { if (rf & 1) {
846
+ i0.ɵɵelement(0, "i", 115);
412
847
  } }
413
- function ListsOperationsResource_Conditional_41_Template(rf, ctx) { if (rf & 1) {
414
- const _r20 = i0.ɵɵgetCurrentView();
415
- i0.ɵɵelementStart(0, "div", 30)(1, "div", 83)(2, "h3");
848
+ function ListsOperationsResource_Conditional_54_Template(rf, ctx) { if (rf & 1) {
849
+ const _r38 = i0.ɵɵgetCurrentView();
850
+ i0.ɵɵelementStart(0, "div", 38)(1, "div", 128)(2, "h3");
416
851
  i0.ɵɵtext(3, "Add to Existing List");
417
852
  i0.ɵɵelementEnd();
418
- i0.ɵɵelementStart(4, "button", 84);
419
- i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_41_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelAddToListDialog()); });
420
- i0.ɵɵelement(5, "i", 38);
853
+ i0.ɵɵelementStart(4, "button", 129);
854
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_54_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r38); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelAddToListDialog()); });
855
+ i0.ɵɵelement(5, "i", 46);
421
856
  i0.ɵɵelementEnd()();
422
- i0.ɵɵelementStart(6, "div", 85)(7, "div", 94);
423
- i0.ɵɵelement(8, "i", 49);
857
+ i0.ɵɵelementStart(6, "div", 130)(7, "div", 157);
858
+ i0.ɵɵelement(8, "i", 57);
424
859
  i0.ɵɵtext(9);
425
860
  i0.ɵɵelementEnd();
426
- i0.ɵɵelementStart(10, "div", 95);
427
- i0.ɵɵelement(11, "i", 40);
428
- i0.ɵɵelementStart(12, "input", 96);
429
- i0.ɵɵtwoWayListener("ngModelChange", function ListsOperationsResource_Conditional_41_Template_input_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.addToListSearchTerm, $event) || (ctx_r1.addToListSearchTerm = $event); return i0.ɵɵresetView($event); });
430
- i0.ɵɵlistener("ngModelChange", function ListsOperationsResource_Conditional_41_Template_input_ngModelChange_12_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.filterAddToListOptions()); });
861
+ i0.ɵɵelementStart(10, "div", 158);
862
+ i0.ɵɵelement(11, "i", 48);
863
+ i0.ɵɵelementStart(12, "input", 159);
864
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsOperationsResource_Conditional_54_Template_input_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r38); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.addToListSearchTerm, $event) || (ctx_r1.addToListSearchTerm = $event); return i0.ɵɵresetView($event); });
865
+ i0.ɵɵlistener("ngModelChange", function ListsOperationsResource_Conditional_54_Template_input_ngModelChange_12_listener() { i0.ɵɵrestoreView(_r38); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.filterAddToListOptions()); });
431
866
  i0.ɵɵelementEnd()();
432
- i0.ɵɵelementStart(13, "div", 97);
433
- i0.ɵɵrepeaterCreate(14, ListsOperationsResource_Conditional_41_For_15_Template, 8, 5, "div", 98, i0.ɵɵrepeaterTrackByIdentity);
434
- i0.ɵɵconditionalCreate(16, ListsOperationsResource_Conditional_41_Conditional_16_Template, 4, 1, "div", 99);
867
+ i0.ɵɵelementStart(13, "div", 160);
868
+ i0.ɵɵrepeaterCreate(14, ListsOperationsResource_Conditional_54_For_15_Template, 8, 5, "div", 161, i0.ɵɵrepeaterTrackByIdentity);
869
+ i0.ɵɵconditionalCreate(16, ListsOperationsResource_Conditional_54_Conditional_16_Template, 4, 1, "div", 162);
435
870
  i0.ɵɵelementEnd()();
436
- i0.ɵɵelementStart(17, "div", 90)(18, "button", 91);
437
- i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_41_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.confirmAddToList()); });
438
- i0.ɵɵconditionalCreate(19, ListsOperationsResource_Conditional_41_Conditional_19_Template, 1, 0, "i", 92);
871
+ i0.ɵɵelementStart(17, "div", 146)(18, "button", 155);
872
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_54_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r38); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.confirmAddToList()); });
873
+ i0.ɵɵconditionalCreate(19, ListsOperationsResource_Conditional_54_Conditional_19_Template, 1, 0, "i", 115);
439
874
  i0.ɵɵtext(20);
440
875
  i0.ɵɵelementEnd();
441
- i0.ɵɵelementStart(21, "button", 93);
442
- i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_41_Template_button_click_21_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelAddToListDialog()); });
876
+ i0.ɵɵelementStart(21, "button", 156);
877
+ i0.ɵɵlistener("click", function ListsOperationsResource_Conditional_54_Template_button_click_21_listener() { i0.ɵɵrestoreView(_r38); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelAddToListDialog()); });
443
878
  i0.ɵɵtext(22, "Cancel");
444
879
  i0.ɵɵelementEnd()()();
445
880
  } if (rf & 2) {
@@ -463,6 +898,7 @@ let ListsOperationsResource = class ListsOperationsResource extends BaseResource
463
898
  cdr;
464
899
  setOperationsService;
465
900
  notificationService;
901
+ exportService;
466
902
  destroy$ = new Subject();
467
903
  maxLists = 4;
468
904
  selectedLists = [];
@@ -470,6 +906,14 @@ let ListsOperationsResource = class ListsOperationsResource extends BaseResource
470
906
  filteredAvailableLists = [];
471
907
  listSearchTerm = '';
472
908
  showListDropdown = false;
909
+ // View operands (new in Phase 1.8). Tracked separately from selectedLists
910
+ // so the existing list-only logic keeps working; the operand-aware
911
+ // service combines both into a single computation.
912
+ selectedViews = [];
913
+ availableViews = [];
914
+ filteredAvailableViews = [];
915
+ viewSearchTerm = '';
916
+ showViewDropdown = false;
473
917
  // Entity filter
474
918
  entityOptions = [];
475
919
  selectedEntityId = '';
@@ -491,22 +935,46 @@ let ListsOperationsResource = class ListsOperationsResource extends BaseResource
491
935
  addToListSearchTerm = '';
492
936
  filteredAddToListOptions = [];
493
937
  selectedTargetListId = null;
938
+ // Compose-into-target panel (Phase 1.10) — picks an op + target for
939
+ // committing the result of the selected operands.
940
+ composeOp = 'union';
941
+ composeTarget = 'new';
942
+ composeNewListName = '';
943
+ composeTargetListId = null;
944
+ composeTargetSearch = '';
945
+ showComposeTargetDropdown = false;
946
+ isComposing = false;
947
+ composeDelta = null;
948
+ composeConfirmVisible = false;
949
+ // Export dialog (mockup 26). Opens before any export; lets the user
950
+ // pick format + which entity fields to include. Fields are resolved
951
+ // from EntityInfo when the dialog opens — no separate fetch.
952
+ showExportDialog = false;
953
+ exportFormat = 'excel';
954
+ exportFields = [];
955
+ exportRecordCount = 0;
956
+ isExporting = false;
494
957
  entityIdFromSelectedLists = null;
495
958
  currentEntityInfo = null;
496
959
  // User Settings persistence
497
960
  USER_SETTING_KEY = 'ListsOperations.State';
498
961
  saveSettingsTimeout = null;
499
962
  isLoadingSettings = false;
500
- constructor(cdr, setOperationsService, notificationService) {
963
+ constructor(cdr, setOperationsService, notificationService, exportService) {
501
964
  super();
502
965
  this.cdr = cdr;
503
966
  this.setOperationsService = setOperationsService;
504
967
  this.notificationService = notificationService;
968
+ this.exportService = exportService;
505
969
  }
506
970
  get hasMultipleEntities() {
507
- if (this.selectedLists.length < 2)
971
+ if (this.totalOperandCount < 2)
508
972
  return false;
509
- const entities = new Set(this.selectedLists.map(s => s.list.EntityID));
973
+ const entities = new Set();
974
+ for (const s of this.selectedLists)
975
+ entities.add(s.list.EntityID);
976
+ for (const s of this.selectedViews)
977
+ entities.add(s.entityID);
510
978
  return entities.size > 1;
511
979
  }
512
980
  async ngOnInit() {
@@ -528,17 +996,32 @@ let ListsOperationsResource = class ListsOperationsResource extends BaseResource
528
996
  async loadAvailableLists() {
529
997
  const rv = RunView.FromMetadataProvider(this.ProviderToUse);
530
998
  const md = this.ProviderToUse;
531
- const result = await rv.RunView({
532
- EntityName: 'MJ: Lists',
533
- ExtraFilter: `UserID = '${md.CurrentUser?.ID}'`,
534
- OrderBy: 'Name',
535
- ResultType: 'entity_object'
536
- });
537
- if (result.Success) {
538
- this.availableLists = result.Results || [];
999
+ // RunViews's typed overload doesn't express tuple positions, so we
1000
+ // run them as two parallel single-typed RunView calls — same number
1001
+ // of round trips, cleaner typing.
1002
+ const [listResult, viewResult] = await Promise.all([
1003
+ rv.RunView({
1004
+ EntityName: 'MJ: Lists',
1005
+ ExtraFilter: `UserID = '${md.CurrentUser?.ID}'`,
1006
+ OrderBy: 'Name',
1007
+ ResultType: 'entity_object',
1008
+ }),
1009
+ rv.RunView({
1010
+ EntityName: 'MJ: User Views',
1011
+ ExtraFilter: `UserID = '${md.CurrentUser?.ID}'`,
1012
+ OrderBy: 'Name',
1013
+ ResultType: 'entity_object',
1014
+ }),
1015
+ ]);
1016
+ if (listResult.Success) {
1017
+ this.availableLists = listResult.Results || [];
539
1018
  this.buildEntityOptions();
540
1019
  this.filterAvailableLists();
541
1020
  }
1021
+ if (viewResult.Success) {
1022
+ this.availableViews = viewResult.Results || [];
1023
+ this.filterAvailableViews();
1024
+ }
542
1025
  }
543
1026
  /**
544
1027
  * Build entity options for the filter dropdown
@@ -566,19 +1049,20 @@ let ListsOperationsResource = class ListsOperationsResource extends BaseResource
566
1049
  * Handle entity filter change
567
1050
  */
568
1051
  onEntityFilterChange() {
569
- // Clear selected lists if changing entity filter
570
- if (this.selectedLists.length > 0) {
571
- const firstEntityId = this.selectedLists[0].list.EntityID;
572
- if (this.selectedEntityId && this.selectedEntityId !== firstEntityId) {
573
- // Entity changed - clear selections
574
- this.selectedLists = [];
575
- this.vennData = null;
576
- this.selectedRegion = null;
577
- this.lastOperationResult = null;
578
- this.previewRecordsDisplay = [];
579
- }
1052
+ // If we're locked to an entity and the filter changes to a different
1053
+ // one, wipe both list AND view selections — the entity invariant
1054
+ // applies to all operands.
1055
+ const lockedEntityId = this.lockedEntityID;
1056
+ if (lockedEntityId && this.selectedEntityId && this.selectedEntityId !== lockedEntityId) {
1057
+ this.selectedLists = [];
1058
+ this.selectedViews = [];
1059
+ this.vennData = null;
1060
+ this.selectedRegion = null;
1061
+ this.lastOperationResult = null;
1062
+ this.previewRecordsDisplay = [];
580
1063
  }
581
1064
  this.filterAvailableLists();
1065
+ this.filterAvailableViews();
582
1066
  this.saveState();
583
1067
  }
584
1068
  filterAvailableLists() {
@@ -588,10 +1072,10 @@ let ListsOperationsResource = class ListsOperationsResource extends BaseResource
588
1072
  if (this.selectedEntityId) {
589
1073
  filtered = filtered.filter(l => UUIDsEqual(l.EntityID, this.selectedEntityId));
590
1074
  }
591
- // If we have selected lists, restrict to same entity
592
- if (this.selectedLists.length > 0) {
593
- this.entityIdFromSelectedLists = this.selectedLists[0].list.EntityID;
594
- filtered = filtered.filter(l => UUIDsEqual(l.EntityID, this.entityIdFromSelectedLists));
1075
+ // If we have any operands selected (list or view), restrict to same entity.
1076
+ const lockedEntityId = this.lockedEntityID;
1077
+ if (lockedEntityId) {
1078
+ filtered = filtered.filter(l => UUIDsEqual(l.EntityID, lockedEntityId));
595
1079
  }
596
1080
  if (this.listSearchTerm) {
597
1081
  const term = this.listSearchTerm.toLowerCase();
@@ -600,8 +1084,53 @@ let ListsOperationsResource = class ListsOperationsResource extends BaseResource
600
1084
  }
601
1085
  this.filteredAvailableLists = filtered.slice(0, 10);
602
1086
  }
1087
+ /**
1088
+ * Same logic as `filterAvailableLists` for the view picker. Views are
1089
+ * locked to the same entity as any already-selected list or view.
1090
+ */
1091
+ filterAvailableViews() {
1092
+ const selectedIds = new Set(this.selectedViews.map(s => s.view.ID));
1093
+ let filtered = this.availableViews.filter(v => !selectedIds.has(v.ID));
1094
+ if (this.selectedEntityId) {
1095
+ filtered = filtered.filter(v => UUIDsEqual(v.EntityID, this.selectedEntityId));
1096
+ }
1097
+ const lockedEntityId = this.lockedEntityID;
1098
+ if (lockedEntityId) {
1099
+ filtered = filtered.filter(v => UUIDsEqual(v.EntityID, lockedEntityId));
1100
+ }
1101
+ if (this.viewSearchTerm) {
1102
+ const term = this.viewSearchTerm.toLowerCase();
1103
+ filtered = filtered.filter(v => v.Name.toLowerCase().includes(term) ||
1104
+ (v.Entity && v.Entity.toLowerCase().includes(term)));
1105
+ }
1106
+ this.filteredAvailableViews = filtered.slice(0, 10);
1107
+ }
1108
+ /**
1109
+ * Returns the entity ID that operands are currently locked to, or null
1110
+ * if no operands are selected. Lists win over views purely because they
1111
+ * come first in the operand list; either source is authoritative.
1112
+ */
1113
+ get lockedEntityID() {
1114
+ if (this.selectedLists.length > 0)
1115
+ return this.selectedLists[0].list.EntityID;
1116
+ if (this.selectedViews.length > 0)
1117
+ return this.selectedViews[0].entityID;
1118
+ return null;
1119
+ }
1120
+ /**
1121
+ * Display name of the entity currently locking the picker — drives the
1122
+ * "Comparing operands of type: …" hint in the UI. Falls back to the
1123
+ * first available denormalized name we have.
1124
+ */
1125
+ get lockedEntityName() {
1126
+ if (this.selectedLists.length > 0)
1127
+ return this.selectedLists[0].entityName;
1128
+ if (this.selectedViews.length > 0)
1129
+ return this.selectedViews[0].entityName;
1130
+ return null;
1131
+ }
603
1132
  addList(list) {
604
- const color = this.setOperationsService.getColorForIndex(this.selectedLists.length);
1133
+ const color = this.setOperationsService.getColorForIndex(this.totalOperandCount);
605
1134
  this.selectedLists.push({
606
1135
  list,
607
1136
  entityName: list.Entity || 'Unknown',
@@ -610,21 +1139,53 @@ let ListsOperationsResource = class ListsOperationsResource extends BaseResource
610
1139
  this.listSearchTerm = '';
611
1140
  this.showListDropdown = false;
612
1141
  this.filterAvailableLists();
1142
+ this.filterAvailableViews();
613
1143
  this.recalculateVenn();
614
1144
  this.saveState();
615
1145
  }
616
1146
  removeList(index) {
617
1147
  this.selectedLists.splice(index, 1);
618
- // Reassign colors
619
- this.selectedLists.forEach((item, i) => {
620
- item.color = this.setOperationsService.getColorForIndex(i);
1148
+ // Reassign colors across BOTH lists and views so the palette stays in order.
1149
+ this.reassignOperandColors();
1150
+ this.filterAvailableLists();
1151
+ this.filterAvailableViews();
1152
+ this.recalculateVenn();
1153
+ this.saveState();
1154
+ }
1155
+ addView(view) {
1156
+ const color = this.setOperationsService.getColorForIndex(this.totalOperandCount);
1157
+ this.selectedViews.push({
1158
+ view,
1159
+ entityName: view.Entity || 'Unknown',
1160
+ entityID: view.EntityID,
1161
+ color,
621
1162
  });
1163
+ this.viewSearchTerm = '';
1164
+ this.showViewDropdown = false;
622
1165
  this.filterAvailableLists();
1166
+ this.filterAvailableViews();
623
1167
  this.recalculateVenn();
624
1168
  this.saveState();
625
1169
  }
1170
+ removeView(index) {
1171
+ this.selectedViews.splice(index, 1);
1172
+ this.reassignOperandColors();
1173
+ this.filterAvailableLists();
1174
+ this.filterAvailableViews();
1175
+ this.recalculateVenn();
1176
+ this.saveState();
1177
+ }
1178
+ reassignOperandColors() {
1179
+ let i = 0;
1180
+ for (const s of this.selectedLists) {
1181
+ s.color = this.setOperationsService.getColorForIndex(i++);
1182
+ }
1183
+ for (const s of this.selectedViews) {
1184
+ s.color = this.setOperationsService.getColorForIndex(i++);
1185
+ }
1186
+ }
626
1187
  async recalculateVenn() {
627
- if (this.selectedLists.length === 0) {
1188
+ if (this.totalOperandCount === 0) {
628
1189
  this.vennData = null;
629
1190
  this.selectedRegion = null;
630
1191
  this.lastOperationResult = null;
@@ -633,8 +1194,8 @@ let ListsOperationsResource = class ListsOperationsResource extends BaseResource
633
1194
  this.isCalculating = true;
634
1195
  this.cdr.detectChanges();
635
1196
  try {
636
- const lists = this.selectedLists.map(s => s.list);
637
- this.vennData = await this.setOperationsService.calculateVennData(lists);
1197
+ const operands = this.buildAllOperands();
1198
+ this.vennData = await this.setOperationsService.calculateVennDataForOperands(operands);
638
1199
  this.selectedRegion = null;
639
1200
  this.lastOperationResult = null;
640
1201
  }
@@ -646,6 +1207,37 @@ let ListsOperationsResource = class ListsOperationsResource extends BaseResource
646
1207
  this.cdr.detectChanges();
647
1208
  }
648
1209
  }
1210
+ /**
1211
+ * Combined operand count — drives "≥ 2 operands" checks for showing
1212
+ * operation buttons + the Venn diagram empty-state.
1213
+ */
1214
+ get totalOperandCount() {
1215
+ return this.selectedLists.length + this.selectedViews.length;
1216
+ }
1217
+ /**
1218
+ * Build the unified `SetOperand[]` for the service. Lists come first
1219
+ * (preserving the existing color order); views follow. Each view's
1220
+ * color is picked sequentially from the same palette.
1221
+ */
1222
+ buildAllOperands() {
1223
+ const fromLists = this.selectedLists.map((s) => ({
1224
+ kind: 'list',
1225
+ id: s.list.ID,
1226
+ name: s.list.Name,
1227
+ entityID: s.list.EntityID,
1228
+ entityName: s.entityName,
1229
+ color: s.color,
1230
+ }));
1231
+ const fromViews = this.selectedViews.map((s) => ({
1232
+ kind: 'view',
1233
+ id: s.view.ID,
1234
+ name: s.view.Name,
1235
+ entityID: s.entityID,
1236
+ entityName: s.entityName,
1237
+ color: s.color,
1238
+ }));
1239
+ return [...fromLists, ...fromViews];
1240
+ }
649
1241
  onRegionClick(event) {
650
1242
  this.selectedRegion = event.intersection;
651
1243
  this.lastOperationResult = null;
@@ -801,14 +1393,14 @@ let ListsOperationsResource = class ListsOperationsResource extends BaseResource
801
1393
  }
802
1394
  }
803
1395
  async performOperation(operation) {
804
- if (this.selectedLists.length < 2)
1396
+ if (this.totalOperandCount < 2)
805
1397
  return;
806
1398
  this.isCalculating = true;
807
1399
  this.selectedRegion = null;
808
1400
  this.cdr.detectChanges();
809
1401
  try {
810
- const listIds = this.selectedLists.map(s => s.list.ID);
811
- this.lastOperationResult = await this.setOperationsService.performOperation(operation, listIds);
1402
+ const operands = this.buildAllOperands();
1403
+ this.lastOperationResult = await this.setOperationsService.performOperationForOperands(operation, operands);
812
1404
  this.previewRecords = this.lastOperationResult.resultRecordIds.slice(0, 10);
813
1405
  }
814
1406
  catch (error) {
@@ -819,6 +1411,185 @@ let ListsOperationsResource = class ListsOperationsResource extends BaseResource
819
1411
  this.cdr.detectChanges();
820
1412
  }
821
1413
  }
1414
+ // -------------------------------------------------------------------
1415
+ // Compose-into-target (Phase 1.10)
1416
+ //
1417
+ // The "Compose" panel sits below the Venn diagram. It mirrors the
1418
+ // operand list already chosen above but adds the explicit target step:
1419
+ // either materialize the result into a brand-new List, or merge into an
1420
+ // existing one (which routes through the delta-confirm dialog because
1421
+ // existing-target operations can produce drops).
1422
+ //
1423
+ // The op selector here only supports the three set-ops the server
1424
+ // exposes (union / intersection / difference). The Quick Operations
1425
+ // panel above still has `symmetric_difference` for preview, but that
1426
+ // doesn't map to a server compose op — and a target commit needs the
1427
+ // server side for the delta + drop-guard.
1428
+ // -------------------------------------------------------------------
1429
+ /**
1430
+ * Server-side compose preview — builds inputs from the currently selected
1431
+ * operands (lists + views) and calls `ComposeLists`. Returns the signed
1432
+ * delta so `composeAndSave` can route through `ApplyListDelta` when the
1433
+ * target is an existing list.
1434
+ */
1435
+ buildComposeInputs() {
1436
+ const inputs = this.selectedLists.map((s) => ({
1437
+ kind: 'list',
1438
+ listId: s.list.ID,
1439
+ }));
1440
+ for (const s of this.selectedViews) {
1441
+ inputs.push({ kind: 'view', viewId: s.view.ID });
1442
+ }
1443
+ return inputs;
1444
+ }
1445
+ get canCompose() {
1446
+ if (this.totalOperandCount < 2)
1447
+ return false;
1448
+ if (this.composeTarget === 'new')
1449
+ return this.composeNewListName.trim().length > 0;
1450
+ return !!this.composeTargetListId;
1451
+ }
1452
+ /**
1453
+ * "Preview Result" — re-runs the Quick-Operation path with the compose
1454
+ * panel's chosen op so the user can see the expected output count
1455
+ * before committing. We use the local set-op service rather than the
1456
+ * server here because preview is a read-only operation that doesn't
1457
+ * need a delta token (target is null) — staying local keeps it fast.
1458
+ */
1459
+ async previewCompose() {
1460
+ if (this.totalOperandCount < 2)
1461
+ return;
1462
+ await this.performOperation(this.composeOp);
1463
+ }
1464
+ /**
1465
+ * Commit the compose: either materialize a new list (client-side using
1466
+ * the previewed record IDs) or merge into an existing list via the
1467
+ * server's ComposeLists + ApplyListDelta flow.
1468
+ */
1469
+ async composeAndSave() {
1470
+ if (!this.canCompose || this.isComposing)
1471
+ return;
1472
+ this.isComposing = true;
1473
+ this.cdr.detectChanges();
1474
+ try {
1475
+ if (this.composeTarget === 'new') {
1476
+ await this.composeToNewList();
1477
+ }
1478
+ else {
1479
+ await this.composeToExistingList();
1480
+ }
1481
+ }
1482
+ catch (e) {
1483
+ const message = e instanceof Error ? e.message : String(e);
1484
+ this.notificationService.CreateSimpleNotification(`Compose failed: ${message}`, 'error', 5000);
1485
+ }
1486
+ finally {
1487
+ this.isComposing = false;
1488
+ this.cdr.detectChanges();
1489
+ }
1490
+ }
1491
+ /**
1492
+ * New-list path: ensure preview is fresh, then route through the
1493
+ * existing "create list from selection" machinery using the result's
1494
+ * record IDs. This keeps materialization + naming in one place.
1495
+ */
1496
+ async composeToNewList() {
1497
+ // Refresh preview so result reflects the compose-panel's op (the user
1498
+ // may have run a different op via Quick Operations).
1499
+ await this.performOperation(this.composeOp);
1500
+ if (!this.lastOperationResult || this.lastOperationResult.resultCount === 0) {
1501
+ this.notificationService.CreateSimpleNotification('Compose produced zero records — nothing to save.', 'warning', 3000);
1502
+ return;
1503
+ }
1504
+ this.newListName = this.composeNewListName.trim();
1505
+ this.newListDescription = `Composed via ${this.getOperationLabel(this.composeOp)} of ${this.totalOperandCount} source(s).`;
1506
+ this.recordsToAdd = this.lastOperationResult.resultRecordIds;
1507
+ await this.confirmCreateList();
1508
+ // Clear the compose form on success.
1509
+ this.composeNewListName = '';
1510
+ this.cdr.detectChanges();
1511
+ }
1512
+ /**
1513
+ * Existing-list path: compose server-side to get a signed delta, then
1514
+ * surface the delta-confirm dialog. Sync semantics (replace contents)
1515
+ * apply implicitly — the server returns ToRemove for any records that
1516
+ * are in the target but not in the compose result.
1517
+ */
1518
+ async composeToExistingList() {
1519
+ if (!this.composeTargetListId)
1520
+ return;
1521
+ const provider = this.ProviderToUse;
1522
+ const client = new GraphQLListsClient(provider);
1523
+ const delta = await client.ComposeLists({
1524
+ Op: this.composeOp,
1525
+ Inputs: this.buildComposeInputs(),
1526
+ Target: { kind: 'list', listId: this.composeTargetListId },
1527
+ });
1528
+ this.composeDelta = delta;
1529
+ this.composeConfirmVisible = true;
1530
+ }
1531
+ onComposeConfirmCancel() {
1532
+ this.composeConfirmVisible = false;
1533
+ this.composeDelta = null;
1534
+ this.cdr.detectChanges();
1535
+ }
1536
+ async onComposeConfirmCommit(deltaToken) {
1537
+ if (!this.composeDelta)
1538
+ return;
1539
+ const provider = this.ProviderToUse;
1540
+ const client = new GraphQLListsClient(provider);
1541
+ try {
1542
+ const result = await client.ApplyListDelta({
1543
+ Delta: { ...this.composeDelta, DeltaToken: deltaToken },
1544
+ ConfirmDrops: (this.composeDelta.Counts.Remove ?? 0) > 0,
1545
+ });
1546
+ if (result.Success) {
1547
+ this.composeConfirmVisible = false;
1548
+ this.composeDelta = null;
1549
+ this.notificationService.CreateSimpleNotification(`Target updated: +${result.Counts?.Added ?? 0} / -${result.Counts?.Removed ?? 0}`, 'success', 3000);
1550
+ }
1551
+ else {
1552
+ this.notificationService.CreateSimpleNotification(`Compose apply failed: ${result.Message}`, 'error', 5000);
1553
+ }
1554
+ }
1555
+ catch (e) {
1556
+ const message = e instanceof Error ? e.message : String(e);
1557
+ this.notificationService.CreateSimpleNotification(`Compose apply failed: ${message}`, 'error', 5000);
1558
+ }
1559
+ finally {
1560
+ this.cdr.detectChanges();
1561
+ }
1562
+ }
1563
+ /**
1564
+ * Filtered list of existing lists eligible as compose targets. We
1565
+ * exclude lists already in the selected operands (committing to a
1566
+ * source list would be a self-referential compose) and lists from
1567
+ * other entities (the entity invariant still applies).
1568
+ */
1569
+ get filteredComposeTargets() {
1570
+ const operandListIds = new Set(this.selectedLists.map((s) => s.list.ID));
1571
+ const lockedEntityId = this.lockedEntityID;
1572
+ let pool = this.availableLists.filter((l) => !operandListIds.has(l.ID));
1573
+ if (lockedEntityId) {
1574
+ pool = pool.filter((l) => UUIDsEqual(l.EntityID, lockedEntityId));
1575
+ }
1576
+ if (this.composeTargetSearch.trim().length > 0) {
1577
+ const term = this.composeTargetSearch.toLowerCase();
1578
+ pool = pool.filter((l) => l.Name.toLowerCase().includes(term));
1579
+ }
1580
+ return pool.slice(0, 10);
1581
+ }
1582
+ selectComposeTarget(list) {
1583
+ this.composeTargetListId = list.ID;
1584
+ this.composeTargetSearch = list.Name;
1585
+ this.showComposeTargetDropdown = false;
1586
+ }
1587
+ composeTargetDisplayName() {
1588
+ if (!this.composeTargetListId)
1589
+ return '';
1590
+ const found = this.availableLists.find((l) => UUIDsEqual(l.ID, this.composeTargetListId));
1591
+ return found?.Name ?? '';
1592
+ }
822
1593
  getOperationLabel(operation) {
823
1594
  switch (operation) {
824
1595
  case 'union': return 'Union (All Records)';
@@ -998,9 +1769,134 @@ let ListsOperationsResource = class ListsOperationsResource extends BaseResource
998
1769
  this.cdr.detectChanges();
999
1770
  }
1000
1771
  }
1001
- exportToExcel() {
1002
- // TODO: Implement Excel export
1003
- this.notificationService.CreateSimpleNotification('Export to Excel - coming soon', 'info', 2000);
1772
+ /**
1773
+ * Open the export-format-and-columns picker (mockup 26). Resolves the
1774
+ * candidate field list from EntityInfo on the loaded metadata — no
1775
+ * extra RunView. Default selection mirrors what the previous
1776
+ * "export all" behavior produced.
1777
+ */
1778
+ openExportDialog() {
1779
+ const recordIds = this.selectedRegion?.recordIds ?? this.lastOperationResult?.resultRecordIds ?? [];
1780
+ if (recordIds.length === 0) {
1781
+ this.notificationService.CreateSimpleNotification('Nothing to export — pick a region first.', 'info', 3000);
1782
+ return;
1783
+ }
1784
+ const entityName = this.selectedLists[0]?.entityName ?? this.selectedViews[0]?.entityName ?? null;
1785
+ if (!entityName) {
1786
+ this.notificationService.CreateSimpleNotification('Cannot determine entity for export.', 'error', 4000);
1787
+ return;
1788
+ }
1789
+ const md = this.ProviderToUse;
1790
+ const entityInfo = md.EntityByName(entityName);
1791
+ if (!entityInfo) {
1792
+ this.notificationService.CreateSimpleNotification(`Entity '${entityName}' not found.`, 'error', 4000);
1793
+ return;
1794
+ }
1795
+ if (entityInfo.PrimaryKeys.length !== 1) {
1796
+ this.notificationService.CreateSimpleNotification(`Composite-PK entities ('${entityName}') aren't yet supported for Operations export.`, 'warning', 5000);
1797
+ return;
1798
+ }
1799
+ // Build the candidate field list from the loaded EntityInfo. Hide
1800
+ // virtual / not-queryable fields so users can't pick them and get
1801
+ // a confusing empty column. Default-select everything to match the
1802
+ // previous "export all" behavior.
1803
+ this.exportFields = entityInfo.Fields
1804
+ .filter((f) => f.IsVirtual !== true)
1805
+ .map((f) => ({
1806
+ Name: f.Name,
1807
+ DisplayName: f.DisplayName || f.Name,
1808
+ Selected: true,
1809
+ }));
1810
+ this.exportRecordCount = recordIds.length;
1811
+ this.exportFormat = 'excel';
1812
+ this.showExportDialog = true;
1813
+ this.cdr.detectChanges();
1814
+ }
1815
+ closeExportDialog() {
1816
+ this.showExportDialog = false;
1817
+ this.cdr.detectChanges();
1818
+ }
1819
+ selectAllExportFields() {
1820
+ for (const f of this.exportFields)
1821
+ f.Selected = true;
1822
+ }
1823
+ selectNoneExportFields() {
1824
+ for (const f of this.exportFields)
1825
+ f.Selected = false;
1826
+ }
1827
+ get selectedExportFieldCount() {
1828
+ return this.exportFields.filter((f) => f.Selected).length;
1829
+ }
1830
+ /**
1831
+ * Run the export with the user's selected format + columns. Bulk-load
1832
+ * via RunView restricted to the chosen Fields so we don't shuttle
1833
+ * data we'll then throw away.
1834
+ */
1835
+ async executeExport() {
1836
+ const recordIds = this.selectedRegion?.recordIds ?? this.lastOperationResult?.resultRecordIds ?? [];
1837
+ if (recordIds.length === 0)
1838
+ return;
1839
+ const entityName = this.selectedLists[0]?.entityName ?? this.selectedViews[0]?.entityName ?? null;
1840
+ if (!entityName)
1841
+ return;
1842
+ const selectedFields = this.exportFields.filter((f) => f.Selected).map((f) => f.Name);
1843
+ if (selectedFields.length === 0)
1844
+ return;
1845
+ this.isExporting = true;
1846
+ this.cdr.detectChanges();
1847
+ try {
1848
+ const md = this.ProviderToUse;
1849
+ const entityInfo = md.EntityByName(entityName);
1850
+ const pk = entityInfo.PrimaryKeys[0].Name;
1851
+ // Always include the PK in the SELECT — RunView won't filter on
1852
+ // a column it didn't pull, and downstream lookups expect it.
1853
+ const fieldsForQuery = Array.from(new Set([pk, ...selectedFields]));
1854
+ const escaped = recordIds.map((id) => `'${String(id).replace(/'/g, "''")}'`).join(',');
1855
+ const rv = RunView.FromMetadataProvider(md);
1856
+ const result = await rv.RunView({
1857
+ EntityName: entityName,
1858
+ ExtraFilter: `${pk} IN (${escaped})`,
1859
+ Fields: fieldsForQuery,
1860
+ ResultType: 'simple',
1861
+ });
1862
+ if (!result.Success) {
1863
+ this.notificationService.CreateSimpleNotification(`Export failed: ${result.ErrorMessage}`, 'error', 5000);
1864
+ return;
1865
+ }
1866
+ // Project rows to exactly the user's selected columns + ordering
1867
+ // so the file matches what they checked. Skips the PK if they
1868
+ // didn't pick it.
1869
+ const rows = (result.Results ?? []).map((row) => {
1870
+ const projected = {};
1871
+ for (const f of selectedFields)
1872
+ projected[f] = row[f];
1873
+ return projected;
1874
+ });
1875
+ const dateStamp = new Date().toISOString().slice(0, 10);
1876
+ const ext = this.exportFormat === 'excel' ? 'xlsx' : this.exportFormat;
1877
+ const fileName = `lists-operations-${dateStamp}.${ext}`;
1878
+ const exportResult = this.exportFormat === 'excel'
1879
+ ? await this.exportService.toExcel(rows, { fileName, includeHeaders: true })
1880
+ : this.exportFormat === 'csv'
1881
+ ? await this.exportService.toCSV(rows, { fileName, includeHeaders: true })
1882
+ : await this.exportService.toJSON(rows, { fileName });
1883
+ if (exportResult.success) {
1884
+ this.exportService.downloadResult(exportResult);
1885
+ this.notificationService.CreateSimpleNotification(`Exported ${rows.length} record(s)`, 'success', 3000);
1886
+ this.showExportDialog = false;
1887
+ }
1888
+ else {
1889
+ this.notificationService.CreateSimpleNotification('Export failed', 'error', 5000);
1890
+ }
1891
+ }
1892
+ catch (e) {
1893
+ const message = e instanceof Error ? e.message : String(e);
1894
+ this.notificationService.CreateSimpleNotification(`Export error: ${message}`, 'error', 5000);
1895
+ }
1896
+ finally {
1897
+ this.isExporting = false;
1898
+ this.cdr.detectChanges();
1899
+ }
1004
1900
  }
1005
1901
  async GetResourceDisplayName(_data) {
1006
1902
  return 'Operations';
@@ -1013,12 +1909,14 @@ let ListsOperationsResource = class ListsOperationsResource extends BaseResource
1013
1909
  */
1014
1910
  clearAllSelections() {
1015
1911
  this.selectedLists = [];
1912
+ this.selectedViews = [];
1016
1913
  this.selectedEntityId = '';
1017
1914
  this.vennData = null;
1018
1915
  this.selectedRegion = null;
1019
1916
  this.lastOperationResult = null;
1020
1917
  this.previewRecordsDisplay = [];
1021
1918
  this.filterAvailableLists();
1919
+ this.filterAvailableViews();
1022
1920
  this.saveState();
1023
1921
  this.cdr.detectChanges();
1024
1922
  }
@@ -1116,60 +2014,74 @@ let ListsOperationsResource = class ListsOperationsResource extends BaseResource
1116
2014
  this.isLoadingSettings = false;
1117
2015
  }
1118
2016
  }
1119
- static ɵfac = function ListsOperationsResource_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ListsOperationsResource)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.ListSetOperationsService), i0.ɵɵdirectiveInject(i2.MJNotificationService)); };
1120
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ListsOperationsResource, selectors: [["mj-lists-operations-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 42, vars: 20, consts: [["Title", "List Operations", "Icon", "fa-solid fa-diagram-project", "Subtitle", "Visualize overlaps and perform set operations on your lists"], ["actions", ""], [3, "Flex", "Padding"], [1, "operations-content"], [1, "selection-panel"], [1, "panel-header"], [1, "list-count"], [1, "entity-filter-section"], [1, "filter-label"], [1, "entity-selector"], [1, "entity-select", 3, "ngModelChange", "ngModel"], ["value", ""], [3, "value"], [1, "selected-lists"], [1, "selected-item"], [1, "add-list-area"], [1, "lists-full"], [1, "entity-note"], [1, "quick-operations"], [1, "venn-panel"], [3, "data", "selectedRegion"], [1, "venn-empty"], [1, "loading-overlay"], [1, "results-panel"], [1, "fa-solid", "fa-crosshairs"], [1, "region-details"], [1, "operation-result"], [1, "results-empty"], [1, "modal-overlay"], [1, "modal-dialog"], [1, "modal-dialog", "add-to-list-dialog"], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Clear all selections", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "item-color"], [1, "item-info"], [1, "item-name"], [1, "item-entity"], [1, "remove-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "add-list-search"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search lists to add...", 3, "ngModelChange", "focus", "ngModel"], [1, "list-dropdown"], [1, "dropdown-backdrop", 3, "click"], [1, "dropdown-content"], [1, "dropdown-item"], [1, "dropdown-item", 3, "click"], [1, "dropdown-name"], [1, "dropdown-entity"], [1, "fa-solid", "fa-info-circle"], [1, "operation-buttons"], [1, "op-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-layer-group"], [1, "fa-solid", "fa-circle-notch"], [1, "fa-solid", "fa-arrows-split-up-and-left"], [3, "regionClick", "data", "selectedRegion"], [1, "empty-icon"], [1, "fa-solid", "fa-circle-nodes"], ["text", "Calculating..."], [1, "region-header"], [1, "region-label"], [1, "region-count"], [1, "region-actions"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "fa-solid", "fa-plus"], ["mjButton", "", 3, "click"], [1, "fa-solid", "fa-folder-plus"], [1, "fa-solid", "fa-file-excel"], [1, "record-preview"], [1, "preview-list"], [1, "preview-card"], [1, "preview-loading"], [1, "preview-card-content"], [1, "preview-name"], [1, "preview-secondary"], ["title", "Open record", 1, "preview-open-btn", 3, "click"], [1, "fa-solid", "fa-external-link-alt"], ["text", "Loading preview...", "size", "small"], [1, "result-header"], [1, "result-operation"], [1, "result-count"], [1, "fa-solid", "fa-hand-pointer"], [1, "modal-overlay", 3, "click"], [1, "modal-header"], [1, "modal-close", 3, "click"], [1, "modal-body"], [1, "form-group"], ["type", "text", "placeholder", "Enter list name", 1, "form-input", 3, "ngModelChange", "ngModel"], ["placeholder", "Optional description", "rows", "3", 1, "form-input", 3, "ngModelChange", "ngModel"], [1, "form-info"], [1, "modal-footer"], [1, "btn-primary", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "btn-secondary", 3, "click"], [1, "form-info", 2, "margin-bottom", "16px"], [1, "list-search"], ["type", "text", "placeholder", "Search lists...", 1, "form-input", 3, "ngModelChange", "ngModel"], [1, "list-options"], [1, "list-option", 3, "selected"], [1, "list-options-empty"], [1, "list-option", 3, "click"], [1, "list-option-radio"], ["type", "radio", "name", "targetList", 3, "checked"], [1, "list-option-info"], [1, "list-option-name"], [1, "list-option-entity"], [1, "fa-solid", "fa-inbox"]], template: function ListsOperationsResource_Template(rf, ctx) { if (rf & 1) {
1121
- i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 0);
1122
- i0.ɵɵconditionalCreate(2, ListsOperationsResource_Conditional_2_Template, 4, 0, "div", 1);
2017
+ static ɵfac = function ListsOperationsResource_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ListsOperationsResource)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.ListSetOperationsService), i0.ɵɵdirectiveInject(i2.MJNotificationService), i0.ɵɵdirectiveInject(i3.ExportService)); };
2018
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ListsOperationsResource, selectors: [["mj-lists-operations-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 55, vars: 25, consts: [[1, "operations-container"], [1, "operations-header"], [1, "header-top"], [1, "header-title"], [1, "fa-solid", "fa-diagram-project"], ["title", "Clear all selections", 1, "clear-all-btn"], [1, "header-subtitle"], [1, "operations-content"], [1, "selection-panel"], [1, "panel-header"], [1, "list-count"], [1, "entity-filter-section"], [1, "filter-label"], [1, "entity-selector"], [1, "entity-select", 3, "ngModelChange", "ngModel"], ["value", ""], [3, "value"], [1, "selected-lists"], [1, "selected-item"], [1, "add-list-area"], [1, "lists-full"], [1, "selected-views"], [1, "selected-item", "selected-item--view"], [1, "entity-note"], [1, "quick-operations"], [1, "venn-panel"], [3, "data", "selectedRegion"], [1, "venn-empty"], [1, "loading-overlay"], [1, "results-panel"], [1, "fa-solid", "fa-crosshairs"], [1, "region-details"], [1, "operation-result"], [1, "results-empty"], [1, "compose-panel"], [3, "Confirm", "Cancel", "Visible", "Delta", "TargetListName", "SourceLabel"], [1, "modal-overlay"], [1, "modal-dialog"], [1, "modal-dialog", "add-to-list-dialog"], ["title", "Clear all selections", 1, "clear-all-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "item-color"], [1, "item-info"], [1, "item-name"], [1, "item-entity"], [1, "remove-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "add-list-search"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search lists to add...", 3, "ngModelChange", "focus", "ngModel"], [1, "list-dropdown"], [1, "dropdown-backdrop", 3, "click"], [1, "dropdown-content"], [1, "dropdown-item"], [1, "dropdown-item", 3, "click"], [1, "dropdown-name"], [1, "dropdown-entity"], [1, "fa-solid", "fa-info-circle"], [1, "item-color", "item-color--view"], [1, "fa-solid", "fa-eye", 3, "title"], [1, "fa-solid", "fa-eye"], ["type", "text", "placeholder", "Search views to add...", 3, "ngModelChange", "focus", "ngModel"], [1, "operation-buttons"], [1, "op-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-layer-group"], [1, "fa-solid", "fa-circle-notch"], [1, "fa-solid", "fa-arrows-split-up-and-left"], [3, "regionClick", "data", "selectedRegion"], [1, "empty-icon"], [1, "fa-solid", "fa-circle-nodes"], ["text", "Calculating..."], [1, "region-header"], [1, "region-label"], [1, "region-count"], [1, "region-actions"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "fa-solid", "fa-plus"], ["mjButton", "", 3, "click"], [1, "fa-solid", "fa-folder-plus"], [1, "fa-solid", "fa-file-excel"], [1, "record-preview"], [1, "preview-list"], [1, "preview-card"], [1, "preview-loading"], [1, "preview-card-content"], [1, "preview-name"], [1, "preview-secondary"], ["title", "Open record", 1, "preview-open-btn", 3, "click"], [1, "fa-solid", "fa-external-link-alt"], ["text", "Loading preview...", "size", "small"], [1, "result-header"], [1, "result-operation"], [1, "result-count"], [1, "fa-solid", "fa-hand-pointer"], [1, "compose-panel__header"], [1, "fa-solid", "fa-shapes"], [1, "compose-panel__body"], [1, "compose-grid"], [1, "compose-column"], [1, "compose-column__label"], [1, "compose-sources"], [1, "compose-source-chip"], [1, "compose-source-chip", "compose-source-chip--view"], [1, "compose-arrow"], [1, "compose-options"], [1, "compose-option"], ["type", "radio", "name", "composeOp", 3, "change", "checked"], [1, "compose-option__title"], [1, "compose-option__desc"], [1, "fa-solid", "fa-minus-circle"], ["type", "radio", "name", "composeTarget", 3, "change", "checked"], ["type", "text", "placeholder", "New list name\u2026", 1, "compose-input", 3, "ngModel"], [1, "compose-target-search"], [1, "compose-footer"], [1, "op-btn", "op-btn--primary", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-bolt"], [1, "compose-footer__spacer"], [1, "compose-footer__hint"], [1, "fa-solid", "fa-list"], [1, "compose-source-name"], [1, "compose-source-badge"], [1, "compose-source-badge", "compose-source-badge--view"], ["type", "text", "placeholder", "New list name\u2026", 1, "compose-input", 3, "ngModelChange", "ngModel"], ["type", "text", "placeholder", "Search lists\u2026", 1, "compose-input", 3, "ngModelChange", "focus", "ngModel"], [1, "compose-target-dropdown"], [1, "modal-overlay", 3, "click"], [1, "modal-dialog", "export-dialog"], [1, "modal-header"], [1, "modal-close", 3, "click"], [1, "modal-body"], [1, "export-format-row"], [1, "export-format-option", 3, "click"], ["type", "radio", "name", "exportFormat", "value", "excel", 3, "ngModelChange", "ngModel"], [1, "fa-solid", "fa-file-excel", 2, "color", "var(--mj-status-success)"], ["type", "radio", "name", "exportFormat", "value", "csv", 3, "ngModelChange", "ngModel"], [1, "fa-solid", "fa-file-csv", 2, "color", "var(--mj-text-secondary)"], ["type", "radio", "name", "exportFormat", "value", "json", 3, "ngModelChange", "ngModel"], [1, "fa-solid", "fa-file-code", 2, "color", "var(--mj-brand-primary)"], [1, "export-section-divider"], [1, "export-section-label"], [1, "export-fields-list"], [1, "export-field-row"], [1, "export-field-actions"], ["href", "#", 3, "click"], [1, "muted"], [1, "modal-footer"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], ["mjButton", "", "variant", "outline", 3, "click", "disabled"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], [1, "fa-solid", "fa-download"], [1, "form-group"], ["type", "text", "placeholder", "Enter list name", 1, "form-input", 3, "ngModelChange", "ngModel"], ["placeholder", "Optional description", "rows", "3", 1, "form-input", 3, "ngModelChange", "ngModel"], [1, "form-info"], [1, "btn-primary", 3, "click", "disabled"], [1, "btn-secondary", 3, "click"], [1, "form-info", 2, "margin-bottom", "16px"], [1, "list-search"], ["type", "text", "placeholder", "Search lists...", 1, "form-input", 3, "ngModelChange", "ngModel"], [1, "list-options"], [1, "list-option", 3, "selected"], [1, "list-options-empty"], [1, "list-option", 3, "click"], [1, "list-option-radio"], ["type", "radio", "name", "targetList", 3, "checked"], [1, "list-option-info"], [1, "list-option-name"], [1, "list-option-entity"], [1, "fa-solid", "fa-inbox"]], template: function ListsOperationsResource_Template(rf, ctx) { if (rf & 1) {
2019
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "div", 3);
2020
+ i0.ɵɵelement(4, "i", 4);
2021
+ i0.ɵɵelementStart(5, "h2");
2022
+ i0.ɵɵtext(6, "List Operations");
2023
+ i0.ɵɵelementEnd()();
2024
+ i0.ɵɵconditionalCreate(7, ListsOperationsResource_Conditional_7_Template, 3, 0, "button", 5);
1123
2025
  i0.ɵɵelementEnd();
1124
- i0.ɵɵelementStart(3, "mj-page-body", 2)(4, "div", 3)(5, "div", 4)(6, "div", 5)(7, "h3");
1125
- i0.ɵɵtext(8, "Selected Lists");
2026
+ i0.ɵɵelementStart(8, "div", 6);
2027
+ i0.ɵɵtext(9, " Visualize overlaps and perform set operations on your lists ");
2028
+ i0.ɵɵelementEnd()();
2029
+ i0.ɵɵelementStart(10, "div", 7)(11, "div", 8)(12, "div", 9)(13, "h3");
2030
+ i0.ɵɵtext(14, "Selected Operands");
1126
2031
  i0.ɵɵelementEnd();
1127
- i0.ɵɵconditionalCreate(9, ListsOperationsResource_Conditional_9_Template, 2, 2, "span", 6);
2032
+ i0.ɵɵconditionalCreate(15, ListsOperationsResource_Conditional_15_Template, 2, 2, "span", 10);
1128
2033
  i0.ɵɵelementEnd();
1129
- i0.ɵɵelementStart(10, "div", 7)(11, "label", 8);
1130
- i0.ɵɵtext(12, "Filter by Entity");
2034
+ i0.ɵɵelementStart(16, "div", 11)(17, "label", 12);
2035
+ i0.ɵɵtext(18, "Filter by Entity");
1131
2036
  i0.ɵɵelementEnd();
1132
- i0.ɵɵelementStart(13, "div", 9)(14, "select", 10);
1133
- i0.ɵɵtwoWayListener("ngModelChange", function ListsOperationsResource_Template_select_ngModelChange_14_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.selectedEntityId, $event) || (ctx.selectedEntityId = $event); return $event; });
1134
- i0.ɵɵlistener("ngModelChange", function ListsOperationsResource_Template_select_ngModelChange_14_listener() { return ctx.onEntityFilterChange(); });
1135
- i0.ɵɵelementStart(15, "option", 11);
1136
- i0.ɵɵtext(16, "All Entities");
2037
+ i0.ɵɵelementStart(19, "div", 13)(20, "select", 14);
2038
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsOperationsResource_Template_select_ngModelChange_20_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.selectedEntityId, $event) || (ctx.selectedEntityId = $event); return $event; });
2039
+ i0.ɵɵlistener("ngModelChange", function ListsOperationsResource_Template_select_ngModelChange_20_listener() { return ctx.onEntityFilterChange(); });
2040
+ i0.ɵɵelementStart(21, "option", 15);
2041
+ i0.ɵɵtext(22, "All Entities");
1137
2042
  i0.ɵɵelementEnd();
1138
- i0.ɵɵrepeaterCreate(17, ListsOperationsResource_For_18_Template, 2, 3, "option", 12, i0.ɵɵrepeaterTrackByIdentity);
2043
+ i0.ɵɵrepeaterCreate(23, ListsOperationsResource_For_24_Template, 2, 3, "option", 16, _forTrack0);
1139
2044
  i0.ɵɵelementEnd()()();
1140
- i0.ɵɵelementStart(19, "div", 13);
1141
- i0.ɵɵrepeaterCreate(20, ListsOperationsResource_For_21_Template, 9, 4, "div", 14, i0.ɵɵrepeaterTrackByIdentity);
1142
- i0.ɵɵconditionalCreate(22, ListsOperationsResource_Conditional_22_Template, 5, 2, "div", 15);
1143
- i0.ɵɵconditionalCreate(23, ListsOperationsResource_Conditional_23_Template, 3, 1, "div", 16);
2045
+ i0.ɵɵelementStart(25, "div", 17);
2046
+ i0.ɵɵrepeaterCreate(26, ListsOperationsResource_For_27_Template, 9, 4, "div", 18, i0.ɵɵrepeaterTrackByIdentity);
2047
+ i0.ɵɵconditionalCreate(28, ListsOperationsResource_Conditional_28_Template, 5, 2, "div", 19);
2048
+ i0.ɵɵconditionalCreate(29, ListsOperationsResource_Conditional_29_Template, 3, 1, "div", 20);
1144
2049
  i0.ɵɵelementEnd();
1145
- i0.ɵɵconditionalCreate(24, ListsOperationsResource_Conditional_24_Template, 6, 1, "div", 17);
1146
- i0.ɵɵconditionalCreate(25, ListsOperationsResource_Conditional_25_Template, 16, 3, "div", 18);
2050
+ i0.ɵɵelementStart(30, "div", 21);
2051
+ i0.ɵɵrepeaterCreate(31, ListsOperationsResource_For_32_Template, 10, 5, "div", 22, i0.ɵɵrepeaterTrackByIdentity);
2052
+ i0.ɵɵconditionalCreate(33, ListsOperationsResource_Conditional_33_Template, 5, 2, "div", 19);
1147
2053
  i0.ɵɵelementEnd();
1148
- i0.ɵɵelementStart(26, "div", 19);
1149
- i0.ɵɵconditionalCreate(27, ListsOperationsResource_Conditional_27_Template, 1, 2, "mj-venn-diagram", 20);
1150
- i0.ɵɵconditionalCreate(28, ListsOperationsResource_Conditional_28_Template, 7, 0, "div", 21);
1151
- i0.ɵɵconditionalCreate(29, ListsOperationsResource_Conditional_29_Template, 2, 0, "div", 22);
2054
+ i0.ɵɵconditionalCreate(34, ListsOperationsResource_Conditional_34_Template, 6, 1, "div", 23);
2055
+ i0.ɵɵconditionalCreate(35, ListsOperationsResource_Conditional_35_Template, 16, 3, "div", 24);
1152
2056
  i0.ɵɵelementEnd();
1153
- i0.ɵɵelementStart(30, "div", 23)(31, "div", 5)(32, "h3");
1154
- i0.ɵɵelement(33, "i", 24);
1155
- i0.ɵɵtext(34);
1156
- i0.ɵɵelementEnd()();
1157
- i0.ɵɵconditionalCreate(35, ListsOperationsResource_Conditional_35_Template, 17, 3, "div", 25);
1158
- i0.ɵɵconditionalCreate(36, ListsOperationsResource_Conditional_36_Template, 13, 2, "div", 26);
1159
- i0.ɵɵconditionalCreate(37, ListsOperationsResource_Conditional_37_Template, 4, 0, "div", 27);
2057
+ i0.ɵɵelementStart(36, "div", 25);
2058
+ i0.ɵɵconditionalCreate(37, ListsOperationsResource_Conditional_37_Template, 1, 2, "mj-venn-diagram", 26);
2059
+ i0.ɵɵconditionalCreate(38, ListsOperationsResource_Conditional_38_Template, 7, 0, "div", 27);
2060
+ i0.ɵɵconditionalCreate(39, ListsOperationsResource_Conditional_39_Template, 2, 0, "div", 28);
2061
+ i0.ɵɵelementEnd();
2062
+ i0.ɵɵelementStart(40, "div", 29)(41, "div", 9)(42, "h3");
2063
+ i0.ɵɵelement(43, "i", 30);
2064
+ i0.ɵɵtext(44);
1160
2065
  i0.ɵɵelementEnd()();
1161
- i0.ɵɵconditionalCreate(38, ListsOperationsResource_Conditional_38_Template, 1, 0, "div", 28);
1162
- i0.ɵɵconditionalCreate(39, ListsOperationsResource_Conditional_39_Template, 24, 7, "div", 29);
1163
- i0.ɵɵconditionalCreate(40, ListsOperationsResource_Conditional_40_Template, 1, 0, "div", 28);
1164
- i0.ɵɵconditionalCreate(41, ListsOperationsResource_Conditional_41_Template, 23, 7, "div", 30);
2066
+ i0.ɵɵconditionalCreate(45, ListsOperationsResource_Conditional_45_Template, 17, 3, "div", 31);
2067
+ i0.ɵɵconditionalCreate(46, ListsOperationsResource_Conditional_46_Template, 13, 2, "div", 32);
2068
+ i0.ɵɵconditionalCreate(47, ListsOperationsResource_Conditional_47_Template, 4, 0, "div", 33);
1165
2069
  i0.ɵɵelementEnd()();
2070
+ i0.ɵɵconditionalCreate(48, ListsOperationsResource_Conditional_48_Template, 73, 22, "div", 34);
2071
+ i0.ɵɵelementStart(49, "mj-list-delta-confirm", 35);
2072
+ i0.ɵɵlistener("Confirm", function ListsOperationsResource_Template_mj_list_delta_confirm_Confirm_49_listener($event) { return ctx.onComposeConfirmCommit($event); })("Cancel", function ListsOperationsResource_Template_mj_list_delta_confirm_Cancel_49_listener() { return ctx.onComposeConfirmCancel(); });
2073
+ i0.ɵɵelementEnd();
2074
+ i0.ɵɵconditionalCreate(50, ListsOperationsResource_Conditional_50_Template, 44, 16);
2075
+ i0.ɵɵconditionalCreate(51, ListsOperationsResource_Conditional_51_Template, 1, 0, "div", 36);
2076
+ i0.ɵɵconditionalCreate(52, ListsOperationsResource_Conditional_52_Template, 24, 7, "div", 37);
2077
+ i0.ɵɵconditionalCreate(53, ListsOperationsResource_Conditional_53_Template, 1, 0, "div", 36);
2078
+ i0.ɵɵconditionalCreate(54, ListsOperationsResource_Conditional_54_Template, 23, 7, "div", 38);
2079
+ i0.ɵɵelementEnd();
1166
2080
  } if (rf & 2) {
1167
- i0.ɵɵadvance(2);
1168
- i0.ɵɵconditional(ctx.selectedLists.length > 0 || ctx.selectedEntityId ? 2 : -1);
1169
- i0.ɵɵadvance();
1170
- i0.ɵɵproperty("Flex", true)("Padding", false);
1171
- i0.ɵɵadvance(6);
1172
- i0.ɵɵconditional(ctx.selectedLists.length > 0 ? 9 : -1);
2081
+ i0.ɵɵadvance(7);
2082
+ i0.ɵɵconditional(ctx.totalOperandCount > 0 || ctx.selectedEntityId ? 7 : -1);
2083
+ i0.ɵɵadvance(8);
2084
+ i0.ɵɵconditional(ctx.totalOperandCount > 0 ? 15 : -1);
1173
2085
  i0.ɵɵadvance(5);
1174
2086
  i0.ɵɵtwoWayProperty("ngModel", ctx.selectedEntityId);
1175
2087
  i0.ɵɵadvance(3);
@@ -1177,36 +2089,46 @@ let ListsOperationsResource = class ListsOperationsResource extends BaseResource
1177
2089
  i0.ɵɵadvance(3);
1178
2090
  i0.ɵɵrepeater(ctx.selectedLists);
1179
2091
  i0.ɵɵadvance(2);
1180
- i0.ɵɵconditional(ctx.selectedLists.length < ctx.maxLists ? 22 : -1);
2092
+ i0.ɵɵconditional(ctx.totalOperandCount < ctx.maxLists ? 28 : -1);
1181
2093
  i0.ɵɵadvance();
1182
- i0.ɵɵconditional(ctx.selectedLists.length >= ctx.maxLists ? 23 : -1);
2094
+ i0.ɵɵconditional(ctx.totalOperandCount >= ctx.maxLists ? 29 : -1);
2095
+ i0.ɵɵadvance(2);
2096
+ i0.ɵɵrepeater(ctx.selectedViews);
2097
+ i0.ɵɵadvance(2);
2098
+ i0.ɵɵconditional(ctx.totalOperandCount < ctx.maxLists ? 33 : -1);
1183
2099
  i0.ɵɵadvance();
1184
- i0.ɵɵconditional(ctx.selectedLists.length > 0 ? 24 : -1);
2100
+ i0.ɵɵconditional(ctx.totalOperandCount > 0 && ctx.lockedEntityName ? 34 : -1);
1185
2101
  i0.ɵɵadvance();
1186
- i0.ɵɵconditional(ctx.selectedLists.length >= 2 ? 25 : -1);
2102
+ i0.ɵɵconditional(ctx.totalOperandCount >= 2 ? 35 : -1);
1187
2103
  i0.ɵɵadvance(2);
1188
- i0.ɵɵconditional(ctx.selectedLists.length > 0 ? 27 : -1);
2104
+ i0.ɵɵconditional(ctx.totalOperandCount > 0 ? 37 : -1);
1189
2105
  i0.ɵɵadvance();
1190
- i0.ɵɵconditional(ctx.selectedLists.length === 0 ? 28 : -1);
2106
+ i0.ɵɵconditional(ctx.totalOperandCount === 0 ? 38 : -1);
1191
2107
  i0.ɵɵadvance();
1192
- i0.ɵɵconditional(ctx.isCalculating ? 29 : -1);
2108
+ i0.ɵɵconditional(ctx.isCalculating ? 39 : -1);
1193
2109
  i0.ɵɵadvance(5);
1194
2110
  i0.ɵɵtextInterpolate1(" ", ctx.selectedRegion ? "Selected Region" : "Results", " ");
1195
2111
  i0.ɵɵadvance();
1196
- i0.ɵɵconditional(ctx.selectedRegion ? 35 : -1);
2112
+ i0.ɵɵconditional(ctx.selectedRegion ? 45 : -1);
2113
+ i0.ɵɵadvance();
2114
+ i0.ɵɵconditional(ctx.lastOperationResult && !ctx.selectedRegion ? 46 : -1);
2115
+ i0.ɵɵadvance();
2116
+ i0.ɵɵconditional(!ctx.selectedRegion && !ctx.lastOperationResult ? 47 : -1);
2117
+ i0.ɵɵadvance();
2118
+ i0.ɵɵconditional(ctx.totalOperandCount >= 2 ? 48 : -1);
1197
2119
  i0.ɵɵadvance();
1198
- i0.ɵɵconditional(ctx.lastOperationResult && !ctx.selectedRegion ? 36 : -1);
2120
+ i0.ɵɵproperty("Visible", ctx.composeConfirmVisible && !!ctx.composeDelta)("Delta", ctx.composeDelta)("TargetListName", ctx.composeTargetDisplayName())("SourceLabel", "compose result");
1199
2121
  i0.ɵɵadvance();
1200
- i0.ɵɵconditional(!ctx.selectedRegion && !ctx.lastOperationResult ? 37 : -1);
2122
+ i0.ɵɵconditional(ctx.showExportDialog ? 50 : -1);
1201
2123
  i0.ɵɵadvance();
1202
- i0.ɵɵconditional(ctx.showCreateDialog ? 38 : -1);
2124
+ i0.ɵɵconditional(ctx.showCreateDialog ? 51 : -1);
1203
2125
  i0.ɵɵadvance();
1204
- i0.ɵɵconditional(ctx.showCreateDialog ? 39 : -1);
2126
+ i0.ɵɵconditional(ctx.showCreateDialog ? 52 : -1);
1205
2127
  i0.ɵɵadvance();
1206
- i0.ɵɵconditional(ctx.showAddToListDialog ? 40 : -1);
2128
+ i0.ɵɵconditional(ctx.showAddToListDialog ? 53 : -1);
1207
2129
  i0.ɵɵadvance();
1208
- i0.ɵɵconditional(ctx.showAddToListDialog ? 41 : -1);
1209
- } }, dependencies: [i3.NgSelectOption, i3.ɵNgSelectMultipleOption, i3.DefaultValueAccessor, i3.SelectControlValueAccessor, i3.NgControlStatus, i3.NgModel, i4.MJButtonDirective, i4.MJPageLayoutComponent, i4.MJPageHeaderComponent, i4.MJPageBodyComponent, i5.LoadingComponent, i6.VennDiagramComponent], styles: ["\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .operations-header {\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .header-top {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 4px;\n }\n\n .header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .clear-all-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .clear-all-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n }\n\n .clear-all-btn i {\n font-size: 12px;\n }\n\n .header-title i {\n font-size: 24px;\n color: var(--mj-brand-primary);\n }\n\n .header-title h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .header-subtitle {\n color: var(--mj-text-secondary);\n font-size: 14px;\n }\n\n .operations-content {\n display: grid;\n grid-template-columns: 280px 1fr 300px;\n gap: 16px;\n flex: 1;\n padding: 16px;\n overflow: hidden;\n }\n\n /* Panels */\n .selection-panel,\n .results-panel {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .venn-panel {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n position: relative;\n min-height: 400px;\n }\n\n .panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .panel-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .list-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n /* Entity Filter */\n .entity-filter-section {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .filter-label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n }\n\n .entity-select {\n width: 100%;\n padding: 8px 12px;\n font-size: 13px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n outline: none;\n transition: border-color 0.2s;\n }\n\n .entity-select:focus {\n border-color: var(--mj-brand-primary);\n }\n\n .entity-note {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 8px 12px;\n padding: 8px 10px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-radius: 6px;\n font-size: 12px;\n color: var(--mj-status-success);\n }\n\n .entity-note i {\n color: var(--mj-status-success);\n }\n\n /* Selected Lists */\n .selected-lists {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n }\n\n .selected-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n margin-bottom: 8px;\n }\n\n .item-color {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n flex-shrink: 0;\n }\n\n .item-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n }\n\n .item-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .item-entity {\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .remove-btn {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n }\n\n .remove-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Add list area */\n .add-list-area {\n position: relative;\n }\n\n .add-list-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border: 1px dashed var(--mj-border-default);\n border-radius: 6px;\n transition: border-color 0.2s;\n }\n\n .add-list-search:focus-within {\n border-color: var(--mj-brand-primary);\n }\n\n .add-list-search i {\n color: var(--mj-text-muted);\n }\n\n .add-list-search input {\n flex: 1;\n border: none;\n outline: none;\n font-size: 13px;\n }\n\n .list-dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: 100;\n margin-top: 4px;\n }\n\n .dropdown-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n .dropdown-content {\n position: relative;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: var(--mj-shadow-md);\n max-height: 200px;\n overflow-y: auto;\n }\n\n .dropdown-item {\n display: flex;\n flex-direction: column;\n padding: 10px 12px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .dropdown-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .dropdown-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .dropdown-entity {\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .lists-full {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n }\n\n .entity-warning {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin: 12px;\n padding: 10px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-radius: 6px;\n font-size: 12px;\n color: var(--mj-status-warning);\n }\n\n .entity-warning i {\n color: var(--mj-status-warning);\n margin-top: 2px;\n }\n\n /* Quick Operations */\n .quick-operations {\n padding: 12px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .quick-operations h4 {\n margin: 0 0 10px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .operation-buttons {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .op-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .op-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n }\n\n .op-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n /* Venn Panel */\n .venn-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n padding: 40px;\n }\n\n .empty-icon {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-radius: 50%;\n margin-bottom: 20px;\n }\n\n .empty-icon i {\n font-size: 36px;\n color: var(--mj-brand-primary);\n }\n\n .venn-empty h3 {\n margin: 0 0 8px;\n font-size: 18px;\n color: var(--mj-text-primary);\n }\n\n .venn-empty p {\n margin: 0;\n color: var(--mj-text-secondary);\n font-size: 14px;\n max-width: 300px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: color-mix(in srgb, var(--mj-bg-surface-card) 90%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n /* Results Panel */\n .region-details,\n .operation-result {\n padding: 16px;\n }\n\n .region-header,\n .result-header {\n margin-bottom: 16px;\n }\n\n .region-label,\n .result-operation {\n display: block;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n }\n\n .region-count,\n .result-count {\n font-size: 13px;\n color: var(--mj-brand-primary);\n font-weight: 500;\n }\n\n .region-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 16px;\n }\n\n .action-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .action-btn:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .action-btn.primary {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .action-btn.primary:hover {\n background: var(--mj-brand-primary-hover);\n }\n\n .record-preview h5 {\n margin: 0 0 8px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .preview-list {\n max-height: 200px;\n overflow-y: auto;\n }\n\n .preview-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n margin-bottom: 6px;\n transition: all 0.15s ease;\n }\n\n .preview-card:hover {\n background: var(--mj-bg-surface-sunken);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .preview-card-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .preview-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .preview-secondary {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .preview-open-btn {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n cursor: pointer;\n padding: 6px 8px;\n border-radius: 4px;\n opacity: 0.6;\n transition: all 0.15s ease;\n flex-shrink: 0;\n }\n\n .preview-open-btn:hover {\n opacity: 1;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .preview-loading {\n padding: 12px;\n text-align: center;\n }\n\n .results-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 200px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .results-empty i {\n font-size: 32px;\n margin-bottom: 12px;\n opacity: 0.5;\n }\n\n .results-empty p {\n font-size: 13px;\n margin: 0;\n max-width: 200px;\n }\n\n /* Modal */\n .modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n }\n\n .modal-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n width: 420px;\n max-width: 90vw;\n z-index: 1001;\n }\n\n .modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .modal-header h3 {\n margin: 0;\n font-size: 16px;\n color: var(--mj-text-primary);\n }\n\n .modal-close {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px 8px;\n }\n\n .modal-body {\n padding: 20px;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .form-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n box-sizing: border-box;\n }\n\n .form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n textarea.form-input {\n resize: vertical;\n }\n\n .form-info {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .form-info i {\n color: var(--mj-brand-primary);\n }\n\n .modal-footer {\n display: flex;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-secondary {\n padding: 10px 20px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n }\n\n .btn-secondary:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n /* Add to List Dialog */\n .add-to-list-dialog {\n width: 480px;\n }\n\n .add-to-list-dialog .modal-body {\n max-height: 400px;\n overflow-y: auto;\n }\n\n .list-search {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n margin-bottom: 12px;\n }\n\n .list-search i {\n color: var(--mj-text-muted);\n flex-shrink: 0;\n }\n\n .list-search .form-input {\n flex: 1;\n border: none;\n background: transparent;\n padding: 0;\n font-size: 14px;\n }\n\n .list-search .form-input:focus {\n box-shadow: none;\n outline: none;\n }\n\n .list-options {\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n max-height: 250px;\n overflow-y: auto;\n }\n\n .list-option {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n cursor: pointer;\n transition: background 0.15s;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .list-option:last-child {\n border-bottom: none;\n }\n\n .list-option:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-option.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .list-option-radio {\n flex-shrink: 0;\n }\n\n .list-option-radio input[type=\"radio\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n }\n\n .list-option-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .list-option-name {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-option-entity {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .list-options-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 30px 20px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .list-options-empty i {\n font-size: 28px;\n margin-bottom: 10px;\n opacity: 0.5;\n }\n\n .list-options-empty p {\n margin: 0;\n font-size: 13px;\n }\n\n /* Responsive */\n @media (max-width: 1024px) {\n .operations-content {\n grid-template-columns: 1fr;\n grid-template-rows: auto 1fr auto;\n }\n\n .selection-panel {\n order: 1;\n }\n\n .venn-panel {\n order: 2;\n min-height: 300px;\n }\n\n .results-panel {\n order: 3;\n }\n }\n "], encapsulation: 2 });
2130
+ i0.ɵɵconditional(ctx.showAddToListDialog ? 54 : -1);
2131
+ } }, dependencies: [i4.NgSelectOption, i4.ɵNgSelectMultipleOption, i4.DefaultValueAccessor, i4.CheckboxControlValueAccessor, i4.SelectControlValueAccessor, i4.RadioControlValueAccessor, i4.NgControlStatus, i4.NgModel, i5.MJButtonDirective, i6.LoadingComponent, i7.ListDeltaConfirmComponent, i8.VennDiagramComponent], styles: ["\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .operations-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n }\n\n .operations-header {\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .header-top {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 4px;\n }\n\n .header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .clear-all-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .clear-all-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n }\n\n .clear-all-btn i {\n font-size: 12px;\n }\n\n .header-title i {\n font-size: 24px;\n color: var(--mj-brand-primary);\n }\n\n .header-title h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .header-subtitle {\n color: var(--mj-text-secondary);\n font-size: 14px;\n }\n\n .operations-content {\n display: grid;\n grid-template-columns: 280px 1fr 300px;\n gap: 16px;\n flex: 1;\n padding: 16px;\n overflow: hidden;\n }\n\n /* Panels */\n .selection-panel,\n .results-panel {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .venn-panel {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n position: relative;\n min-height: 400px;\n }\n\n .panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .panel-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .list-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n /* Entity Filter */\n .entity-filter-section {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .filter-label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n }\n\n .entity-select {\n width: 100%;\n padding: 8px 12px;\n font-size: 13px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n outline: none;\n transition: border-color 0.2s;\n }\n\n .entity-select:focus {\n border-color: var(--mj-brand-primary);\n }\n\n .entity-note {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 8px 12px;\n padding: 8px 10px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-radius: 6px;\n font-size: 12px;\n color: var(--mj-status-success);\n }\n\n .entity-note i {\n color: var(--mj-status-success);\n }\n\n /* Selected Lists */\n .selected-lists {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n }\n\n /* Selected Views (sibling section) */\n .selected-views {\n overflow-y: auto;\n padding: 0 12px 12px 12px;\n }\n\n .selected-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n margin-bottom: 8px;\n }\n\n /* View operands get a dashed outline so they read distinctly from\n list operands. The fill stays muted because views are dynamic. */\n .selected-item--view {\n border: 1px dashed var(--mj-border-default);\n background: var(--mj-bg-surface);\n }\n\n .item-color {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n flex-shrink: 0;\n }\n\n /* View color swatch is a ring around a hollow centre \u2014 mirrors the\n dashed-stroke convention from the Venn diagram. */\n .item-color--view {\n background: transparent !important;\n border: 2px dashed currentColor;\n border-radius: 50%;\n }\n\n .item-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n }\n\n .item-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .item-entity {\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .remove-btn {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n }\n\n .remove-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Add list area */\n .add-list-area {\n position: relative;\n }\n\n .add-list-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border: 1px dashed var(--mj-border-default);\n border-radius: 6px;\n transition: border-color 0.2s;\n }\n\n .add-list-search:focus-within {\n border-color: var(--mj-brand-primary);\n }\n\n .add-list-search i {\n color: var(--mj-text-muted);\n }\n\n .add-list-search input {\n flex: 1;\n border: none;\n outline: none;\n font-size: 13px;\n }\n\n .list-dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: 100;\n margin-top: 4px;\n }\n\n .dropdown-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n .dropdown-content {\n position: relative;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: var(--mj-shadow-md);\n max-height: 200px;\n overflow-y: auto;\n }\n\n .dropdown-item {\n display: flex;\n flex-direction: column;\n padding: 10px 12px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .dropdown-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .dropdown-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .dropdown-entity {\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .lists-full {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n }\n\n .entity-warning {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin: 12px;\n padding: 10px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-radius: 6px;\n font-size: 12px;\n color: var(--mj-status-warning);\n }\n\n .entity-warning i {\n color: var(--mj-status-warning);\n margin-top: 2px;\n }\n\n /* Quick Operations */\n .quick-operations {\n padding: 12px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .quick-operations h4 {\n margin: 0 0 10px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .operation-buttons {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .op-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .op-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n }\n\n .op-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n /* Venn Panel */\n .venn-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n padding: 40px;\n }\n\n .empty-icon {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-radius: 50%;\n margin-bottom: 20px;\n }\n\n .empty-icon i {\n font-size: 36px;\n color: var(--mj-brand-primary);\n }\n\n .venn-empty h3 {\n margin: 0 0 8px;\n font-size: 18px;\n color: var(--mj-text-primary);\n }\n\n .venn-empty p {\n margin: 0;\n color: var(--mj-text-secondary);\n font-size: 14px;\n max-width: 300px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: color-mix(in srgb, var(--mj-bg-surface-card) 90%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n /* Results Panel */\n .region-details,\n .operation-result {\n padding: 16px;\n }\n\n .region-header,\n .result-header {\n margin-bottom: 16px;\n }\n\n .region-label,\n .result-operation {\n display: block;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n }\n\n .region-count,\n .result-count {\n font-size: 13px;\n color: var(--mj-brand-primary);\n font-weight: 500;\n }\n\n .region-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 16px;\n }\n\n .action-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .action-btn:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .action-btn.primary {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .action-btn.primary:hover {\n background: var(--mj-brand-primary-hover);\n }\n\n .record-preview h5 {\n margin: 0 0 8px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .preview-list {\n max-height: 200px;\n overflow-y: auto;\n }\n\n .preview-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n margin-bottom: 6px;\n transition: all 0.15s ease;\n }\n\n .preview-card:hover {\n background: var(--mj-bg-surface-sunken);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .preview-card-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .preview-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .preview-secondary {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .preview-open-btn {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n cursor: pointer;\n padding: 6px 8px;\n border-radius: 4px;\n opacity: 0.6;\n transition: all 0.15s ease;\n flex-shrink: 0;\n }\n\n .preview-open-btn:hover {\n opacity: 1;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .preview-loading {\n padding: 12px;\n text-align: center;\n }\n\n .results-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 200px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .results-empty i {\n font-size: 32px;\n margin-bottom: 12px;\n opacity: 0.5;\n }\n\n .results-empty p {\n font-size: 13px;\n margin: 0;\n max-width: 200px;\n }\n\n /* Modal */\n .modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n }\n\n .modal-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n width: 420px;\n max-width: 90vw;\n z-index: 1001;\n }\n\n .modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .modal-header h3 {\n margin: 0;\n font-size: 16px;\n color: var(--mj-text-primary);\n }\n\n .modal-close {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px 8px;\n }\n\n .modal-body {\n padding: 20px;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .form-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n box-sizing: border-box;\n }\n\n .form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n textarea.form-input {\n resize: vertical;\n }\n\n .form-info {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .form-info i {\n color: var(--mj-brand-primary);\n }\n\n .modal-footer {\n display: flex;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-secondary {\n padding: 10px 20px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n }\n\n .btn-secondary:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n /* Add to List Dialog */\n .add-to-list-dialog {\n width: 480px;\n }\n\n .add-to-list-dialog .modal-body {\n max-height: 400px;\n overflow-y: auto;\n }\n\n /* Export dialog (mockup 26) */\n .export-dialog .modal-body { max-height: 60vh; overflow-y: auto; }\n .export-format-row { display: flex; gap: 8px; margin-top: 8px; }\n .export-format-option {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n cursor: pointer;\n font-size: 13px;\n background: var(--mj-bg-surface);\n }\n .export-format-option--selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, transparent);\n }\n .export-format-option input[type=\"radio\"] { margin: 0; }\n .export-section-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 16px 0;\n }\n .export-section-label {\n display: block;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n margin-bottom: 8px;\n }\n .export-fields-list {\n max-height: 220px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n }\n .export-field-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 13px;\n cursor: pointer;\n }\n .export-field-row:last-child { border-bottom: none; }\n .export-field-row:hover { background: var(--mj-bg-surface-hover); }\n .export-field-actions {\n display: flex;\n gap: 12px;\n margin-top: 8px;\n align-items: center;\n font-size: 11.5px;\n }\n .export-field-actions a { color: var(--mj-text-link); }\n .export-field-actions .muted {\n margin-left: auto;\n color: var(--mj-text-muted);\n }\n\n .list-search {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n margin-bottom: 12px;\n }\n\n .list-search i {\n color: var(--mj-text-muted);\n flex-shrink: 0;\n }\n\n .list-search .form-input {\n flex: 1;\n border: none;\n background: transparent;\n padding: 0;\n font-size: 14px;\n }\n\n .list-search .form-input:focus {\n box-shadow: none;\n outline: none;\n }\n\n .list-options {\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n max-height: 250px;\n overflow-y: auto;\n }\n\n .list-option {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n cursor: pointer;\n transition: background 0.15s;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .list-option:last-child {\n border-bottom: none;\n }\n\n .list-option:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-option.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .list-option-radio {\n flex-shrink: 0;\n }\n\n .list-option-radio input[type=\"radio\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n }\n\n .list-option-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .list-option-name {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-option-entity {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .list-options-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 30px 20px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .list-options-empty i {\n font-size: 28px;\n margin-bottom: 10px;\n opacity: 0.5;\n }\n\n .list-options-empty p {\n margin: 0;\n font-size: 13px;\n }\n\n /* Responsive */\n @media (max-width: 1024px) {\n .operations-content {\n grid-template-columns: 1fr;\n grid-template-rows: auto 1fr auto;\n }\n\n .selection-panel {\n order: 1;\n }\n\n .venn-panel {\n order: 2;\n min-height: 300px;\n }\n\n .results-panel {\n order: 3;\n }\n }\n\n /* Compose-into-target panel (Phase 1.10) */\n .compose-panel {\n margin: 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n overflow: hidden;\n }\n\n .compose-panel__header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .compose-panel__header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .compose-panel__body {\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .compose-grid {\n display: grid;\n grid-template-columns: 1.2fr auto 1fr auto 1fr;\n gap: 16px;\n align-items: flex-start;\n }\n\n .compose-arrow {\n align-self: center;\n font-size: 24px;\n color: var(--mj-text-muted);\n }\n\n .compose-column {\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-width: 0;\n }\n\n .compose-column__label {\n font-size: 11px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n }\n\n .compose-sources {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .compose-source-chip {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n font-size: 12.5px;\n }\n\n .compose-source-chip--view {\n border: 1px dashed var(--mj-border-default);\n background: var(--mj-bg-surface);\n }\n\n .compose-source-name {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .compose-source-badge {\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 999px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n\n .compose-source-badge--view {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .compose-options {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .compose-option {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n font-size: 12.5px;\n }\n\n .compose-option--selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, var(--mj-bg-surface));\n }\n\n .compose-option__title {\n font-weight: 600;\n }\n\n .compose-option__desc {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n }\n\n .compose-input {\n width: 100%;\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n font-size: 12.5px;\n }\n\n .compose-target-search {\n position: relative;\n }\n\n .compose-target-dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: 50;\n }\n\n .compose-footer {\n display: flex;\n align-items: center;\n gap: 10px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .compose-footer__spacer { flex: 1; }\n\n .compose-footer__hint {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .op-btn--primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .op-btn--primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n "], encapsulation: 2 });
1210
2132
  };
1211
2133
  ListsOperationsResource = __decorate([
1212
2134
  RegisterClass(BaseResourceComponent, 'ListsOperationsResource')
@@ -1215,30 +2137,38 @@ export { ListsOperationsResource };
1215
2137
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ListsOperationsResource, [{
1216
2138
  type: Component,
1217
2139
  args: [{ standalone: false, selector: 'mj-lists-operations-resource', template: `
1218
- <mj-page-layout>
1219
- <mj-page-header
1220
- Title="List Operations"
1221
- Icon="fa-solid fa-diagram-project"
1222
- Subtitle="Visualize overlaps and perform set operations on your lists">
1223
- @if (selectedLists.length > 0 || selectedEntityId) {
1224
- <div actions>
1225
- <button mjButton variant="secondary" size="sm" (click)="clearAllSelections()" title="Clear all selections">
1226
- <i class="fa-solid fa-xmark"></i> Clear
1227
- </button>
2140
+ <div class="operations-container">
2141
+ <!-- Header -->
2142
+ <div class="operations-header">
2143
+ <div class="header-top">
2144
+ <div class="header-title">
2145
+ <i class="fa-solid fa-diagram-project"></i>
2146
+ <h2>List Operations</h2>
1228
2147
  </div>
1229
- }
1230
- </mj-page-header>
1231
-
1232
- <mj-page-body [Flex]="true" [Padding]="false">
2148
+ @if (totalOperandCount > 0 || selectedEntityId) {
2149
+ <button
2150
+ class="clear-all-btn"
2151
+ (click)="clearAllSelections()"
2152
+ title="Clear all selections">
2153
+ <i class="fa-solid fa-xmark"></i>
2154
+ Clear
2155
+ </button>
2156
+ }
2157
+ </div>
2158
+ <div class="header-subtitle">
2159
+ Visualize overlaps and perform set operations on your lists
2160
+ </div>
2161
+ </div>
2162
+
1233
2163
  <!-- Main Content -->
1234
2164
  <div class="operations-content">
1235
2165
  <!-- Left Panel: List Selection -->
1236
2166
  <div class="selection-panel">
1237
2167
  <div class="panel-header">
1238
- <h3>Selected Lists</h3>
1239
- @if (selectedLists.length > 0) {
2168
+ <h3>Selected Operands</h3>
2169
+ @if (totalOperandCount > 0) {
1240
2170
  <span class="list-count">
1241
- {{selectedLists.length}}/{{maxLists}}
2171
+ {{totalOperandCount}}/{{maxLists}}
1242
2172
  </span>
1243
2173
  }
1244
2174
  </div>
@@ -1252,7 +2182,7 @@ export { ListsOperationsResource };
1252
2182
  (ngModelChange)="onEntityFilterChange()"
1253
2183
  class="entity-select">
1254
2184
  <option value="">All Entities</option>
1255
- @for (entity of entityOptions; track entity) {
2185
+ @for (entity of entityOptions; track entity.id) {
1256
2186
  <option [value]="entity.id">
1257
2187
  {{entity.name}} ({{entity.listCount}})
1258
2188
  </option>
@@ -1276,7 +2206,7 @@ export { ListsOperationsResource };
1276
2206
  </div>
1277
2207
  }
1278
2208
 
1279
- @if (selectedLists.length < maxLists) {
2209
+ @if (totalOperandCount < maxLists) {
1280
2210
  <div class="add-list-area">
1281
2211
  <div class="add-list-search">
1282
2212
  <i class="fa-solid fa-search"></i>
@@ -1306,24 +2236,78 @@ export { ListsOperationsResource };
1306
2236
  </div>
1307
2237
  }
1308
2238
 
1309
- @if (selectedLists.length >= maxLists) {
2239
+ @if (totalOperandCount >= maxLists) {
1310
2240
  <div class="lists-full">
1311
2241
  <i class="fa-solid fa-info-circle"></i>
1312
- Maximum {{maxLists}} lists can be compared
2242
+ Maximum {{maxLists}} operands can be compared
1313
2243
  </div>
1314
2244
  }
1315
2245
  </div>
1316
-
2246
+
2247
+ <!-- Selected views (Phase 1.8). Tracked separately from lists
2248
+ so the existing list flows stay untouched, but combined at
2249
+ compute time via SetOperand[]. Dashed-style icon flags them
2250
+ as dynamic-at-resolution. -->
2251
+ <div class="selected-views">
2252
+ @for (item of selectedViews; track item; let i = $index) {
2253
+ <div class="selected-item selected-item--view">
2254
+ <div class="item-color item-color--view" [style.border-color]="item.color"></div>
2255
+ <div class="item-info">
2256
+ <span class="item-name">
2257
+ <i class="fa-solid fa-eye" [title]="'View'"></i>
2258
+ {{item.view.Name}}
2259
+ </span>
2260
+ <span class="item-entity">{{item.entityName}}</span>
2261
+ </div>
2262
+ <button class="remove-btn" (click)="removeView(i)">
2263
+ <i class="fa-solid fa-times"></i>
2264
+ </button>
2265
+ </div>
2266
+ }
2267
+
2268
+ @if (totalOperandCount < maxLists) {
2269
+ <div class="add-list-area">
2270
+ <div class="add-list-search">
2271
+ <i class="fa-solid fa-eye"></i>
2272
+ <input
2273
+ type="text"
2274
+ [(ngModel)]="viewSearchTerm"
2275
+ (ngModelChange)="filterAvailableViews()"
2276
+ placeholder="Search views to add..."
2277
+ (focus)="showViewDropdown = true" />
2278
+ </div>
2279
+ @if (showViewDropdown && filteredAvailableViews.length > 0) {
2280
+ <div class="list-dropdown">
2281
+ <div class="dropdown-backdrop" (click)="showViewDropdown = false"></div>
2282
+ <div class="dropdown-content">
2283
+ @for (view of filteredAvailableViews; track view) {
2284
+ <div
2285
+ class="dropdown-item"
2286
+ (click)="addView(view)">
2287
+ <span class="dropdown-name">
2288
+ <i class="fa-solid fa-eye"></i>
2289
+ {{view.Name}}
2290
+ </span>
2291
+ <span class="dropdown-entity">{{view.Entity}}</span>
2292
+ </div>
2293
+ }
2294
+ </div>
2295
+ </div>
2296
+ }
2297
+ </div>
2298
+ }
2299
+ </div>
2300
+
1317
2301
  <!-- Entity consistency note -->
1318
- @if (selectedLists.length > 0) {
2302
+ @if (totalOperandCount > 0 && lockedEntityName) {
1319
2303
  <div class="entity-note">
1320
2304
  <i class="fa-solid fa-info-circle"></i>
1321
- <span>Comparing lists of type: <strong>{{selectedLists[0].entityName}}</strong></span>
2305
+ <span>Comparing operands of type: <strong>{{lockedEntityName}}</strong></span>
1322
2306
  </div>
1323
2307
  }
1324
-
2308
+
1325
2309
  <!-- Quick Operations -->
1326
- @if (selectedLists.length >= 2) {
2310
+ @if (totalOperandCount >= 2) {
1327
2311
  <div class="quick-operations">
1328
2312
  <h4>Quick Operations</h4>
1329
2313
  <div class="operation-buttons">
@@ -1343,24 +2327,24 @@ export { ListsOperationsResource };
1343
2327
  </div>
1344
2328
  }
1345
2329
  </div>
1346
-
2330
+
1347
2331
  <!-- Center: Venn Diagram -->
1348
2332
  <div class="venn-panel">
1349
- @if (selectedLists.length > 0) {
2333
+ @if (totalOperandCount > 0) {
1350
2334
  <mj-venn-diagram
1351
2335
  [data]="vennData"
1352
2336
  [selectedRegion]="selectedRegion"
1353
2337
  (regionClick)="onRegionClick($event)">
1354
2338
  </mj-venn-diagram>
1355
2339
  }
1356
-
1357
- @if (selectedLists.length === 0) {
2340
+
2341
+ @if (totalOperandCount === 0) {
1358
2342
  <div class="venn-empty">
1359
2343
  <div class="empty-icon">
1360
2344
  <i class="fa-solid fa-circle-nodes"></i>
1361
2345
  </div>
1362
- <h3>Add Lists to Compare</h3>
1363
- <p>Select 2-4 lists from the same entity to visualize their overlaps and perform set operations.</p>
2346
+ <h3>Add Lists or Views to Compare</h3>
2347
+ <p>Select 2-4 lists or views from the same entity to visualize their overlaps and perform set operations.</p>
1364
2348
  </div>
1365
2349
  }
1366
2350
 
@@ -1396,9 +2380,9 @@ export { ListsOperationsResource };
1396
2380
  <i class="fa-solid fa-folder-plus"></i>
1397
2381
  Add to List
1398
2382
  </button>
1399
- <button mjButton (click)="exportToExcel()">
2383
+ <button mjButton (click)="openExportDialog()">
1400
2384
  <i class="fa-solid fa-file-excel"></i>
1401
- Export
2385
+ Export
1402
2386
  </button>
1403
2387
  </div>
1404
2388
  @if (previewRecordsDisplay.length > 0) {
@@ -1458,7 +2442,224 @@ export { ListsOperationsResource };
1458
2442
  }
1459
2443
  </div>
1460
2444
  </div>
1461
-
2445
+
2446
+ <!-- Compose-into-target panel (Phase 1.10). Lives outside operations-content
2447
+ so it spans the full panel width per mockup 11. Only shows once
2448
+ the user has at least 2 operands selected. -->
2449
+ @if (totalOperandCount >= 2) {
2450
+ <div class="compose-panel">
2451
+ <div class="compose-panel__header">
2452
+ <i class="fa-solid fa-shapes"></i>
2453
+ <h3>Compose into a Target List</h3>
2454
+ </div>
2455
+ <div class="compose-panel__body">
2456
+ <div class="compose-grid">
2457
+ <!-- Sources column (read-only — reflects the chips above) -->
2458
+ <div class="compose-column">
2459
+ <div class="compose-column__label">Sources ({{ totalOperandCount }})</div>
2460
+ <div class="compose-sources">
2461
+ @for (s of selectedLists; track s.list.ID) {
2462
+ <div class="compose-source-chip">
2463
+ <i class="fa-solid fa-list" [style.color]="s.color"></i>
2464
+ <span class="compose-source-name">{{ s.list.Name }}</span>
2465
+ <span class="compose-source-badge">List</span>
2466
+ </div>
2467
+ }
2468
+ @for (s of selectedViews; track s.view.ID) {
2469
+ <div class="compose-source-chip compose-source-chip--view">
2470
+ <i class="fa-solid fa-eye" [style.color]="s.color"></i>
2471
+ <span class="compose-source-name">{{ s.view.Name }}</span>
2472
+ <span class="compose-source-badge compose-source-badge--view">View</span>
2473
+ </div>
2474
+ }
2475
+ </div>
2476
+ </div>
2477
+
2478
+ <div class="compose-arrow">→</div>
2479
+
2480
+ <!-- Operation column -->
2481
+ <div class="compose-column">
2482
+ <div class="compose-column__label">Operation</div>
2483
+ <div class="compose-options">
2484
+ <label class="compose-option" [class.compose-option--selected]="composeOp === 'union'">
2485
+ <input type="radio" name="composeOp" [checked]="composeOp === 'union'" (change)="composeOp = 'union'" />
2486
+ <i class="fa-solid fa-layer-group"></i>
2487
+ <div>
2488
+ <div class="compose-option__title">Union</div>
2489
+ <div class="compose-option__desc">Combine all sources, dedupe</div>
2490
+ </div>
2491
+ </label>
2492
+ <label class="compose-option" [class.compose-option--selected]="composeOp === 'intersection'">
2493
+ <input type="radio" name="composeOp" [checked]="composeOp === 'intersection'" (change)="composeOp = 'intersection'" />
2494
+ <i class="fa-solid fa-circle-notch"></i>
2495
+ <div>
2496
+ <div class="compose-option__title">Intersection</div>
2497
+ <div class="compose-option__desc">Only records in all sources</div>
2498
+ </div>
2499
+ </label>
2500
+ <label class="compose-option" [class.compose-option--selected]="composeOp === 'difference'">
2501
+ <input type="radio" name="composeOp" [checked]="composeOp === 'difference'" (change)="composeOp = 'difference'" />
2502
+ <i class="fa-solid fa-minus-circle"></i>
2503
+ <div>
2504
+ <div class="compose-option__title">Difference</div>
2505
+ <div class="compose-option__desc">First minus the rest</div>
2506
+ </div>
2507
+ </label>
2508
+ </div>
2509
+ </div>
2510
+
2511
+ <div class="compose-arrow">→</div>
2512
+
2513
+ <!-- Target column -->
2514
+ <div class="compose-column">
2515
+ <div class="compose-column__label">Target</div>
2516
+ <div class="compose-options">
2517
+ <label class="compose-option" [class.compose-option--selected]="composeTarget === 'new'">
2518
+ <input type="radio" name="composeTarget" [checked]="composeTarget === 'new'" (change)="composeTarget = 'new'" />
2519
+ <div class="compose-option__title">Create New List</div>
2520
+ </label>
2521
+ <label class="compose-option" [class.compose-option--selected]="composeTarget === 'existing'">
2522
+ <input type="radio" name="composeTarget" [checked]="composeTarget === 'existing'" (change)="composeTarget = 'existing'" />
2523
+ <div class="compose-option__title">Existing List…</div>
2524
+ </label>
2525
+
2526
+ @if (composeTarget === 'new') {
2527
+ <input
2528
+ class="compose-input"
2529
+ type="text"
2530
+ [(ngModel)]="composeNewListName"
2531
+ placeholder="New list name…" />
2532
+ } @else {
2533
+ <div class="compose-target-search">
2534
+ <input
2535
+ class="compose-input"
2536
+ type="text"
2537
+ [(ngModel)]="composeTargetSearch"
2538
+ (focus)="showComposeTargetDropdown = true"
2539
+ placeholder="Search lists…" />
2540
+ @if (showComposeTargetDropdown && filteredComposeTargets.length > 0) {
2541
+ <div class="compose-target-dropdown">
2542
+ <div class="dropdown-backdrop" (click)="showComposeTargetDropdown = false"></div>
2543
+ <div class="dropdown-content">
2544
+ @for (l of filteredComposeTargets; track l.ID) {
2545
+ <div class="dropdown-item" (click)="selectComposeTarget(l)">
2546
+ <span class="dropdown-name">{{ l.Name }}</span>
2547
+ <span class="dropdown-entity">{{ l.Entity }}</span>
2548
+ </div>
2549
+ }
2550
+ </div>
2551
+ </div>
2552
+ }
2553
+ </div>
2554
+ }
2555
+ </div>
2556
+ </div>
2557
+ </div>
2558
+
2559
+ <div class="compose-footer">
2560
+ <button class="op-btn" (click)="previewCompose()" [disabled]="isCalculating || isComposing">
2561
+ <i class="fa-solid fa-eye"></i>
2562
+ <span>Preview Result</span>
2563
+ </button>
2564
+ <button class="op-btn op-btn--primary" (click)="composeAndSave()" [disabled]="!canCompose || isCalculating || isComposing">
2565
+ @if (isComposing) {
2566
+ <i class="fa-solid fa-spinner fa-spin"></i>
2567
+ } @else {
2568
+ <i class="fa-solid fa-bolt"></i>
2569
+ }
2570
+ <span>{{ isComposing ? 'Composing…' : 'Compute & Save' }}</span>
2571
+ </button>
2572
+ <div class="compose-footer__spacer"></div>
2573
+ @if (lastOperationResult) {
2574
+ <div class="compose-footer__hint">
2575
+ Expected output: <strong>{{ lastOperationResult.resultCount }} records</strong>
2576
+ ({{ getOperationLabel(lastOperationResult.operation) }})
2577
+ </div>
2578
+ }
2579
+ </div>
2580
+ </div>
2581
+ </div>
2582
+ }
2583
+
2584
+ <!-- Compose-into-existing-list delta-confirm -->
2585
+ <mj-list-delta-confirm
2586
+ [Visible]="composeConfirmVisible && !!composeDelta"
2587
+ [Delta]="composeDelta"
2588
+ [TargetListName]="composeTargetDisplayName()"
2589
+ [SourceLabel]="'compose result'"
2590
+ (Confirm)="onComposeConfirmCommit($event)"
2591
+ (Cancel)="onComposeConfirmCancel()">
2592
+ </mj-list-delta-confirm>
2593
+
2594
+ <!-- Export Dialog (mockup 26) -->
2595
+ @if (showExportDialog) {
2596
+ <div class="modal-overlay" (click)="closeExportDialog()"></div>
2597
+ <div class="modal-dialog export-dialog">
2598
+ <div class="modal-header">
2599
+ <h3><i class="fa-solid fa-file-excel"></i> Export {{ exportRecordCount }} Record{{ exportRecordCount === 1 ? '' : 's' }}</h3>
2600
+ <button class="modal-close" (click)="closeExportDialog()">
2601
+ <i class="fa-solid fa-times"></i>
2602
+ </button>
2603
+ </div>
2604
+ <div class="modal-body">
2605
+ <div class="export-format-row">
2606
+ <label class="export-format-option"
2607
+ [class.export-format-option--selected]="exportFormat === 'excel'"
2608
+ (click)="exportFormat = 'excel'">
2609
+ <input type="radio" name="exportFormat" value="excel" [(ngModel)]="exportFormat">
2610
+ <i class="fa-solid fa-file-excel" style="color: var(--mj-status-success);"></i>
2611
+ <span>Excel (.xlsx)</span>
2612
+ </label>
2613
+ <label class="export-format-option"
2614
+ [class.export-format-option--selected]="exportFormat === 'csv'"
2615
+ (click)="exportFormat = 'csv'">
2616
+ <input type="radio" name="exportFormat" value="csv" [(ngModel)]="exportFormat">
2617
+ <i class="fa-solid fa-file-csv" style="color: var(--mj-text-secondary);"></i>
2618
+ <span>CSV</span>
2619
+ </label>
2620
+ <label class="export-format-option"
2621
+ [class.export-format-option--selected]="exportFormat === 'json'"
2622
+ (click)="exportFormat = 'json'">
2623
+ <input type="radio" name="exportFormat" value="json" [(ngModel)]="exportFormat">
2624
+ <i class="fa-solid fa-file-code" style="color: var(--mj-brand-primary);"></i>
2625
+ <span>JSON</span>
2626
+ </label>
2627
+ </div>
2628
+
2629
+ <div class="export-section-divider"></div>
2630
+
2631
+ <label class="export-section-label">Columns to include</label>
2632
+ <div class="export-fields-list">
2633
+ @for (f of exportFields; track f.Name) {
2634
+ <label class="export-field-row">
2635
+ <input type="checkbox" [(ngModel)]="f.Selected">
2636
+ <span>{{ f.DisplayName }}</span>
2637
+ </label>
2638
+ }
2639
+ </div>
2640
+ <div class="export-field-actions">
2641
+ <a href="#" (click)="selectAllExportFields(); $event.preventDefault()">Select All</a>
2642
+ <a href="#" (click)="selectNoneExportFields(); $event.preventDefault()">Select None</a>
2643
+ <span class="muted">{{ selectedExportFieldCount }} of {{ exportFields.length }} selected</span>
2644
+ </div>
2645
+ </div>
2646
+ <div class="modal-footer">
2647
+ <button mjButton variant="primary"
2648
+ [disabled]="selectedExportFieldCount === 0 || isExporting"
2649
+ (click)="executeExport()">
2650
+ @if (isExporting) {
2651
+ <i class="fa-solid fa-spinner fa-spin"></i>
2652
+ Exporting…
2653
+ } @else {
2654
+ <i class="fa-solid fa-download"></i>
2655
+ Export {{ exportRecordCount }} Record{{ exportRecordCount === 1 ? '' : 's' }}
2656
+ }
2657
+ </button>
2658
+ <button mjButton variant="outline" [disabled]="isExporting" (click)="closeExportDialog()">Cancel</button>
2659
+ </div>
2660
+ </div>
2661
+ }
2662
+
1462
2663
  <!-- Create List Dialog -->
1463
2664
  @if (showCreateDialog) {
1464
2665
  <div class="modal-overlay" (click)="cancelCreateDialog()"></div>
@@ -1570,9 +2771,8 @@ export { ListsOperationsResource };
1570
2771
  </div>
1571
2772
  </div>
1572
2773
  }
1573
- </mj-page-body>
1574
- </mj-page-layout>
1575
- `, encapsulation: ViewEncapsulation.None, styles: ["\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .operations-header {\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .header-top {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 4px;\n }\n\n .header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .clear-all-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .clear-all-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n }\n\n .clear-all-btn i {\n font-size: 12px;\n }\n\n .header-title i {\n font-size: 24px;\n color: var(--mj-brand-primary);\n }\n\n .header-title h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .header-subtitle {\n color: var(--mj-text-secondary);\n font-size: 14px;\n }\n\n .operations-content {\n display: grid;\n grid-template-columns: 280px 1fr 300px;\n gap: 16px;\n flex: 1;\n padding: 16px;\n overflow: hidden;\n }\n\n /* Panels */\n .selection-panel,\n .results-panel {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .venn-panel {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n position: relative;\n min-height: 400px;\n }\n\n .panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .panel-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .list-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n /* Entity Filter */\n .entity-filter-section {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .filter-label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n }\n\n .entity-select {\n width: 100%;\n padding: 8px 12px;\n font-size: 13px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n outline: none;\n transition: border-color 0.2s;\n }\n\n .entity-select:focus {\n border-color: var(--mj-brand-primary);\n }\n\n .entity-note {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 8px 12px;\n padding: 8px 10px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-radius: 6px;\n font-size: 12px;\n color: var(--mj-status-success);\n }\n\n .entity-note i {\n color: var(--mj-status-success);\n }\n\n /* Selected Lists */\n .selected-lists {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n }\n\n .selected-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n margin-bottom: 8px;\n }\n\n .item-color {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n flex-shrink: 0;\n }\n\n .item-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n }\n\n .item-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .item-entity {\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .remove-btn {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n }\n\n .remove-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Add list area */\n .add-list-area {\n position: relative;\n }\n\n .add-list-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border: 1px dashed var(--mj-border-default);\n border-radius: 6px;\n transition: border-color 0.2s;\n }\n\n .add-list-search:focus-within {\n border-color: var(--mj-brand-primary);\n }\n\n .add-list-search i {\n color: var(--mj-text-muted);\n }\n\n .add-list-search input {\n flex: 1;\n border: none;\n outline: none;\n font-size: 13px;\n }\n\n .list-dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: 100;\n margin-top: 4px;\n }\n\n .dropdown-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n .dropdown-content {\n position: relative;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: var(--mj-shadow-md);\n max-height: 200px;\n overflow-y: auto;\n }\n\n .dropdown-item {\n display: flex;\n flex-direction: column;\n padding: 10px 12px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .dropdown-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .dropdown-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .dropdown-entity {\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .lists-full {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n }\n\n .entity-warning {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin: 12px;\n padding: 10px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-radius: 6px;\n font-size: 12px;\n color: var(--mj-status-warning);\n }\n\n .entity-warning i {\n color: var(--mj-status-warning);\n margin-top: 2px;\n }\n\n /* Quick Operations */\n .quick-operations {\n padding: 12px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .quick-operations h4 {\n margin: 0 0 10px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .operation-buttons {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .op-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .op-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n }\n\n .op-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n /* Venn Panel */\n .venn-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n padding: 40px;\n }\n\n .empty-icon {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-radius: 50%;\n margin-bottom: 20px;\n }\n\n .empty-icon i {\n font-size: 36px;\n color: var(--mj-brand-primary);\n }\n\n .venn-empty h3 {\n margin: 0 0 8px;\n font-size: 18px;\n color: var(--mj-text-primary);\n }\n\n .venn-empty p {\n margin: 0;\n color: var(--mj-text-secondary);\n font-size: 14px;\n max-width: 300px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: color-mix(in srgb, var(--mj-bg-surface-card) 90%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n /* Results Panel */\n .region-details,\n .operation-result {\n padding: 16px;\n }\n\n .region-header,\n .result-header {\n margin-bottom: 16px;\n }\n\n .region-label,\n .result-operation {\n display: block;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n }\n\n .region-count,\n .result-count {\n font-size: 13px;\n color: var(--mj-brand-primary);\n font-weight: 500;\n }\n\n .region-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 16px;\n }\n\n .action-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .action-btn:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .action-btn.primary {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .action-btn.primary:hover {\n background: var(--mj-brand-primary-hover);\n }\n\n .record-preview h5 {\n margin: 0 0 8px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .preview-list {\n max-height: 200px;\n overflow-y: auto;\n }\n\n .preview-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n margin-bottom: 6px;\n transition: all 0.15s ease;\n }\n\n .preview-card:hover {\n background: var(--mj-bg-surface-sunken);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .preview-card-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .preview-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .preview-secondary {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .preview-open-btn {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n cursor: pointer;\n padding: 6px 8px;\n border-radius: 4px;\n opacity: 0.6;\n transition: all 0.15s ease;\n flex-shrink: 0;\n }\n\n .preview-open-btn:hover {\n opacity: 1;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .preview-loading {\n padding: 12px;\n text-align: center;\n }\n\n .results-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 200px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .results-empty i {\n font-size: 32px;\n margin-bottom: 12px;\n opacity: 0.5;\n }\n\n .results-empty p {\n font-size: 13px;\n margin: 0;\n max-width: 200px;\n }\n\n /* Modal */\n .modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n }\n\n .modal-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n width: 420px;\n max-width: 90vw;\n z-index: 1001;\n }\n\n .modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .modal-header h3 {\n margin: 0;\n font-size: 16px;\n color: var(--mj-text-primary);\n }\n\n .modal-close {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px 8px;\n }\n\n .modal-body {\n padding: 20px;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .form-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n box-sizing: border-box;\n }\n\n .form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n textarea.form-input {\n resize: vertical;\n }\n\n .form-info {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .form-info i {\n color: var(--mj-brand-primary);\n }\n\n .modal-footer {\n display: flex;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-secondary {\n padding: 10px 20px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n }\n\n .btn-secondary:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n /* Add to List Dialog */\n .add-to-list-dialog {\n width: 480px;\n }\n\n .add-to-list-dialog .modal-body {\n max-height: 400px;\n overflow-y: auto;\n }\n\n .list-search {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n margin-bottom: 12px;\n }\n\n .list-search i {\n color: var(--mj-text-muted);\n flex-shrink: 0;\n }\n\n .list-search .form-input {\n flex: 1;\n border: none;\n background: transparent;\n padding: 0;\n font-size: 14px;\n }\n\n .list-search .form-input:focus {\n box-shadow: none;\n outline: none;\n }\n\n .list-options {\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n max-height: 250px;\n overflow-y: auto;\n }\n\n .list-option {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n cursor: pointer;\n transition: background 0.15s;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .list-option:last-child {\n border-bottom: none;\n }\n\n .list-option:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-option.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .list-option-radio {\n flex-shrink: 0;\n }\n\n .list-option-radio input[type=\"radio\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n }\n\n .list-option-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .list-option-name {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-option-entity {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .list-options-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 30px 20px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .list-options-empty i {\n font-size: 28px;\n margin-bottom: 10px;\n opacity: 0.5;\n }\n\n .list-options-empty p {\n margin: 0;\n font-size: 13px;\n }\n\n /* Responsive */\n @media (max-width: 1024px) {\n .operations-content {\n grid-template-columns: 1fr;\n grid-template-rows: auto 1fr auto;\n }\n\n .selection-panel {\n order: 1;\n }\n\n .venn-panel {\n order: 2;\n min-height: 300px;\n }\n\n .results-panel {\n order: 3;\n }\n }\n "] }]
1576
- }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.ListSetOperationsService }, { type: i2.MJNotificationService }], null); })();
1577
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ListsOperationsResource, { className: "ListsOperationsResource", filePath: "src/Lists/components/lists-operations-resource.component.ts", lineNumber: 1276 }); })();
2774
+ </div>
2775
+ `, encapsulation: ViewEncapsulation.None, styles: ["\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .operations-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n }\n\n .operations-header {\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .header-top {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 4px;\n }\n\n .header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .clear-all-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .clear-all-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n }\n\n .clear-all-btn i {\n font-size: 12px;\n }\n\n .header-title i {\n font-size: 24px;\n color: var(--mj-brand-primary);\n }\n\n .header-title h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .header-subtitle {\n color: var(--mj-text-secondary);\n font-size: 14px;\n }\n\n .operations-content {\n display: grid;\n grid-template-columns: 280px 1fr 300px;\n gap: 16px;\n flex: 1;\n padding: 16px;\n overflow: hidden;\n }\n\n /* Panels */\n .selection-panel,\n .results-panel {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .venn-panel {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n position: relative;\n min-height: 400px;\n }\n\n .panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .panel-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .list-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n /* Entity Filter */\n .entity-filter-section {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .filter-label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n }\n\n .entity-select {\n width: 100%;\n padding: 8px 12px;\n font-size: 13px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n outline: none;\n transition: border-color 0.2s;\n }\n\n .entity-select:focus {\n border-color: var(--mj-brand-primary);\n }\n\n .entity-note {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 8px 12px;\n padding: 8px 10px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-radius: 6px;\n font-size: 12px;\n color: var(--mj-status-success);\n }\n\n .entity-note i {\n color: var(--mj-status-success);\n }\n\n /* Selected Lists */\n .selected-lists {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n }\n\n /* Selected Views (sibling section) */\n .selected-views {\n overflow-y: auto;\n padding: 0 12px 12px 12px;\n }\n\n .selected-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n margin-bottom: 8px;\n }\n\n /* View operands get a dashed outline so they read distinctly from\n list operands. The fill stays muted because views are dynamic. */\n .selected-item--view {\n border: 1px dashed var(--mj-border-default);\n background: var(--mj-bg-surface);\n }\n\n .item-color {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n flex-shrink: 0;\n }\n\n /* View color swatch is a ring around a hollow centre \u2014 mirrors the\n dashed-stroke convention from the Venn diagram. */\n .item-color--view {\n background: transparent !important;\n border: 2px dashed currentColor;\n border-radius: 50%;\n }\n\n .item-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n }\n\n .item-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .item-entity {\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .remove-btn {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n }\n\n .remove-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Add list area */\n .add-list-area {\n position: relative;\n }\n\n .add-list-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border: 1px dashed var(--mj-border-default);\n border-radius: 6px;\n transition: border-color 0.2s;\n }\n\n .add-list-search:focus-within {\n border-color: var(--mj-brand-primary);\n }\n\n .add-list-search i {\n color: var(--mj-text-muted);\n }\n\n .add-list-search input {\n flex: 1;\n border: none;\n outline: none;\n font-size: 13px;\n }\n\n .list-dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: 100;\n margin-top: 4px;\n }\n\n .dropdown-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n .dropdown-content {\n position: relative;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: var(--mj-shadow-md);\n max-height: 200px;\n overflow-y: auto;\n }\n\n .dropdown-item {\n display: flex;\n flex-direction: column;\n padding: 10px 12px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .dropdown-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .dropdown-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .dropdown-entity {\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .lists-full {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n }\n\n .entity-warning {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin: 12px;\n padding: 10px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-radius: 6px;\n font-size: 12px;\n color: var(--mj-status-warning);\n }\n\n .entity-warning i {\n color: var(--mj-status-warning);\n margin-top: 2px;\n }\n\n /* Quick Operations */\n .quick-operations {\n padding: 12px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .quick-operations h4 {\n margin: 0 0 10px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .operation-buttons {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .op-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .op-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n }\n\n .op-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n /* Venn Panel */\n .venn-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n padding: 40px;\n }\n\n .empty-icon {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-radius: 50%;\n margin-bottom: 20px;\n }\n\n .empty-icon i {\n font-size: 36px;\n color: var(--mj-brand-primary);\n }\n\n .venn-empty h3 {\n margin: 0 0 8px;\n font-size: 18px;\n color: var(--mj-text-primary);\n }\n\n .venn-empty p {\n margin: 0;\n color: var(--mj-text-secondary);\n font-size: 14px;\n max-width: 300px;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: color-mix(in srgb, var(--mj-bg-surface-card) 90%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n /* Results Panel */\n .region-details,\n .operation-result {\n padding: 16px;\n }\n\n .region-header,\n .result-header {\n margin-bottom: 16px;\n }\n\n .region-label,\n .result-operation {\n display: block;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n }\n\n .region-count,\n .result-count {\n font-size: 13px;\n color: var(--mj-brand-primary);\n font-weight: 500;\n }\n\n .region-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 16px;\n }\n\n .action-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .action-btn:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .action-btn.primary {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .action-btn.primary:hover {\n background: var(--mj-brand-primary-hover);\n }\n\n .record-preview h5 {\n margin: 0 0 8px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .preview-list {\n max-height: 200px;\n overflow-y: auto;\n }\n\n .preview-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n margin-bottom: 6px;\n transition: all 0.15s ease;\n }\n\n .preview-card:hover {\n background: var(--mj-bg-surface-sunken);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .preview-card-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .preview-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .preview-secondary {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .preview-open-btn {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n cursor: pointer;\n padding: 6px 8px;\n border-radius: 4px;\n opacity: 0.6;\n transition: all 0.15s ease;\n flex-shrink: 0;\n }\n\n .preview-open-btn:hover {\n opacity: 1;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .preview-loading {\n padding: 12px;\n text-align: center;\n }\n\n .results-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 200px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .results-empty i {\n font-size: 32px;\n margin-bottom: 12px;\n opacity: 0.5;\n }\n\n .results-empty p {\n font-size: 13px;\n margin: 0;\n max-width: 200px;\n }\n\n /* Modal */\n .modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n }\n\n .modal-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n width: 420px;\n max-width: 90vw;\n z-index: 1001;\n }\n\n .modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .modal-header h3 {\n margin: 0;\n font-size: 16px;\n color: var(--mj-text-primary);\n }\n\n .modal-close {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px 8px;\n }\n\n .modal-body {\n padding: 20px;\n }\n\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .form-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n box-sizing: border-box;\n }\n\n .form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n textarea.form-input {\n resize: vertical;\n }\n\n .form-info {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .form-info i {\n color: var(--mj-brand-primary);\n }\n\n .modal-footer {\n display: flex;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-secondary {\n padding: 10px 20px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n }\n\n .btn-secondary:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n /* Add to List Dialog */\n .add-to-list-dialog {\n width: 480px;\n }\n\n .add-to-list-dialog .modal-body {\n max-height: 400px;\n overflow-y: auto;\n }\n\n /* Export dialog (mockup 26) */\n .export-dialog .modal-body { max-height: 60vh; overflow-y: auto; }\n .export-format-row { display: flex; gap: 8px; margin-top: 8px; }\n .export-format-option {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n cursor: pointer;\n font-size: 13px;\n background: var(--mj-bg-surface);\n }\n .export-format-option--selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, transparent);\n }\n .export-format-option input[type=\"radio\"] { margin: 0; }\n .export-section-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 16px 0;\n }\n .export-section-label {\n display: block;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n margin-bottom: 8px;\n }\n .export-fields-list {\n max-height: 220px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n }\n .export-field-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 13px;\n cursor: pointer;\n }\n .export-field-row:last-child { border-bottom: none; }\n .export-field-row:hover { background: var(--mj-bg-surface-hover); }\n .export-field-actions {\n display: flex;\n gap: 12px;\n margin-top: 8px;\n align-items: center;\n font-size: 11.5px;\n }\n .export-field-actions a { color: var(--mj-text-link); }\n .export-field-actions .muted {\n margin-left: auto;\n color: var(--mj-text-muted);\n }\n\n .list-search {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n margin-bottom: 12px;\n }\n\n .list-search i {\n color: var(--mj-text-muted);\n flex-shrink: 0;\n }\n\n .list-search .form-input {\n flex: 1;\n border: none;\n background: transparent;\n padding: 0;\n font-size: 14px;\n }\n\n .list-search .form-input:focus {\n box-shadow: none;\n outline: none;\n }\n\n .list-options {\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n max-height: 250px;\n overflow-y: auto;\n }\n\n .list-option {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n cursor: pointer;\n transition: background 0.15s;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .list-option:last-child {\n border-bottom: none;\n }\n\n .list-option:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-option.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .list-option-radio {\n flex-shrink: 0;\n }\n\n .list-option-radio input[type=\"radio\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n }\n\n .list-option-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .list-option-name {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-option-entity {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .list-options-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 30px 20px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .list-options-empty i {\n font-size: 28px;\n margin-bottom: 10px;\n opacity: 0.5;\n }\n\n .list-options-empty p {\n margin: 0;\n font-size: 13px;\n }\n\n /* Responsive */\n @media (max-width: 1024px) {\n .operations-content {\n grid-template-columns: 1fr;\n grid-template-rows: auto 1fr auto;\n }\n\n .selection-panel {\n order: 1;\n }\n\n .venn-panel {\n order: 2;\n min-height: 300px;\n }\n\n .results-panel {\n order: 3;\n }\n }\n\n /* Compose-into-target panel (Phase 1.10) */\n .compose-panel {\n margin: 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n overflow: hidden;\n }\n\n .compose-panel__header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .compose-panel__header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .compose-panel__body {\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .compose-grid {\n display: grid;\n grid-template-columns: 1.2fr auto 1fr auto 1fr;\n gap: 16px;\n align-items: flex-start;\n }\n\n .compose-arrow {\n align-self: center;\n font-size: 24px;\n color: var(--mj-text-muted);\n }\n\n .compose-column {\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-width: 0;\n }\n\n .compose-column__label {\n font-size: 11px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n }\n\n .compose-sources {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .compose-source-chip {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n font-size: 12.5px;\n }\n\n .compose-source-chip--view {\n border: 1px dashed var(--mj-border-default);\n background: var(--mj-bg-surface);\n }\n\n .compose-source-name {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .compose-source-badge {\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 999px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n\n .compose-source-badge--view {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .compose-options {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .compose-option {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n font-size: 12.5px;\n }\n\n .compose-option--selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, var(--mj-bg-surface));\n }\n\n .compose-option__title {\n font-weight: 600;\n }\n\n .compose-option__desc {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n }\n\n .compose-input {\n width: 100%;\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n font-size: 12.5px;\n }\n\n .compose-target-search {\n position: relative;\n }\n\n .compose-target-dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: 50;\n }\n\n .compose-footer {\n display: flex;\n align-items: center;\n gap: 10px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .compose-footer__spacer { flex: 1; }\n\n .compose-footer__hint {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .op-btn--primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .op-btn--primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n "] }]
2776
+ }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.ListSetOperationsService }, { type: i2.MJNotificationService }, { type: i3.ExportService }], null); })();
2777
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ListsOperationsResource, { className: "ListsOperationsResource", filePath: "src/Lists/components/lists-operations-resource.component.ts", lineNumber: 1841 }); })();
1578
2778
  //# sourceMappingURL=lists-operations-resource.component.js.map