@memberjunction/ng-dashboards 5.35.0 → 5.37.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
@@ -5,10 +5,12 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  import { Component, ViewEncapsulation, HostListener } from '@angular/core';
8
- import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
8
+ import { RegisterClass, UUIDsEqual, MJGlobal } from '@memberjunction/global';
9
9
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
10
- import { RunView } from '@memberjunction/core';
10
+ import { BaseEntity, RunView } from '@memberjunction/core';
11
11
  import { Subject } from 'rxjs';
12
+ import { takeUntil } from 'rxjs/operators';
13
+ import { CapabilitiesForLevel } from '@memberjunction/lists-base';
12
14
  import * as i0 from "@angular/core";
13
15
  import * as i1 from "@memberjunction/ng-base-application";
14
16
  import * as i2 from "@memberjunction/ng-notifications";
@@ -19,15 +21,44 @@ import * as i6 from "@memberjunction/ng-ui-components";
19
21
  import * as i7 from "@memberjunction/ng-shared-generic";
20
22
  const _c0 = a0 => ({ node: a0, depth: 0 });
21
23
  const _c1 = (a0, a1) => ({ node: a0, depth: a1 });
22
- function ListsBrowseResource_Conditional_14_Template(rf, ctx) { if (rf & 1) {
23
- i0.ɵɵelementStart(0, "div", 13);
24
- i0.ɵɵelement(1, "mj-loading", 24);
24
+ const _forTrack0 = ($index, $item) => $item.TagID;
25
+ function ListsBrowseResource_Conditional_17_For_5_Template(rf, ctx) { if (rf & 1) {
26
+ const _r3 = i0.ɵɵgetCurrentView();
27
+ i0.ɵɵelementStart(0, "button", 31);
28
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_17_For_5_Template_button_click_0_listener() { const f_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.removeTagFilter(f_r4.TagID)); });
29
+ i0.ɵɵtext(1);
30
+ i0.ɵɵelement(2, "i", 32);
25
31
  i0.ɵɵelementEnd();
32
+ } if (rf & 2) {
33
+ const f_r4 = ctx.$implicit;
34
+ i0.ɵɵadvance();
35
+ i0.ɵɵtextInterpolate1(" ", f_r4.Name, " ");
26
36
  } }
27
- function ListsBrowseResource_Conditional_15_Template(rf, ctx) { if (rf & 1) {
37
+ function ListsBrowseResource_Conditional_17_Template(rf, ctx) { if (rf & 1) {
28
38
  const _r2 = i0.ɵɵgetCurrentView();
29
- i0.ɵɵelementStart(0, "div", 14)(1, "div", 25);
30
- i0.ɵɵelement(2, "div", 26)(3, "i", 27);
39
+ i0.ɵɵelementStart(0, "div", 14)(1, "span", 27);
40
+ i0.ɵɵelement(2, "i", 28);
41
+ i0.ɵɵtext(3, " Filtering by tag: ");
42
+ i0.ɵɵelementEnd();
43
+ i0.ɵɵrepeaterCreate(4, ListsBrowseResource_Conditional_17_For_5_Template, 3, 1, "button", 29, _forTrack0);
44
+ i0.ɵɵelementStart(6, "button", 30);
45
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_17_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r2); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.clearTagFilters()); });
46
+ i0.ɵɵtext(7, " Clear all ");
47
+ i0.ɵɵelementEnd()();
48
+ } if (rf & 2) {
49
+ const ctx_r4 = i0.ɵɵnextContext();
50
+ i0.ɵɵadvance(4);
51
+ i0.ɵɵrepeater(ctx_r4.tagFilters);
52
+ } }
53
+ function ListsBrowseResource_Conditional_18_Template(rf, ctx) { if (rf & 1) {
54
+ i0.ɵɵelementStart(0, "div", 15);
55
+ i0.ɵɵelement(1, "mj-loading", 33);
56
+ i0.ɵɵelementEnd();
57
+ } }
58
+ function ListsBrowseResource_Conditional_19_Template(rf, ctx) { if (rf & 1) {
59
+ const _r6 = i0.ɵɵgetCurrentView();
60
+ i0.ɵɵelementStart(0, "div", 16)(1, "div", 34);
61
+ i0.ɵɵelement(2, "div", 35)(3, "i", 36);
31
62
  i0.ɵɵelementEnd();
32
63
  i0.ɵɵelementStart(4, "h3");
33
64
  i0.ɵɵtext(5, "No Lists Yet");
@@ -35,31 +66,31 @@ function ListsBrowseResource_Conditional_15_Template(rf, ctx) { if (rf & 1) {
35
66
  i0.ɵɵelementStart(6, "p");
36
67
  i0.ɵɵtext(7, "Lists help you organize and track groups of records across your data.");
37
68
  i0.ɵɵelementEnd();
38
- i0.ɵɵelementStart(8, "div", 28)(9, "div", 29);
39
- i0.ɵɵelement(10, "i", 30);
69
+ i0.ɵɵelementStart(8, "div", 37)(9, "div", 38);
70
+ i0.ɵɵelement(10, "i", 39);
40
71
  i0.ɵɵelementStart(11, "span");
41
72
  i0.ɵɵtext(12, "Group records from any entity");
42
73
  i0.ɵɵelementEnd()();
43
- i0.ɵɵelementStart(13, "div", 29);
44
- i0.ɵɵelement(14, "i", 30);
74
+ i0.ɵɵelementStart(13, "div", 38);
75
+ i0.ɵɵelement(14, "i", 39);
45
76
  i0.ɵɵelementStart(15, "span");
46
77
  i0.ɵɵtext(16, "Organize with categories");
47
78
  i0.ɵɵelementEnd()();
48
- i0.ɵɵelementStart(17, "div", 29);
49
- i0.ɵɵelement(18, "i", 30);
79
+ i0.ɵɵelementStart(17, "div", 38);
80
+ i0.ɵɵelement(18, "i", 39);
50
81
  i0.ɵɵelementStart(19, "span");
51
82
  i0.ɵɵtext(20, "Quick access from any view");
52
83
  i0.ɵɵelementEnd()()();
53
- i0.ɵɵelementStart(21, "button", 31);
54
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_15_Template_button_click_21_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.createNewList()); });
55
- i0.ɵɵelement(22, "i", 10);
84
+ i0.ɵɵelementStart(21, "button", 40);
85
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_19_Template_button_click_21_listener() { i0.ɵɵrestoreView(_r6); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.createNewList()); });
86
+ i0.ɵɵelement(22, "i", 11);
56
87
  i0.ɵɵtext(23, " Create Your First List ");
57
88
  i0.ɵɵelementEnd()();
58
89
  } }
59
- function ListsBrowseResource_Conditional_16_Template(rf, ctx) { if (rf & 1) {
60
- const _r4 = i0.ɵɵgetCurrentView();
61
- i0.ɵɵelementStart(0, "div", 15)(1, "div", 32);
62
- i0.ɵɵelement(2, "i", 33);
90
+ function ListsBrowseResource_Conditional_20_Template(rf, ctx) { if (rf & 1) {
91
+ const _r7 = i0.ɵɵgetCurrentView();
92
+ i0.ɵɵelementStart(0, "div", 17)(1, "div", 41);
93
+ i0.ɵɵelement(2, "i", 42);
63
94
  i0.ɵɵelementEnd();
64
95
  i0.ɵɵelementStart(3, "h3");
65
96
  i0.ɵɵtext(4, "No Results Found");
@@ -67,674 +98,736 @@ function ListsBrowseResource_Conditional_16_Template(rf, ctx) { if (rf & 1) {
67
98
  i0.ɵɵelementStart(5, "p");
68
99
  i0.ɵɵtext(6, "No lists match your current filters.");
69
100
  i0.ɵɵelementEnd();
70
- i0.ɵɵelementStart(7, "p", 34);
101
+ i0.ɵɵelementStart(7, "p", 43);
71
102
  i0.ɵɵtext(8, "Try adjusting your search or filters.");
72
103
  i0.ɵɵelementEnd();
73
- i0.ɵɵelementStart(9, "button", 35);
74
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_16_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.clearFilters()); });
104
+ i0.ɵɵelementStart(9, "button", 44);
105
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_20_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r7); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.clearFilters()); });
75
106
  i0.ɵɵtext(10, "Clear All Filters");
76
107
  i0.ɵɵelementEnd()();
77
108
  } }
78
- function ListsBrowseResource_Conditional_17_For_7_Template(rf, ctx) { if (rf & 1) {
79
- i0.ɵɵelementStart(0, "option", 39);
109
+ function ListsBrowseResource_Conditional_21_For_9_Template(rf, ctx) { if (rf & 1) {
110
+ i0.ɵɵelementStart(0, "option", 49);
80
111
  i0.ɵɵtext(1);
81
112
  i0.ɵɵelementEnd();
82
113
  } if (rf & 2) {
83
- const opt_r6 = ctx.$implicit;
84
- i0.ɵɵproperty("value", opt_r6.value);
114
+ const opt_r9 = ctx.$implicit;
115
+ i0.ɵɵproperty("value", opt_r9.value);
85
116
  i0.ɵɵadvance();
86
- i0.ɵɵtextInterpolate(opt_r6.name);
117
+ i0.ɵɵtextInterpolate(opt_r9.name);
87
118
  } }
88
- function ListsBrowseResource_Conditional_17_Conditional_8_For_21_Conditional_8_Template(rf, ctx) { if (rf & 1) {
89
- i0.ɵɵelementStart(0, "span", 59);
119
+ function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_8_Template(rf, ctx) { if (rf & 1) {
120
+ i0.ɵɵelementStart(0, "span", 69);
90
121
  i0.ɵɵtext(1);
91
122
  i0.ɵɵelementEnd();
92
123
  } if (rf & 2) {
93
- const item_r8 = i0.ɵɵnextContext().$implicit;
124
+ const item_r11 = i0.ɵɵnextContext().$implicit;
94
125
  i0.ɵɵadvance();
95
- i0.ɵɵtextInterpolate(item_r8.list.Description);
126
+ i0.ɵɵtextInterpolate(item_r11.list.Description);
96
127
  } }
97
- function ListsBrowseResource_Conditional_17_Conditional_8_For_21_Conditional_15_Conditional_0_Template(rf, ctx) { if (rf & 1) {
98
- i0.ɵɵelementStart(0, "span", 70);
99
- i0.ɵɵelement(1, "i", 71);
100
- i0.ɵɵelementStart(2, "span", 72);
128
+ function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_15_Conditional_0_Template(rf, ctx) { if (rf & 1) {
129
+ i0.ɵɵelementStart(0, "span", 81);
130
+ i0.ɵɵelement(1, "i", 82);
131
+ i0.ɵɵelementStart(2, "span", 83);
101
132
  i0.ɵɵtext(3);
102
133
  i0.ɵɵelementEnd()();
103
134
  } if (rf & 2) {
104
- const sharing_r9 = i0.ɵɵnextContext();
135
+ const sharing_r12 = i0.ɵɵnextContext();
105
136
  i0.ɵɵadvance(3);
106
- i0.ɵɵtextInterpolate(sharing_r9.totalShares);
137
+ i0.ɵɵtextInterpolate(sharing_r12.totalShares);
107
138
  } }
108
- function ListsBrowseResource_Conditional_17_Conditional_8_For_21_Conditional_15_Conditional_1_Template(rf, ctx) { if (rf & 1) {
109
- i0.ɵɵelementStart(0, "span", 64);
110
- i0.ɵɵelement(1, "i", 73);
139
+ function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_15_Conditional_1_Template(rf, ctx) { if (rf & 1) {
140
+ i0.ɵɵelementStart(0, "span", 74);
141
+ i0.ɵɵelement(1, "i", 84);
111
142
  i0.ɵɵelementEnd();
112
143
  } }
113
- function ListsBrowseResource_Conditional_17_Conditional_8_For_21_Conditional_15_Template(rf, ctx) { if (rf & 1) {
114
- i0.ɵɵconditionalCreate(0, ListsBrowseResource_Conditional_17_Conditional_8_For_21_Conditional_15_Conditional_0_Template, 4, 1, "span", 70);
115
- i0.ɵɵconditionalCreate(1, ListsBrowseResource_Conditional_17_Conditional_8_For_21_Conditional_15_Conditional_1_Template, 2, 0, "span", 64);
144
+ function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_15_Template(rf, ctx) { if (rf & 1) {
145
+ i0.ɵɵconditionalCreate(0, ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_15_Conditional_0_Template, 4, 1, "span", 81);
146
+ i0.ɵɵconditionalCreate(1, ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_15_Conditional_1_Template, 2, 0, "span", 74);
116
147
  } if (rf & 2) {
117
- const sharing_r9 = ctx;
118
- i0.ɵɵconditional(sharing_r9.totalShares > 0 ? 0 : -1);
148
+ const sharing_r12 = ctx;
149
+ i0.ɵɵconditional(sharing_r12.totalShares > 0 ? 0 : -1);
119
150
  i0.ɵɵadvance();
120
- i0.ɵɵconditional(sharing_r9.totalShares === 0 ? 1 : -1);
151
+ i0.ɵɵconditional(sharing_r12.totalShares === 0 ? 1 : -1);
121
152
  } }
122
- function ListsBrowseResource_Conditional_17_Conditional_8_For_21_Conditional_16_Template(rf, ctx) { if (rf & 1) {
123
- i0.ɵɵelementStart(0, "span", 64);
124
- i0.ɵɵelement(1, "i", 73);
153
+ function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_16_Template(rf, ctx) { if (rf & 1) {
154
+ i0.ɵɵelementStart(0, "span", 74);
155
+ i0.ɵɵelement(1, "i", 84);
125
156
  i0.ɵɵelementEnd();
126
157
  } }
127
- function ListsBrowseResource_Conditional_17_Conditional_8_For_21_Conditional_23_Template(rf, ctx) { if (rf & 1) {
158
+ function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Template(rf, ctx) { if (rf & 1) {
128
159
  const _r10 = i0.ɵɵgetCurrentView();
129
- i0.ɵɵelementStart(0, "button", 74);
130
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_17_Conditional_8_For_21_Conditional_23_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r10); const item_r8 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openListMenu($event, item_r8)); });
131
- i0.ɵɵelement(1, "i", 75);
132
- i0.ɵɵelementEnd();
133
- } }
134
- function ListsBrowseResource_Conditional_17_Conditional_8_For_21_Template(rf, ctx) { if (rf & 1) {
135
- const _r7 = i0.ɵɵgetCurrentView();
136
- i0.ɵɵelementStart(0, "tr", 53);
137
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_17_Conditional_8_For_21_Template_tr_click_0_listener() { const item_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openList(item_r8)); })("keydown.enter", function ListsBrowseResource_Conditional_17_Conditional_8_For_21_Template_tr_keydown_enter_0_listener() { const item_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openList(item_r8)); });
138
- i0.ɵɵelementStart(1, "td", 54)(2, "div", 55)(3, "div", 56);
160
+ i0.ɵɵelementStart(0, "tr", 63);
161
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Template_tr_click_0_listener() { const item_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openList(item_r11)); })("keydown.enter", function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Template_tr_keydown_enter_0_listener() { const item_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openList(item_r11)); });
162
+ i0.ɵɵelementStart(1, "td", 64)(2, "div", 65)(3, "div", 66);
139
163
  i0.ɵɵelement(4, "i");
140
164
  i0.ɵɵelementEnd();
141
- i0.ɵɵelementStart(5, "div", 57)(6, "span", 58);
165
+ i0.ɵɵelementStart(5, "div", 67)(6, "span", 68);
142
166
  i0.ɵɵtext(7);
143
167
  i0.ɵɵelementEnd();
144
- i0.ɵɵconditionalCreate(8, ListsBrowseResource_Conditional_17_Conditional_8_For_21_Conditional_8_Template, 2, 1, "span", 59);
168
+ i0.ɵɵconditionalCreate(8, ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_8_Template, 2, 1, "span", 69);
145
169
  i0.ɵɵelementEnd()()();
146
- i0.ɵɵelementStart(9, "td", 60)(10, "span", 61);
170
+ i0.ɵɵelementStart(9, "td", 70)(10, "span", 71);
147
171
  i0.ɵɵtext(11);
148
172
  i0.ɵɵelementEnd()();
149
- i0.ɵɵelementStart(12, "td", 62);
173
+ i0.ɵɵelementStart(12, "td", 72);
150
174
  i0.ɵɵtext(13);
151
175
  i0.ɵɵelementEnd();
152
- i0.ɵɵelementStart(14, "td", 63);
153
- i0.ɵɵconditionalCreate(15, ListsBrowseResource_Conditional_17_Conditional_8_For_21_Conditional_15_Template, 2, 2);
154
- i0.ɵɵconditionalCreate(16, ListsBrowseResource_Conditional_17_Conditional_8_For_21_Conditional_16_Template, 2, 0, "span", 64);
176
+ i0.ɵɵelementStart(14, "td", 73);
177
+ i0.ɵɵconditionalCreate(15, ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_15_Template, 2, 2);
178
+ i0.ɵɵconditionalCreate(16, ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_16_Template, 2, 0, "span", 74);
155
179
  i0.ɵɵelementEnd();
156
- i0.ɵɵelementStart(17, "td", 65)(18, "span", 66);
180
+ i0.ɵɵelementStart(17, "td", 75)(18, "span", 76);
157
181
  i0.ɵɵtext(19);
158
182
  i0.ɵɵelementEnd()();
159
- i0.ɵɵelementStart(20, "td", 67);
183
+ i0.ɵɵelementStart(20, "td", 77);
160
184
  i0.ɵɵtext(21);
161
185
  i0.ɵɵelementEnd();
162
- i0.ɵɵelementStart(22, "td", 68);
163
- i0.ɵɵconditionalCreate(23, ListsBrowseResource_Conditional_17_Conditional_8_For_21_Conditional_23_Template, 2, 0, "button", 69);
164
- i0.ɵɵelementEnd()();
186
+ i0.ɵɵelementStart(22, "td", 78)(23, "button", 79);
187
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Template_button_click_23_listener($event) { const item_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openListMenu($event, item_r11)); });
188
+ i0.ɵɵelement(24, "i", 80);
189
+ i0.ɵɵelementEnd()()();
165
190
  } if (rf & 2) {
166
191
  let tmp_19_0;
167
- const item_r8 = ctx.$implicit;
168
- const ctx_r2 = i0.ɵɵnextContext(3);
192
+ const item_r11 = ctx.$implicit;
193
+ const ctx_r4 = i0.ɵɵnextContext(3);
169
194
  i0.ɵɵadvance(3);
170
- i0.ɵɵstyleProp("background-color", ctx_r2.getEntityColor(item_r8.entityName));
195
+ i0.ɵɵstyleProp("background-color", ctx_r4.getEntityColor(item_r11.entityName));
171
196
  i0.ɵɵadvance();
172
- i0.ɵɵclassMap(ctx_r2.getEntityIcon(item_r8.entityName));
197
+ i0.ɵɵclassMap(ctx_r4.getEntityIcon(item_r11.entityName));
173
198
  i0.ɵɵadvance(3);
174
- i0.ɵɵtextInterpolate(item_r8.list.Name);
199
+ i0.ɵɵtextInterpolate(item_r11.list.Name);
175
200
  i0.ɵɵadvance();
176
- i0.ɵɵconditional(item_r8.list.Description ? 8 : -1);
201
+ i0.ɵɵconditional(item_r11.list.Description ? 8 : -1);
177
202
  i0.ɵɵadvance(3);
178
- i0.ɵɵtextInterpolate(item_r8.entityName);
203
+ i0.ɵɵtextInterpolate(item_r11.entityName);
179
204
  i0.ɵɵadvance(2);
180
- i0.ɵɵtextInterpolate(item_r8.itemCount);
205
+ i0.ɵɵtextInterpolate(item_r11.itemCount);
181
206
  i0.ɵɵadvance(2);
182
- i0.ɵɵconditional((tmp_19_0 = item_r8.sharingInfo) ? 15 : -1, tmp_19_0);
207
+ i0.ɵɵconditional((tmp_19_0 = item_r11.sharingInfo) ? 15 : -1, tmp_19_0);
183
208
  i0.ɵɵadvance();
184
- i0.ɵɵconditional(!item_r8.sharingInfo ? 16 : -1);
209
+ i0.ɵɵconditional(!item_r11.sharingInfo ? 16 : -1);
185
210
  i0.ɵɵadvance(2);
186
- i0.ɵɵclassProp("is-me", item_r8.isOwner);
211
+ i0.ɵɵclassProp("is-me", item_r11.isOwner);
187
212
  i0.ɵɵadvance();
188
- i0.ɵɵtextInterpolate1(" ", item_r8.isOwner ? "You" : item_r8.ownerName, " ");
189
- i0.ɵɵadvance(2);
190
- i0.ɵɵtextInterpolate(ctx_r2.formatDate(item_r8.list.__mj_UpdatedAt));
213
+ i0.ɵɵtextInterpolate1(" ", item_r11.isOwner ? "You" : item_r11.ownerName, " ");
191
214
  i0.ɵɵadvance(2);
192
- i0.ɵɵconditional(item_r8.isOwner ? 23 : -1);
215
+ i0.ɵɵtextInterpolate(ctx_r4.formatDate(item_r11.list.__mj_UpdatedAt));
193
216
  } }
194
- function ListsBrowseResource_Conditional_17_Conditional_8_Template(rf, ctx) { if (rf & 1) {
195
- i0.ɵɵelementStart(0, "div", 40)(1, "table", 43)(2, "thead")(3, "tr")(4, "th", 44);
217
+ function ListsBrowseResource_Conditional_21_Conditional_10_Template(rf, ctx) { if (rf & 1) {
218
+ i0.ɵɵelementStart(0, "div", 50)(1, "table", 53)(2, "thead")(3, "tr")(4, "th", 54);
196
219
  i0.ɵɵtext(5, "Name");
197
220
  i0.ɵɵelementEnd();
198
- i0.ɵɵelementStart(6, "th", 45);
221
+ i0.ɵɵelementStart(6, "th", 55);
199
222
  i0.ɵɵtext(7, "Entity");
200
223
  i0.ɵɵelementEnd();
201
- i0.ɵɵelementStart(8, "th", 46);
224
+ i0.ɵɵelementStart(8, "th", 56);
202
225
  i0.ɵɵtext(9, "Items");
203
226
  i0.ɵɵelementEnd();
204
- i0.ɵɵelementStart(10, "th", 47);
227
+ i0.ɵɵelementStart(10, "th", 57);
205
228
  i0.ɵɵtext(11, "Shared");
206
229
  i0.ɵɵelementEnd();
207
- i0.ɵɵelementStart(12, "th", 48);
230
+ i0.ɵɵelementStart(12, "th", 58);
208
231
  i0.ɵɵtext(13, "Owner");
209
232
  i0.ɵɵelementEnd();
210
- i0.ɵɵelementStart(14, "th", 49);
233
+ i0.ɵɵelementStart(14, "th", 59);
211
234
  i0.ɵɵtext(15, "Updated");
212
235
  i0.ɵɵelementEnd();
213
- i0.ɵɵelementStart(16, "th", 50)(17, "span", 51);
236
+ i0.ɵɵelementStart(16, "th", 60)(17, "span", 61);
214
237
  i0.ɵɵtext(18, "Actions");
215
238
  i0.ɵɵelementEnd()()()();
216
239
  i0.ɵɵelementStart(19, "tbody");
217
- i0.ɵɵrepeaterCreate(20, ListsBrowseResource_Conditional_17_Conditional_8_For_21_Template, 24, 15, "tr", 52, i0.ɵɵrepeaterTrackByIdentity);
240
+ i0.ɵɵrepeaterCreate(20, ListsBrowseResource_Conditional_21_Conditional_10_For_21_Template, 25, 14, "tr", 62, i0.ɵɵrepeaterTrackByIdentity);
218
241
  i0.ɵɵelementEnd()()();
219
242
  } if (rf & 2) {
220
- const ctx_r2 = i0.ɵɵnextContext(2);
243
+ const ctx_r4 = i0.ɵɵnextContext(2);
221
244
  i0.ɵɵadvance(20);
222
- i0.ɵɵrepeater(ctx_r2.filteredLists);
223
- } }
224
- function ListsBrowseResource_Conditional_17_Conditional_9_For_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
225
- const _r13 = i0.ɵɵgetCurrentView();
226
- i0.ɵɵelementStart(0, "div", 80)(1, "button", 93);
227
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_17_Conditional_9_For_2_Conditional_4_Template_button_click_1_listener($event) { i0.ɵɵrestoreView(_r13); const item_r12 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openListMenu($event, item_r12)); });
228
- i0.ɵɵelement(2, "i", 75);
229
- i0.ɵɵelementEnd()();
245
+ i0.ɵɵrepeater(ctx_r4.filteredLists);
230
246
  } }
231
- function ListsBrowseResource_Conditional_17_Conditional_9_For_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
232
- i0.ɵɵelementStart(0, "p", 83);
247
+ function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Conditional_12_Template(rf, ctx) { if (rf & 1) {
248
+ i0.ɵɵelementStart(0, "p", 94);
233
249
  i0.ɵɵtext(1);
234
250
  i0.ɵɵelementEnd();
235
251
  } if (rf & 2) {
236
- const item_r12 = i0.ɵɵnextContext().$implicit;
252
+ const item_r14 = i0.ɵɵnextContext().$implicit;
237
253
  i0.ɵɵadvance();
238
- i0.ɵɵtextInterpolate(item_r12.list.Description);
254
+ i0.ɵɵtextInterpolate(item_r14.list.Description);
239
255
  } }
240
- function ListsBrowseResource_Conditional_17_Conditional_9_For_2_Conditional_21_Conditional_0_Template(rf, ctx) { if (rf & 1) {
241
- i0.ɵɵelementStart(0, "span", 94);
242
- i0.ɵɵelement(1, "i", 71);
256
+ function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Conditional_27_Conditional_0_Template(rf, ctx) { if (rf & 1) {
257
+ i0.ɵɵelementStart(0, "span", 106);
258
+ i0.ɵɵelement(1, "i", 82);
243
259
  i0.ɵɵelementEnd();
244
260
  } if (rf & 2) {
245
- const sharing_r14 = i0.ɵɵnextContext();
246
- i0.ɵɵproperty("title", "Shared with " + sharing_r14.totalShares + " user(s)/role(s)");
261
+ const sharing_r15 = i0.ɵɵnextContext();
262
+ i0.ɵɵproperty("title", "Shared with " + sharing_r15.totalShares + " user(s)/role(s)");
247
263
  } }
248
- function ListsBrowseResource_Conditional_17_Conditional_9_For_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
249
- i0.ɵɵconditionalCreate(0, ListsBrowseResource_Conditional_17_Conditional_9_For_2_Conditional_21_Conditional_0_Template, 2, 1, "span", 94);
264
+ function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Conditional_27_Template(rf, ctx) { if (rf & 1) {
265
+ i0.ɵɵconditionalCreate(0, ListsBrowseResource_Conditional_21_Conditional_11_For_2_Conditional_27_Conditional_0_Template, 2, 1, "span", 106);
250
266
  } if (rf & 2) {
251
267
  i0.ɵɵconditional(ctx.totalShares > 0 ? 0 : -1);
252
268
  } }
253
- function ListsBrowseResource_Conditional_17_Conditional_9_For_2_Template(rf, ctx) { if (rf & 1) {
254
- const _r11 = i0.ɵɵgetCurrentView();
255
- i0.ɵɵelementStart(0, "div", 77);
256
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_17_Conditional_9_For_2_Template_div_click_0_listener() { const item_r12 = i0.ɵɵrestoreView(_r11).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openList(item_r12)); })("keydown.enter", function ListsBrowseResource_Conditional_17_Conditional_9_For_2_Template_div_keydown_enter_0_listener() { const item_r12 = i0.ɵɵrestoreView(_r11).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openList(item_r12)); });
257
- i0.ɵɵelementStart(1, "div", 78)(2, "div", 79);
269
+ function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template(rf, ctx) { if (rf & 1) {
270
+ const _r13 = i0.ɵɵgetCurrentView();
271
+ i0.ɵɵelementStart(0, "div", 86);
272
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template_div_click_0_listener() { const item_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openList(item_r14)); })("keydown.enter", function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template_div_keydown_enter_0_listener() { const item_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openList(item_r14)); });
273
+ i0.ɵɵelementStart(1, "div", 87)(2, "div", 88);
258
274
  i0.ɵɵelement(3, "i");
259
275
  i0.ɵɵelementEnd();
260
- i0.ɵɵconditionalCreate(4, ListsBrowseResource_Conditional_17_Conditional_9_For_2_Conditional_4_Template, 3, 0, "div", 80);
276
+ i0.ɵɵelementStart(4, "button", 89);
277
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template_button_click_4_listener($event) { const item_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.toggleFavorite($event, item_r14)); });
278
+ i0.ɵɵelement(5, "i");
261
279
  i0.ɵɵelementEnd();
262
- i0.ɵɵelementStart(5, "div", 81)(6, "h3", 82);
263
- i0.ɵɵtext(7);
280
+ i0.ɵɵelementStart(6, "div", 90)(7, "button", 91);
281
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template_button_click_7_listener($event) { const item_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openListMenu($event, item_r14)); });
282
+ i0.ɵɵelement(8, "i", 80);
283
+ i0.ɵɵelementEnd()()();
284
+ i0.ɵɵelementStart(9, "div", 92)(10, "h3", 93);
285
+ i0.ɵɵtext(11);
264
286
  i0.ɵɵelementEnd();
265
- i0.ɵɵconditionalCreate(8, ListsBrowseResource_Conditional_17_Conditional_9_For_2_Conditional_8_Template, 2, 1, "p", 83);
266
- i0.ɵɵelementStart(9, "div", 84)(10, "span", 85);
267
- i0.ɵɵelement(11, "i", 86);
268
- i0.ɵɵtext(12);
287
+ i0.ɵɵconditionalCreate(12, ListsBrowseResource_Conditional_21_Conditional_11_For_2_Conditional_12_Template, 2, 1, "p", 94);
288
+ i0.ɵɵelementStart(13, "div", 95)(14, "span", 96);
289
+ i0.ɵɵelement(15, "i", 97);
290
+ i0.ɵɵtext(16);
269
291
  i0.ɵɵelementEnd();
270
- i0.ɵɵelementStart(13, "span", 85);
271
- i0.ɵɵelement(14, "i", 87);
272
- i0.ɵɵtext(15);
273
- i0.ɵɵelementEnd()()();
274
- i0.ɵɵelementStart(16, "div", 88)(17, "span", 89);
275
- i0.ɵɵelement(18, "i", 90);
292
+ i0.ɵɵelementStart(17, "span", 96);
293
+ i0.ɵɵelement(18, "i", 98);
276
294
  i0.ɵɵtext(19);
277
- i0.ɵɵelementEnd();
278
- i0.ɵɵelementStart(20, "div", 91);
279
- i0.ɵɵconditionalCreate(21, ListsBrowseResource_Conditional_17_Conditional_9_For_2_Conditional_21_Template, 1, 1);
280
- i0.ɵɵelementStart(22, "span", 92);
281
- i0.ɵɵtext(23);
295
+ i0.ɵɵelementEnd()();
296
+ i0.ɵɵelementStart(20, "div", 99);
297
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template_div_click_20_listener($event) { i0.ɵɵrestoreView(_r13); return i0.ɵɵresetView($event.stopPropagation()); });
298
+ i0.ɵɵelementStart(21, "mj-tag-chips", 100);
299
+ i0.ɵɵlistener("TagClicked", function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template_mj_tag_chips_TagClicked_21_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.onCardTagClicked($event)); });
300
+ i0.ɵɵelementEnd()()();
301
+ i0.ɵɵelementStart(22, "div", 101)(23, "span", 102);
302
+ i0.ɵɵelement(24, "i", 103);
303
+ i0.ɵɵtext(25);
304
+ i0.ɵɵelementEnd();
305
+ i0.ɵɵelementStart(26, "div", 104);
306
+ i0.ɵɵconditionalCreate(27, ListsBrowseResource_Conditional_21_Conditional_11_For_2_Conditional_27_Template, 1, 1);
307
+ i0.ɵɵelementStart(28, "span", 105);
308
+ i0.ɵɵtext(29);
282
309
  i0.ɵɵelementEnd()()()();
283
310
  } if (rf & 2) {
284
- let tmp_22_0;
285
- const item_r12 = ctx.$implicit;
286
- const ctx_r2 = i0.ɵɵnextContext(3);
311
+ let tmp_28_0;
312
+ const item_r14 = ctx.$implicit;
313
+ const ctx_r4 = i0.ɵɵnextContext(3);
287
314
  i0.ɵɵadvance(2);
288
- i0.ɵɵstyleProp("background-color", ctx_r2.getEntityColor(item_r12.entityName));
315
+ i0.ɵɵstyleProp("background-color", ctx_r4.getEntityColor(item_r14.entityName));
289
316
  i0.ɵɵadvance();
290
- i0.ɵɵclassMap(ctx_r2.getEntityIcon(item_r12.entityName));
317
+ i0.ɵɵclassMap(ctx_r4.getEntityIcon(item_r14.entityName));
291
318
  i0.ɵɵadvance();
292
- i0.ɵɵconditional(item_r12.isOwner ? 4 : -1);
293
- i0.ɵɵadvance(3);
294
- i0.ɵɵtextInterpolate(item_r12.list.Name);
319
+ i0.ɵɵclassProp("favorite-btn--active", ctx_r4.isFavorite(item_r14.list.ID));
320
+ i0.ɵɵproperty("title", ctx_r4.isFavorite(item_r14.list.ID) ? "Remove from favorites" : "Add to favorites");
295
321
  i0.ɵɵadvance();
296
- i0.ɵɵconditional(item_r12.list.Description ? 8 : -1);
322
+ i0.ɵɵclassMap(ctx_r4.isFavorite(item_r14.list.ID) ? "fa-solid fa-star" : "fa-regular fa-star");
323
+ i0.ɵɵadvance(6);
324
+ i0.ɵɵtextInterpolate(item_r14.list.Name);
325
+ i0.ɵɵadvance();
326
+ i0.ɵɵconditional(item_r14.list.Description ? 12 : -1);
297
327
  i0.ɵɵadvance(4);
298
- i0.ɵɵtextInterpolate1(" ", item_r12.entityName, " ");
328
+ i0.ɵɵtextInterpolate1(" ", item_r14.entityName, " ");
299
329
  i0.ɵɵadvance(3);
300
- i0.ɵɵtextInterpolate2(" ", item_r12.itemCount, " item", item_r12.itemCount !== 1 ? "s" : "", " ");
330
+ i0.ɵɵtextInterpolate2(" ", item_r14.itemCount, " item", item_r14.itemCount !== 1 ? "s" : "", " ");
331
+ i0.ɵɵadvance(2);
332
+ i0.ɵɵproperty("Provider", ctx_r4.Provider)("RecordID", item_r14.list.ID)("Editable", false)("MaxDisplay", 3);
301
333
  i0.ɵɵadvance(2);
302
- i0.ɵɵclassProp("is-me", item_r12.isOwner);
334
+ i0.ɵɵclassProp("is-me", item_r14.isOwner);
303
335
  i0.ɵɵadvance(2);
304
- i0.ɵɵtextInterpolate1(" ", item_r12.isOwner ? "You" : item_r12.ownerName, " ");
336
+ i0.ɵɵtextInterpolate1(" ", item_r14.isOwner ? "You" : item_r14.ownerName, " ");
305
337
  i0.ɵɵadvance(2);
306
- i0.ɵɵconditional((tmp_22_0 = item_r12.sharingInfo) ? 21 : -1, tmp_22_0);
338
+ i0.ɵɵconditional((tmp_28_0 = item_r14.sharingInfo) ? 27 : -1, tmp_28_0);
307
339
  i0.ɵɵadvance(2);
308
- i0.ɵɵtextInterpolate(ctx_r2.formatDate(item_r12.list.__mj_UpdatedAt));
340
+ i0.ɵɵtextInterpolate(ctx_r4.formatDate(item_r14.list.__mj_UpdatedAt));
309
341
  } }
310
- function ListsBrowseResource_Conditional_17_Conditional_9_Template(rf, ctx) { if (rf & 1) {
311
- i0.ɵɵelementStart(0, "div", 41);
312
- i0.ɵɵrepeaterCreate(1, ListsBrowseResource_Conditional_17_Conditional_9_For_2_Template, 24, 15, "div", 76, i0.ɵɵrepeaterTrackByIdentity);
342
+ function ListsBrowseResource_Conditional_21_Conditional_11_Template(rf, ctx) { if (rf & 1) {
343
+ i0.ɵɵelementStart(0, "div", 51);
344
+ i0.ɵɵrepeaterCreate(1, ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template, 30, 23, "div", 85, i0.ɵɵrepeaterTrackByIdentity);
313
345
  i0.ɵɵelementEnd();
314
346
  } if (rf & 2) {
315
- const ctx_r2 = i0.ɵɵnextContext(2);
347
+ const ctx_r4 = i0.ɵɵnextContext(2);
316
348
  i0.ɵɵadvance();
317
- i0.ɵɵrepeater(ctx_r2.filteredLists);
349
+ i0.ɵɵrepeater(ctx_r4.filteredLists);
318
350
  } }
319
- function ListsBrowseResource_Conditional_17_Conditional_10_For_2_ng_container_0_Template(rf, ctx) { if (rf & 1) {
351
+ function ListsBrowseResource_Conditional_21_Conditional_12_For_2_ng_container_0_Template(rf, ctx) { if (rf & 1) {
320
352
  i0.ɵɵelementContainer(0);
321
353
  } }
322
- function ListsBrowseResource_Conditional_17_Conditional_10_For_2_Template(rf, ctx) { if (rf & 1) {
323
- i0.ɵɵtemplate(0, ListsBrowseResource_Conditional_17_Conditional_10_For_2_ng_container_0_Template, 1, 0, "ng-container", 95);
354
+ function ListsBrowseResource_Conditional_21_Conditional_12_For_2_Template(rf, ctx) { if (rf & 1) {
355
+ i0.ɵɵtemplate(0, ListsBrowseResource_Conditional_21_Conditional_12_For_2_ng_container_0_Template, 1, 0, "ng-container", 107);
324
356
  } if (rf & 2) {
325
- const node_r15 = ctx.$implicit;
357
+ const node_r16 = ctx.$implicit;
326
358
  i0.ɵɵnextContext(3);
327
- const categoryNodeTemplate_r16 = i0.ɵɵreference(19);
328
- i0.ɵɵproperty("ngTemplateOutlet", categoryNodeTemplate_r16)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, node_r15));
359
+ const categoryNodeTemplate_r17 = i0.ɵɵreference(23);
360
+ i0.ɵɵproperty("ngTemplateOutlet", categoryNodeTemplate_r17)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, node_r16));
329
361
  } }
330
- function ListsBrowseResource_Conditional_17_Conditional_10_Template(rf, ctx) { if (rf & 1) {
331
- i0.ɵɵelementStart(0, "div", 42);
332
- i0.ɵɵrepeaterCreate(1, ListsBrowseResource_Conditional_17_Conditional_10_For_2_Template, 1, 4, "ng-container", null, i0.ɵɵrepeaterTrackByIdentity);
362
+ function ListsBrowseResource_Conditional_21_Conditional_12_Template(rf, ctx) { if (rf & 1) {
363
+ i0.ɵɵelementStart(0, "div", 52);
364
+ i0.ɵɵrepeaterCreate(1, ListsBrowseResource_Conditional_21_Conditional_12_For_2_Template, 1, 4, "ng-container", null, i0.ɵɵrepeaterTrackByIdentity);
333
365
  i0.ɵɵelementEnd();
334
366
  } if (rf & 2) {
335
- const ctx_r2 = i0.ɵɵnextContext(2);
367
+ const ctx_r4 = i0.ɵɵnextContext(2);
336
368
  i0.ɵɵadvance();
337
- i0.ɵɵrepeater(ctx_r2.categoryTree);
369
+ i0.ɵɵrepeater(ctx_r4.categoryTree);
338
370
  } }
339
- function ListsBrowseResource_Conditional_17_Template(rf, ctx) { if (rf & 1) {
340
- const _r5 = i0.ɵɵgetCurrentView();
341
- i0.ɵɵelementStart(0, "div", 16)(1, "div", 36)(2, "div", 37)(3, "label");
342
- i0.ɵɵtext(4, "Sort:");
343
- i0.ɵɵelementEnd();
344
- i0.ɵɵelementStart(5, "select", 38);
345
- i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_17_Template_select_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.selectedSort, $event) || (ctx_r2.selectedSort = $event); return i0.ɵɵresetView($event); });
346
- i0.ɵɵlistener("ngModelChange", function ListsBrowseResource_Conditional_17_Template_select_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onSortChange($event)); });
347
- i0.ɵɵrepeaterCreate(6, ListsBrowseResource_Conditional_17_For_7_Template, 2, 2, "option", 39, i0.ɵɵrepeaterTrackByIdentity);
371
+ function ListsBrowseResource_Conditional_21_Template(rf, ctx) { if (rf & 1) {
372
+ const _r8 = i0.ɵɵgetCurrentView();
373
+ i0.ɵɵelementStart(0, "div", 18)(1, "div", 45)(2, "span", 46);
374
+ i0.ɵɵtext(3);
375
+ i0.ɵɵelementEnd();
376
+ i0.ɵɵelementStart(4, "div", 47)(5, "label");
377
+ i0.ɵɵtext(6, "Sort:");
378
+ i0.ɵɵelementEnd();
379
+ i0.ɵɵelementStart(7, "select", 48);
380
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_21_Template_select_ngModelChange_7_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r4 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r4.selectedSort, $event) || (ctx_r4.selectedSort = $event); return i0.ɵɵresetView($event); });
381
+ i0.ɵɵlistener("ngModelChange", function ListsBrowseResource_Conditional_21_Template_select_ngModelChange_7_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.onSortChange($event)); });
382
+ i0.ɵɵrepeaterCreate(8, ListsBrowseResource_Conditional_21_For_9_Template, 2, 2, "option", 49, i0.ɵɵrepeaterTrackByIdentity);
348
383
  i0.ɵɵelementEnd()()();
349
- i0.ɵɵconditionalCreate(8, ListsBrowseResource_Conditional_17_Conditional_8_Template, 22, 0, "div", 40);
350
- i0.ɵɵconditionalCreate(9, ListsBrowseResource_Conditional_17_Conditional_9_Template, 3, 0, "div", 41);
351
- i0.ɵɵconditionalCreate(10, ListsBrowseResource_Conditional_17_Conditional_10_Template, 3, 0, "div", 42);
384
+ i0.ɵɵconditionalCreate(10, ListsBrowseResource_Conditional_21_Conditional_10_Template, 22, 0, "div", 50);
385
+ i0.ɵɵconditionalCreate(11, ListsBrowseResource_Conditional_21_Conditional_11_Template, 3, 0, "div", 51);
386
+ i0.ɵɵconditionalCreate(12, ListsBrowseResource_Conditional_21_Conditional_12_Template, 3, 0, "div", 52);
352
387
  i0.ɵɵelementEnd();
353
388
  } if (rf & 2) {
354
- const ctx_r2 = i0.ɵɵnextContext();
355
- i0.ɵɵadvance(5);
356
- i0.ɵɵtwoWayProperty("ngModel", ctx_r2.selectedSort);
389
+ const ctx_r4 = i0.ɵɵnextContext();
390
+ i0.ɵɵadvance(3);
391
+ i0.ɵɵtextInterpolate2("", ctx_r4.filteredLists.length, " list", ctx_r4.filteredLists.length !== 1 ? "s" : "");
392
+ i0.ɵɵadvance(4);
393
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r4.selectedSort);
357
394
  i0.ɵɵadvance();
358
- i0.ɵɵrepeater(ctx_r2.sortOptions);
395
+ i0.ɵɵrepeater(ctx_r4.sortOptions);
359
396
  i0.ɵɵadvance(2);
360
- i0.ɵɵconditional(ctx_r2.viewMode === "table" ? 8 : -1);
397
+ i0.ɵɵconditional(ctx_r4.viewMode === "table" ? 10 : -1);
361
398
  i0.ɵɵadvance();
362
- i0.ɵɵconditional(ctx_r2.viewMode === "card" ? 9 : -1);
399
+ i0.ɵɵconditional(ctx_r4.viewMode === "card" ? 11 : -1);
363
400
  i0.ɵɵadvance();
364
- i0.ɵɵconditional(ctx_r2.viewMode === "hierarchy" ? 10 : -1);
401
+ i0.ɵɵconditional(ctx_r4.viewMode === "hierarchy" ? 12 : -1);
365
402
  } }
366
- function ListsBrowseResource_ng_template_18_Conditional_1_Template(rf, ctx) { if (rf & 1) {
367
- const _r17 = i0.ɵɵgetCurrentView();
368
- i0.ɵɵelementStart(0, "div", 100);
369
- i0.ɵɵlistener("click", function ListsBrowseResource_ng_template_18_Conditional_1_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r17); const node_r18 = i0.ɵɵnextContext().node; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.toggleCategory(node_r18)); });
370
- i0.ɵɵelement(1, "i")(2, "i", 101);
371
- i0.ɵɵelementStart(3, "span", 102);
403
+ function ListsBrowseResource_ng_template_22_Conditional_1_Template(rf, ctx) { if (rf & 1) {
404
+ const _r18 = i0.ɵɵgetCurrentView();
405
+ i0.ɵɵelementStart(0, "div", 112);
406
+ i0.ɵɵlistener("click", function ListsBrowseResource_ng_template_22_Conditional_1_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r18); const node_r19 = i0.ɵɵnextContext().node; const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.toggleCategory(node_r19)); });
407
+ i0.ɵɵelement(1, "i")(2, "i", 113);
408
+ i0.ɵɵelementStart(3, "span", 114);
372
409
  i0.ɵɵtext(4);
373
410
  i0.ɵɵelementEnd();
374
- i0.ɵɵelementStart(5, "span", 103);
411
+ i0.ɵɵelementStart(5, "span", 115);
375
412
  i0.ɵɵtext(6);
376
413
  i0.ɵɵelementEnd()();
377
414
  } if (rf & 2) {
378
- const node_r18 = i0.ɵɵnextContext().node;
379
- const ctx_r2 = i0.ɵɵnextContext();
415
+ const node_r19 = i0.ɵɵnextContext().node;
416
+ const ctx_r4 = i0.ɵɵnextContext();
380
417
  i0.ɵɵadvance();
381
- i0.ɵɵclassMap(node_r18.isExpanded ? "fa-solid fa-chevron-down" : "fa-solid fa-chevron-right");
418
+ i0.ɵɵclassMap(node_r19.isExpanded ? "fa-solid fa-chevron-down" : "fa-solid fa-chevron-right");
382
419
  i0.ɵɵadvance();
383
- i0.ɵɵclassProp("fa-folder-open", node_r18.isExpanded);
420
+ i0.ɵɵclassProp("fa-folder-open", node_r19.isExpanded);
384
421
  i0.ɵɵadvance(2);
385
- i0.ɵɵtextInterpolate(node_r18.category.Name);
422
+ i0.ɵɵtextInterpolate(node_r19.category.Name);
386
423
  i0.ɵɵadvance(2);
387
- i0.ɵɵtextInterpolate(ctx_r2.getListCountInCategory(node_r18));
424
+ i0.ɵɵtextInterpolate(ctx_r4.getListCountInCategory(node_r19));
388
425
  } }
389
- function ListsBrowseResource_ng_template_18_Conditional_2_Template(rf, ctx) { if (rf & 1) {
390
- const _r19 = i0.ɵɵgetCurrentView();
391
- i0.ɵɵelementStart(0, "div", 104);
392
- i0.ɵɵlistener("click", function ListsBrowseResource_ng_template_18_Conditional_2_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r19); const node_r18 = i0.ɵɵnextContext().node; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.toggleCategory(node_r18)); });
393
- i0.ɵɵelement(1, "i")(2, "i", 105);
394
- i0.ɵɵelementStart(3, "span", 102);
426
+ function ListsBrowseResource_ng_template_22_Conditional_2_Template(rf, ctx) { if (rf & 1) {
427
+ const _r20 = i0.ɵɵgetCurrentView();
428
+ i0.ɵɵelementStart(0, "div", 116);
429
+ i0.ɵɵlistener("click", function ListsBrowseResource_ng_template_22_Conditional_2_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r20); const node_r19 = i0.ɵɵnextContext().node; const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.toggleCategory(node_r19)); });
430
+ i0.ɵɵelement(1, "i")(2, "i", 117);
431
+ i0.ɵɵelementStart(3, "span", 114);
395
432
  i0.ɵɵtext(4, "Uncategorized");
396
433
  i0.ɵɵelementEnd();
397
- i0.ɵɵelementStart(5, "span", 103);
434
+ i0.ɵɵelementStart(5, "span", 115);
398
435
  i0.ɵɵtext(6);
399
436
  i0.ɵɵelementEnd()();
400
437
  } if (rf & 2) {
401
- const node_r18 = i0.ɵɵnextContext().node;
438
+ const node_r19 = i0.ɵɵnextContext().node;
402
439
  i0.ɵɵadvance();
403
- i0.ɵɵclassMap(node_r18.isExpanded ? "fa-solid fa-chevron-down" : "fa-solid fa-chevron-right");
440
+ i0.ɵɵclassMap(node_r19.isExpanded ? "fa-solid fa-chevron-down" : "fa-solid fa-chevron-right");
404
441
  i0.ɵɵadvance(5);
405
- i0.ɵɵtextInterpolate(node_r18.lists.length);
442
+ i0.ɵɵtextInterpolate(node_r19.lists.length);
406
443
  } }
407
- function ListsBrowseResource_ng_template_18_Conditional_3_For_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
444
+ function ListsBrowseResource_ng_template_22_Conditional_3_For_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
408
445
  i0.ɵɵelementStart(0, "span");
409
446
  i0.ɵɵtext(1);
410
447
  i0.ɵɵelementEnd();
411
448
  } if (rf & 2) {
412
- const item_r21 = i0.ɵɵnextContext().$implicit;
449
+ const item_r22 = i0.ɵɵnextContext().$implicit;
413
450
  i0.ɵɵadvance();
414
- i0.ɵɵtextInterpolate1(" \u00B7 ", item_r21.ownerName);
415
- } }
416
- function ListsBrowseResource_ng_template_18_Conditional_3_For_2_Conditional_9_Template(rf, ctx) { if (rf & 1) {
417
- const _r22 = i0.ɵɵgetCurrentView();
418
- i0.ɵɵelementStart(0, "div", 110)(1, "button", 111);
419
- i0.ɵɵlistener("click", function ListsBrowseResource_ng_template_18_Conditional_3_For_2_Conditional_9_Template_button_click_1_listener($event) { i0.ɵɵrestoreView(_r22); const item_r21 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openListMenu($event, item_r21)); });
420
- i0.ɵɵelement(2, "i", 75);
421
- i0.ɵɵelementEnd()();
451
+ i0.ɵɵtextInterpolate1(" \u00B7 ", item_r22.ownerName);
422
452
  } }
423
- function ListsBrowseResource_ng_template_18_Conditional_3_For_2_Template(rf, ctx) { if (rf & 1) {
424
- const _r20 = i0.ɵɵgetCurrentView();
425
- i0.ɵɵelementStart(0, "div", 107);
426
- i0.ɵɵlistener("click", function ListsBrowseResource_ng_template_18_Conditional_3_For_2_Template_div_click_0_listener() { const item_r21 = i0.ɵɵrestoreView(_r20).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openList(item_r21)); })("keydown.enter", function ListsBrowseResource_ng_template_18_Conditional_3_For_2_Template_div_keydown_enter_0_listener() { const item_r21 = i0.ɵɵrestoreView(_r20).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openList(item_r21)); });
427
- i0.ɵɵelementStart(1, "div", 56);
453
+ function ListsBrowseResource_ng_template_22_Conditional_3_For_2_Template(rf, ctx) { if (rf & 1) {
454
+ const _r21 = i0.ɵɵgetCurrentView();
455
+ i0.ɵɵelementStart(0, "div", 119);
456
+ i0.ɵɵlistener("click", function ListsBrowseResource_ng_template_22_Conditional_3_For_2_Template_div_click_0_listener() { const item_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openList(item_r22)); })("keydown.enter", function ListsBrowseResource_ng_template_22_Conditional_3_For_2_Template_div_keydown_enter_0_listener() { const item_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openList(item_r22)); });
457
+ i0.ɵɵelementStart(1, "div", 66);
428
458
  i0.ɵɵelement(2, "i");
429
459
  i0.ɵɵelementEnd();
430
- i0.ɵɵelementStart(3, "div", 108)(4, "span", 58);
460
+ i0.ɵɵelementStart(3, "div", 120)(4, "span", 68);
431
461
  i0.ɵɵtext(5);
432
462
  i0.ɵɵelementEnd();
433
- i0.ɵɵelementStart(6, "span", 109);
463
+ i0.ɵɵelementStart(6, "span", 121);
434
464
  i0.ɵɵtext(7);
435
- i0.ɵɵconditionalCreate(8, ListsBrowseResource_ng_template_18_Conditional_3_For_2_Conditional_8_Template, 2, 1, "span");
465
+ i0.ɵɵconditionalCreate(8, ListsBrowseResource_ng_template_22_Conditional_3_For_2_Conditional_8_Template, 2, 1, "span");
436
466
  i0.ɵɵelementEnd()();
437
- i0.ɵɵconditionalCreate(9, ListsBrowseResource_ng_template_18_Conditional_3_For_2_Conditional_9_Template, 3, 0, "div", 110);
438
- i0.ɵɵelementEnd();
467
+ i0.ɵɵelementStart(9, "div", 122)(10, "button", 123);
468
+ i0.ɵɵlistener("click", function ListsBrowseResource_ng_template_22_Conditional_3_For_2_Template_button_click_10_listener($event) { const item_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openListMenu($event, item_r22)); });
469
+ i0.ɵɵelement(11, "i", 80);
470
+ i0.ɵɵelementEnd()()();
439
471
  } if (rf & 2) {
440
- const item_r21 = ctx.$implicit;
441
- const ctx_r2 = i0.ɵɵnextContext(3);
472
+ const item_r22 = ctx.$implicit;
473
+ const ctx_r4 = i0.ɵɵnextContext(3);
442
474
  i0.ɵɵadvance();
443
- i0.ɵɵstyleProp("background-color", ctx_r2.getEntityColor(item_r21.entityName));
475
+ i0.ɵɵstyleProp("background-color", ctx_r4.getEntityColor(item_r22.entityName));
444
476
  i0.ɵɵadvance();
445
- i0.ɵɵclassMap(ctx_r2.getEntityIcon(item_r21.entityName));
477
+ i0.ɵɵclassMap(ctx_r4.getEntityIcon(item_r22.entityName));
446
478
  i0.ɵɵadvance(3);
447
- i0.ɵɵtextInterpolate(item_r21.list.Name);
479
+ i0.ɵɵtextInterpolate(item_r22.list.Name);
448
480
  i0.ɵɵadvance(2);
449
- i0.ɵɵtextInterpolate2(" ", item_r21.entityName, " \u00B7 ", item_r21.itemCount, " items ");
450
- i0.ɵɵadvance();
451
- i0.ɵɵconditional(!item_r21.isOwner ? 8 : -1);
481
+ i0.ɵɵtextInterpolate2(" ", item_r22.entityName, " \u00B7 ", item_r22.itemCount, " items ");
452
482
  i0.ɵɵadvance();
453
- i0.ɵɵconditional(item_r21.isOwner ? 9 : -1);
483
+ i0.ɵɵconditional(!item_r22.isOwner ? 8 : -1);
454
484
  } }
455
- function ListsBrowseResource_ng_template_18_Conditional_3_Template(rf, ctx) { if (rf & 1) {
456
- i0.ɵɵelementStart(0, "div", 99);
457
- i0.ɵɵrepeaterCreate(1, ListsBrowseResource_ng_template_18_Conditional_3_For_2_Template, 10, 9, "div", 106, i0.ɵɵrepeaterTrackByIdentity);
485
+ function ListsBrowseResource_ng_template_22_Conditional_3_Template(rf, ctx) { if (rf & 1) {
486
+ i0.ɵɵelementStart(0, "div", 111);
487
+ i0.ɵɵrepeaterCreate(1, ListsBrowseResource_ng_template_22_Conditional_3_For_2_Template, 12, 8, "div", 118, i0.ɵɵrepeaterTrackByIdentity);
458
488
  i0.ɵɵelementEnd();
459
489
  } if (rf & 2) {
460
- const node_r18 = i0.ɵɵnextContext().node;
490
+ const node_r19 = i0.ɵɵnextContext().node;
461
491
  i0.ɵɵadvance();
462
- i0.ɵɵrepeater(node_r18.lists);
492
+ i0.ɵɵrepeater(node_r19.lists);
463
493
  } }
464
- function ListsBrowseResource_ng_template_18_Conditional_4_For_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {
494
+ function ListsBrowseResource_ng_template_22_Conditional_4_For_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {
465
495
  i0.ɵɵelementContainer(0);
466
496
  } }
467
- function ListsBrowseResource_ng_template_18_Conditional_4_For_1_Template(rf, ctx) { if (rf & 1) {
468
- i0.ɵɵtemplate(0, ListsBrowseResource_ng_template_18_Conditional_4_For_1_ng_container_0_Template, 1, 0, "ng-container", 95);
497
+ function ListsBrowseResource_ng_template_22_Conditional_4_For_1_Template(rf, ctx) { if (rf & 1) {
498
+ i0.ɵɵtemplate(0, ListsBrowseResource_ng_template_22_Conditional_4_For_1_ng_container_0_Template, 1, 0, "ng-container", 107);
469
499
  } if (rf & 2) {
470
500
  const child_r23 = ctx.$implicit;
471
501
  const depth_r24 = i0.ɵɵnextContext(2).depth;
472
502
  i0.ɵɵnextContext();
473
- const categoryNodeTemplate_r16 = i0.ɵɵreference(19);
474
- i0.ɵɵproperty("ngTemplateOutlet", categoryNodeTemplate_r16)("ngTemplateOutletContext", i0.ɵɵpureFunction2(2, _c1, child_r23, depth_r24 + 1));
503
+ const categoryNodeTemplate_r17 = i0.ɵɵreference(23);
504
+ i0.ɵɵproperty("ngTemplateOutlet", categoryNodeTemplate_r17)("ngTemplateOutletContext", i0.ɵɵpureFunction2(2, _c1, child_r23, depth_r24 + 1));
475
505
  } }
476
- function ListsBrowseResource_ng_template_18_Conditional_4_Template(rf, ctx) { if (rf & 1) {
477
- i0.ɵɵrepeaterCreate(0, ListsBrowseResource_ng_template_18_Conditional_4_For_1_Template, 1, 5, "ng-container", null, i0.ɵɵrepeaterTrackByIdentity);
506
+ function ListsBrowseResource_ng_template_22_Conditional_4_Template(rf, ctx) { if (rf & 1) {
507
+ i0.ɵɵrepeaterCreate(0, ListsBrowseResource_ng_template_22_Conditional_4_For_1_Template, 1, 5, "ng-container", null, i0.ɵɵrepeaterTrackByIdentity);
478
508
  } if (rf & 2) {
479
- const node_r18 = i0.ɵɵnextContext().node;
480
- i0.ɵɵrepeater(node_r18.children);
509
+ const node_r19 = i0.ɵɵnextContext().node;
510
+ i0.ɵɵrepeater(node_r19.children);
481
511
  } }
482
- function ListsBrowseResource_ng_template_18_Template(rf, ctx) { if (rf & 1) {
483
- i0.ɵɵelementStart(0, "div", 96);
484
- i0.ɵɵconditionalCreate(1, ListsBrowseResource_ng_template_18_Conditional_1_Template, 7, 6, "div", 97);
485
- i0.ɵɵconditionalCreate(2, ListsBrowseResource_ng_template_18_Conditional_2_Template, 7, 3, "div", 98);
486
- i0.ɵɵconditionalCreate(3, ListsBrowseResource_ng_template_18_Conditional_3_Template, 3, 0, "div", 99);
487
- i0.ɵɵconditionalCreate(4, ListsBrowseResource_ng_template_18_Conditional_4_Template, 2, 0);
512
+ function ListsBrowseResource_ng_template_22_Template(rf, ctx) { if (rf & 1) {
513
+ i0.ɵɵelementStart(0, "div", 108);
514
+ i0.ɵɵconditionalCreate(1, ListsBrowseResource_ng_template_22_Conditional_1_Template, 7, 6, "div", 109);
515
+ i0.ɵɵconditionalCreate(2, ListsBrowseResource_ng_template_22_Conditional_2_Template, 7, 3, "div", 110);
516
+ i0.ɵɵconditionalCreate(3, ListsBrowseResource_ng_template_22_Conditional_3_Template, 3, 0, "div", 111);
517
+ i0.ɵɵconditionalCreate(4, ListsBrowseResource_ng_template_22_Conditional_4_Template, 2, 0);
488
518
  i0.ɵɵelementEnd();
489
519
  } if (rf & 2) {
490
- const node_r18 = ctx.node;
520
+ const node_r19 = ctx.node;
491
521
  const depth_r24 = ctx.depth;
492
522
  i0.ɵɵstyleProp("margin-left", depth_r24 * 20, "px");
493
523
  i0.ɵɵadvance();
494
- i0.ɵɵconditional(node_r18.category ? 1 : -1);
524
+ i0.ɵɵconditional(node_r19.category ? 1 : -1);
495
525
  i0.ɵɵadvance();
496
- i0.ɵɵconditional(!node_r18.category && node_r18.lists.length > 0 ? 2 : -1);
526
+ i0.ɵɵconditional(!node_r19.category && node_r19.lists.length > 0 ? 2 : -1);
497
527
  i0.ɵɵadvance();
498
- i0.ɵɵconditional(node_r18.isExpanded ? 3 : -1);
528
+ i0.ɵɵconditional(node_r19.isExpanded ? 3 : -1);
499
529
  i0.ɵɵadvance();
500
- i0.ɵɵconditional(node_r18.isExpanded ? 4 : -1);
530
+ i0.ɵɵconditional(node_r19.isExpanded ? 4 : -1);
501
531
  } }
502
- function ListsBrowseResource_Conditional_20_Template(rf, ctx) { if (rf & 1) {
532
+ function ListsBrowseResource_Conditional_24_Template(rf, ctx) { if (rf & 1) {
503
533
  const _r25 = i0.ɵɵgetCurrentView();
504
- i0.ɵɵelementStart(0, "div", 112);
505
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_20_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r25); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeContextMenu()); });
534
+ i0.ɵɵelementStart(0, "div", 124);
535
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_24_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r25); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeContextMenu()); });
506
536
  i0.ɵɵelementEnd();
507
537
  } }
508
- function ListsBrowseResource_Conditional_21_Template(rf, ctx) { if (rf & 1) {
538
+ function ListsBrowseResource_Conditional_25_Conditional_1_Template(rf, ctx) { if (rf & 1) {
539
+ const _r27 = i0.ɵɵgetCurrentView();
540
+ i0.ɵɵelementStart(0, "button", 127);
541
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_25_Conditional_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r27); const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.editList()); });
542
+ i0.ɵɵelement(1, "i", 130);
543
+ i0.ɵɵtext(2, " Edit ");
544
+ i0.ɵɵelementEnd();
545
+ } }
546
+ function ListsBrowseResource_Conditional_25_Conditional_2_Template(rf, ctx) { if (rf & 1) {
547
+ const _r28 = i0.ɵɵgetCurrentView();
548
+ i0.ɵɵelementStart(0, "button", 127);
549
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_25_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r28); const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.openShareDialog()); });
550
+ i0.ɵɵelement(1, "i", 82);
551
+ i0.ɵɵtext(2, " Share ");
552
+ i0.ɵɵelementEnd();
553
+ } }
554
+ function ListsBrowseResource_Conditional_25_Conditional_6_Template(rf, ctx) { if (rf & 1) {
555
+ const _r29 = i0.ɵɵgetCurrentView();
556
+ i0.ɵɵelement(0, "div", 131);
557
+ i0.ɵɵelementStart(1, "button", 132);
558
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_25_Conditional_6_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r29); const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.confirmDeleteList()); });
559
+ i0.ɵɵelement(2, "i", 133);
560
+ i0.ɵɵtext(3, " Delete ");
561
+ i0.ɵɵelementEnd();
562
+ } }
563
+ function ListsBrowseResource_Conditional_25_Conditional_7_Template(rf, ctx) { if (rf & 1) {
564
+ i0.ɵɵelementStart(0, "div", 129);
565
+ i0.ɵɵelement(1, "i", 134);
566
+ i0.ɵɵtext(2, " Viewer access \u2014 read only ");
567
+ i0.ɵɵelementEnd();
568
+ } }
569
+ function ListsBrowseResource_Conditional_25_Template(rf, ctx) { if (rf & 1) {
509
570
  const _r26 = i0.ɵɵgetCurrentView();
510
- i0.ɵɵelementStart(0, "div", 113)(1, "button", 114);
511
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r26); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.editList()); });
512
- i0.ɵɵelement(2, "i", 115);
513
- i0.ɵɵtext(3, " Edit ");
514
- i0.ɵɵelementEnd();
515
- i0.ɵɵelementStart(4, "button", 114);
516
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r26); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.openShareDialog()); });
517
- i0.ɵɵelement(5, "i", 71);
518
- i0.ɵɵtext(6, " Share ");
519
- i0.ɵɵelementEnd();
520
- i0.ɵɵelementStart(7, "button", 114);
521
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r26); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.duplicateList()); });
522
- i0.ɵɵelement(8, "i", 116);
523
- i0.ɵɵtext(9, " Duplicate ");
524
- i0.ɵɵelementEnd();
525
- i0.ɵɵelement(10, "div", 117);
526
- i0.ɵɵelementStart(11, "button", 118);
527
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r26); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.confirmDeleteList()); });
528
- i0.ɵɵelement(12, "i", 119);
529
- i0.ɵɵtext(13, " Delete ");
530
- i0.ɵɵelementEnd()();
571
+ i0.ɵɵelementStart(0, "div", 125);
572
+ i0.ɵɵconditionalCreate(1, ListsBrowseResource_Conditional_25_Conditional_1_Template, 3, 0, "button", 126);
573
+ i0.ɵɵconditionalCreate(2, ListsBrowseResource_Conditional_25_Conditional_2_Template, 3, 0, "button", 126);
574
+ i0.ɵɵelementStart(3, "button", 127);
575
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_25_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r26); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.duplicateList()); });
576
+ i0.ɵɵelement(4, "i", 128);
577
+ i0.ɵɵtext(5, " Duplicate ");
578
+ i0.ɵɵelementEnd();
579
+ i0.ɵɵconditionalCreate(6, ListsBrowseResource_Conditional_25_Conditional_6_Template, 4, 0);
580
+ i0.ɵɵconditionalCreate(7, ListsBrowseResource_Conditional_25_Conditional_7_Template, 3, 0, "div", 129);
581
+ i0.ɵɵelementEnd();
531
582
  } if (rf & 2) {
532
- const ctx_r2 = i0.ɵɵnextContext();
533
- i0.ɵɵstyleProp("top", ctx_r2.contextMenuY, "px")("left", ctx_r2.contextMenuX, "px");
583
+ const ctx_r4 = i0.ɵɵnextContext();
584
+ i0.ɵɵstyleProp("top", ctx_r4.contextMenuY, "px")("left", ctx_r4.contextMenuX, "px");
585
+ i0.ɵɵadvance();
586
+ i0.ɵɵconditional(ctx_r4.contextItemCapabilities.CanEdit ? 1 : -1);
587
+ i0.ɵɵadvance();
588
+ i0.ɵɵconditional(ctx_r4.contextItemCapabilities.CanShare ? 2 : -1);
589
+ i0.ɵɵadvance(4);
590
+ i0.ɵɵconditional(ctx_r4.contextItemCapabilities.CanDelete ? 6 : -1);
591
+ i0.ɵɵadvance();
592
+ i0.ɵɵconditional(!ctx_r4.contextItemCapabilities.CanEdit && !ctx_r4.contextItemCapabilities.CanShare && !ctx_r4.contextItemCapabilities.CanDelete ? 7 : -1);
534
593
  } }
535
- function ListsBrowseResource_Conditional_22_Template(rf, ctx) { if (rf & 1) {
536
- const _r27 = i0.ɵɵgetCurrentView();
537
- i0.ɵɵelementStart(0, "div", 120);
538
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_22_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r27); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeCreateDialog()); });
594
+ function ListsBrowseResource_Conditional_26_Template(rf, ctx) { if (rf & 1) {
595
+ const _r30 = i0.ɵɵgetCurrentView();
596
+ i0.ɵɵelementStart(0, "div", 135);
597
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_26_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r30); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeCreateDialog()); });
539
598
  i0.ɵɵelementEnd();
540
599
  } }
541
- function ListsBrowseResource_Conditional_23_Conditional_15_Template(rf, ctx) { if (rf & 1) {
542
- const _r29 = i0.ɵɵgetCurrentView();
543
- i0.ɵɵelementStart(0, "div", 125)(1, "label");
600
+ function ListsBrowseResource_Conditional_27_Conditional_15_Template(rf, ctx) { if (rf & 1) {
601
+ const _r32 = i0.ɵɵgetCurrentView();
602
+ i0.ɵɵelementStart(0, "div", 140)(1, "label");
544
603
  i0.ɵɵtext(2, "Entity *");
545
604
  i0.ɵɵelementEnd();
546
- i0.ɵɵelementStart(3, "div", 134)(4, "input", 135, 1);
547
- i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_23_Conditional_15_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.entitySearchTerm, $event) || (ctx_r2.entitySearchTerm = $event); return i0.ɵɵresetView($event); });
548
- i0.ɵɵlistener("ngModelChange", function ListsBrowseResource_Conditional_23_Conditional_15_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.filterEntities($event)); })("focus", function ListsBrowseResource_Conditional_23_Conditional_15_Template_input_focus_4_listener() { i0.ɵɵrestoreView(_r29); const entityInput_r30 = i0.ɵɵreference(5); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.openEntityDropdown(entityInput_r30)); });
605
+ i0.ɵɵelementStart(3, "div", 149)(4, "input", 150, 1);
606
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_27_Conditional_15_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r32); const ctx_r4 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r4.entitySearchTerm, $event) || (ctx_r4.entitySearchTerm = $event); return i0.ɵɵresetView($event); });
607
+ i0.ɵɵlistener("ngModelChange", function ListsBrowseResource_Conditional_27_Conditional_15_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r32); const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.filterEntities($event)); })("focus", function ListsBrowseResource_Conditional_27_Conditional_15_Template_input_focus_4_listener() { i0.ɵɵrestoreView(_r32); const entityInput_r33 = i0.ɵɵreference(5); const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.openEntityDropdown(entityInput_r33)); });
549
608
  i0.ɵɵelementEnd()()();
550
609
  } if (rf & 2) {
551
- const ctx_r2 = i0.ɵɵnextContext(2);
610
+ const ctx_r4 = i0.ɵɵnextContext(2);
552
611
  i0.ɵɵadvance(4);
553
- i0.ɵɵtwoWayProperty("ngModel", ctx_r2.entitySearchTerm);
612
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r4.entitySearchTerm);
554
613
  } }
555
- function ListsBrowseResource_Conditional_23_Conditional_16_Template(rf, ctx) { if (rf & 1) {
556
- i0.ɵɵelementStart(0, "div", 125)(1, "label");
614
+ function ListsBrowseResource_Conditional_27_Conditional_16_Template(rf, ctx) { if (rf & 1) {
615
+ i0.ɵɵelementStart(0, "div", 140)(1, "label");
557
616
  i0.ɵɵtext(2, "Entity");
558
617
  i0.ɵɵelementEnd();
559
- i0.ɵɵelement(3, "input", 136);
618
+ i0.ɵɵelement(3, "input", 151);
560
619
  i0.ɵɵelementEnd();
561
620
  } if (rf & 2) {
562
- const ctx_r2 = i0.ɵɵnextContext(2);
621
+ const ctx_r4 = i0.ɵɵnextContext(2);
563
622
  i0.ɵɵadvance(3);
564
- i0.ɵɵproperty("value", ctx_r2.entitySearchTerm);
623
+ i0.ɵɵproperty("value", ctx_r4.entitySearchTerm);
565
624
  } }
566
- function ListsBrowseResource_Conditional_23_For_24_Template(rf, ctx) { if (rf & 1) {
567
- i0.ɵɵelementStart(0, "option", 129);
625
+ function ListsBrowseResource_Conditional_27_For_24_Template(rf, ctx) { if (rf & 1) {
626
+ i0.ɵɵelementStart(0, "option", 144);
568
627
  i0.ɵɵtext(1);
569
628
  i0.ɵɵelementEnd();
570
629
  } if (rf & 2) {
571
- const cat_r31 = ctx.$implicit;
572
- i0.ɵɵproperty("ngValue", cat_r31.ID);
630
+ const cat_r34 = ctx.$implicit;
631
+ i0.ɵɵproperty("ngValue", cat_r34.ID);
573
632
  i0.ɵɵadvance();
574
- i0.ɵɵtextInterpolate(cat_r31.displayName);
633
+ i0.ɵɵtextInterpolate(cat_r34.displayName);
575
634
  } }
576
- function ListsBrowseResource_Conditional_23_Conditional_27_Template(rf, ctx) { if (rf & 1) {
577
- i0.ɵɵelement(0, "i", 132);
635
+ function ListsBrowseResource_Conditional_27_Conditional_27_Template(rf, ctx) { if (rf & 1) {
636
+ i0.ɵɵelement(0, "i", 147);
578
637
  } }
579
- function ListsBrowseResource_Conditional_23_Template(rf, ctx) { if (rf & 1) {
580
- const _r28 = i0.ɵɵgetCurrentView();
581
- i0.ɵɵelementStart(0, "div", 20)(1, "div", 121)(2, "h3");
638
+ function ListsBrowseResource_Conditional_27_Template(rf, ctx) { if (rf & 1) {
639
+ const _r31 = i0.ɵɵgetCurrentView();
640
+ i0.ɵɵelementStart(0, "div", 22)(1, "div", 136)(2, "h3");
582
641
  i0.ɵɵtext(3);
583
642
  i0.ɵɵelementEnd();
584
- i0.ɵɵelementStart(4, "button", 122);
585
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_23_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeCreateDialog()); });
586
- i0.ɵɵelement(5, "i", 123);
643
+ i0.ɵɵelementStart(4, "button", 137);
644
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_27_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r31); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeCreateDialog()); });
645
+ i0.ɵɵelement(5, "i", 138);
587
646
  i0.ɵɵelementEnd()();
588
- i0.ɵɵelementStart(6, "div", 124)(7, "div", 125)(8, "label");
647
+ i0.ɵɵelementStart(6, "div", 139)(7, "div", 140)(8, "label");
589
648
  i0.ɵɵtext(9, "Name *");
590
649
  i0.ɵɵelementEnd();
591
- i0.ɵɵelementStart(10, "input", 126);
592
- i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_23_Template_input_ngModelChange_10_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.newListName, $event) || (ctx_r2.newListName = $event); return i0.ɵɵresetView($event); });
650
+ i0.ɵɵelementStart(10, "input", 141);
651
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_27_Template_input_ngModelChange_10_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r4 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r4.newListName, $event) || (ctx_r4.newListName = $event); return i0.ɵɵresetView($event); });
593
652
  i0.ɵɵelementEnd()();
594
- i0.ɵɵelementStart(11, "div", 125)(12, "label");
653
+ i0.ɵɵelementStart(11, "div", 140)(12, "label");
595
654
  i0.ɵɵtext(13, "Description");
596
655
  i0.ɵɵelementEnd();
597
- i0.ɵɵelementStart(14, "textarea", 127);
598
- i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_23_Template_textarea_ngModelChange_14_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.newListDescription, $event) || (ctx_r2.newListDescription = $event); return i0.ɵɵresetView($event); });
656
+ i0.ɵɵelementStart(14, "textarea", 142);
657
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_27_Template_textarea_ngModelChange_14_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r4 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r4.newListDescription, $event) || (ctx_r4.newListDescription = $event); return i0.ɵɵresetView($event); });
599
658
  i0.ɵɵelementEnd()();
600
- i0.ɵɵconditionalCreate(15, ListsBrowseResource_Conditional_23_Conditional_15_Template, 6, 1, "div", 125);
601
- i0.ɵɵconditionalCreate(16, ListsBrowseResource_Conditional_23_Conditional_16_Template, 4, 1, "div", 125);
602
- i0.ɵɵelementStart(17, "div", 125)(18, "label");
659
+ i0.ɵɵconditionalCreate(15, ListsBrowseResource_Conditional_27_Conditional_15_Template, 6, 1, "div", 140);
660
+ i0.ɵɵconditionalCreate(16, ListsBrowseResource_Conditional_27_Conditional_16_Template, 4, 1, "div", 140);
661
+ i0.ɵɵelementStart(17, "div", 140)(18, "label");
603
662
  i0.ɵɵtext(19, "Category");
604
663
  i0.ɵɵelementEnd();
605
- i0.ɵɵelementStart(20, "select", 128);
606
- i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_23_Template_select_ngModelChange_20_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.selectedCategoryId, $event) || (ctx_r2.selectedCategoryId = $event); return i0.ɵɵresetView($event); });
607
- i0.ɵɵelementStart(21, "option", 129);
664
+ i0.ɵɵelementStart(20, "select", 143);
665
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_27_Template_select_ngModelChange_20_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r4 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r4.selectedCategoryId, $event) || (ctx_r4.selectedCategoryId = $event); return i0.ɵɵresetView($event); });
666
+ i0.ɵɵelementStart(21, "option", 144);
608
667
  i0.ɵɵtext(22, "No category");
609
668
  i0.ɵɵelementEnd();
610
- i0.ɵɵrepeaterCreate(23, ListsBrowseResource_Conditional_23_For_24_Template, 2, 2, "option", 129, i0.ɵɵrepeaterTrackByIdentity);
669
+ i0.ɵɵrepeaterCreate(23, ListsBrowseResource_Conditional_27_For_24_Template, 2, 2, "option", 144, i0.ɵɵrepeaterTrackByIdentity);
611
670
  i0.ɵɵelementEnd()()();
612
- i0.ɵɵelementStart(25, "div", 130)(26, "button", 131);
613
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_23_Template_button_click_26_listener() { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.saveList()); });
614
- i0.ɵɵconditionalCreate(27, ListsBrowseResource_Conditional_23_Conditional_27_Template, 1, 0, "i", 132);
671
+ i0.ɵɵelementStart(25, "div", 145)(26, "button", 146);
672
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_27_Template_button_click_26_listener() { i0.ɵɵrestoreView(_r31); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.saveList()); });
673
+ i0.ɵɵconditionalCreate(27, ListsBrowseResource_Conditional_27_Conditional_27_Template, 1, 0, "i", 147);
615
674
  i0.ɵɵtext(28);
616
675
  i0.ɵɵelementEnd();
617
- i0.ɵɵelementStart(29, "button", 133);
618
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_23_Template_button_click_29_listener() { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeCreateDialog()); });
676
+ i0.ɵɵelementStart(29, "button", 148);
677
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_27_Template_button_click_29_listener() { i0.ɵɵrestoreView(_r31); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeCreateDialog()); });
619
678
  i0.ɵɵtext(30, "Cancel");
620
679
  i0.ɵɵelementEnd()()();
621
680
  } if (rf & 2) {
622
- const ctx_r2 = i0.ɵɵnextContext();
681
+ const ctx_r4 = i0.ɵɵnextContext();
623
682
  i0.ɵɵadvance(3);
624
- i0.ɵɵtextInterpolate(ctx_r2.editingList ? "Edit List" : "Create New List");
683
+ i0.ɵɵtextInterpolate(ctx_r4.editingList ? "Edit List" : "Create New List");
625
684
  i0.ɵɵadvance(7);
626
- i0.ɵɵtwoWayProperty("ngModel", ctx_r2.newListName);
685
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r4.newListName);
627
686
  i0.ɵɵadvance(4);
628
- i0.ɵɵtwoWayProperty("ngModel", ctx_r2.newListDescription);
687
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r4.newListDescription);
629
688
  i0.ɵɵadvance();
630
- i0.ɵɵconditional(!ctx_r2.editingList ? 15 : -1);
689
+ i0.ɵɵconditional(!ctx_r4.editingList ? 15 : -1);
631
690
  i0.ɵɵadvance();
632
- i0.ɵɵconditional(ctx_r2.editingList ? 16 : -1);
691
+ i0.ɵɵconditional(ctx_r4.editingList ? 16 : -1);
633
692
  i0.ɵɵadvance(4);
634
- i0.ɵɵtwoWayProperty("ngModel", ctx_r2.selectedCategoryId);
693
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r4.selectedCategoryId);
635
694
  i0.ɵɵadvance();
636
695
  i0.ɵɵproperty("ngValue", null);
637
696
  i0.ɵɵadvance(2);
638
- i0.ɵɵrepeater(ctx_r2.flatCategories);
697
+ i0.ɵɵrepeater(ctx_r4.flatCategories);
639
698
  i0.ɵɵadvance(3);
640
- i0.ɵɵproperty("disabled", !ctx_r2.newListName || !ctx_r2.editingList && !ctx_r2.selectedEntityId || ctx_r2.isSaving);
699
+ i0.ɵɵproperty("disabled", !ctx_r4.newListName || !ctx_r4.editingList && !ctx_r4.selectedEntityId || ctx_r4.isSaving);
641
700
  i0.ɵɵadvance();
642
- i0.ɵɵconditional(ctx_r2.isSaving ? 27 : -1);
701
+ i0.ɵɵconditional(ctx_r4.isSaving ? 27 : -1);
643
702
  i0.ɵɵadvance();
644
- i0.ɵɵtextInterpolate1(" ", ctx_r2.isSaving ? "Saving..." : ctx_r2.editingList ? "Save" : "Create", " ");
703
+ i0.ɵɵtextInterpolate1(" ", ctx_r4.isSaving ? "Saving..." : ctx_r4.editingList ? "Save" : "Create", " ");
645
704
  i0.ɵɵadvance();
646
- i0.ɵɵproperty("disabled", ctx_r2.isSaving);
705
+ i0.ɵɵproperty("disabled", ctx_r4.isSaving);
647
706
  } }
648
- function ListsBrowseResource_Conditional_24_Template(rf, ctx) { if (rf & 1) {
649
- const _r32 = i0.ɵɵgetCurrentView();
650
- i0.ɵɵelementStart(0, "div", 120);
651
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_24_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r32); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.cancelDelete()); });
707
+ function ListsBrowseResource_Conditional_28_Template(rf, ctx) { if (rf & 1) {
708
+ const _r35 = i0.ɵɵgetCurrentView();
709
+ i0.ɵɵelementStart(0, "div", 135);
710
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_28_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r35); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.cancelDelete()); });
652
711
  i0.ɵɵelementEnd();
653
712
  } }
654
- function ListsBrowseResource_Conditional_25_Conditional_16_Template(rf, ctx) { if (rf & 1) {
655
- i0.ɵɵelement(0, "i", 132);
713
+ function ListsBrowseResource_Conditional_29_Conditional_16_Template(rf, ctx) { if (rf & 1) {
714
+ i0.ɵɵelement(0, "i", 147);
656
715
  } }
657
- function ListsBrowseResource_Conditional_25_Template(rf, ctx) { if (rf & 1) {
658
- const _r33 = i0.ɵɵgetCurrentView();
659
- i0.ɵɵelementStart(0, "div", 21)(1, "div", 121)(2, "h3");
716
+ function ListsBrowseResource_Conditional_29_Template(rf, ctx) { if (rf & 1) {
717
+ const _r36 = i0.ɵɵgetCurrentView();
718
+ i0.ɵɵelementStart(0, "div", 23)(1, "div", 136)(2, "h3");
660
719
  i0.ɵɵtext(3, "Delete List");
661
720
  i0.ɵɵelementEnd();
662
- i0.ɵɵelementStart(4, "button", 122);
663
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_25_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r33); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.cancelDelete()); });
664
- i0.ɵɵelement(5, "i", 123);
721
+ i0.ɵɵelementStart(4, "button", 137);
722
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_29_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r36); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.cancelDelete()); });
723
+ i0.ɵɵelement(5, "i", 138);
665
724
  i0.ɵɵelementEnd()();
666
- i0.ɵɵelementStart(6, "div", 124)(7, "p");
725
+ i0.ɵɵelementStart(6, "div", 139)(7, "p");
667
726
  i0.ɵɵtext(8, "Are you sure you want to delete \"");
668
727
  i0.ɵɵelementStart(9, "strong");
669
728
  i0.ɵɵtext(10);
670
729
  i0.ɵɵelementEnd();
671
730
  i0.ɵɵtext(11, "\"?");
672
731
  i0.ɵɵelementEnd();
673
- i0.ɵɵelementStart(12, "p", 137);
732
+ i0.ɵɵelementStart(12, "p", 152);
674
733
  i0.ɵɵtext(13, "This will also remove all items in the list.");
675
734
  i0.ɵɵelementEnd()();
676
- i0.ɵɵelementStart(14, "div", 130)(15, "button", 138);
677
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_25_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r33); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.deleteList()); });
678
- i0.ɵɵconditionalCreate(16, ListsBrowseResource_Conditional_25_Conditional_16_Template, 1, 0, "i", 132);
735
+ i0.ɵɵelementStart(14, "div", 145)(15, "button", 153);
736
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_29_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r36); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.deleteList()); });
737
+ i0.ɵɵconditionalCreate(16, ListsBrowseResource_Conditional_29_Conditional_16_Template, 1, 0, "i", 147);
679
738
  i0.ɵɵtext(17);
680
739
  i0.ɵɵelementEnd();
681
- i0.ɵɵelementStart(18, "button", 133);
682
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_25_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r33); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.cancelDelete()); });
740
+ i0.ɵɵelementStart(18, "button", 148);
741
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_29_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r36); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.cancelDelete()); });
683
742
  i0.ɵɵtext(19, "Cancel");
684
743
  i0.ɵɵelementEnd()()();
685
744
  } if (rf & 2) {
686
- const ctx_r2 = i0.ɵɵnextContext();
745
+ const ctx_r4 = i0.ɵɵnextContext();
687
746
  i0.ɵɵadvance(10);
688
- i0.ɵɵtextInterpolate(ctx_r2.deleteListName);
747
+ i0.ɵɵtextInterpolate(ctx_r4.deleteListName);
689
748
  i0.ɵɵadvance(5);
690
- i0.ɵɵproperty("disabled", ctx_r2.isDeleting);
749
+ i0.ɵɵproperty("disabled", ctx_r4.isDeleting);
691
750
  i0.ɵɵadvance();
692
- i0.ɵɵconditional(ctx_r2.isDeleting ? 16 : -1);
751
+ i0.ɵɵconditional(ctx_r4.isDeleting ? 16 : -1);
693
752
  i0.ɵɵadvance();
694
- i0.ɵɵtextInterpolate1(" ", ctx_r2.isDeleting ? "Deleting..." : "Delete", " ");
753
+ i0.ɵɵtextInterpolate1(" ", ctx_r4.isDeleting ? "Deleting..." : "Delete", " ");
695
754
  i0.ɵɵadvance();
696
- i0.ɵɵproperty("disabled", ctx_r2.isDeleting);
755
+ i0.ɵɵproperty("disabled", ctx_r4.isDeleting);
697
756
  } }
698
- function ListsBrowseResource_Conditional_26_Template(rf, ctx) { if (rf & 1) {
699
- const _r34 = i0.ɵɵgetCurrentView();
700
- i0.ɵɵelementStart(0, "mj-list-share-dialog", 139);
701
- i0.ɵɵlistener("complete", function ListsBrowseResource_Conditional_26_Template_mj_list_share_dialog_complete_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onShareComplete($event)); })("cancel", function ListsBrowseResource_Conditional_26_Template_mj_list_share_dialog_cancel_0_listener() { i0.ɵɵrestoreView(_r34); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onShareCancel()); });
757
+ function ListsBrowseResource_Conditional_30_Template(rf, ctx) { if (rf & 1) {
758
+ const _r37 = i0.ɵɵgetCurrentView();
759
+ i0.ɵɵelementStart(0, "mj-list-share-dialog", 154);
760
+ i0.ɵɵlistener("complete", function ListsBrowseResource_Conditional_30_Template_mj_list_share_dialog_complete_0_listener($event) { i0.ɵɵrestoreView(_r37); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.onShareComplete($event)); })("cancel", function ListsBrowseResource_Conditional_30_Template_mj_list_share_dialog_cancel_0_listener() { i0.ɵɵrestoreView(_r37); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.onShareCancel()); })("manageInvitations", function ListsBrowseResource_Conditional_30_Template_mj_list_share_dialog_manageInvitations_0_listener() { i0.ɵɵrestoreView(_r37); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.onManageInvitations()); })("viewAuditLog", function ListsBrowseResource_Conditional_30_Template_mj_list_share_dialog_viewAuditLog_0_listener() { i0.ɵɵrestoreView(_r37); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.onViewAuditLog()); });
702
761
  i0.ɵɵelementEnd();
703
762
  } if (rf & 2) {
704
- const ctx_r2 = i0.ɵɵnextContext();
705
- i0.ɵɵproperty("config", ctx_r2.shareDialogConfig)("visible", ctx_r2.showShareDialog);
763
+ const ctx_r4 = i0.ɵɵnextContext();
764
+ i0.ɵɵproperty("config", ctx_r4.shareDialogConfig)("visible", ctx_r4.showShareDialog);
706
765
  } }
707
- function ListsBrowseResource_Conditional_27_For_3_Template(rf, ctx) { if (rf & 1) {
708
- const _r35 = i0.ɵɵgetCurrentView();
709
- i0.ɵɵelementStart(0, "div", 144);
710
- i0.ɵɵlistener("mousedown", function ListsBrowseResource_Conditional_27_For_3_Template_div_mousedown_0_listener($event) { const entity_r36 = i0.ɵɵrestoreView(_r35).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); ctx_r2.selectEntity(entity_r36); return i0.ɵɵresetView($event.preventDefault()); });
766
+ function ListsBrowseResource_Conditional_31_Template(rf, ctx) { if (rf & 1) {
767
+ const _r38 = i0.ɵɵgetCurrentView();
768
+ i0.ɵɵelementStart(0, "mj-dialog", 155);
769
+ i0.ɵɵlistener("Close", function ListsBrowseResource_Conditional_31_Template_mj_dialog_Close_0_listener() { i0.ɵɵrestoreView(_r38); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeInvitationsDialog()); });
770
+ i0.ɵɵelementStart(1, "div", 156);
771
+ i0.ɵɵelement(2, "mj-list-invitations", 157);
772
+ i0.ɵɵelementEnd();
773
+ i0.ɵɵelementStart(3, "mj-dialog-actions")(4, "button", 158);
774
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_31_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r38); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeInvitationsDialog()); });
775
+ i0.ɵɵtext(5, "Close");
776
+ i0.ɵɵelementEnd()()();
777
+ } if (rf & 2) {
778
+ const ctx_r4 = i0.ɵɵnextContext();
779
+ i0.ɵɵproperty("Visible", true)("Title", "Invitations \u2014 " + (ctx_r4.activeShareListName ?? "List"))("MinWidth", 640)("Width", 900)("Height", 640);
780
+ i0.ɵɵadvance(2);
781
+ i0.ɵɵproperty("Provider", ctx_r4.ProviderToUse)("ListID", ctx_r4.activeShareListId)("ListName", ctx_r4.activeShareListName);
782
+ } }
783
+ function ListsBrowseResource_Conditional_32_Template(rf, ctx) { if (rf & 1) {
784
+ const _r39 = i0.ɵɵgetCurrentView();
785
+ i0.ɵɵelementStart(0, "mj-dialog", 155);
786
+ i0.ɵɵlistener("Close", function ListsBrowseResource_Conditional_32_Template_mj_dialog_Close_0_listener() { i0.ɵɵrestoreView(_r39); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeAuditLogDialog()); });
787
+ i0.ɵɵelementStart(1, "div", 156);
788
+ i0.ɵɵelement(2, "mj-list-audit-log", 159);
789
+ i0.ɵɵelementEnd();
790
+ i0.ɵɵelementStart(3, "mj-dialog-actions")(4, "button", 158);
791
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_32_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r39); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeAuditLogDialog()); });
792
+ i0.ɵɵtext(5, "Close");
793
+ i0.ɵɵelementEnd()()();
794
+ } if (rf & 2) {
795
+ const ctx_r4 = i0.ɵɵnextContext();
796
+ i0.ɵɵproperty("Visible", true)("Title", "Audit Log \u2014 " + (ctx_r4.activeShareListName ?? "List"))("MinWidth", 720)("Width", 980)("Height", 680);
797
+ i0.ɵɵadvance(2);
798
+ i0.ɵɵproperty("Provider", ctx_r4.ProviderToUse)("ListID", ctx_r4.activeShareListId);
799
+ } }
800
+ function ListsBrowseResource_Conditional_33_For_3_Template(rf, ctx) { if (rf & 1) {
801
+ const _r40 = i0.ɵɵgetCurrentView();
802
+ i0.ɵɵelementStart(0, "div", 164);
803
+ i0.ɵɵlistener("mousedown", function ListsBrowseResource_Conditional_33_For_3_Template_div_mousedown_0_listener($event) { const entity_r41 = i0.ɵɵrestoreView(_r40).$implicit; const ctx_r4 = i0.ɵɵnextContext(2); ctx_r4.selectEntity(entity_r41); return i0.ɵɵresetView($event.preventDefault()); });
711
804
  i0.ɵɵtext(1);
712
805
  i0.ɵɵelementEnd();
713
806
  } if (rf & 2) {
714
- const entity_r36 = ctx.$implicit;
807
+ const entity_r41 = ctx.$implicit;
715
808
  i0.ɵɵadvance();
716
- i0.ɵɵtextInterpolate1(" ", entity_r36.Name, " ");
809
+ i0.ɵɵtextInterpolate1(" ", entity_r41.Name, " ");
717
810
  } }
718
- function ListsBrowseResource_Conditional_27_Conditional_4_Template(rf, ctx) { if (rf & 1) {
719
- i0.ɵɵelementStart(0, "div", 143);
811
+ function ListsBrowseResource_Conditional_33_Conditional_4_Template(rf, ctx) { if (rf & 1) {
812
+ i0.ɵɵelementStart(0, "div", 163);
720
813
  i0.ɵɵtext(1, " No entities found ");
721
814
  i0.ɵɵelementEnd();
722
815
  } }
723
- function ListsBrowseResource_Conditional_27_Template(rf, ctx) { if (rf & 1) {
724
- i0.ɵɵelementStart(0, "div", 140)(1, "div", 141);
725
- i0.ɵɵrepeaterCreate(2, ListsBrowseResource_Conditional_27_For_3_Template, 2, 1, "div", 142, i0.ɵɵrepeaterTrackByIdentity);
726
- i0.ɵɵconditionalCreate(4, ListsBrowseResource_Conditional_27_Conditional_4_Template, 2, 0, "div", 143);
816
+ function ListsBrowseResource_Conditional_33_Template(rf, ctx) { if (rf & 1) {
817
+ i0.ɵɵelementStart(0, "div", 160)(1, "div", 161);
818
+ i0.ɵɵrepeaterCreate(2, ListsBrowseResource_Conditional_33_For_3_Template, 2, 1, "div", 162, i0.ɵɵrepeaterTrackByIdentity);
819
+ i0.ɵɵconditionalCreate(4, ListsBrowseResource_Conditional_33_Conditional_4_Template, 2, 0, "div", 163);
727
820
  i0.ɵɵelementEnd()();
728
821
  } if (rf & 2) {
729
- const ctx_r2 = i0.ɵɵnextContext();
730
- i0.ɵɵstyleProp("top", ctx_r2.entityDropdownPosition.top, "px")("left", ctx_r2.entityDropdownPosition.left, "px")("width", ctx_r2.entityDropdownPosition.width, "px");
731
- i0.ɵɵclassProp("dropdown-above", ctx_r2.entityDropdownPosition.openAbove);
822
+ const ctx_r4 = i0.ɵɵnextContext();
823
+ i0.ɵɵstyleProp("top", ctx_r4.entityDropdownPosition.top, "px")("left", ctx_r4.entityDropdownPosition.left, "px")("width", ctx_r4.entityDropdownPosition.width, "px");
824
+ i0.ɵɵclassProp("dropdown-above", ctx_r4.entityDropdownPosition.openAbove);
732
825
  i0.ɵɵadvance();
733
- i0.ɵɵclassProp("open-above", ctx_r2.entityDropdownPosition.openAbove);
826
+ i0.ɵɵclassProp("open-above", ctx_r4.entityDropdownPosition.openAbove);
734
827
  i0.ɵɵadvance();
735
- i0.ɵɵrepeater(ctx_r2.filteredEntitiesList);
828
+ i0.ɵɵrepeater(ctx_r4.filteredEntitiesList);
736
829
  i0.ɵɵadvance(2);
737
- i0.ɵɵconditional(ctx_r2.filteredEntitiesList.length === 0 ? 4 : -1);
830
+ i0.ɵɵconditional(ctx_r4.filteredEntitiesList.length === 0 ? 4 : -1);
738
831
  } }
739
832
  let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponent {
740
833
  cdr;
@@ -749,6 +842,27 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
749
842
  selectedEntity = 'all';
750
843
  selectedOwner = 'mine';
751
844
  selectedSort = 'name';
845
+ /**
846
+ * Active tag filters (Phase 4.3). Multi-tag = AND — a list must have
847
+ * every active tag to appear. URL state mirrors this via the `tags`
848
+ * query param (comma-separated tag IDs).
849
+ */
850
+ tagFilters = [];
851
+ /**
852
+ * Set of List IDs that match the current `tagFilters` (intersection).
853
+ * `null` means "no tag filter active" — pass-through. Populated by
854
+ * `recomputeTagMembership` whenever `tagFilters` changes; consumed by
855
+ * `applyFilters` to narrow the visible list.
856
+ */
857
+ tagFilteredListIds = null;
858
+ /**
859
+ * Favorite-list IDs for the current user (Phase 5.3). Backed by the
860
+ * existing `MJ: User Favorites` entity. `null` while loading; a Set
861
+ * once populated so card-side toggling is O(1).
862
+ */
863
+ favoriteListIds = new Set();
864
+ /** When true, only favorited lists appear in the grid. */
865
+ showOnlyFavorites = false;
752
866
  allLists = [];
753
867
  filteredLists = [];
754
868
  categories = [];
@@ -793,6 +907,29 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
793
907
  // Sharing dialog state
794
908
  showShareDialog = false;
795
909
  shareDialogConfig = null;
910
+ // Viewer-perspective gating (Phase 2.8). Capabilities are computed
911
+ // lazily when the user opens the context menu — running per-card
912
+ // would mean N permission-resolve calls per browse render. The
913
+ // resolved level is cached on the item so re-opening the same menu
914
+ // doesn't refetch.
915
+ contextItemCapabilities = CapabilitiesForLevel('Owner');
916
+ capabilityCache = new Map();
917
+ // Tracks whether the in-memory categories list is known-stale
918
+ // relative to the DB. Flipped to true by the BaseEntity event
919
+ // subscription whenever any `MJ: List Categories` row is saved or
920
+ // deleted (most often from the Categories tab next door). Reset to
921
+ // false after `refreshCategoriesForDialog` reloads. Initial true so
922
+ // the first dialog open always populates from a fresh fetch.
923
+ categoriesDirty = true;
924
+ // Invitations / audit log dialogs (mockups 16, 18) — opened from
925
+ // the share dialog. Each dialog binds to a single list at a time,
926
+ // tracked by `activeShareListId`/`activeShareListName` lifted from
927
+ // shareDialogConfig at open time so we keep the context after the
928
+ // share dialog closes.
929
+ showInvitationsDialog = false;
930
+ showAuditLogDialog = false;
931
+ activeShareListId = null;
932
+ activeShareListName = null;
796
933
  entityColorMap = new Map();
797
934
  entityIconMap = new Map();
798
935
  categoryMap = new Map();
@@ -829,9 +966,38 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
829
966
  }
830
967
  async ngOnInit() {
831
968
  super.ngOnInit();
969
+ this.subscribeToCategoryChanges();
832
970
  await this.loadData();
833
971
  this.NotifyLoadComplete();
834
972
  }
973
+ /**
974
+ * Mark the in-memory categories list dirty whenever any BaseEntity
975
+ * raises a save / delete event for `MJ: List Categories`. The
976
+ * Create/Edit dialog uses this flag to skip the per-open RunView
977
+ * unless something has actually changed since last load — keeps the
978
+ * dialog snappy without showing stale categories.
979
+ *
980
+ * Subscribes to MJGlobal's event bus rather than wiring each
981
+ * category entity's per-instance listener, because the Categories
982
+ * tab creates fresh BaseEntity instances we can't see from here.
983
+ */
984
+ subscribeToCategoryChanges() {
985
+ MJGlobal.Instance.GetEventListener()
986
+ .pipe(takeUntil(this.destroy$))
987
+ .subscribe((mjEvt) => {
988
+ if (mjEvt.eventCode !== BaseEntity.BaseEventCode)
989
+ return;
990
+ const beEvt = mjEvt.args;
991
+ if (!beEvt)
992
+ return;
993
+ const entityName = beEvt.baseEntity?.EntityInfo.Name ?? beEvt.entityName;
994
+ if (entityName !== 'MJ: List Categories')
995
+ return;
996
+ if (beEvt.type === 'save' || beEvt.type === 'delete') {
997
+ this.categoriesDirty = true;
998
+ }
999
+ });
1000
+ }
835
1001
  ngOnDestroy() {
836
1002
  super.ngOnDestroy();
837
1003
  this.destroy$.next();
@@ -843,12 +1009,17 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
843
1009
  const md = this.ProviderToUse;
844
1010
  const rv = RunView.FromMetadataProvider(this.ProviderToUse);
845
1011
  this.currentUserId = md.CurrentUser?.ID || '';
846
- // Load all lists, categories, details, and users in parallel
1012
+ // BypassCache on Lists + List Details: after a delete/duplicate, the
1013
+ // RunView cache for these entities doesn't always reflect the latest
1014
+ // state in time (event-driven invalidation races the immediate
1015
+ // refresh). Trading a small perf hit for correctness here is worth
1016
+ // it — categories and users stay cache-warm.
847
1017
  const [listsResult, categoriesResult, detailsResult, usersResult] = await rv.RunViews([
848
1018
  {
849
1019
  EntityName: 'MJ: Lists',
850
1020
  OrderBy: 'Name',
851
- ResultType: 'entity_object'
1021
+ ResultType: 'entity_object',
1022
+ BypassCache: true
852
1023
  },
853
1024
  {
854
1025
  EntityName: 'MJ: List Categories',
@@ -858,7 +1029,8 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
858
1029
  {
859
1030
  EntityName: 'MJ: List Details',
860
1031
  Fields: ['ListID'],
861
- ResultType: 'simple'
1032
+ ResultType: 'simple',
1033
+ BypassCache: true
862
1034
  },
863
1035
  {
864
1036
  EntityName: 'MJ: Users',
@@ -881,6 +1053,9 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
881
1053
  }
882
1054
  // Build flat categories for dropdown
883
1055
  this.flatCategories = this.buildFlatCategories(this.categories);
1056
+ // loadData() already pulled fresh categories — clear the dirty
1057
+ // flag so the first dialog open doesn't redundantly refetch.
1058
+ this.categoriesDirty = false;
884
1059
  // Build user map
885
1060
  const userMap = new Map();
886
1061
  for (const user of users) {
@@ -924,6 +1099,8 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
924
1099
  ];
925
1100
  this.applyFilters();
926
1101
  this.buildCategoryTree();
1102
+ // Load favorites in parallel — not critical-path, but cheap.
1103
+ void this.loadFavorites();
927
1104
  // Load sharing info in the background
928
1105
  this.loadSharingInfo();
929
1106
  }
@@ -1100,6 +1277,16 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1100
1277
  if (this.selectedEntity !== 'all') {
1101
1278
  result = result.filter(item => item.entityName === this.selectedEntity);
1102
1279
  }
1280
+ // Tag filter (Phase 4.3 — intersection of all active tags).
1281
+ if (this.tagFilteredListIds !== null) {
1282
+ const matches = this.tagFilteredListIds;
1283
+ result = result.filter(item => matches.has(item.list.ID));
1284
+ }
1285
+ // Favorites-only toggle (Phase 5.3).
1286
+ if (this.showOnlyFavorites) {
1287
+ const favs = this.favoriteListIds;
1288
+ result = result.filter(item => favs.has(item.list.ID));
1289
+ }
1103
1290
  // Sort
1104
1291
  switch (this.selectedSort) {
1105
1292
  case 'name':
@@ -1167,14 +1354,215 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1167
1354
  const appId = this.Data?.Configuration?.applicationId || '';
1168
1355
  this.tabService.OpenList(item.list.ID, item.list.Name, appId);
1169
1356
  }
1357
+ /**
1358
+ * Handle a tag chip click on a list card — adds the tag to the
1359
+ * filter row (multi-tag = AND). Wired by Phase 4.3; the chip
1360
+ * component emits the (TagID, Name) pair so we can both display
1361
+ * the chip name and filter by ID.
1362
+ */
1363
+ onCardTagClicked(payload) {
1364
+ if (this.tagFilters.some((f) => f.TagID === payload.TagID))
1365
+ return;
1366
+ this.tagFilters = [...this.tagFilters, payload];
1367
+ void this.recomputeTagMembership();
1368
+ }
1369
+ /** Remove a tag from the filter row. */
1370
+ removeTagFilter(tagId) {
1371
+ this.tagFilters = this.tagFilters.filter((f) => f.TagID !== tagId);
1372
+ void this.recomputeTagMembership();
1373
+ }
1374
+ /** Clear all active tag filters. */
1375
+ clearTagFilters() {
1376
+ this.tagFilters = [];
1377
+ this.tagFilteredListIds = null;
1378
+ this.applyFilters();
1379
+ }
1380
+ /**
1381
+ * Resolve which lists have ALL active tags. Done server-side so the
1382
+ * filter works regardless of which lists the user has scrolled past.
1383
+ * Result is cached on `tagFilteredListIds`; `applyFilters` consumes it.
1384
+ */
1385
+ async recomputeTagMembership() {
1386
+ if (this.tagFilters.length === 0) {
1387
+ this.tagFilteredListIds = null;
1388
+ this.applyFilters();
1389
+ return;
1390
+ }
1391
+ try {
1392
+ const md = this.ProviderToUse;
1393
+ const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');
1394
+ if (!listsEntity) {
1395
+ this.tagFilteredListIds = new Set();
1396
+ this.applyFilters();
1397
+ return;
1398
+ }
1399
+ const tagIds = this.tagFilters.map((f) => `'${f.TagID}'`).join(',');
1400
+ const rv = RunView.FromMetadataProvider(md);
1401
+ const result = await rv.RunView({
1402
+ EntityName: 'MJ: Tagged Items',
1403
+ ExtraFilter: `EntityID='${listsEntity.ID}' AND TagID IN (${tagIds})`,
1404
+ Fields: ['RecordID', 'TagID'],
1405
+ ResultType: 'simple',
1406
+ });
1407
+ // Intersection: count tag hits per list, keep only those with
1408
+ // exactly `tagFilters.length` matches (one per required tag).
1409
+ const counts = new Map();
1410
+ for (const row of result.Results ?? []) {
1411
+ const id = String(row.RecordID);
1412
+ counts.set(id, (counts.get(id) ?? 0) + 1);
1413
+ }
1414
+ const required = this.tagFilters.length;
1415
+ const matches = new Set();
1416
+ for (const [id, count] of counts) {
1417
+ if (count >= required)
1418
+ matches.add(id);
1419
+ }
1420
+ this.tagFilteredListIds = matches;
1421
+ }
1422
+ catch (e) {
1423
+ // On failure, fall back to "no match" so the user sees an empty
1424
+ // state rather than every list — avoids leaking unfiltered data
1425
+ // when the filter intent failed silently.
1426
+ this.tagFilteredListIds = new Set();
1427
+ }
1428
+ this.applyFilters();
1429
+ }
1430
+ /**
1431
+ * Load the current user's favorite lists into `favoriteListIds`.
1432
+ * Cheap — typically <100 rows per user. Driven by the `MJ: User
1433
+ * Favorites` entity scoped by the Lists EntityID. Best-effort: on
1434
+ * failure the star icons just stay dim.
1435
+ */
1436
+ async loadFavorites() {
1437
+ try {
1438
+ const md = this.ProviderToUse;
1439
+ const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');
1440
+ if (!listsEntity || !md.CurrentUser)
1441
+ return;
1442
+ const rv = RunView.FromMetadataProvider(md);
1443
+ const result = await rv.RunView({
1444
+ EntityName: 'MJ: User Favorites',
1445
+ ExtraFilter: `UserID='${md.CurrentUser.ID}' AND EntityID='${listsEntity.ID}'`,
1446
+ Fields: ['RecordID'],
1447
+ ResultType: 'simple',
1448
+ });
1449
+ this.favoriteListIds = new Set((result.Results ?? []).map((r) => String(r.RecordID)));
1450
+ }
1451
+ catch {
1452
+ // Silent — favorites are a polish feature, not load-bearing.
1453
+ this.favoriteListIds = new Set();
1454
+ }
1455
+ }
1456
+ /**
1457
+ * Toggle a list's favorite state. Optimistic: flips the local Set
1458
+ * first, then writes through. Reverts on failure.
1459
+ */
1460
+ async toggleFavorite(event, item) {
1461
+ event.stopPropagation();
1462
+ const wasFav = this.favoriteListIds.has(item.list.ID);
1463
+ // Optimistic update.
1464
+ if (wasFav)
1465
+ this.favoriteListIds.delete(item.list.ID);
1466
+ else
1467
+ this.favoriteListIds.add(item.list.ID);
1468
+ // Re-trigger filter recompute since the favorites-only toggle
1469
+ // may be on.
1470
+ this.applyFilters();
1471
+ try {
1472
+ const md = this.ProviderToUse;
1473
+ const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');
1474
+ if (!listsEntity || !md.CurrentUser)
1475
+ throw new Error('Cannot resolve user favorites entity');
1476
+ if (wasFav) {
1477
+ // Find + delete the existing favorite row.
1478
+ const rv = RunView.FromMetadataProvider(md);
1479
+ const result = await rv.RunView({
1480
+ EntityName: 'MJ: User Favorites',
1481
+ ExtraFilter: `UserID='${md.CurrentUser.ID}' AND EntityID='${listsEntity.ID}' AND RecordID='${item.list.ID}'`,
1482
+ ResultType: 'entity_object',
1483
+ });
1484
+ for (const row of result.Results ?? [])
1485
+ await row.Delete();
1486
+ }
1487
+ else {
1488
+ const fav = await md.GetEntityObject('MJ: User Favorites', md.CurrentUser);
1489
+ fav.NewRecord();
1490
+ fav.UserID = md.CurrentUser.ID;
1491
+ fav.EntityID = listsEntity.ID;
1492
+ fav.RecordID = item.list.ID;
1493
+ await fav.Save();
1494
+ }
1495
+ }
1496
+ catch {
1497
+ // Revert on failure.
1498
+ if (wasFav)
1499
+ this.favoriteListIds.add(item.list.ID);
1500
+ else
1501
+ this.favoriteListIds.delete(item.list.ID);
1502
+ this.applyFilters();
1503
+ }
1504
+ }
1505
+ isFavorite(listId) {
1506
+ return this.favoriteListIds.has(listId);
1507
+ }
1508
+ toggleShowOnlyFavorites() {
1509
+ this.showOnlyFavorites = !this.showOnlyFavorites;
1510
+ this.applyFilters();
1511
+ }
1170
1512
  openListMenu(event, item) {
1171
1513
  event.stopPropagation();
1172
1514
  const mouseEvent = event;
1173
1515
  this.selectedContextItem = item;
1174
1516
  this.contextMenuX = mouseEvent.clientX;
1175
1517
  this.contextMenuY = mouseEvent.clientY;
1518
+ // Fast path: owners always have full capabilities. Avoid an extra
1519
+ // permission-resolve round trip for the common case.
1520
+ if (item.isOwner) {
1521
+ this.contextItemCapabilities = CapabilitiesForLevel('Owner');
1522
+ this.showContextMenu = true;
1523
+ return;
1524
+ }
1525
+ // Render the menu immediately with a conservative viewer-level cap
1526
+ // set, then refine via async resolve. The flicker is a single tick
1527
+ // — and viewers/editors stay correctly gated even if resolve fails.
1528
+ const cached = this.capabilityCache.get(item.list.ID);
1529
+ if (cached !== undefined) {
1530
+ this.contextItemCapabilities = CapabilitiesForLevel(cached);
1531
+ }
1532
+ else {
1533
+ this.contextItemCapabilities = CapabilitiesForLevel('View');
1534
+ void this.refineContextCapabilities(item.list.ID);
1535
+ }
1176
1536
  this.showContextMenu = true;
1177
1537
  }
1538
+ /** Resolve the current user's permission level for a list and update
1539
+ * the open context menu in place. Cached so re-opening the same menu
1540
+ * doesn't re-hit the resolver. */
1541
+ async refineContextCapabilities(listId) {
1542
+ try {
1543
+ const currentUserId = this.ProviderToUse.CurrentUser?.ID;
1544
+ if (!currentUserId) {
1545
+ // No user context — leave the conservative fallback in place.
1546
+ return;
1547
+ }
1548
+ // Go through the Angular sharing service rather than instantiating the
1549
+ // server-side `ListSharing` class directly. The service hits the GraphQL
1550
+ // surface, which is the only sanctioned client→server path; the server
1551
+ // package writes audit logs + permission rows that have no business
1552
+ // running in a browser bundle.
1553
+ const level = (await this.listSharingService.getUserPermissionLevel(listId, currentUserId));
1554
+ this.capabilityCache.set(listId, level);
1555
+ // Only mutate state if the user is still on this same menu — they
1556
+ // may have closed it before resolve finished.
1557
+ if (this.showContextMenu && this.selectedContextItem && UUIDsEqual(this.selectedContextItem.list.ID, listId)) {
1558
+ this.contextItemCapabilities = CapabilitiesForLevel(level);
1559
+ this.cdr.detectChanges();
1560
+ }
1561
+ }
1562
+ catch {
1563
+ // Conservative fallback already applied at menu open time.
1564
+ }
1565
+ }
1178
1566
  closeContextMenu() {
1179
1567
  this.showContextMenu = false;
1180
1568
  this.selectedContextItem = null;
@@ -1188,6 +1576,10 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1188
1576
  this.selectedCategoryId = null;
1189
1577
  this.showEntityDropdown = false;
1190
1578
  this.showCreateDialog = true;
1579
+ // Refresh categories so newly-created ones appear without a page
1580
+ // reload. Cheap RunView; runs in the background while the user is
1581
+ // typing the list name.
1582
+ void this.refreshCategoriesForDialog();
1191
1583
  }
1192
1584
  editList() {
1193
1585
  if (!this.selectedContextItem)
@@ -1199,8 +1591,49 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1199
1591
  this.selectedEntityId = list.EntityID;
1200
1592
  this.entitySearchTerm = list.Entity || '';
1201
1593
  this.selectedCategoryId = list.CategoryID || null;
1202
- this.showCreateDialog = true;
1594
+ // Ensure no stale state from a previous Create attempt — the entity
1595
+ // dropdown portal renders at z-index 10002 and could otherwise sit on
1596
+ // top of the edit dialog and block interaction.
1597
+ this.showEntityDropdown = false;
1598
+ // Close the context menu BEFORE opening the dialog. Doing it after
1599
+ // leaves a one-tick window where both the menu and the modal-overlay
1600
+ // are stacked, and the menu's outer click-overlay can swallow the
1601
+ // first click into the form fields below it.
1203
1602
  this.closeContextMenu();
1603
+ this.showCreateDialog = true;
1604
+ this.cdr.detectChanges();
1605
+ void this.refreshCategoriesForDialog();
1606
+ }
1607
+ /** Re-pull MJ: List Categories so the dropdown reflects any
1608
+ * newly-created categories. Skips the round trip when nothing has
1609
+ * changed since the last load — `categoriesDirty` is flipped on
1610
+ * by the BaseEntity event subscription whenever a category row
1611
+ * is saved/deleted, so the only times this actually fetches are
1612
+ * (a) the first dialog open, and (b) after the user touched a
1613
+ * category somewhere else. */
1614
+ async refreshCategoriesForDialog() {
1615
+ if (!this.categoriesDirty)
1616
+ return;
1617
+ try {
1618
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
1619
+ const result = await rv.RunView({
1620
+ EntityName: 'MJ: List Categories',
1621
+ OrderBy: 'Name',
1622
+ ResultType: 'simple',
1623
+ });
1624
+ if (!result.Success)
1625
+ return;
1626
+ this.categories = (result.Results ?? []);
1627
+ this.categoryMap.clear();
1628
+ for (const cat of this.categories)
1629
+ this.categoryMap.set(cat.ID, cat);
1630
+ this.flatCategories = this.buildFlatCategories(this.categories);
1631
+ this.categoriesDirty = false;
1632
+ this.cdr.detectChanges();
1633
+ }
1634
+ catch {
1635
+ // Best-effort — the dialog still works with the previously-loaded list.
1636
+ }
1204
1637
  }
1205
1638
  selectEntity(entity) {
1206
1639
  this.selectedEntityId = entity.ID;
@@ -1245,7 +1678,7 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1245
1678
  try {
1246
1679
  const md = this.ProviderToUse;
1247
1680
  const rv = RunView.FromMetadataProvider(this.ProviderToUse);
1248
- const newList = await md.GetEntityObject('MJ: Lists');
1681
+ const newList = await md.GetEntityObject('MJ: Lists', md.CurrentUser);
1249
1682
  newList.Name = `${listToDuplicate.Name} (Copy)`;
1250
1683
  newList.Description = listToDuplicate.Description;
1251
1684
  newList.EntityID = listToDuplicate.EntityID;
@@ -1256,26 +1689,45 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1256
1689
  this.notificationService.CreateSimpleNotification('Failed to duplicate list', 'error', 4000);
1257
1690
  return;
1258
1691
  }
1692
+ // BypassCache to avoid any stale RunView cache that might mask members.
1693
+ // High MaxRows to cover large lists; entity_object so we have typed access.
1259
1694
  const itemsResult = await rv.RunView({
1260
1695
  EntityName: 'MJ: List Details',
1261
1696
  ExtraFilter: `ListID = '${listToDuplicate.ID}'`,
1262
- ResultType: 'entity_object'
1697
+ ResultType: 'entity_object',
1698
+ MaxRows: 100000,
1699
+ BypassCache: true
1263
1700
  });
1264
- if (itemsResult.Success && itemsResult.Results.length > 0) {
1265
- let copiedCount = 0;
1266
- for (const item of itemsResult.Results) {
1267
- const newItem = await md.GetEntityObject('MJ: List Details');
1701
+ if (!itemsResult.Success) {
1702
+ console.error('Duplicate: failed to load source list members', itemsResult.ErrorMessage);
1703
+ this.notificationService.CreateSimpleNotification(`Could not load source list members: ${itemsResult.ErrorMessage || 'unknown'}`, 'error', 6000);
1704
+ return;
1705
+ }
1706
+ const sourceItems = itemsResult.Results ?? [];
1707
+ if (sourceItems.length === 0) {
1708
+ this.notificationService.CreateSimpleNotification('List duplicated (source had no records)', 'success', 3000);
1709
+ }
1710
+ else {
1711
+ // Batch all detail inserts into one transaction group so this is
1712
+ // a single round-trip instead of 1-per-row. All-or-nothing: if any
1713
+ // row fails server-side validation the whole group rolls back.
1714
+ const tg = await md.CreateTransactionGroup();
1715
+ for (const item of sourceItems) {
1716
+ const newItem = await md.GetEntityObject('MJ: List Details', md.CurrentUser);
1268
1717
  newItem.ListID = newList.ID;
1269
1718
  newItem.RecordID = item.RecordID;
1270
1719
  newItem.Sequence = item.Sequence;
1271
- const itemSaved = await newItem.Save();
1272
- if (itemSaved)
1273
- copiedCount++;
1720
+ newItem.TransactionGroup = tg;
1721
+ await newItem.Save(); // queued into tg, not sent yet
1722
+ }
1723
+ const submitted = await tg.Submit();
1724
+ if (submitted) {
1725
+ this.notificationService.CreateSimpleNotification(`List duplicated with ${sourceItems.length} item${sourceItems.length !== 1 ? 's' : ''}`, 'success', 3000);
1726
+ }
1727
+ else {
1728
+ console.error('Duplicate: transaction group submit failed');
1729
+ this.notificationService.CreateSimpleNotification(`Duplicated list but failed to copy ${sourceItems.length} items — see console`, 'error', 6000);
1274
1730
  }
1275
- this.notificationService.CreateSimpleNotification(`List duplicated with ${copiedCount} item${copiedCount !== 1 ? 's' : ''}`, 'success', 3000);
1276
- }
1277
- else {
1278
- this.notificationService.CreateSimpleNotification('List duplicated successfully', 'success', 3000);
1279
1731
  }
1280
1732
  await this.loadData();
1281
1733
  }
@@ -1309,9 +1761,31 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1309
1761
  this.isDeleting = true;
1310
1762
  this.cdr.detectChanges();
1311
1763
  try {
1764
+ // spDeleteList doesn't cascade to MJ: List Details, so the FK
1765
+ // constraint (FK_ListDetail_List) blocks the delete if the list
1766
+ // has any members. Cascade-delete the details first in a
1767
+ // transaction group so the whole thing rolls back if any single
1768
+ // delete fails. The proper long-term fix is a migration that
1769
+ // adds ON DELETE CASCADE (or extends the SP); this keeps the UI
1770
+ // unblocked in the meantime.
1771
+ const cascadeOk = await this.cascadeDeleteListMembers(listToDelete.ID);
1772
+ if (!cascadeOk) {
1773
+ this.notificationService.CreateSimpleNotification(`Failed to delete list members for "${listName}" — list not deleted`, 'error', 6000);
1774
+ return;
1775
+ }
1312
1776
  const deleted = await listToDelete.Delete();
1313
1777
  if (deleted) {
1314
1778
  this.notificationService.CreateSimpleNotification(`"${listName}" deleted`, 'success', 3000);
1779
+ // Optimistic removal from local state so the card disappears
1780
+ // immediately. Without this, the user sees the just-deleted list
1781
+ // until loadData() rebuilds — and worse, can click Delete on it
1782
+ // again (which hangs because the in-memory entity still has the
1783
+ // now-deleted record's ID).
1784
+ const deletedId = listToDelete.ID;
1785
+ this.allLists = this.allLists.filter(item => !UUIDsEqual(item.list.ID, deletedId));
1786
+ this.applyFilters();
1787
+ this.buildCategoryTree();
1788
+ this.cdr.detectChanges();
1315
1789
  }
1316
1790
  else {
1317
1791
  const errorMessage = listToDelete.LatestResult?.Message || 'Unknown error occurred';
@@ -1319,7 +1793,10 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1319
1793
  this.notificationService.CreateSimpleNotification(`Failed to delete list: ${errorMessage}`, 'error', 6000);
1320
1794
  }
1321
1795
  this.cancelDelete();
1322
- await this.loadData();
1796
+ // Authoritative refresh — loadData() now sets BypassCache: true on
1797
+ // the 'MJ: Lists' RunView, so this no longer races the optimistic
1798
+ // local removal against a stale cache.
1799
+ void this.loadData();
1323
1800
  }
1324
1801
  catch (error) {
1325
1802
  console.error('Error deleting list:', error);
@@ -1331,6 +1808,35 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1331
1808
  this.cdr.detectChanges();
1332
1809
  }
1333
1810
  }
1811
+ /** Delete every MJ: List Details row for a given list in a single
1812
+ * transaction group. Returns true if everything succeeded (including
1813
+ * the trivial "no members" case). */
1814
+ async cascadeDeleteListMembers(listId) {
1815
+ const md = this.ProviderToUse;
1816
+ const rv = RunView.FromMetadataProvider(md);
1817
+ const lookup = await rv.RunView({
1818
+ EntityName: 'MJ: List Details',
1819
+ ExtraFilter: `ListID='${listId}'`,
1820
+ ResultType: 'entity_object',
1821
+ });
1822
+ if (!lookup.Success) {
1823
+ console.error('Failed to load list details for cascade-delete:', lookup.ErrorMessage);
1824
+ return false;
1825
+ }
1826
+ const details = lookup.Results ?? [];
1827
+ if (details.length === 0)
1828
+ return true;
1829
+ const tg = await md.CreateTransactionGroup();
1830
+ for (const d of details) {
1831
+ d.TransactionGroup = tg;
1832
+ await d.Delete();
1833
+ }
1834
+ const ok = await tg.Submit();
1835
+ if (!ok) {
1836
+ console.error('Cascade-delete transaction failed for list', listId);
1837
+ }
1838
+ return ok;
1839
+ }
1334
1840
  closeCreateDialog() {
1335
1841
  this.showCreateDialog = false;
1336
1842
  this.editingList = null;
@@ -1348,7 +1854,7 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1348
1854
  list = this.editingList;
1349
1855
  }
1350
1856
  else {
1351
- list = await md.GetEntityObject('MJ: Lists');
1857
+ list = await md.GetEntityObject('MJ: Lists', md.CurrentUser);
1352
1858
  list.UserID = md.CurrentUser.ID;
1353
1859
  list.EntityID = this.selectedEntityId;
1354
1860
  }
@@ -1403,6 +1909,36 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1403
1909
  this.showShareDialog = false;
1404
1910
  this.shareDialogConfig = null;
1405
1911
  }
1912
+ /** "Manage Invitations" clicked inside the share dialog — opens a
1913
+ * modal hosting `<mj-list-invitations>` for the same list. The
1914
+ * share dialog is closed so dialogs don't visually stack. */
1915
+ onManageInvitations() {
1916
+ if (!this.shareDialogConfig)
1917
+ return;
1918
+ this.activeShareListId = this.shareDialogConfig.listId;
1919
+ this.activeShareListName = this.shareDialogConfig.listName;
1920
+ this.showShareDialog = false;
1921
+ this.showInvitationsDialog = true;
1922
+ this.cdr.detectChanges();
1923
+ }
1924
+ closeInvitationsDialog() {
1925
+ this.showInvitationsDialog = false;
1926
+ this.cdr.detectChanges();
1927
+ }
1928
+ /** "View audit log" link in share dialog. */
1929
+ onViewAuditLog() {
1930
+ if (!this.shareDialogConfig)
1931
+ return;
1932
+ this.activeShareListId = this.shareDialogConfig.listId;
1933
+ this.activeShareListName = this.shareDialogConfig.listName;
1934
+ this.showShareDialog = false;
1935
+ this.showAuditLogDialog = true;
1936
+ this.cdr.detectChanges();
1937
+ }
1938
+ closeAuditLogDialog() {
1939
+ this.showAuditLogDialog = false;
1940
+ this.cdr.detectChanges();
1941
+ }
1406
1942
  async loadSharingInfo() {
1407
1943
  // Load sharing summaries for all lists that the user owns
1408
1944
  const ownedLists = this.allLists.filter(item => item.isOwner);
@@ -1426,7 +1962,7 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1426
1962
  static ɵfac = function ListsBrowseResource_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ListsBrowseResource)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.TabService), i0.ɵɵdirectiveInject(i2.MJNotificationService), i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i3.ListSharingService)); };
1427
1963
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ListsBrowseResource, selectors: [["mj-lists-browse-resource"]], hostBindings: function ListsBrowseResource_HostBindings(rf, ctx) { if (rf & 1) {
1428
1964
  i0.ɵɵlistener("click", function ListsBrowseResource_click_HostBindingHandler($event) { return ctx.onDocumentClick($event); }, i0.ɵɵresolveDocument)("keydown.escape", function ListsBrowseResource_keydown_escape_HostBindingHandler() { return ctx.onEscapeKey(); }, i0.ɵɵresolveDocument);
1429
- } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 28, vars: 20, consts: [["categoryNodeTemplate", ""], ["entityInput", ""], ["Title", "Lists", "Icon", "fa-solid fa-list-check"], ["meta", ""], ["Label", "lists", 3, "Count"], ["actions", ""], [3, "ClearAllRequested", "ActiveCount", "ShowClearAll"], [3, "ValuesChange", "Reset", "Fields", "Values"], [3, "KeyChange", "Options", "ActiveKey"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click"], [1, "fa-solid", "fa-plus"], ["toolbar", ""], ["Placeholder", "Search lists...", 3, "ValueChange", "Value"], [1, "loading-container"], [1, "empty-state"], [1, "empty-state", "search-empty"], [1, "browse-content"], [1, "context-menu-overlay"], [1, "context-menu", 3, "top", "left"], [1, "modal-overlay"], [1, "modal-dialog"], [1, "modal-dialog", "confirm-dialog"], [3, "config", "visible"], [1, "entity-dropdown-portal", 3, "top", "left", "width", "dropdown-above"], ["text", "Loading lists...", "size", "medium"], [1, "empty-state-icon-wrapper"], [1, "icon-bg"], [1, "fa-solid", "fa-list-check"], [1, "empty-state-features"], [1, "feature-item"], [1, "fa-solid", "fa-check-circle"], [1, "btn-create-large", 3, "click"], [1, "empty-state-icon-wrapper", "search"], [1, "fa-solid", "fa-filter-circle-xmark"], [1, "empty-hint"], [1, "btn-clear", 3, "click"], [1, "results-header"], [1, "sort-options"], [1, "filter-select", "sort-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "lists-table"], ["role", "list", "aria-label", "Lists", 1, "lists-grid"], [1, "category-tree"], ["role", "grid", "aria-label", "Lists table"], ["scope", "col", 1, "col-name"], ["scope", "col", 1, "col-entity"], ["scope", "col", 1, "col-items"], ["scope", "col", 1, "col-sharing"], ["scope", "col", 1, "col-owner"], ["scope", "col", 1, "col-updated"], ["scope", "col", 1, "col-actions"], [1, "sr-only"], ["tabindex", "0", "role", "row", 1, "list-row"], ["tabindex", "0", "role", "row", 1, "list-row", 3, "click", "keydown.enter"], ["role", "gridcell", 1, "col-name"], [1, "name-cell"], ["aria-hidden", "true", 1, "list-icon"], [1, "name-content"], [1, "list-name"], [1, "list-desc"], ["role", "gridcell", 1, "col-entity"], [1, "entity-badge"], ["role", "gridcell", 1, "col-items"], ["role", "gridcell", 1, "col-sharing"], [1, "sharing-private"], ["role", "gridcell", 1, "col-owner"], [1, "owner-name"], ["role", "gridcell", 1, "col-updated"], ["role", "gridcell", 1, "col-actions"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "More options"], [1, "sharing-indicator"], [1, "fa-solid", "fa-share-nodes"], [1, "share-count"], [1, "fa-solid", "fa-lock"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "More options", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-ellipsis-v"], ["tabindex", "0", "role", "listitem", 1, "list-card"], ["tabindex", "0", "role", "listitem", 1, "list-card", 3, "click", "keydown.enter"], [1, "card-header"], ["aria-hidden", "true", 1, "card-icon"], [1, "card-menu"], [1, "card-body"], [1, "card-title"], [1, "card-description"], [1, "card-meta"], [1, "meta-item"], [1, "fa-solid", "fa-database"], [1, "fa-solid", "fa-hashtag"], [1, "card-footer"], [1, "owner-tag"], [1, "fa-solid", "fa-user"], [1, "card-footer-right"], [1, "date-info"], [1, "menu-btn", 3, "click"], [1, "sharing-badge", 3, "title"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "category-section"], [1, "category-header"], [1, "category-header", "uncategorized"], ["role", "list", 1, "category-lists"], [1, "category-header", 3, "click"], [1, "fa-solid", "fa-folder"], [1, "category-name"], [1, "category-count"], [1, "category-header", "uncategorized", 3, "click"], [1, "fa-solid", "fa-inbox"], ["tabindex", "0", "role", "listitem", 1, "list-row", "hierarchy-row"], ["tabindex", "0", "role", "listitem", 1, "list-row", "hierarchy-row", 3, "click", "keydown.enter"], [1, "list-info"], [1, "list-meta"], [1, "list-actions"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "click"], [1, "context-menu-overlay", 3, "click"], [1, "context-menu"], [1, "menu-item", 3, "click"], [1, "fa-solid", "fa-pen"], [1, "fa-solid", "fa-copy"], [1, "menu-divider"], [1, "menu-item", "danger", 3, "click"], [1, "fa-solid", "fa-trash"], [1, "modal-overlay", 3, "click"], [1, "modal-header"], [1, "modal-close", 3, "click"], [1, "fa-solid", "fa-times"], [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-input", 3, "ngModelChange", "ngModel"], [3, "ngValue"], [1, "modal-footer"], [1, "btn-primary", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "btn-secondary", 3, "click", "disabled"], [1, "custom-select-wrapper"], ["type", "text", "placeholder", "Search and select an entity", 1, "form-input", 3, "ngModelChange", "focus", "ngModel"], ["type", "text", "disabled", "", 1, "form-input", 3, "value"], [1, "warning-text"], [1, "btn-danger", 3, "click", "disabled"], [3, "complete", "cancel", "config", "visible"], [1, "entity-dropdown-portal"], [1, "entity-dropdown-content"], [1, "dropdown-item"], [1, "dropdown-empty"], [1, "dropdown-item", 3, "mousedown"]], template: function ListsBrowseResource_Template(rf, ctx) { if (rf & 1) {
1965
+ } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 34, vars: 29, consts: [["categoryNodeTemplate", ""], ["entityInput", ""], ["Title", "Lists", "Icon", "fa-solid fa-list-check"], ["meta", ""], ["Label", "lists", 3, "Count", "Total"], ["actions", ""], [3, "ClearAllRequested", "ActiveCount", "ShowClearAll"], [3, "ValuesChange", "Reset", "Fields", "Values"], [3, "KeyChange", "Options", "ActiveKey"], [1, "favorite-filter-toggle", 3, "click", "title"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click"], [1, "fa-solid", "fa-plus"], ["toolbar", ""], ["Placeholder", "Search lists...", 3, "ValueChange", "Value"], [1, "tag-filter-row"], [1, "loading-container"], [1, "empty-state"], [1, "empty-state", "search-empty"], [1, "browse-content"], [1, "context-menu-overlay"], [1, "context-menu", 3, "top", "left"], [1, "modal-overlay"], [1, "modal-dialog"], [1, "modal-dialog", "confirm-dialog"], [3, "config", "visible"], [3, "Visible", "Title", "MinWidth", "Width", "Height"], [1, "entity-dropdown-portal", 3, "top", "left", "width", "dropdown-above"], [1, "tag-filter-row__label"], [1, "fa-solid", "fa-tag"], ["type", "button", 1, "tag-filter-chip"], ["type", "button", 1, "tag-filter-row__clear", 3, "click"], ["type", "button", 1, "tag-filter-chip", 3, "click"], [1, "fa-solid", "fa-xmark"], ["text", "Loading lists...", "size", "medium"], [1, "empty-state-icon-wrapper"], [1, "icon-bg"], [1, "fa-solid", "fa-list-check"], [1, "empty-state-features"], [1, "feature-item"], [1, "fa-solid", "fa-check-circle"], [1, "btn-create-large", 3, "click"], [1, "empty-state-icon-wrapper", "search"], [1, "fa-solid", "fa-filter-circle-xmark"], [1, "empty-hint"], [1, "btn-clear", 3, "click"], [1, "results-header"], [1, "result-count"], [1, "sort-options"], [1, "filter-select", "sort-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "lists-table"], ["role", "list", "aria-label", "Lists", 1, "lists-grid"], [1, "category-tree"], ["role", "grid", "aria-label", "Lists table"], ["scope", "col", 1, "col-name"], ["scope", "col", 1, "col-entity"], ["scope", "col", 1, "col-items"], ["scope", "col", 1, "col-sharing"], ["scope", "col", 1, "col-owner"], ["scope", "col", 1, "col-updated"], ["scope", "col", 1, "col-actions"], [1, "sr-only"], ["tabindex", "0", "role", "row", 1, "list-row"], ["tabindex", "0", "role", "row", 1, "list-row", 3, "click", "keydown.enter"], ["role", "gridcell", 1, "col-name"], [1, "name-cell"], ["aria-hidden", "true", 1, "list-icon"], [1, "name-content"], [1, "list-name"], [1, "list-desc"], ["role", "gridcell", 1, "col-entity"], [1, "entity-badge"], ["role", "gridcell", 1, "col-items"], ["role", "gridcell", 1, "col-sharing"], [1, "sharing-private"], ["role", "gridcell", 1, "col-owner"], [1, "owner-name"], ["role", "gridcell", 1, "col-updated"], ["role", "gridcell", 1, "col-actions"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "More options", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-ellipsis-v"], [1, "sharing-indicator"], [1, "fa-solid", "fa-share-nodes"], [1, "share-count"], [1, "fa-solid", "fa-lock"], ["tabindex", "0", "role", "listitem", 1, "list-card"], ["tabindex", "0", "role", "listitem", 1, "list-card", 3, "click", "keydown.enter"], [1, "card-header"], ["aria-hidden", "true", 1, "card-icon"], [1, "favorite-btn", 3, "click", "title"], [1, "card-menu"], [1, "menu-btn", 3, "click"], [1, "card-body"], [1, "card-title"], [1, "card-description"], [1, "card-meta"], [1, "meta-item"], [1, "fa-solid", "fa-database"], [1, "fa-solid", "fa-hashtag"], [1, "card-tags", 3, "click"], ["EntityName", "MJ: Lists", 3, "TagClicked", "Provider", "RecordID", "Editable", "MaxDisplay"], [1, "card-footer"], [1, "owner-tag"], [1, "fa-solid", "fa-user"], [1, "card-footer-right"], [1, "date-info"], [1, "sharing-badge", 3, "title"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "category-section"], [1, "category-header"], [1, "category-header", "uncategorized"], ["role", "list", 1, "category-lists"], [1, "category-header", 3, "click"], [1, "fa-solid", "fa-folder"], [1, "category-name"], [1, "category-count"], [1, "category-header", "uncategorized", 3, "click"], [1, "fa-solid", "fa-inbox"], ["tabindex", "0", "role", "listitem", 1, "list-row", "hierarchy-row"], ["tabindex", "0", "role", "listitem", 1, "list-row", "hierarchy-row", 3, "click", "keydown.enter"], [1, "list-info"], [1, "list-meta"], [1, "list-actions"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "click"], [1, "context-menu-overlay", 3, "click"], [1, "context-menu"], [1, "menu-item"], [1, "menu-item", 3, "click"], [1, "fa-solid", "fa-copy"], [1, "menu-viewer-hint"], [1, "fa-solid", "fa-pen"], [1, "menu-divider"], [1, "menu-item", "danger", 3, "click"], [1, "fa-solid", "fa-trash"], [1, "fa-solid", "fa-eye"], [1, "modal-overlay", 3, "click"], [1, "modal-header"], [1, "modal-close", 3, "click"], [1, "fa-solid", "fa-times"], [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-input", 3, "ngModelChange", "ngModel"], [3, "ngValue"], [1, "modal-footer"], [1, "btn-primary", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "btn-secondary", 3, "click", "disabled"], [1, "custom-select-wrapper"], ["type", "text", "placeholder", "Search and select an entity", 1, "form-input", 3, "ngModelChange", "focus", "ngModel"], ["type", "text", "disabled", "", 1, "form-input", 3, "value"], [1, "warning-text"], [1, "btn-danger", 3, "click", "disabled"], [3, "complete", "cancel", "manageInvitations", "viewAuditLog", "config", "visible"], [3, "Close", "Visible", "Title", "MinWidth", "Width", "Height"], [1, "dialog-content"], [3, "Provider", "ListID", "ListName"], ["mjButton", "", "variant", "outline", 3, "click"], [3, "Provider", "ListID"], [1, "entity-dropdown-portal"], [1, "entity-dropdown-content"], [1, "dropdown-item"], [1, "dropdown-empty"], [1, "dropdown-item", 3, "mousedown"]], template: function ListsBrowseResource_Template(rf, ctx) { if (rf & 1) {
1430
1966
  const _r1 = i0.ɵɵgetCurrentView();
1431
1967
  i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 2)(2, "div", 3);
1432
1968
  i0.ɵɵelement(3, "mj-stat-badge", 4);
@@ -1440,64 +1976,84 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1440
1976
  i0.ɵɵlistener("KeyChange", function ListsBrowseResource_Template_mj_view_toggle_KeyChange_7_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.setViewMode($event)); });
1441
1977
  i0.ɵɵelementEnd();
1442
1978
  i0.ɵɵelementStart(8, "button", 9);
1443
- i0.ɵɵlistener("click", function ListsBrowseResource_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.createNewList()); });
1444
- i0.ɵɵelement(9, "i", 10);
1445
- i0.ɵɵtext(10, " New List ");
1979
+ i0.ɵɵlistener("click", function ListsBrowseResource_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.toggleShowOnlyFavorites()); });
1980
+ i0.ɵɵelement(9, "i");
1981
+ i0.ɵɵtext(10, " Favorites ");
1982
+ i0.ɵɵelementEnd();
1983
+ i0.ɵɵelementStart(11, "button", 10);
1984
+ i0.ɵɵlistener("click", function ListsBrowseResource_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.createNewList()); });
1985
+ i0.ɵɵelement(12, "i", 11);
1986
+ i0.ɵɵtext(13, " New List ");
1446
1987
  i0.ɵɵelementEnd()();
1447
- i0.ɵɵelementStart(11, "div", 11)(12, "mj-page-search", 12);
1448
- i0.ɵɵlistener("ValueChange", function ListsBrowseResource_Template_mj_page_search_ValueChange_12_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSearchChange($event)); });
1988
+ i0.ɵɵelementStart(14, "div", 12)(15, "mj-page-search", 13);
1989
+ i0.ɵɵlistener("ValueChange", function ListsBrowseResource_Template_mj_page_search_ValueChange_15_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSearchChange($event)); });
1449
1990
  i0.ɵɵelementEnd()()();
1450
- i0.ɵɵelementStart(13, "mj-page-body");
1451
- i0.ɵɵconditionalCreate(14, ListsBrowseResource_Conditional_14_Template, 2, 0, "div", 13);
1452
- i0.ɵɵconditionalCreate(15, ListsBrowseResource_Conditional_15_Template, 24, 0, "div", 14);
1453
- i0.ɵɵconditionalCreate(16, ListsBrowseResource_Conditional_16_Template, 11, 0, "div", 15);
1454
- i0.ɵɵconditionalCreate(17, ListsBrowseResource_Conditional_17_Template, 11, 4, "div", 16);
1455
- i0.ɵɵtemplate(18, ListsBrowseResource_ng_template_18_Template, 5, 6, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
1456
- i0.ɵɵconditionalCreate(20, ListsBrowseResource_Conditional_20_Template, 1, 0, "div", 17);
1457
- i0.ɵɵconditionalCreate(21, ListsBrowseResource_Conditional_21_Template, 14, 4, "div", 18);
1458
- i0.ɵɵconditionalCreate(22, ListsBrowseResource_Conditional_22_Template, 1, 0, "div", 19);
1459
- i0.ɵɵconditionalCreate(23, ListsBrowseResource_Conditional_23_Template, 31, 11, "div", 20);
1991
+ i0.ɵɵelementStart(16, "mj-page-body");
1992
+ i0.ɵɵconditionalCreate(17, ListsBrowseResource_Conditional_17_Template, 8, 0, "div", 14);
1993
+ i0.ɵɵconditionalCreate(18, ListsBrowseResource_Conditional_18_Template, 2, 0, "div", 15);
1994
+ i0.ɵɵconditionalCreate(19, ListsBrowseResource_Conditional_19_Template, 24, 0, "div", 16);
1995
+ i0.ɵɵconditionalCreate(20, ListsBrowseResource_Conditional_20_Template, 11, 0, "div", 17);
1996
+ i0.ɵɵconditionalCreate(21, ListsBrowseResource_Conditional_21_Template, 13, 6, "div", 18);
1997
+ i0.ɵɵtemplate(22, ListsBrowseResource_ng_template_22_Template, 5, 6, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
1460
1998
  i0.ɵɵconditionalCreate(24, ListsBrowseResource_Conditional_24_Template, 1, 0, "div", 19);
1461
- i0.ɵɵconditionalCreate(25, ListsBrowseResource_Conditional_25_Template, 20, 5, "div", 21);
1462
- i0.ɵɵconditionalCreate(26, ListsBrowseResource_Conditional_26_Template, 1, 2, "mj-list-share-dialog", 22);
1463
- i0.ɵɵconditionalCreate(27, ListsBrowseResource_Conditional_27_Template, 5, 11, "div", 23);
1464
- i0.ɵɵelementEnd()();
1999
+ i0.ɵɵconditionalCreate(25, ListsBrowseResource_Conditional_25_Template, 8, 8, "div", 20);
2000
+ i0.ɵɵelementEnd();
2001
+ i0.ɵɵconditionalCreate(26, ListsBrowseResource_Conditional_26_Template, 1, 0, "div", 21);
2002
+ i0.ɵɵconditionalCreate(27, ListsBrowseResource_Conditional_27_Template, 31, 11, "div", 22);
2003
+ i0.ɵɵconditionalCreate(28, ListsBrowseResource_Conditional_28_Template, 1, 0, "div", 21);
2004
+ i0.ɵɵconditionalCreate(29, ListsBrowseResource_Conditional_29_Template, 20, 5, "div", 23);
2005
+ i0.ɵɵconditionalCreate(30, ListsBrowseResource_Conditional_30_Template, 1, 2, "mj-list-share-dialog", 24);
2006
+ i0.ɵɵconditionalCreate(31, ListsBrowseResource_Conditional_31_Template, 6, 8, "mj-dialog", 25);
2007
+ i0.ɵɵconditionalCreate(32, ListsBrowseResource_Conditional_32_Template, 6, 7, "mj-dialog", 25);
2008
+ i0.ɵɵconditionalCreate(33, ListsBrowseResource_Conditional_33_Template, 5, 11, "div", 26);
2009
+ i0.ɵɵelementEnd();
1465
2010
  } if (rf & 2) {
1466
2011
  i0.ɵɵadvance(3);
1467
- i0.ɵɵproperty("Count", ctx.filteredLists.length);
2012
+ i0.ɵɵproperty("Count", ctx.filteredLists.length)("Total", ctx.allLists.length);
1468
2013
  i0.ɵɵadvance(2);
1469
2014
  i0.ɵɵproperty("ActiveCount", ctx.ActiveFilterCount)("ShowClearAll", ctx.ActiveFilterCount > 0);
1470
2015
  i0.ɵɵadvance();
1471
2016
  i0.ɵɵproperty("Fields", ctx.listFilterFields)("Values", ctx.listFilterValues);
1472
2017
  i0.ɵɵadvance();
1473
2018
  i0.ɵɵproperty("Options", ctx.listViewOptions)("ActiveKey", ctx.viewMode);
1474
- i0.ɵɵadvance(5);
2019
+ i0.ɵɵadvance();
2020
+ i0.ɵɵclassProp("favorite-filter-toggle--active", ctx.showOnlyFavorites);
2021
+ i0.ɵɵproperty("title", ctx.showOnlyFavorites ? "Showing favorites only" : "Show all lists");
2022
+ i0.ɵɵadvance();
2023
+ i0.ɵɵclassMap(ctx.showOnlyFavorites ? "fa-solid fa-star" : "fa-regular fa-star");
2024
+ i0.ɵɵadvance(6);
1475
2025
  i0.ɵɵproperty("Value", ctx.searchTerm);
1476
2026
  i0.ɵɵadvance(2);
1477
- i0.ɵɵconditional(ctx.isLoading ? 14 : -1);
2027
+ i0.ɵɵconditional(ctx.tagFilters.length > 0 ? 17 : -1);
1478
2028
  i0.ɵɵadvance();
1479
- i0.ɵɵconditional(!ctx.isLoading && ctx.allLists.length === 0 ? 15 : -1);
2029
+ i0.ɵɵconditional(ctx.isLoading ? 18 : -1);
1480
2030
  i0.ɵɵadvance();
1481
- i0.ɵɵconditional(!ctx.isLoading && ctx.allLists.length > 0 && ctx.filteredLists.length === 0 ? 16 : -1);
2031
+ i0.ɵɵconditional(!ctx.isLoading && ctx.allLists.length === 0 ? 19 : -1);
1482
2032
  i0.ɵɵadvance();
1483
- i0.ɵɵconditional(!ctx.isLoading && ctx.filteredLists.length > 0 ? 17 : -1);
2033
+ i0.ɵɵconditional(!ctx.isLoading && ctx.allLists.length > 0 && ctx.filteredLists.length === 0 ? 20 : -1);
2034
+ i0.ɵɵadvance();
2035
+ i0.ɵɵconditional(!ctx.isLoading && ctx.filteredLists.length > 0 ? 21 : -1);
1484
2036
  i0.ɵɵadvance(3);
1485
- i0.ɵɵconditional(ctx.showContextMenu ? 20 : -1);
2037
+ i0.ɵɵconditional(ctx.showContextMenu ? 24 : -1);
2038
+ i0.ɵɵadvance();
2039
+ i0.ɵɵconditional(ctx.showContextMenu ? 25 : -1);
1486
2040
  i0.ɵɵadvance();
1487
- i0.ɵɵconditional(ctx.showContextMenu ? 21 : -1);
2041
+ i0.ɵɵconditional(ctx.showCreateDialog ? 26 : -1);
1488
2042
  i0.ɵɵadvance();
1489
- i0.ɵɵconditional(ctx.showCreateDialog ? 22 : -1);
2043
+ i0.ɵɵconditional(ctx.showCreateDialog ? 27 : -1);
1490
2044
  i0.ɵɵadvance();
1491
- i0.ɵɵconditional(ctx.showCreateDialog ? 23 : -1);
2045
+ i0.ɵɵconditional(ctx.showDeleteConfirm ? 28 : -1);
1492
2046
  i0.ɵɵadvance();
1493
- i0.ɵɵconditional(ctx.showDeleteConfirm ? 24 : -1);
2047
+ i0.ɵɵconditional(ctx.showDeleteConfirm ? 29 : -1);
1494
2048
  i0.ɵɵadvance();
1495
- i0.ɵɵconditional(ctx.showDeleteConfirm ? 25 : -1);
2049
+ i0.ɵɵconditional(ctx.shareDialogConfig ? 30 : -1);
1496
2050
  i0.ɵɵadvance();
1497
- i0.ɵɵconditional(ctx.shareDialogConfig ? 26 : -1);
2051
+ i0.ɵɵconditional(ctx.showInvitationsDialog && ctx.activeShareListId ? 31 : -1);
1498
2052
  i0.ɵɵadvance();
1499
- i0.ɵɵconditional(ctx.showEntityDropdown && !ctx.editingList ? 27 : -1);
1500
- } }, dependencies: [i4.NgTemplateOutlet, i5.NgSelectOption, i5.ɵNgSelectMultipleOption, i5.DefaultValueAccessor, i5.SelectControlValueAccessor, i5.NgControlStatus, i5.NgModel, i6.MJButtonDirective, i6.MJPageLayoutComponent, i6.MJPageHeaderComponent, i6.MJPageBodyComponent, i6.MJPageSearchComponent, i6.MJFilterPopoverComponent, i6.MJFilterPanelComponent, i6.MJViewToggleComponent, i6.MJStatBadgeComponent, i7.LoadingComponent, i3.ListShareDialogComponent], styles: ["\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n /* Header */\n .browse-header {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n }\n\n .header-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .header-title i {\n font-size: 24px;\n color: var(--mj-brand-primary);\n }\n\n .header-title h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n }\n\n .search-box {\n position: relative;\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 200px;\n max-width: 300px;\n }\n\n .search-box i.fa-search {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n }\n\n .search-box input {\n padding: 8px 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n font-size: 14px;\n width: 100%;\n transition: border-color 0.2s, box-shadow 0.2s;\n }\n\n .search-box input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .clear-search {\n position: absolute;\n right: 8px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n }\n\n .filter-group {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .filter-group label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .filter-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n min-width: 120px;\n }\n\n .filter-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .sort-select {\n min-width: 140px;\n }\n\n .view-toggle-group {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n }\n\n .view-toggle {\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border: none;\n border-right: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .view-toggle:last-child {\n border-right: none;\n }\n\n .view-toggle:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .view-toggle.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .btn-create {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-create:hover {\n background: var(--mj-brand-primary-hover);\n }\n\n /* Loading */\n .loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n }\n\n /* Empty State */\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n padding: 48px 40px;\n text-align: center;\n max-width: 480px;\n margin: 0 auto;\n }\n\n .empty-state-icon-wrapper {\n position: relative;\n margin-bottom: 24px;\n }\n\n .empty-state-icon-wrapper .icon-bg {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 120px;\n height: 120px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .empty-state-icon-wrapper > i {\n position: relative;\n font-size: 56px;\n color: var(--mj-brand-primary);\n z-index: 1;\n }\n\n .empty-state-icon-wrapper.search > i {\n font-size: 48px;\n color: var(--mj-text-disabled);\n }\n\n .empty-state h3 {\n margin: 0 0 12px;\n font-size: 22px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .empty-state p {\n margin: 0 0 8px;\n color: var(--mj-text-secondary);\n font-size: 15px;\n line-height: 1.5;\n }\n\n .empty-state p:last-of-type {\n margin-bottom: 24px;\n }\n\n .empty-hint {\n color: var(--mj-text-muted) !important;\n font-size: 13px !important;\n }\n\n .empty-state-features {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 28px;\n text-align: left;\n }\n\n .feature-item {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n }\n\n .feature-item i {\n font-size: 14px !important;\n color: var(--mj-status-success) !important;\n }\n\n .btn-create-large {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 28px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 8px;\n font-size: 15px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n\n .btn-create-large:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n }\n\n .btn-clear {\n padding: 10px 20px;\n background: var(--mj-bg-surface-sunken);\n border: none;\n border-radius: 6px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-clear:hover {\n background: var(--mj-border-default);\n }\n\n /* Content */\n .browse-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px 24px;\n }\n\n .results-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n }\n\n .sort-options {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .sort-options label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n /* Table View */\n .lists-table {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: var(--mj-shadow-sm);\n }\n\n .lists-table table {\n width: 100%;\n border-collapse: collapse;\n }\n\n .lists-table th {\n text-align: left;\n padding: 12px 16px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .lists-table td {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .list-row {\n cursor: pointer;\n transition: background 0.15s;\n outline: none;\n }\n\n .list-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .list-row:focus-visible {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n }\n\n .list-row:last-child td {\n border-bottom: none;\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n .col-name { width: 30%; }\n .col-entity { width: 15%; }\n .col-items { width: 8%; text-align: center; }\n .col-sharing { width: 8%; text-align: center; }\n .col-owner { width: 14%; }\n .col-updated { width: 15%; }\n .col-actions { width: 10%; text-align: right; }\n\n /* Sharing indicators */\n .sharing-indicator {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: var(--mj-brand-primary);\n font-size: 13px;\n }\n\n .sharing-indicator i {\n font-size: 14px;\n }\n\n .share-count {\n font-weight: 500;\n }\n\n .sharing-private {\n color: var(--mj-text-muted);\n font-size: 13px;\n }\n\n .sharing-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 50%;\n color: var(--mj-brand-primary);\n font-size: 11px;\n }\n\n .card-footer-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .name-cell {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .list-icon {\n width: 36px;\n height: 36px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .name-content {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .list-name {\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .entity-badge {\n display: inline-block;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 4px;\n font-size: 12px;\n color: var(--mj-brand-primary-hover);\n }\n\n .owner-name {\n color: var(--mj-text-secondary);\n }\n\n .owner-name.is-me {\n color: var(--mj-brand-primary);\n font-weight: 500;\n }\n\n .action-btn {\n background: none;\n border: none;\n padding: 6px 10px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s;\n }\n\n .action-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Card View */\n .lists-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n }\n\n .list-card {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n cursor: pointer;\n transition: transform 0.2s, box-shadow 0.2s, outline 0.1s;\n outline: 2px solid transparent;\n }\n\n .list-card:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-md);\n }\n\n .list-card:focus {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .list-card:focus:not(:focus-visible) {\n outline: none;\n }\n\n .list-card:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 16px 16px 0;\n }\n\n .card-icon {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 18px;\n }\n\n .menu-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .menu-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .card-body {\n padding: 12px 16px;\n }\n\n .card-title {\n margin: 0 0 4px;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .card-description {\n margin: 0 0 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .card-meta {\n display: flex;\n gap: 16px;\n }\n\n .meta-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .card-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .owner-tag {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n }\n\n .owner-tag.is-me {\n color: var(--mj-brand-primary);\n }\n\n .date-info {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n /* Hierarchy View */\n .category-tree {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .category-section {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .category-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .category-header:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .category-header i:first-child {\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .category-header .fa-folder,\n .category-header .fa-folder-open {\n color: var(--mj-status-warning);\n }\n\n .category-header.uncategorized .fa-inbox {\n color: var(--mj-text-muted);\n }\n\n .category-name {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .category-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n .category-lists {\n border-top: 1px solid var(--mj-border-default);\n }\n\n .hierarchy-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px 12px 40px;\n cursor: pointer;\n transition: background 0.2s;\n outline: none;\n }\n\n .hierarchy-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .hierarchy-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .hierarchy-row:focus-visible {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n }\n\n .list-info {\n flex: 1;\n min-width: 0;\n }\n\n .list-meta {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .list-actions {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.2s;\n }\n\n .hierarchy-row:hover .list-actions {\n opacity: 1;\n }\n\n /* Context Menu */\n .context-menu-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n }\n\n .context-menu {\n position: fixed;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-md);\n min-width: 160px;\n padding: 4px 0;\n z-index: 1000;\n }\n\n .menu-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 16px;\n background: none;\n border: none;\n text-align: left;\n font-size: 14px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .menu-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .menu-item.danger {\n color: var(--mj-status-error);\n }\n\n .menu-item.danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n }\n\n .menu-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }\n\n /* Modal Styles */\n .modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n }\n\n .modal-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-lg);\n width: 500px;\n max-width: 90vw;\n max-height: 90vh;\n overflow: hidden;\n z-index: 1001;\n }\n\n .confirm-dialog {\n width: 400px;\n }\n\n .modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .modal-close {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .modal-close:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .modal-body {\n padding: 20px;\n max-height: 60vh;\n overflow-y: auto;\n }\n\n .modal-body p {\n margin: 0 0 8px;\n color: var(--mj-text-primary);\n }\n\n .warning-text {\n color: var(--mj-status-error) !important;\n font-size: 13px;\n }\n\n .modal-footer {\n display: flex;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-secondary {\n padding: 10px 20px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-danger {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-danger:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-status-error) 85%, black);\n }\n\n /* Form Styles */\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group:last-child {\n margin-bottom: 0;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .form-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.2s, box-shadow 0.2s;\n box-sizing: border-box;\n }\n\n .form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .form-input:disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n textarea.form-input {\n resize: vertical;\n min-height: 80px;\n }\n\n select.form-input {\n cursor: pointer;\n }\n\n .custom-select-wrapper {\n position: relative;\n }\n\n /* Portal Dropdown */\n .entity-dropdown-portal {\n position: fixed;\n z-index: 10002;\n }\n\n .entity-dropdown-content {\n max-height: 200px;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: var(--mj-shadow-md);\n }\n\n .entity-dropdown-content.open-above {\n position: absolute;\n bottom: 0;\n }\n\n .dropdown-item {\n padding: 10px 12px;\n cursor: pointer;\n transition: background 0.15s;\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .dropdown-item:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .dropdown-item:first-child {\n border-radius: 6px 6px 0 0;\n }\n\n .dropdown-item:last-child {\n border-radius: 0 0 6px 6px;\n }\n\n .dropdown-empty {\n padding: 10px 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .header-row {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n\n .btn-create {\n width: 100%;\n justify-content: center;\n }\n\n .header-actions {\n flex-direction: column;\n align-items: stretch;\n }\n\n .search-box {\n max-width: none;\n }\n\n .filter-group {\n width: 100%;\n }\n\n .filter-select {\n flex: 1;\n width: 100%;\n }\n\n .view-toggle-group {\n justify-content: center;\n }\n\n .lists-table {\n overflow-x: auto;\n }\n\n .col-entity, .col-items, .col-updated {\n display: none;\n }\n\n .lists-grid {\n grid-template-columns: 1fr;\n }\n\n .modal-dialog {\n width: 95vw;\n }\n }\n "], encapsulation: 2 });
2053
+ i0.ɵɵconditional(ctx.showAuditLogDialog && ctx.activeShareListId ? 32 : -1);
2054
+ i0.ɵɵadvance();
2055
+ i0.ɵɵconditional(ctx.showEntityDropdown && !ctx.editingList ? 33 : -1);
2056
+ } }, dependencies: [i4.NgTemplateOutlet, i5.NgSelectOption, i5.ɵNgSelectMultipleOption, i5.DefaultValueAccessor, i5.SelectControlValueAccessor, i5.NgControlStatus, i5.NgModel, i6.MJButtonDirective, i6.MJDialogComponent, i6.MJDialogActionsComponent, i6.MJPageLayoutComponent, i6.MJPageHeaderComponent, i6.MJPageBodyComponent, i6.MJPageSearchComponent, i6.MJFilterPopoverComponent, i6.MJFilterPanelComponent, i6.MJViewToggleComponent, i6.MJStatBadgeComponent, i7.LoadingComponent, i3.ListAuditLogComponent, i3.ListInvitationsComponent, i3.ListShareDialogComponent, i3.TagChipsComponent], styles: ["\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .lists-browse-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n overflow: hidden;\n }\n\n /* Header */\n .browse-header {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n }\n\n .header-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .header-title i {\n font-size: 24px;\n color: var(--mj-brand-primary);\n }\n\n .header-title h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n }\n\n .search-box {\n position: relative;\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 200px;\n max-width: 300px;\n }\n\n .search-box i.fa-search {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n }\n\n .search-box input {\n padding: 8px 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n font-size: 14px;\n width: 100%;\n transition: border-color 0.2s, box-shadow 0.2s;\n }\n\n .search-box input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .clear-search {\n position: absolute;\n right: 8px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n }\n\n .filter-group {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .filter-group label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .filter-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n min-width: 120px;\n }\n\n .filter-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .sort-select {\n min-width: 140px;\n }\n\n .view-toggle-group {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n }\n\n .view-toggle {\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border: none;\n border-right: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .view-toggle:last-child {\n border-right: none;\n }\n\n .view-toggle:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .view-toggle.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .btn-create {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-create:hover {\n background: var(--mj-brand-primary-hover);\n }\n\n /* Loading */\n .loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n }\n\n /* Empty State */\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n padding: 48px 40px;\n text-align: center;\n max-width: 480px;\n margin: 0 auto;\n }\n\n .empty-state-icon-wrapper {\n position: relative;\n margin-bottom: 24px;\n }\n\n .empty-state-icon-wrapper .icon-bg {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 120px;\n height: 120px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .empty-state-icon-wrapper > i {\n position: relative;\n font-size: 56px;\n color: var(--mj-brand-primary);\n z-index: 1;\n }\n\n .empty-state-icon-wrapper.search > i {\n font-size: 48px;\n color: var(--mj-text-disabled);\n }\n\n .empty-state h3 {\n margin: 0 0 12px;\n font-size: 22px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .empty-state p {\n margin: 0 0 8px;\n color: var(--mj-text-secondary);\n font-size: 15px;\n line-height: 1.5;\n }\n\n .empty-state p:last-of-type {\n margin-bottom: 24px;\n }\n\n .empty-hint {\n color: var(--mj-text-muted) !important;\n font-size: 13px !important;\n }\n\n .empty-state-features {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 28px;\n text-align: left;\n }\n\n .feature-item {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n }\n\n .feature-item i {\n font-size: 14px !important;\n color: var(--mj-status-success) !important;\n }\n\n .btn-create-large {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 28px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 8px;\n font-size: 15px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n\n .btn-create-large:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n }\n\n .btn-clear {\n padding: 10px 20px;\n background: var(--mj-bg-surface-sunken);\n border: none;\n border-radius: 6px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-clear:hover {\n background: var(--mj-border-default);\n }\n\n /* Content */\n .browse-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px 24px;\n }\n\n .results-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n }\n\n .result-count {\n font-size: 14px;\n color: var(--mj-text-secondary);\n }\n\n .sort-options {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .sort-options label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n /* Table View */\n .lists-table {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: var(--mj-shadow-sm);\n }\n\n .lists-table table {\n width: 100%;\n border-collapse: collapse;\n }\n\n .lists-table th {\n text-align: left;\n padding: 12px 16px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .lists-table td {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .list-row {\n cursor: pointer;\n transition: background 0.15s;\n outline: none;\n }\n\n .list-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .list-row:focus-visible {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n }\n\n .list-row:last-child td {\n border-bottom: none;\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n .col-name { width: 30%; }\n .col-entity { width: 15%; }\n .col-items { width: 8%; text-align: center; }\n .col-sharing { width: 8%; text-align: center; }\n .col-owner { width: 14%; }\n .col-updated { width: 15%; }\n .col-actions { width: 10%; text-align: right; }\n\n /* Sharing indicators */\n .sharing-indicator {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: var(--mj-brand-primary);\n font-size: 13px;\n }\n\n .sharing-indicator i {\n font-size: 14px;\n }\n\n .share-count {\n font-weight: 500;\n }\n\n .sharing-private {\n color: var(--mj-text-muted);\n font-size: 13px;\n }\n\n .sharing-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 50%;\n color: var(--mj-brand-primary);\n font-size: 11px;\n }\n\n .card-footer-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .name-cell {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .list-icon {\n width: 36px;\n height: 36px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .name-content {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .list-name {\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .entity-badge {\n display: inline-block;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 4px;\n font-size: 12px;\n color: var(--mj-brand-primary-hover);\n }\n\n .owner-name {\n color: var(--mj-text-secondary);\n }\n\n .owner-name.is-me {\n color: var(--mj-brand-primary);\n font-weight: 500;\n }\n\n .action-btn {\n background: none;\n border: none;\n padding: 6px 10px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s;\n }\n\n .action-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Card View */\n .lists-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n }\n\n .list-card {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n cursor: pointer;\n transition: transform 0.2s, box-shadow 0.2s, outline 0.1s;\n outline: 2px solid transparent;\n }\n\n .list-card:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-md);\n }\n\n .list-card:focus {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .list-card:focus:not(:focus-visible) {\n outline: none;\n }\n\n .list-card:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 16px 16px 0;\n }\n\n .card-icon {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 18px;\n }\n\n .menu-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .menu-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .card-body {\n padding: 12px 16px;\n }\n\n .card-title {\n margin: 0 0 4px;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .card-description {\n margin: 0 0 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .card-meta {\n display: flex;\n gap: 16px;\n }\n\n .meta-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n /* Tag chips on a card. Stop-propagation is set on the wrapper so\n clicks on chips don't open the underlying list. */\n .card-tags {\n margin-top: 8px;\n }\n\n /* Favorite star on cards (Phase 5.3). */\n .favorite-btn {\n background: none;\n border: none;\n padding: 4px;\n margin: -4px;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 14px;\n border-radius: 4px;\n transition: color 0.12s ease, background 0.12s ease;\n }\n\n .favorite-btn:hover {\n background: var(--mj-bg-surface-card);\n color: var(--mj-status-warning);\n }\n\n .favorite-btn--active {\n color: var(--mj-status-warning);\n }\n\n /* Favorites-only toggle in the toolbar. */\n .favorite-filter-toggle {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: none;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 12.5px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n }\n\n .favorite-filter-toggle:hover {\n border-color: var(--mj-status-warning);\n color: var(--mj-status-warning);\n }\n\n .favorite-filter-toggle--active {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n color: var(--mj-status-warning);\n font-weight: 600;\n }\n\n /* Active-tag filter row above the grid (Phase 4.3). */\n .tag-filter-row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n margin-bottom: 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n font-size: 12.5px;\n }\n\n .tag-filter-row__label {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n\n .tag-filter-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 10px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n font-size: 11.5px;\n cursor: pointer;\n }\n\n .tag-filter-chip:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface));\n }\n\n .tag-filter-row__clear {\n background: none;\n border: none;\n color: var(--mj-text-link);\n font-size: 11.5px;\n cursor: pointer;\n margin-left: auto;\n }\n\n .tag-filter-row__clear:hover {\n text-decoration: underline;\n }\n\n .card-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .owner-tag {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n }\n\n .owner-tag.is-me {\n color: var(--mj-brand-primary);\n }\n\n .date-info {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n /* Hierarchy View */\n .category-tree {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .category-section {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .category-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .category-header:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .category-header i:first-child {\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .category-header .fa-folder,\n .category-header .fa-folder-open {\n color: var(--mj-status-warning);\n }\n\n .category-header.uncategorized .fa-inbox {\n color: var(--mj-text-muted);\n }\n\n .category-name {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .category-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n .category-lists {\n border-top: 1px solid var(--mj-border-default);\n }\n\n .hierarchy-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px 12px 40px;\n cursor: pointer;\n transition: background 0.2s;\n outline: none;\n }\n\n .hierarchy-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .hierarchy-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .hierarchy-row:focus-visible {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n }\n\n .list-info {\n flex: 1;\n min-width: 0;\n }\n\n .list-meta {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .list-actions {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.2s;\n }\n\n .hierarchy-row:hover .list-actions {\n opacity: 1;\n }\n\n /* Context Menu */\n .context-menu-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n }\n\n .context-menu {\n position: fixed;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-md);\n min-width: 160px;\n padding: 4px 0;\n z-index: 1000;\n }\n\n .menu-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 16px;\n background: none;\n border: none;\n text-align: left;\n font-size: 14px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .menu-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .menu-item.danger {\n color: var(--mj-status-error);\n }\n\n .menu-item.danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n }\n\n .menu-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }\n\n .menu-viewer-hint {\n padding: 10px 14px;\n font-size: 12px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 8px;\n font-style: italic;\n }\n .menu-viewer-hint i { color: var(--mj-text-muted); }\n\n /* Modal Styles */\n .modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n }\n\n .modal-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-lg);\n width: 500px;\n max-width: 90vw;\n max-height: 90vh;\n overflow: hidden;\n z-index: 1001;\n }\n\n .confirm-dialog {\n width: 400px;\n }\n\n .modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .modal-close {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .modal-close:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .modal-body {\n padding: 20px;\n max-height: 60vh;\n overflow-y: auto;\n }\n\n .modal-body p {\n margin: 0 0 8px;\n color: var(--mj-text-primary);\n }\n\n .warning-text {\n color: var(--mj-status-error) !important;\n font-size: 13px;\n }\n\n .modal-footer {\n display: flex;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-secondary {\n padding: 10px 20px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-danger {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-danger:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-status-error) 85%, black);\n }\n\n /* Form Styles */\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group:last-child {\n margin-bottom: 0;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .form-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.2s, box-shadow 0.2s;\n box-sizing: border-box;\n }\n\n .form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .form-input:disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n textarea.form-input {\n resize: vertical;\n min-height: 80px;\n }\n\n select.form-input {\n cursor: pointer;\n }\n\n .custom-select-wrapper {\n position: relative;\n }\n\n /* Portal Dropdown */\n .entity-dropdown-portal {\n position: fixed;\n z-index: 10002;\n }\n\n .entity-dropdown-content {\n max-height: 200px;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: var(--mj-shadow-md);\n }\n\n .entity-dropdown-content.open-above {\n position: absolute;\n bottom: 0;\n }\n\n .dropdown-item {\n padding: 10px 12px;\n cursor: pointer;\n transition: background 0.15s;\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .dropdown-item:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .dropdown-item:first-child {\n border-radius: 6px 6px 0 0;\n }\n\n .dropdown-item:last-child {\n border-radius: 0 0 6px 6px;\n }\n\n .dropdown-empty {\n padding: 10px 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .header-row {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n\n .btn-create {\n width: 100%;\n justify-content: center;\n }\n\n .header-actions {\n flex-direction: column;\n align-items: stretch;\n }\n\n .search-box {\n max-width: none;\n }\n\n .filter-group {\n width: 100%;\n }\n\n .filter-select {\n flex: 1;\n width: 100%;\n }\n\n .view-toggle-group {\n justify-content: center;\n }\n\n .lists-table {\n overflow-x: auto;\n }\n\n .col-entity, .col-items, .col-updated {\n display: none;\n }\n\n .lists-grid {\n grid-template-columns: 1fr;\n }\n\n .modal-dialog {\n width: 95vw;\n }\n }\n "], encapsulation: 2 });
1501
2057
  };
1502
2058
  ListsBrowseResource = __decorate([
1503
2059
  RegisterClass(BaseResourceComponent, 'ListsBrowseResource')
@@ -1508,8 +2064,13 @@ export { ListsBrowseResource };
1508
2064
  args: [{ standalone: false, selector: 'mj-lists-browse-resource', template: `
1509
2065
  <mj-page-layout>
1510
2066
  <mj-page-header Title="Lists" Icon="fa-solid fa-list-check">
2067
+ <!-- X-of-Y filtered count earns its meta spot per chrome conventions §2. -->
1511
2068
  <div meta>
1512
- <mj-stat-badge [Count]="filteredLists.length" Label="lists"></mj-stat-badge>
2069
+ <mj-stat-badge
2070
+ [Count]="filteredLists.length"
2071
+ [Total]="allLists.length"
2072
+ Label="lists">
2073
+ </mj-stat-badge>
1513
2074
  </div>
1514
2075
  <div actions>
1515
2076
  <mj-filter-popover
@@ -1530,6 +2091,17 @@ export { ListsBrowseResource };
1530
2091
  (KeyChange)="setViewMode($any($event))">
1531
2092
  </mj-view-toggle>
1532
2093
 
2094
+ <!-- Favorites-only toggle (Phase 5.3). Sits next to the view toggle
2095
+ so it reads as "filter scope" alongside view mode. -->
2096
+ <button
2097
+ class="favorite-filter-toggle"
2098
+ [class.favorite-filter-toggle--active]="showOnlyFavorites"
2099
+ (click)="toggleShowOnlyFavorites()"
2100
+ [title]="showOnlyFavorites ? 'Showing favorites only' : 'Show all lists'">
2101
+ <i [class]="showOnlyFavorites ? 'fa-solid fa-star' : 'fa-regular fa-star'"></i>
2102
+ Favorites
2103
+ </button>
2104
+
1533
2105
  <button mjButton variant="primary" size="sm" (click)="createNewList()">
1534
2106
  <i class="fa-solid fa-plus"></i> New List
1535
2107
  </button>
@@ -1544,13 +2116,37 @@ export { ListsBrowseResource };
1544
2116
  </mj-page-header>
1545
2117
 
1546
2118
  <mj-page-body>
2119
+
2120
+ <!-- Active tag filters (Phase 4.3). Renders only when at least one
2121
+ tag is active — multi-tag = AND. Clicking a chip's × removes it. -->
2122
+ @if (tagFilters.length > 0) {
2123
+ <div class="tag-filter-row">
2124
+ <span class="tag-filter-row__label">
2125
+ <i class="fa-solid fa-tag"></i>
2126
+ Filtering by tag:
2127
+ </span>
2128
+ @for (f of tagFilters; track f.TagID) {
2129
+ <button
2130
+ class="tag-filter-chip"
2131
+ type="button"
2132
+ (click)="removeTagFilter(f.TagID)">
2133
+ {{ f.Name }}
2134
+ <i class="fa-solid fa-xmark"></i>
2135
+ </button>
2136
+ }
2137
+ <button class="tag-filter-row__clear" type="button" (click)="clearTagFilters()">
2138
+ Clear all
2139
+ </button>
2140
+ </div>
2141
+ }
2142
+
1547
2143
  <!-- Loading State -->
1548
2144
  @if (isLoading) {
1549
2145
  <div class="loading-container">
1550
2146
  <mj-loading text="Loading lists..." size="medium"></mj-loading>
1551
2147
  </div>
1552
2148
  }
1553
-
2149
+
1554
2150
  <!-- Empty State - No Lists -->
1555
2151
  @if (!isLoading && allLists.length === 0) {
1556
2152
  <div class="empty-state">
@@ -1597,9 +2193,8 @@ export { ListsBrowseResource };
1597
2193
  <!-- Results Content -->
1598
2194
  @if (!isLoading && filteredLists.length > 0) {
1599
2195
  <div class="browse-content">
1600
- <!-- Sort options — sort UI is undecided in the chrome conventions doc;
1601
- keeping it here in the body as a sub-view control until the doc takes a position. -->
1602
2196
  <div class="results-header">
2197
+ <span class="result-count">{{filteredLists.length}} list{{filteredLists.length !== 1 ? 's' : ''}}</span>
1603
2198
  <div class="sort-options">
1604
2199
  <label>Sort:</label>
1605
2200
  <select
@@ -1679,15 +2274,13 @@ export { ListsBrowseResource };
1679
2274
  </td>
1680
2275
  <td class="col-updated" role="gridcell">{{formatDate(item.list.__mj_UpdatedAt)}}</td>
1681
2276
  <td class="col-actions" role="gridcell">
1682
- @if (item.isOwner) {
1683
- <button mjButton
1684
- variant="flat"
1685
- size="sm"
1686
- (click)="openListMenu($event, item)"
1687
- title="More options">
1688
- <i class="fa-solid fa-ellipsis-v" aria-hidden="true"></i>
1689
- </button>
1690
- }
2277
+ <button mjButton
2278
+ variant="flat"
2279
+ size="sm"
2280
+ (click)="openListMenu($event, item)"
2281
+ title="More options">
2282
+ <i class="fa-solid fa-ellipsis-v" aria-hidden="true"></i>
2283
+ </button>
1691
2284
  </td>
1692
2285
  </tr>
1693
2286
  }
@@ -1709,13 +2302,18 @@ export { ListsBrowseResource };
1709
2302
  <div class="card-icon" [style.background-color]="getEntityColor(item.entityName)" aria-hidden="true">
1710
2303
  <i [class]="getEntityIcon(item.entityName)"></i>
1711
2304
  </div>
1712
- @if (item.isOwner) {
1713
- <div class="card-menu">
1714
- <button class="menu-btn" (click)="openListMenu($event, item)">
1715
- <i class="fa-solid fa-ellipsis-v" aria-hidden="true"></i>
1716
- </button>
1717
- </div>
1718
- }
2305
+ <button
2306
+ class="favorite-btn"
2307
+ [class.favorite-btn--active]="isFavorite(item.list.ID)"
2308
+ (click)="toggleFavorite($event, item)"
2309
+ [title]="isFavorite(item.list.ID) ? 'Remove from favorites' : 'Add to favorites'">
2310
+ <i [class]="isFavorite(item.list.ID) ? 'fa-solid fa-star' : 'fa-regular fa-star'"></i>
2311
+ </button>
2312
+ <div class="card-menu">
2313
+ <button class="menu-btn" (click)="openListMenu($event, item)">
2314
+ <i class="fa-solid fa-ellipsis-v" aria-hidden="true"></i>
2315
+ </button>
2316
+ </div>
1719
2317
  </div>
1720
2318
  <div class="card-body">
1721
2319
  <h3 class="card-title">{{item.list.Name}}</h3>
@@ -1732,6 +2330,20 @@ export { ListsBrowseResource };
1732
2330
  {{item.itemCount}} item{{item.itemCount !== 1 ? 's' : ''}}
1733
2331
  </span>
1734
2332
  </div>
2333
+ <!-- Tag chips (Phase 4). Read-only on cards; click adds the
2334
+ tag to the filter row above. We stop propagation on
2335
+ the wrapper so clicks on chips don't also fire the
2336
+ card's openList handler. -->
2337
+ <div class="card-tags" (click)="$event.stopPropagation()">
2338
+ <mj-tag-chips
2339
+ [Provider]="Provider"
2340
+ EntityName="MJ: Lists"
2341
+ [RecordID]="item.list.ID"
2342
+ [Editable]="false"
2343
+ [MaxDisplay]="3"
2344
+ (TagClicked)="onCardTagClicked($event)">
2345
+ </mj-tag-chips>
2346
+ </div>
1735
2347
  </div>
1736
2348
  <div class="card-footer">
1737
2349
  <span class="owner-tag" [class.is-me]="item.isOwner">
@@ -1813,13 +2425,11 @@ export { ListsBrowseResource };
1813
2425
  }
1814
2426
  </span>
1815
2427
  </div>
1816
- @if (item.isOwner) {
1817
- <div class="list-actions">
1818
- <button mjButton variant="flat" size="sm" (click)="openListMenu($event, item)">
1819
- <i class="fa-solid fa-ellipsis-v" aria-hidden="true"></i>
1820
- </button>
1821
- </div>
1822
- }
2428
+ <div class="list-actions">
2429
+ <button mjButton variant="flat" size="sm" (click)="openListMenu($event, item)">
2430
+ <i class="fa-solid fa-ellipsis-v" aria-hidden="true"></i>
2431
+ </button>
2432
+ </div>
1823
2433
  </div>
1824
2434
  }
1825
2435
  </div>
@@ -1834,32 +2444,53 @@ export { ListsBrowseResource };
1834
2444
  </div>
1835
2445
  </ng-template>
1836
2446
 
1837
- <!-- Context Menu -->
2447
+ <!-- Context Menu (Phase 2.8 viewer-perspective gating).
2448
+ Items shown depend on contextItemCapabilities, resolved lazily
2449
+ on menu open. Viewers (no Edit/Share/Delete) still see
2450
+ Duplicate. Server-side enforcement remains source of truth;
2451
+ hiding is just UX so users don't see buttons that would fail. -->
1838
2452
  @if (showContextMenu) {
1839
2453
  <div class="context-menu-overlay" (click)="closeContextMenu()"></div>
1840
2454
  }
1841
2455
  @if (showContextMenu) {
1842
2456
  <div class="context-menu" [style.top.px]="contextMenuY" [style.left.px]="contextMenuX">
1843
- <button class="menu-item" (click)="editList()">
1844
- <i class="fa-solid fa-pen"></i>
1845
- Edit
1846
- </button>
1847
- <button class="menu-item" (click)="openShareDialog()">
1848
- <i class="fa-solid fa-share-nodes"></i>
1849
- Share
1850
- </button>
2457
+ @if (contextItemCapabilities.CanEdit) {
2458
+ <button class="menu-item" (click)="editList()">
2459
+ <i class="fa-solid fa-pen"></i>
2460
+ Edit
2461
+ </button>
2462
+ }
2463
+ @if (contextItemCapabilities.CanShare) {
2464
+ <button class="menu-item" (click)="openShareDialog()">
2465
+ <i class="fa-solid fa-share-nodes"></i>
2466
+ Share
2467
+ </button>
2468
+ }
1851
2469
  <button class="menu-item" (click)="duplicateList()">
1852
2470
  <i class="fa-solid fa-copy"></i>
1853
2471
  Duplicate
1854
2472
  </button>
1855
- <div class="menu-divider"></div>
1856
- <button class="menu-item danger" (click)="confirmDeleteList()">
1857
- <i class="fa-solid fa-trash"></i>
1858
- Delete
1859
- </button>
2473
+ @if (contextItemCapabilities.CanDelete) {
2474
+ <div class="menu-divider"></div>
2475
+ <button class="menu-item danger" (click)="confirmDeleteList()">
2476
+ <i class="fa-solid fa-trash"></i>
2477
+ Delete
2478
+ </button>
2479
+ }
2480
+ @if (!contextItemCapabilities.CanEdit && !contextItemCapabilities.CanShare && !contextItemCapabilities.CanDelete) {
2481
+ <div class="menu-viewer-hint">
2482
+ <i class="fa-solid fa-eye"></i>
2483
+ Viewer access — read only
2484
+ </div>
2485
+ }
1860
2486
  </div>
1861
2487
  }
1862
-
2488
+ </mj-page-body>
2489
+
2490
+ <!-- Modals/overlays live outside mj-page-body so its stacking context
2491
+ doesn't trap them. Position:fixed overlays would otherwise render
2492
+ behind a sibling overlay div, which silently closes the dialog on
2493
+ any click. -->
1863
2494
  <!-- Create/Edit Dialog -->
1864
2495
  @if (showCreateDialog) {
1865
2496
  <div class="modal-overlay" (click)="closeCreateDialog()"></div>
@@ -1969,9 +2600,54 @@ export { ListsBrowseResource };
1969
2600
  [config]="shareDialogConfig"
1970
2601
  [visible]="showShareDialog"
1971
2602
  (complete)="onShareComplete($event)"
1972
- (cancel)="onShareCancel()">
2603
+ (cancel)="onShareCancel()"
2604
+ (manageInvitations)="onManageInvitations()"
2605
+ (viewAuditLog)="onViewAuditLog()">
1973
2606
  </mj-list-share-dialog>
1974
2607
  }
2608
+
2609
+ <!-- Invitations Dialog (mockup 16) -->
2610
+ @if (showInvitationsDialog && activeShareListId) {
2611
+ <mj-dialog
2612
+ [Visible]="true"
2613
+ [Title]="'Invitations — ' + (activeShareListName ?? 'List')"
2614
+ (Close)="closeInvitationsDialog()"
2615
+ [MinWidth]="640"
2616
+ [Width]="900"
2617
+ [Height]="640">
2618
+ <div class="dialog-content">
2619
+ <mj-list-invitations
2620
+ [Provider]="ProviderToUse"
2621
+ [ListID]="activeShareListId"
2622
+ [ListName]="activeShareListName">
2623
+ </mj-list-invitations>
2624
+ </div>
2625
+ <mj-dialog-actions>
2626
+ <button mjButton (click)="closeInvitationsDialog()" variant="outline">Close</button>
2627
+ </mj-dialog-actions>
2628
+ </mj-dialog>
2629
+ }
2630
+
2631
+ <!-- Audit Log Dialog (mockup 18) -->
2632
+ @if (showAuditLogDialog && activeShareListId) {
2633
+ <mj-dialog
2634
+ [Visible]="true"
2635
+ [Title]="'Audit Log — ' + (activeShareListName ?? 'List')"
2636
+ (Close)="closeAuditLogDialog()"
2637
+ [MinWidth]="720"
2638
+ [Width]="980"
2639
+ [Height]="680">
2640
+ <div class="dialog-content">
2641
+ <mj-list-audit-log
2642
+ [Provider]="ProviderToUse"
2643
+ [ListID]="activeShareListId">
2644
+ </mj-list-audit-log>
2645
+ </div>
2646
+ <mj-dialog-actions>
2647
+ <button mjButton (click)="closeAuditLogDialog()" variant="outline">Close</button>
2648
+ </mj-dialog-actions>
2649
+ </mj-dialog>
2650
+ }
1975
2651
 
1976
2652
  <!-- Entity Dropdown Portal -->
1977
2653
  @if (showEntityDropdown && !editingList) {
@@ -1997,9 +2673,8 @@ export { ListsBrowseResource };
1997
2673
  </div>
1998
2674
  </div>
1999
2675
  }
2000
- </mj-page-body>
2001
2676
  </mj-page-layout>
2002
- `, encapsulation: ViewEncapsulation.None, styles: ["\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n /* Header */\n .browse-header {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n }\n\n .header-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .header-title i {\n font-size: 24px;\n color: var(--mj-brand-primary);\n }\n\n .header-title h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n }\n\n .search-box {\n position: relative;\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 200px;\n max-width: 300px;\n }\n\n .search-box i.fa-search {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n }\n\n .search-box input {\n padding: 8px 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n font-size: 14px;\n width: 100%;\n transition: border-color 0.2s, box-shadow 0.2s;\n }\n\n .search-box input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .clear-search {\n position: absolute;\n right: 8px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n }\n\n .filter-group {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .filter-group label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .filter-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n min-width: 120px;\n }\n\n .filter-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .sort-select {\n min-width: 140px;\n }\n\n .view-toggle-group {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n }\n\n .view-toggle {\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border: none;\n border-right: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .view-toggle:last-child {\n border-right: none;\n }\n\n .view-toggle:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .view-toggle.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .btn-create {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-create:hover {\n background: var(--mj-brand-primary-hover);\n }\n\n /* Loading */\n .loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n }\n\n /* Empty State */\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n padding: 48px 40px;\n text-align: center;\n max-width: 480px;\n margin: 0 auto;\n }\n\n .empty-state-icon-wrapper {\n position: relative;\n margin-bottom: 24px;\n }\n\n .empty-state-icon-wrapper .icon-bg {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 120px;\n height: 120px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .empty-state-icon-wrapper > i {\n position: relative;\n font-size: 56px;\n color: var(--mj-brand-primary);\n z-index: 1;\n }\n\n .empty-state-icon-wrapper.search > i {\n font-size: 48px;\n color: var(--mj-text-disabled);\n }\n\n .empty-state h3 {\n margin: 0 0 12px;\n font-size: 22px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .empty-state p {\n margin: 0 0 8px;\n color: var(--mj-text-secondary);\n font-size: 15px;\n line-height: 1.5;\n }\n\n .empty-state p:last-of-type {\n margin-bottom: 24px;\n }\n\n .empty-hint {\n color: var(--mj-text-muted) !important;\n font-size: 13px !important;\n }\n\n .empty-state-features {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 28px;\n text-align: left;\n }\n\n .feature-item {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n }\n\n .feature-item i {\n font-size: 14px !important;\n color: var(--mj-status-success) !important;\n }\n\n .btn-create-large {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 28px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 8px;\n font-size: 15px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n\n .btn-create-large:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n }\n\n .btn-clear {\n padding: 10px 20px;\n background: var(--mj-bg-surface-sunken);\n border: none;\n border-radius: 6px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-clear:hover {\n background: var(--mj-border-default);\n }\n\n /* Content */\n .browse-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px 24px;\n }\n\n .results-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n }\n\n .sort-options {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .sort-options label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n /* Table View */\n .lists-table {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: var(--mj-shadow-sm);\n }\n\n .lists-table table {\n width: 100%;\n border-collapse: collapse;\n }\n\n .lists-table th {\n text-align: left;\n padding: 12px 16px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .lists-table td {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .list-row {\n cursor: pointer;\n transition: background 0.15s;\n outline: none;\n }\n\n .list-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .list-row:focus-visible {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n }\n\n .list-row:last-child td {\n border-bottom: none;\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n .col-name { width: 30%; }\n .col-entity { width: 15%; }\n .col-items { width: 8%; text-align: center; }\n .col-sharing { width: 8%; text-align: center; }\n .col-owner { width: 14%; }\n .col-updated { width: 15%; }\n .col-actions { width: 10%; text-align: right; }\n\n /* Sharing indicators */\n .sharing-indicator {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: var(--mj-brand-primary);\n font-size: 13px;\n }\n\n .sharing-indicator i {\n font-size: 14px;\n }\n\n .share-count {\n font-weight: 500;\n }\n\n .sharing-private {\n color: var(--mj-text-muted);\n font-size: 13px;\n }\n\n .sharing-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 50%;\n color: var(--mj-brand-primary);\n font-size: 11px;\n }\n\n .card-footer-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .name-cell {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .list-icon {\n width: 36px;\n height: 36px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .name-content {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .list-name {\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .entity-badge {\n display: inline-block;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 4px;\n font-size: 12px;\n color: var(--mj-brand-primary-hover);\n }\n\n .owner-name {\n color: var(--mj-text-secondary);\n }\n\n .owner-name.is-me {\n color: var(--mj-brand-primary);\n font-weight: 500;\n }\n\n .action-btn {\n background: none;\n border: none;\n padding: 6px 10px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s;\n }\n\n .action-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Card View */\n .lists-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n }\n\n .list-card {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n cursor: pointer;\n transition: transform 0.2s, box-shadow 0.2s, outline 0.1s;\n outline: 2px solid transparent;\n }\n\n .list-card:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-md);\n }\n\n .list-card:focus {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .list-card:focus:not(:focus-visible) {\n outline: none;\n }\n\n .list-card:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 16px 16px 0;\n }\n\n .card-icon {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 18px;\n }\n\n .menu-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .menu-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .card-body {\n padding: 12px 16px;\n }\n\n .card-title {\n margin: 0 0 4px;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .card-description {\n margin: 0 0 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .card-meta {\n display: flex;\n gap: 16px;\n }\n\n .meta-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .card-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .owner-tag {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n }\n\n .owner-tag.is-me {\n color: var(--mj-brand-primary);\n }\n\n .date-info {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n /* Hierarchy View */\n .category-tree {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .category-section {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .category-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .category-header:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .category-header i:first-child {\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .category-header .fa-folder,\n .category-header .fa-folder-open {\n color: var(--mj-status-warning);\n }\n\n .category-header.uncategorized .fa-inbox {\n color: var(--mj-text-muted);\n }\n\n .category-name {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .category-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n .category-lists {\n border-top: 1px solid var(--mj-border-default);\n }\n\n .hierarchy-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px 12px 40px;\n cursor: pointer;\n transition: background 0.2s;\n outline: none;\n }\n\n .hierarchy-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .hierarchy-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .hierarchy-row:focus-visible {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n }\n\n .list-info {\n flex: 1;\n min-width: 0;\n }\n\n .list-meta {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .list-actions {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.2s;\n }\n\n .hierarchy-row:hover .list-actions {\n opacity: 1;\n }\n\n /* Context Menu */\n .context-menu-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n }\n\n .context-menu {\n position: fixed;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-md);\n min-width: 160px;\n padding: 4px 0;\n z-index: 1000;\n }\n\n .menu-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 16px;\n background: none;\n border: none;\n text-align: left;\n font-size: 14px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .menu-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .menu-item.danger {\n color: var(--mj-status-error);\n }\n\n .menu-item.danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n }\n\n .menu-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }\n\n /* Modal Styles */\n .modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n }\n\n .modal-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-lg);\n width: 500px;\n max-width: 90vw;\n max-height: 90vh;\n overflow: hidden;\n z-index: 1001;\n }\n\n .confirm-dialog {\n width: 400px;\n }\n\n .modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .modal-close {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .modal-close:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .modal-body {\n padding: 20px;\n max-height: 60vh;\n overflow-y: auto;\n }\n\n .modal-body p {\n margin: 0 0 8px;\n color: var(--mj-text-primary);\n }\n\n .warning-text {\n color: var(--mj-status-error) !important;\n font-size: 13px;\n }\n\n .modal-footer {\n display: flex;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-secondary {\n padding: 10px 20px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-danger {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-danger:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-status-error) 85%, black);\n }\n\n /* Form Styles */\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group:last-child {\n margin-bottom: 0;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .form-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.2s, box-shadow 0.2s;\n box-sizing: border-box;\n }\n\n .form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .form-input:disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n textarea.form-input {\n resize: vertical;\n min-height: 80px;\n }\n\n select.form-input {\n cursor: pointer;\n }\n\n .custom-select-wrapper {\n position: relative;\n }\n\n /* Portal Dropdown */\n .entity-dropdown-portal {\n position: fixed;\n z-index: 10002;\n }\n\n .entity-dropdown-content {\n max-height: 200px;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: var(--mj-shadow-md);\n }\n\n .entity-dropdown-content.open-above {\n position: absolute;\n bottom: 0;\n }\n\n .dropdown-item {\n padding: 10px 12px;\n cursor: pointer;\n transition: background 0.15s;\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .dropdown-item:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .dropdown-item:first-child {\n border-radius: 6px 6px 0 0;\n }\n\n .dropdown-item:last-child {\n border-radius: 0 0 6px 6px;\n }\n\n .dropdown-empty {\n padding: 10px 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .header-row {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n\n .btn-create {\n width: 100%;\n justify-content: center;\n }\n\n .header-actions {\n flex-direction: column;\n align-items: stretch;\n }\n\n .search-box {\n max-width: none;\n }\n\n .filter-group {\n width: 100%;\n }\n\n .filter-select {\n flex: 1;\n width: 100%;\n }\n\n .view-toggle-group {\n justify-content: center;\n }\n\n .lists-table {\n overflow-x: auto;\n }\n\n .col-entity, .col-items, .col-updated {\n display: none;\n }\n\n .lists-grid {\n grid-template-columns: 1fr;\n }\n\n .modal-dialog {\n width: 95vw;\n }\n }\n "] }]
2677
+ `, encapsulation: ViewEncapsulation.None, styles: ["\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .lists-browse-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n overflow: hidden;\n }\n\n /* Header */\n .browse-header {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n }\n\n .header-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .header-title i {\n font-size: 24px;\n color: var(--mj-brand-primary);\n }\n\n .header-title h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n }\n\n .search-box {\n position: relative;\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 200px;\n max-width: 300px;\n }\n\n .search-box i.fa-search {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n }\n\n .search-box input {\n padding: 8px 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n font-size: 14px;\n width: 100%;\n transition: border-color 0.2s, box-shadow 0.2s;\n }\n\n .search-box input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .clear-search {\n position: absolute;\n right: 8px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n }\n\n .filter-group {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .filter-group label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .filter-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n min-width: 120px;\n }\n\n .filter-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .sort-select {\n min-width: 140px;\n }\n\n .view-toggle-group {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n }\n\n .view-toggle {\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border: none;\n border-right: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .view-toggle:last-child {\n border-right: none;\n }\n\n .view-toggle:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .view-toggle.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .btn-create {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-create:hover {\n background: var(--mj-brand-primary-hover);\n }\n\n /* Loading */\n .loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n }\n\n /* Empty State */\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n padding: 48px 40px;\n text-align: center;\n max-width: 480px;\n margin: 0 auto;\n }\n\n .empty-state-icon-wrapper {\n position: relative;\n margin-bottom: 24px;\n }\n\n .empty-state-icon-wrapper .icon-bg {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 120px;\n height: 120px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .empty-state-icon-wrapper > i {\n position: relative;\n font-size: 56px;\n color: var(--mj-brand-primary);\n z-index: 1;\n }\n\n .empty-state-icon-wrapper.search > i {\n font-size: 48px;\n color: var(--mj-text-disabled);\n }\n\n .empty-state h3 {\n margin: 0 0 12px;\n font-size: 22px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .empty-state p {\n margin: 0 0 8px;\n color: var(--mj-text-secondary);\n font-size: 15px;\n line-height: 1.5;\n }\n\n .empty-state p:last-of-type {\n margin-bottom: 24px;\n }\n\n .empty-hint {\n color: var(--mj-text-muted) !important;\n font-size: 13px !important;\n }\n\n .empty-state-features {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 28px;\n text-align: left;\n }\n\n .feature-item {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n }\n\n .feature-item i {\n font-size: 14px !important;\n color: var(--mj-status-success) !important;\n }\n\n .btn-create-large {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 28px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 8px;\n font-size: 15px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n\n .btn-create-large:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n }\n\n .btn-clear {\n padding: 10px 20px;\n background: var(--mj-bg-surface-sunken);\n border: none;\n border-radius: 6px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-clear:hover {\n background: var(--mj-border-default);\n }\n\n /* Content */\n .browse-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px 24px;\n }\n\n .results-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n }\n\n .result-count {\n font-size: 14px;\n color: var(--mj-text-secondary);\n }\n\n .sort-options {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .sort-options label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n /* Table View */\n .lists-table {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: var(--mj-shadow-sm);\n }\n\n .lists-table table {\n width: 100%;\n border-collapse: collapse;\n }\n\n .lists-table th {\n text-align: left;\n padding: 12px 16px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .lists-table td {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .list-row {\n cursor: pointer;\n transition: background 0.15s;\n outline: none;\n }\n\n .list-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .list-row:focus-visible {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n }\n\n .list-row:last-child td {\n border-bottom: none;\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n .col-name { width: 30%; }\n .col-entity { width: 15%; }\n .col-items { width: 8%; text-align: center; }\n .col-sharing { width: 8%; text-align: center; }\n .col-owner { width: 14%; }\n .col-updated { width: 15%; }\n .col-actions { width: 10%; text-align: right; }\n\n /* Sharing indicators */\n .sharing-indicator {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: var(--mj-brand-primary);\n font-size: 13px;\n }\n\n .sharing-indicator i {\n font-size: 14px;\n }\n\n .share-count {\n font-weight: 500;\n }\n\n .sharing-private {\n color: var(--mj-text-muted);\n font-size: 13px;\n }\n\n .sharing-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 50%;\n color: var(--mj-brand-primary);\n font-size: 11px;\n }\n\n .card-footer-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .name-cell {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .list-icon {\n width: 36px;\n height: 36px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .name-content {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .list-name {\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .entity-badge {\n display: inline-block;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 4px;\n font-size: 12px;\n color: var(--mj-brand-primary-hover);\n }\n\n .owner-name {\n color: var(--mj-text-secondary);\n }\n\n .owner-name.is-me {\n color: var(--mj-brand-primary);\n font-weight: 500;\n }\n\n .action-btn {\n background: none;\n border: none;\n padding: 6px 10px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s;\n }\n\n .action-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Card View */\n .lists-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n }\n\n .list-card {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n cursor: pointer;\n transition: transform 0.2s, box-shadow 0.2s, outline 0.1s;\n outline: 2px solid transparent;\n }\n\n .list-card:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-md);\n }\n\n .list-card:focus {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .list-card:focus:not(:focus-visible) {\n outline: none;\n }\n\n .list-card:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 16px 16px 0;\n }\n\n .card-icon {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 18px;\n }\n\n .menu-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .menu-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .card-body {\n padding: 12px 16px;\n }\n\n .card-title {\n margin: 0 0 4px;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .card-description {\n margin: 0 0 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .card-meta {\n display: flex;\n gap: 16px;\n }\n\n .meta-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n /* Tag chips on a card. Stop-propagation is set on the wrapper so\n clicks on chips don't open the underlying list. */\n .card-tags {\n margin-top: 8px;\n }\n\n /* Favorite star on cards (Phase 5.3). */\n .favorite-btn {\n background: none;\n border: none;\n padding: 4px;\n margin: -4px;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 14px;\n border-radius: 4px;\n transition: color 0.12s ease, background 0.12s ease;\n }\n\n .favorite-btn:hover {\n background: var(--mj-bg-surface-card);\n color: var(--mj-status-warning);\n }\n\n .favorite-btn--active {\n color: var(--mj-status-warning);\n }\n\n /* Favorites-only toggle in the toolbar. */\n .favorite-filter-toggle {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: none;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 12.5px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n }\n\n .favorite-filter-toggle:hover {\n border-color: var(--mj-status-warning);\n color: var(--mj-status-warning);\n }\n\n .favorite-filter-toggle--active {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n color: var(--mj-status-warning);\n font-weight: 600;\n }\n\n /* Active-tag filter row above the grid (Phase 4.3). */\n .tag-filter-row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n margin-bottom: 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n font-size: 12.5px;\n }\n\n .tag-filter-row__label {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n\n .tag-filter-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 10px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n font-size: 11.5px;\n cursor: pointer;\n }\n\n .tag-filter-chip:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface));\n }\n\n .tag-filter-row__clear {\n background: none;\n border: none;\n color: var(--mj-text-link);\n font-size: 11.5px;\n cursor: pointer;\n margin-left: auto;\n }\n\n .tag-filter-row__clear:hover {\n text-decoration: underline;\n }\n\n .card-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .owner-tag {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n }\n\n .owner-tag.is-me {\n color: var(--mj-brand-primary);\n }\n\n .date-info {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n /* Hierarchy View */\n .category-tree {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .category-section {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .category-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .category-header:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .category-header i:first-child {\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .category-header .fa-folder,\n .category-header .fa-folder-open {\n color: var(--mj-status-warning);\n }\n\n .category-header.uncategorized .fa-inbox {\n color: var(--mj-text-muted);\n }\n\n .category-name {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .category-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n .category-lists {\n border-top: 1px solid var(--mj-border-default);\n }\n\n .hierarchy-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px 12px 40px;\n cursor: pointer;\n transition: background 0.2s;\n outline: none;\n }\n\n .hierarchy-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .hierarchy-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .hierarchy-row:focus-visible {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n }\n\n .list-info {\n flex: 1;\n min-width: 0;\n }\n\n .list-meta {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .list-actions {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.2s;\n }\n\n .hierarchy-row:hover .list-actions {\n opacity: 1;\n }\n\n /* Context Menu */\n .context-menu-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n }\n\n .context-menu {\n position: fixed;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-md);\n min-width: 160px;\n padding: 4px 0;\n z-index: 1000;\n }\n\n .menu-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 16px;\n background: none;\n border: none;\n text-align: left;\n font-size: 14px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .menu-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .menu-item.danger {\n color: var(--mj-status-error);\n }\n\n .menu-item.danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n }\n\n .menu-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }\n\n .menu-viewer-hint {\n padding: 10px 14px;\n font-size: 12px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 8px;\n font-style: italic;\n }\n .menu-viewer-hint i { color: var(--mj-text-muted); }\n\n /* Modal Styles */\n .modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n }\n\n .modal-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-lg);\n width: 500px;\n max-width: 90vw;\n max-height: 90vh;\n overflow: hidden;\n z-index: 1001;\n }\n\n .confirm-dialog {\n width: 400px;\n }\n\n .modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .modal-close {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .modal-close:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .modal-body {\n padding: 20px;\n max-height: 60vh;\n overflow-y: auto;\n }\n\n .modal-body p {\n margin: 0 0 8px;\n color: var(--mj-text-primary);\n }\n\n .warning-text {\n color: var(--mj-status-error) !important;\n font-size: 13px;\n }\n\n .modal-footer {\n display: flex;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-secondary {\n padding: 10px 20px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-danger {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-danger:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-status-error) 85%, black);\n }\n\n /* Form Styles */\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group:last-child {\n margin-bottom: 0;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .form-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.2s, box-shadow 0.2s;\n box-sizing: border-box;\n }\n\n .form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .form-input:disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n textarea.form-input {\n resize: vertical;\n min-height: 80px;\n }\n\n select.form-input {\n cursor: pointer;\n }\n\n .custom-select-wrapper {\n position: relative;\n }\n\n /* Portal Dropdown */\n .entity-dropdown-portal {\n position: fixed;\n z-index: 10002;\n }\n\n .entity-dropdown-content {\n max-height: 200px;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: var(--mj-shadow-md);\n }\n\n .entity-dropdown-content.open-above {\n position: absolute;\n bottom: 0;\n }\n\n .dropdown-item {\n padding: 10px 12px;\n cursor: pointer;\n transition: background 0.15s;\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .dropdown-item:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .dropdown-item:first-child {\n border-radius: 6px 6px 0 0;\n }\n\n .dropdown-item:last-child {\n border-radius: 0 0 6px 6px;\n }\n\n .dropdown-empty {\n padding: 10px 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .header-row {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n\n .btn-create {\n width: 100%;\n justify-content: center;\n }\n\n .header-actions {\n flex-direction: column;\n align-items: stretch;\n }\n\n .search-box {\n max-width: none;\n }\n\n .filter-group {\n width: 100%;\n }\n\n .filter-select {\n flex: 1;\n width: 100%;\n }\n\n .view-toggle-group {\n justify-content: center;\n }\n\n .lists-table {\n overflow-x: auto;\n }\n\n .col-entity, .col-items, .col-updated {\n display: none;\n }\n\n .lists-grid {\n grid-template-columns: 1fr;\n }\n\n .modal-dialog {\n width: 95vw;\n }\n }\n "] }]
2003
2678
  }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.TabService }, { type: i2.MJNotificationService }, { type: i0.ElementRef }, { type: i3.ListSharingService }], { onDocumentClick: [{
2004
2679
  type: HostListener,
2005
2680
  args: ['document:click', ['$event']]
@@ -2007,5 +2682,5 @@ export { ListsBrowseResource };
2007
2682
  type: HostListener,
2008
2683
  args: ['document:keydown.escape']
2009
2684
  }] }); })();
2010
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ListsBrowseResource, { className: "ListsBrowseResource", filePath: "src/Lists/components/lists-browse-resource.component.ts", lineNumber: 1615 }); })();
2685
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ListsBrowseResource, { className: "ListsBrowseResource", filePath: "src/Lists/components/lists-browse-resource.component.ts", lineNumber: 1866 }); })();
2011
2686
  //# sourceMappingURL=lists-browse-resource.component.js.map