@memberjunction/ng-dashboards 5.35.0 → 5.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/agents/agent-configuration.component.js +3 -3
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +22 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +157 -137
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +28 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2075 -2068
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +4 -4
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +3 -3
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +15 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +1411 -1424
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts +12 -8
- package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +329 -371
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +137 -142
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +111 -116
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +13 -65
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +13 -65
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +13 -65
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +13 -65
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/Admin/base-admin-container.component.d.ts +9 -7
- package/dist/Admin/base-admin-container.component.d.ts.map +1 -1
- package/dist/Admin/base-admin-container.component.js +26 -17
- package/dist/Admin/base-admin-container.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +74 -67
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Communication/communication-new-message-resource.component.d.ts +93 -0
- package/dist/Communication/communication-new-message-resource.component.d.ts.map +1 -0
- package/dist/Communication/communication-new-message-resource.component.js +661 -0
- package/dist/Communication/communication-new-message-resource.component.js.map +1 -0
- package/dist/Credentials/components/credentials-categories-resource.component.js +152 -159
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +151 -155
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +20 -21
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts +2 -0
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +131 -125
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +7 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/DevTools/app-state-inspector.component.d.ts +5 -0
- package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/app-state-inspector.component.js +46 -72
- package/dist/DevTools/app-state-inspector.component.js.map +1 -1
- package/dist/DevTools/class-registry.component.js +88 -100
- package/dist/DevTools/class-registry.component.js.map +1 -1
- package/dist/DevTools/event-monitor.component.js +158 -168
- package/dist/DevTools/event-monitor.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +257 -264
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/DevTools/layout-inspector.component.d.ts +5 -0
- package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/layout-inspector.component.js +46 -64
- package/dist/DevTools/layout-inspector.component.js.map +1 -1
- package/dist/DevTools/lazy-module-status.component.js +75 -84
- package/dist/DevTools/lazy-module-status.component.js.map +1 -1
- package/dist/DevTools/settings-explorer.component.js +76 -85
- package/dist/DevTools/settings-explorer.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +2 -0
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +7 -3
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +97 -99
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +842 -855
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +502 -517
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +78 -89
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +5 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1120 -1128
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +11 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +606 -661
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +102 -0
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +1179 -504
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts +133 -3
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +1527 -327
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts +29 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts.map +1 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.js +77 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.js.map +1 -0
- package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts +6 -0
- package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts.map +1 -1
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js +35 -7
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
- package/dist/Lists/index.d.ts +1 -0
- package/dist/Lists/index.d.ts.map +1 -1
- package/dist/Lists/index.js +1 -0
- package/dist/Lists/index.js.map +1 -1
- package/dist/Lists/services/list-set-operations.service.d.ts +93 -2
- package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
- package/dist/Lists/services/list-set-operations.service.js +236 -10
- package/dist/Lists/services/list-set-operations.service.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +19 -19
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +58 -60
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +13 -3
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +1007 -1252
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +31 -6
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +543 -629
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +50 -49
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +1 -1
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +16 -1
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +9 -7
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +13 -4
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +1 -1
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +16 -1
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/lists-dashboards.module.d.ts +10 -9
- package/dist/lists-dashboards.module.d.ts.map +1 -1
- package/dist/lists-dashboards.module.js +13 -2
- package/dist/lists-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -0
- package/dist/public-api.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +1 -1
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +13 -1
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +53 -52
|
@@ -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
|
-
|
|
23
|
-
|
|
24
|
-
i0.ɵɵ
|
|
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
|
|
37
|
+
function ListsBrowseResource_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
28
38
|
const _r2 = i0.ɵɵgetCurrentView();
|
|
29
|
-
i0.ɵɵelementStart(0, "div", 14)(1, "
|
|
30
|
-
i0.ɵɵelement(2, "
|
|
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",
|
|
39
|
-
i0.ɵɵelement(10, "i",
|
|
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",
|
|
44
|
-
i0.ɵɵelement(14, "i",
|
|
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",
|
|
49
|
-
i0.ɵɵelement(18, "i",
|
|
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",
|
|
54
|
-
i0.ɵɵlistener("click", function
|
|
55
|
-
i0.ɵɵelement(22, "i",
|
|
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
|
|
60
|
-
const
|
|
61
|
-
i0.ɵɵelementStart(0, "div",
|
|
62
|
-
i0.ɵɵelement(2, "i",
|
|
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",
|
|
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",
|
|
74
|
-
i0.ɵɵlistener("click", function
|
|
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
|
|
79
|
-
i0.ɵɵelementStart(0, "option",
|
|
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
|
|
84
|
-
i0.ɵɵproperty("value",
|
|
114
|
+
const opt_r9 = ctx.$implicit;
|
|
115
|
+
i0.ɵɵproperty("value", opt_r9.value);
|
|
85
116
|
i0.ɵɵadvance();
|
|
86
|
-
i0.ɵɵtextInterpolate(
|
|
117
|
+
i0.ɵɵtextInterpolate(opt_r9.name);
|
|
87
118
|
} }
|
|
88
|
-
function
|
|
89
|
-
i0.ɵɵelementStart(0, "span",
|
|
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
|
|
124
|
+
const item_r11 = i0.ɵɵnextContext().$implicit;
|
|
94
125
|
i0.ɵɵadvance();
|
|
95
|
-
i0.ɵɵtextInterpolate(
|
|
126
|
+
i0.ɵɵtextInterpolate(item_r11.list.Description);
|
|
96
127
|
} }
|
|
97
|
-
function
|
|
98
|
-
i0.ɵɵelementStart(0, "span",
|
|
99
|
-
i0.ɵɵelement(1, "i",
|
|
100
|
-
i0.ɵɵelementStart(2, "span",
|
|
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
|
|
135
|
+
const sharing_r12 = i0.ɵɵnextContext();
|
|
105
136
|
i0.ɵɵadvance(3);
|
|
106
|
-
i0.ɵɵtextInterpolate(
|
|
137
|
+
i0.ɵɵtextInterpolate(sharing_r12.totalShares);
|
|
107
138
|
} }
|
|
108
|
-
function
|
|
109
|
-
i0.ɵɵelementStart(0, "span",
|
|
110
|
-
i0.ɵɵelement(1, "i",
|
|
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
|
|
114
|
-
i0.ɵɵconditionalCreate(0,
|
|
115
|
-
i0.ɵɵconditionalCreate(1,
|
|
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
|
|
118
|
-
i0.ɵɵconditional(
|
|
148
|
+
const sharing_r12 = ctx;
|
|
149
|
+
i0.ɵɵconditional(sharing_r12.totalShares > 0 ? 0 : -1);
|
|
119
150
|
i0.ɵɵadvance();
|
|
120
|
-
i0.ɵɵconditional(
|
|
151
|
+
i0.ɵɵconditional(sharing_r12.totalShares === 0 ? 1 : -1);
|
|
121
152
|
} }
|
|
122
|
-
function
|
|
123
|
-
i0.ɵɵelementStart(0, "span",
|
|
124
|
-
i0.ɵɵelement(1, "i",
|
|
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
|
|
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, "
|
|
130
|
-
i0.ɵɵlistener("click", function
|
|
131
|
-
i0.ɵɵ
|
|
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",
|
|
165
|
+
i0.ɵɵelementStart(5, "div", 67)(6, "span", 68);
|
|
142
166
|
i0.ɵɵtext(7);
|
|
143
167
|
i0.ɵɵelementEnd();
|
|
144
|
-
i0.ɵɵconditionalCreate(8,
|
|
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",
|
|
170
|
+
i0.ɵɵelementStart(9, "td", 70)(10, "span", 71);
|
|
147
171
|
i0.ɵɵtext(11);
|
|
148
172
|
i0.ɵɵelementEnd()();
|
|
149
|
-
i0.ɵɵelementStart(12, "td",
|
|
173
|
+
i0.ɵɵelementStart(12, "td", 72);
|
|
150
174
|
i0.ɵɵtext(13);
|
|
151
175
|
i0.ɵɵelementEnd();
|
|
152
|
-
i0.ɵɵelementStart(14, "td",
|
|
153
|
-
i0.ɵɵconditionalCreate(15,
|
|
154
|
-
i0.ɵɵconditionalCreate(16,
|
|
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",
|
|
180
|
+
i0.ɵɵelementStart(17, "td", 75)(18, "span", 76);
|
|
157
181
|
i0.ɵɵtext(19);
|
|
158
182
|
i0.ɵɵelementEnd()();
|
|
159
|
-
i0.ɵɵelementStart(20, "td",
|
|
183
|
+
i0.ɵɵelementStart(20, "td", 77);
|
|
160
184
|
i0.ɵɵtext(21);
|
|
161
185
|
i0.ɵɵelementEnd();
|
|
162
|
-
i0.ɵɵelementStart(22, "td",
|
|
163
|
-
i0.ɵɵ
|
|
164
|
-
i0.ɵɵ
|
|
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
|
|
168
|
-
const
|
|
192
|
+
const item_r11 = ctx.$implicit;
|
|
193
|
+
const ctx_r4 = i0.ɵɵnextContext(3);
|
|
169
194
|
i0.ɵɵadvance(3);
|
|
170
|
-
i0.ɵɵstyleProp("background-color",
|
|
195
|
+
i0.ɵɵstyleProp("background-color", ctx_r4.getEntityColor(item_r11.entityName));
|
|
171
196
|
i0.ɵɵadvance();
|
|
172
|
-
i0.ɵɵclassMap(
|
|
197
|
+
i0.ɵɵclassMap(ctx_r4.getEntityIcon(item_r11.entityName));
|
|
173
198
|
i0.ɵɵadvance(3);
|
|
174
|
-
i0.ɵɵtextInterpolate(
|
|
199
|
+
i0.ɵɵtextInterpolate(item_r11.list.Name);
|
|
175
200
|
i0.ɵɵadvance();
|
|
176
|
-
i0.ɵɵconditional(
|
|
201
|
+
i0.ɵɵconditional(item_r11.list.Description ? 8 : -1);
|
|
177
202
|
i0.ɵɵadvance(3);
|
|
178
|
-
i0.ɵɵtextInterpolate(
|
|
203
|
+
i0.ɵɵtextInterpolate(item_r11.entityName);
|
|
179
204
|
i0.ɵɵadvance(2);
|
|
180
|
-
i0.ɵɵtextInterpolate(
|
|
205
|
+
i0.ɵɵtextInterpolate(item_r11.itemCount);
|
|
181
206
|
i0.ɵɵadvance(2);
|
|
182
|
-
i0.ɵɵconditional((tmp_19_0 =
|
|
207
|
+
i0.ɵɵconditional((tmp_19_0 = item_r11.sharingInfo) ? 15 : -1, tmp_19_0);
|
|
183
208
|
i0.ɵɵadvance();
|
|
184
|
-
i0.ɵɵconditional(!
|
|
209
|
+
i0.ɵɵconditional(!item_r11.sharingInfo ? 16 : -1);
|
|
185
210
|
i0.ɵɵadvance(2);
|
|
186
|
-
i0.ɵɵclassProp("is-me",
|
|
211
|
+
i0.ɵɵclassProp("is-me", item_r11.isOwner);
|
|
187
212
|
i0.ɵɵadvance();
|
|
188
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
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.ɵɵ
|
|
215
|
+
i0.ɵɵtextInterpolate(ctx_r4.formatDate(item_r11.list.__mj_UpdatedAt));
|
|
193
216
|
} }
|
|
194
|
-
function
|
|
195
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
221
|
+
i0.ɵɵelementStart(6, "th", 55);
|
|
199
222
|
i0.ɵɵtext(7, "Entity");
|
|
200
223
|
i0.ɵɵelementEnd();
|
|
201
|
-
i0.ɵɵelementStart(8, "th",
|
|
224
|
+
i0.ɵɵelementStart(8, "th", 56);
|
|
202
225
|
i0.ɵɵtext(9, "Items");
|
|
203
226
|
i0.ɵɵelementEnd();
|
|
204
|
-
i0.ɵɵelementStart(10, "th",
|
|
227
|
+
i0.ɵɵelementStart(10, "th", 57);
|
|
205
228
|
i0.ɵɵtext(11, "Shared");
|
|
206
229
|
i0.ɵɵelementEnd();
|
|
207
|
-
i0.ɵɵelementStart(12, "th",
|
|
230
|
+
i0.ɵɵelementStart(12, "th", 58);
|
|
208
231
|
i0.ɵɵtext(13, "Owner");
|
|
209
232
|
i0.ɵɵelementEnd();
|
|
210
|
-
i0.ɵɵelementStart(14, "th",
|
|
233
|
+
i0.ɵɵelementStart(14, "th", 59);
|
|
211
234
|
i0.ɵɵtext(15, "Updated");
|
|
212
235
|
i0.ɵɵelementEnd();
|
|
213
|
-
i0.ɵɵelementStart(16, "th",
|
|
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,
|
|
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
|
|
243
|
+
const ctx_r4 = i0.ɵɵnextContext(2);
|
|
221
244
|
i0.ɵɵadvance(20);
|
|
222
|
-
i0.ɵɵrepeater(
|
|
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
|
|
232
|
-
i0.ɵɵelementStart(0, "p",
|
|
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
|
|
252
|
+
const item_r14 = i0.ɵɵnextContext().$implicit;
|
|
237
253
|
i0.ɵɵadvance();
|
|
238
|
-
i0.ɵɵtextInterpolate(
|
|
254
|
+
i0.ɵɵtextInterpolate(item_r14.list.Description);
|
|
239
255
|
} }
|
|
240
|
-
function
|
|
241
|
-
i0.ɵɵelementStart(0, "span",
|
|
242
|
-
i0.ɵɵelement(1, "i",
|
|
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
|
|
246
|
-
i0.ɵɵproperty("title", "Shared with " +
|
|
261
|
+
const sharing_r15 = i0.ɵɵnextContext();
|
|
262
|
+
i0.ɵɵproperty("title", "Shared with " + sharing_r15.totalShares + " user(s)/role(s)");
|
|
247
263
|
} }
|
|
248
|
-
function
|
|
249
|
-
i0.ɵɵconditionalCreate(0,
|
|
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
|
|
254
|
-
const
|
|
255
|
-
i0.ɵɵelementStart(0, "div",
|
|
256
|
-
i0.ɵɵlistener("click", function
|
|
257
|
-
i0.ɵɵelementStart(1, "div",
|
|
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.ɵɵ
|
|
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(
|
|
263
|
-
i0.ɵɵ
|
|
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(
|
|
266
|
-
i0.ɵɵelementStart(
|
|
267
|
-
i0.ɵɵelement(
|
|
268
|
-
i0.ɵɵtext(
|
|
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(
|
|
271
|
-
i0.ɵɵelement(
|
|
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",
|
|
279
|
-
i0.ɵɵ
|
|
280
|
-
i0.ɵɵelementStart(
|
|
281
|
-
i0.ɵɵ
|
|
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
|
|
285
|
-
const
|
|
286
|
-
const
|
|
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",
|
|
315
|
+
i0.ɵɵstyleProp("background-color", ctx_r4.getEntityColor(item_r14.entityName));
|
|
289
316
|
i0.ɵɵadvance();
|
|
290
|
-
i0.ɵɵclassMap(
|
|
317
|
+
i0.ɵɵclassMap(ctx_r4.getEntityIcon(item_r14.entityName));
|
|
291
318
|
i0.ɵɵadvance();
|
|
292
|
-
i0.ɵɵ
|
|
293
|
-
i0.ɵɵ
|
|
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.ɵɵ
|
|
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(" ",
|
|
328
|
+
i0.ɵɵtextInterpolate1(" ", item_r14.entityName, " ");
|
|
299
329
|
i0.ɵɵadvance(3);
|
|
300
|
-
i0.ɵɵtextInterpolate2(" ",
|
|
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",
|
|
334
|
+
i0.ɵɵclassProp("is-me", item_r14.isOwner);
|
|
303
335
|
i0.ɵɵadvance(2);
|
|
304
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
336
|
+
i0.ɵɵtextInterpolate1(" ", item_r14.isOwner ? "You" : item_r14.ownerName, " ");
|
|
305
337
|
i0.ɵɵadvance(2);
|
|
306
|
-
i0.ɵɵconditional((
|
|
338
|
+
i0.ɵɵconditional((tmp_28_0 = item_r14.sharingInfo) ? 27 : -1, tmp_28_0);
|
|
307
339
|
i0.ɵɵadvance(2);
|
|
308
|
-
i0.ɵɵtextInterpolate(
|
|
340
|
+
i0.ɵɵtextInterpolate(ctx_r4.formatDate(item_r14.list.__mj_UpdatedAt));
|
|
309
341
|
} }
|
|
310
|
-
function
|
|
311
|
-
i0.ɵɵelementStart(0, "div",
|
|
312
|
-
i0.ɵɵrepeaterCreate(1,
|
|
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
|
|
347
|
+
const ctx_r4 = i0.ɵɵnextContext(2);
|
|
316
348
|
i0.ɵɵadvance();
|
|
317
|
-
i0.ɵɵrepeater(
|
|
349
|
+
i0.ɵɵrepeater(ctx_r4.filteredLists);
|
|
318
350
|
} }
|
|
319
|
-
function
|
|
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
|
|
323
|
-
i0.ɵɵtemplate(0,
|
|
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
|
|
357
|
+
const node_r16 = ctx.$implicit;
|
|
326
358
|
i0.ɵɵnextContext(3);
|
|
327
|
-
const
|
|
328
|
-
i0.ɵɵproperty("ngTemplateOutlet",
|
|
359
|
+
const categoryNodeTemplate_r17 = i0.ɵɵreference(23);
|
|
360
|
+
i0.ɵɵproperty("ngTemplateOutlet", categoryNodeTemplate_r17)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, node_r16));
|
|
329
361
|
} }
|
|
330
|
-
function
|
|
331
|
-
i0.ɵɵelementStart(0, "div",
|
|
332
|
-
i0.ɵɵrepeaterCreate(1,
|
|
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
|
|
367
|
+
const ctx_r4 = i0.ɵɵnextContext(2);
|
|
336
368
|
i0.ɵɵadvance();
|
|
337
|
-
i0.ɵɵrepeater(
|
|
369
|
+
i0.ɵɵrepeater(ctx_r4.categoryTree);
|
|
338
370
|
} }
|
|
339
|
-
function
|
|
340
|
-
const
|
|
341
|
-
i0.ɵɵelementStart(0, "div",
|
|
342
|
-
i0.ɵɵtext(
|
|
343
|
-
i0.ɵɵelementEnd();
|
|
344
|
-
i0.ɵɵelementStart(
|
|
345
|
-
i0.ɵɵ
|
|
346
|
-
i0.ɵɵ
|
|
347
|
-
i0.ɵɵ
|
|
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(
|
|
350
|
-
i0.ɵɵconditionalCreate(
|
|
351
|
-
i0.ɵɵconditionalCreate(
|
|
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
|
|
355
|
-
i0.ɵɵadvance(
|
|
356
|
-
i0.ɵɵ
|
|
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(
|
|
395
|
+
i0.ɵɵrepeater(ctx_r4.sortOptions);
|
|
359
396
|
i0.ɵɵadvance(2);
|
|
360
|
-
i0.ɵɵconditional(
|
|
397
|
+
i0.ɵɵconditional(ctx_r4.viewMode === "table" ? 10 : -1);
|
|
361
398
|
i0.ɵɵadvance();
|
|
362
|
-
i0.ɵɵconditional(
|
|
399
|
+
i0.ɵɵconditional(ctx_r4.viewMode === "card" ? 11 : -1);
|
|
363
400
|
i0.ɵɵadvance();
|
|
364
|
-
i0.ɵɵconditional(
|
|
401
|
+
i0.ɵɵconditional(ctx_r4.viewMode === "hierarchy" ? 12 : -1);
|
|
365
402
|
} }
|
|
366
|
-
function
|
|
367
|
-
const
|
|
368
|
-
i0.ɵɵelementStart(0, "div",
|
|
369
|
-
i0.ɵɵlistener("click", function
|
|
370
|
-
i0.ɵɵelement(1, "i")(2, "i",
|
|
371
|
-
i0.ɵɵelementStart(3, "span",
|
|
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",
|
|
411
|
+
i0.ɵɵelementStart(5, "span", 115);
|
|
375
412
|
i0.ɵɵtext(6);
|
|
376
413
|
i0.ɵɵelementEnd()();
|
|
377
414
|
} if (rf & 2) {
|
|
378
|
-
const
|
|
379
|
-
const
|
|
415
|
+
const node_r19 = i0.ɵɵnextContext().node;
|
|
416
|
+
const ctx_r4 = i0.ɵɵnextContext();
|
|
380
417
|
i0.ɵɵadvance();
|
|
381
|
-
i0.ɵɵclassMap(
|
|
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",
|
|
420
|
+
i0.ɵɵclassProp("fa-folder-open", node_r19.isExpanded);
|
|
384
421
|
i0.ɵɵadvance(2);
|
|
385
|
-
i0.ɵɵtextInterpolate(
|
|
422
|
+
i0.ɵɵtextInterpolate(node_r19.category.Name);
|
|
386
423
|
i0.ɵɵadvance(2);
|
|
387
|
-
i0.ɵɵtextInterpolate(
|
|
424
|
+
i0.ɵɵtextInterpolate(ctx_r4.getListCountInCategory(node_r19));
|
|
388
425
|
} }
|
|
389
|
-
function
|
|
390
|
-
const
|
|
391
|
-
i0.ɵɵelementStart(0, "div",
|
|
392
|
-
i0.ɵɵlistener("click", function
|
|
393
|
-
i0.ɵɵelement(1, "i")(2, "i",
|
|
394
|
-
i0.ɵɵelementStart(3, "span",
|
|
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",
|
|
434
|
+
i0.ɵɵelementStart(5, "span", 115);
|
|
398
435
|
i0.ɵɵtext(6);
|
|
399
436
|
i0.ɵɵelementEnd()();
|
|
400
437
|
} if (rf & 2) {
|
|
401
|
-
const
|
|
438
|
+
const node_r19 = i0.ɵɵnextContext().node;
|
|
402
439
|
i0.ɵɵadvance();
|
|
403
|
-
i0.ɵɵclassMap(
|
|
440
|
+
i0.ɵɵclassMap(node_r19.isExpanded ? "fa-solid fa-chevron-down" : "fa-solid fa-chevron-right");
|
|
404
441
|
i0.ɵɵadvance(5);
|
|
405
|
-
i0.ɵɵtextInterpolate(
|
|
442
|
+
i0.ɵɵtextInterpolate(node_r19.lists.length);
|
|
406
443
|
} }
|
|
407
|
-
function
|
|
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
|
|
449
|
+
const item_r22 = i0.ɵɵnextContext().$implicit;
|
|
413
450
|
i0.ɵɵadvance();
|
|
414
|
-
i0.ɵɵtextInterpolate1(" \u00B7 ",
|
|
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
|
|
424
|
-
const
|
|
425
|
-
i0.ɵɵelementStart(0, "div",
|
|
426
|
-
i0.ɵɵlistener("click", function
|
|
427
|
-
i0.ɵɵelementStart(1, "div",
|
|
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",
|
|
460
|
+
i0.ɵɵelementStart(3, "div", 120)(4, "span", 68);
|
|
431
461
|
i0.ɵɵtext(5);
|
|
432
462
|
i0.ɵɵelementEnd();
|
|
433
|
-
i0.ɵɵelementStart(6, "span",
|
|
463
|
+
i0.ɵɵelementStart(6, "span", 121);
|
|
434
464
|
i0.ɵɵtext(7);
|
|
435
|
-
i0.ɵɵconditionalCreate(8,
|
|
465
|
+
i0.ɵɵconditionalCreate(8, ListsBrowseResource_ng_template_22_Conditional_3_For_2_Conditional_8_Template, 2, 1, "span");
|
|
436
466
|
i0.ɵɵelementEnd()();
|
|
437
|
-
i0.ɵɵ
|
|
438
|
-
i0.ɵɵ
|
|
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
|
|
441
|
-
const
|
|
472
|
+
const item_r22 = ctx.$implicit;
|
|
473
|
+
const ctx_r4 = i0.ɵɵnextContext(3);
|
|
442
474
|
i0.ɵɵadvance();
|
|
443
|
-
i0.ɵɵstyleProp("background-color",
|
|
475
|
+
i0.ɵɵstyleProp("background-color", ctx_r4.getEntityColor(item_r22.entityName));
|
|
444
476
|
i0.ɵɵadvance();
|
|
445
|
-
i0.ɵɵclassMap(
|
|
477
|
+
i0.ɵɵclassMap(ctx_r4.getEntityIcon(item_r22.entityName));
|
|
446
478
|
i0.ɵɵadvance(3);
|
|
447
|
-
i0.ɵɵtextInterpolate(
|
|
479
|
+
i0.ɵɵtextInterpolate(item_r22.list.Name);
|
|
448
480
|
i0.ɵɵadvance(2);
|
|
449
|
-
i0.ɵɵtextInterpolate2(" ",
|
|
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(
|
|
483
|
+
i0.ɵɵconditional(!item_r22.isOwner ? 8 : -1);
|
|
454
484
|
} }
|
|
455
|
-
function
|
|
456
|
-
i0.ɵɵelementStart(0, "div",
|
|
457
|
-
i0.ɵɵrepeaterCreate(1,
|
|
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
|
|
490
|
+
const node_r19 = i0.ɵɵnextContext().node;
|
|
461
491
|
i0.ɵɵadvance();
|
|
462
|
-
i0.ɵɵrepeater(
|
|
492
|
+
i0.ɵɵrepeater(node_r19.lists);
|
|
463
493
|
} }
|
|
464
|
-
function
|
|
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
|
|
468
|
-
i0.ɵɵtemplate(0,
|
|
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
|
|
474
|
-
i0.ɵɵproperty("ngTemplateOutlet",
|
|
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
|
|
477
|
-
i0.ɵɵrepeaterCreate(0,
|
|
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
|
|
480
|
-
i0.ɵɵrepeater(
|
|
509
|
+
const node_r19 = i0.ɵɵnextContext().node;
|
|
510
|
+
i0.ɵɵrepeater(node_r19.children);
|
|
481
511
|
} }
|
|
482
|
-
function
|
|
483
|
-
i0.ɵɵelementStart(0, "div",
|
|
484
|
-
i0.ɵɵconditionalCreate(1,
|
|
485
|
-
i0.ɵɵconditionalCreate(2,
|
|
486
|
-
i0.ɵɵconditionalCreate(3,
|
|
487
|
-
i0.ɵɵconditionalCreate(4,
|
|
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
|
|
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(
|
|
524
|
+
i0.ɵɵconditional(node_r19.category ? 1 : -1);
|
|
495
525
|
i0.ɵɵadvance();
|
|
496
|
-
i0.ɵɵconditional(!
|
|
526
|
+
i0.ɵɵconditional(!node_r19.category && node_r19.lists.length > 0 ? 2 : -1);
|
|
497
527
|
i0.ɵɵadvance();
|
|
498
|
-
i0.ɵɵconditional(
|
|
528
|
+
i0.ɵɵconditional(node_r19.isExpanded ? 3 : -1);
|
|
499
529
|
i0.ɵɵadvance();
|
|
500
|
-
i0.ɵɵconditional(
|
|
530
|
+
i0.ɵɵconditional(node_r19.isExpanded ? 4 : -1);
|
|
501
531
|
} }
|
|
502
|
-
function
|
|
532
|
+
function ListsBrowseResource_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
503
533
|
const _r25 = i0.ɵɵgetCurrentView();
|
|
504
|
-
i0.ɵɵelementStart(0, "div",
|
|
505
|
-
i0.ɵɵlistener("click", function
|
|
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
|
|
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",
|
|
511
|
-
i0.ɵɵ
|
|
512
|
-
i0.ɵɵ
|
|
513
|
-
i0.ɵɵ
|
|
514
|
-
i0.ɵɵ
|
|
515
|
-
i0.ɵɵ
|
|
516
|
-
i0.ɵɵ
|
|
517
|
-
i0.ɵɵ
|
|
518
|
-
i0.ɵɵ
|
|
519
|
-
i0.ɵɵ
|
|
520
|
-
i0.ɵɵ
|
|
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
|
|
533
|
-
i0.ɵɵstyleProp("top",
|
|
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
|
|
536
|
-
const
|
|
537
|
-
i0.ɵɵelementStart(0, "div",
|
|
538
|
-
i0.ɵɵlistener("click", function
|
|
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
|
|
542
|
-
const
|
|
543
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
547
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
548
|
-
i0.ɵɵlistener("ngModelChange", function
|
|
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
|
|
610
|
+
const ctx_r4 = i0.ɵɵnextContext(2);
|
|
552
611
|
i0.ɵɵadvance(4);
|
|
553
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
612
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r4.entitySearchTerm);
|
|
554
613
|
} }
|
|
555
|
-
function
|
|
556
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
618
|
+
i0.ɵɵelement(3, "input", 151);
|
|
560
619
|
i0.ɵɵelementEnd();
|
|
561
620
|
} if (rf & 2) {
|
|
562
|
-
const
|
|
621
|
+
const ctx_r4 = i0.ɵɵnextContext(2);
|
|
563
622
|
i0.ɵɵadvance(3);
|
|
564
|
-
i0.ɵɵproperty("value",
|
|
623
|
+
i0.ɵɵproperty("value", ctx_r4.entitySearchTerm);
|
|
565
624
|
} }
|
|
566
|
-
function
|
|
567
|
-
i0.ɵɵelementStart(0, "option",
|
|
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
|
|
572
|
-
i0.ɵɵproperty("ngValue",
|
|
630
|
+
const cat_r34 = ctx.$implicit;
|
|
631
|
+
i0.ɵɵproperty("ngValue", cat_r34.ID);
|
|
573
632
|
i0.ɵɵadvance();
|
|
574
|
-
i0.ɵɵtextInterpolate(
|
|
633
|
+
i0.ɵɵtextInterpolate(cat_r34.displayName);
|
|
575
634
|
} }
|
|
576
|
-
function
|
|
577
|
-
i0.ɵɵelement(0, "i",
|
|
635
|
+
function ListsBrowseResource_Conditional_27_Conditional_27_Template(rf, ctx) { if (rf & 1) {
|
|
636
|
+
i0.ɵɵelement(0, "i", 147);
|
|
578
637
|
} }
|
|
579
|
-
function
|
|
580
|
-
const
|
|
581
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
585
|
-
i0.ɵɵlistener("click", function
|
|
586
|
-
i0.ɵɵelement(5, "i",
|
|
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",
|
|
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",
|
|
592
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
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",
|
|
653
|
+
i0.ɵɵelementStart(11, "div", 140)(12, "label");
|
|
595
654
|
i0.ɵɵtext(13, "Description");
|
|
596
655
|
i0.ɵɵelementEnd();
|
|
597
|
-
i0.ɵɵelementStart(14, "textarea",
|
|
598
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
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,
|
|
601
|
-
i0.ɵɵconditionalCreate(16,
|
|
602
|
-
i0.ɵɵelementStart(17, "div",
|
|
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",
|
|
606
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
607
|
-
i0.ɵɵelementStart(21, "option",
|
|
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,
|
|
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",
|
|
613
|
-
i0.ɵɵlistener("click", function
|
|
614
|
-
i0.ɵɵconditionalCreate(27,
|
|
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",
|
|
618
|
-
i0.ɵɵlistener("click", function
|
|
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
|
|
681
|
+
const ctx_r4 = i0.ɵɵnextContext();
|
|
623
682
|
i0.ɵɵadvance(3);
|
|
624
|
-
i0.ɵɵtextInterpolate(
|
|
683
|
+
i0.ɵɵtextInterpolate(ctx_r4.editingList ? "Edit List" : "Create New List");
|
|
625
684
|
i0.ɵɵadvance(7);
|
|
626
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
685
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r4.newListName);
|
|
627
686
|
i0.ɵɵadvance(4);
|
|
628
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
687
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r4.newListDescription);
|
|
629
688
|
i0.ɵɵadvance();
|
|
630
|
-
i0.ɵɵconditional(!
|
|
689
|
+
i0.ɵɵconditional(!ctx_r4.editingList ? 15 : -1);
|
|
631
690
|
i0.ɵɵadvance();
|
|
632
|
-
i0.ɵɵconditional(
|
|
691
|
+
i0.ɵɵconditional(ctx_r4.editingList ? 16 : -1);
|
|
633
692
|
i0.ɵɵadvance(4);
|
|
634
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
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(
|
|
697
|
+
i0.ɵɵrepeater(ctx_r4.flatCategories);
|
|
639
698
|
i0.ɵɵadvance(3);
|
|
640
|
-
i0.ɵɵproperty("disabled", !
|
|
699
|
+
i0.ɵɵproperty("disabled", !ctx_r4.newListName || !ctx_r4.editingList && !ctx_r4.selectedEntityId || ctx_r4.isSaving);
|
|
641
700
|
i0.ɵɵadvance();
|
|
642
|
-
i0.ɵɵconditional(
|
|
701
|
+
i0.ɵɵconditional(ctx_r4.isSaving ? 27 : -1);
|
|
643
702
|
i0.ɵɵadvance();
|
|
644
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
703
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r4.isSaving ? "Saving..." : ctx_r4.editingList ? "Save" : "Create", " ");
|
|
645
704
|
i0.ɵɵadvance();
|
|
646
|
-
i0.ɵɵproperty("disabled",
|
|
705
|
+
i0.ɵɵproperty("disabled", ctx_r4.isSaving);
|
|
647
706
|
} }
|
|
648
|
-
function
|
|
649
|
-
const
|
|
650
|
-
i0.ɵɵelementStart(0, "div",
|
|
651
|
-
i0.ɵɵlistener("click", function
|
|
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
|
|
655
|
-
i0.ɵɵelement(0, "i",
|
|
713
|
+
function ListsBrowseResource_Conditional_29_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
714
|
+
i0.ɵɵelement(0, "i", 147);
|
|
656
715
|
} }
|
|
657
|
-
function
|
|
658
|
-
const
|
|
659
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
663
|
-
i0.ɵɵlistener("click", function
|
|
664
|
-
i0.ɵɵelement(5, "i",
|
|
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",
|
|
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",
|
|
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",
|
|
677
|
-
i0.ɵɵlistener("click", function
|
|
678
|
-
i0.ɵɵconditionalCreate(16,
|
|
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",
|
|
682
|
-
i0.ɵɵlistener("click", function
|
|
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
|
|
745
|
+
const ctx_r4 = i0.ɵɵnextContext();
|
|
687
746
|
i0.ɵɵadvance(10);
|
|
688
|
-
i0.ɵɵtextInterpolate(
|
|
747
|
+
i0.ɵɵtextInterpolate(ctx_r4.deleteListName);
|
|
689
748
|
i0.ɵɵadvance(5);
|
|
690
|
-
i0.ɵɵproperty("disabled",
|
|
749
|
+
i0.ɵɵproperty("disabled", ctx_r4.isDeleting);
|
|
691
750
|
i0.ɵɵadvance();
|
|
692
|
-
i0.ɵɵconditional(
|
|
751
|
+
i0.ɵɵconditional(ctx_r4.isDeleting ? 16 : -1);
|
|
693
752
|
i0.ɵɵadvance();
|
|
694
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
753
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r4.isDeleting ? "Deleting..." : "Delete", " ");
|
|
695
754
|
i0.ɵɵadvance();
|
|
696
|
-
i0.ɵɵproperty("disabled",
|
|
755
|
+
i0.ɵɵproperty("disabled", ctx_r4.isDeleting);
|
|
697
756
|
} }
|
|
698
|
-
function
|
|
699
|
-
const
|
|
700
|
-
i0.ɵɵelementStart(0, "mj-list-share-dialog",
|
|
701
|
-
i0.ɵɵlistener("complete", function
|
|
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
|
|
705
|
-
i0.ɵɵproperty("config",
|
|
763
|
+
const ctx_r4 = i0.ɵɵnextContext();
|
|
764
|
+
i0.ɵɵproperty("config", ctx_r4.shareDialogConfig)("visible", ctx_r4.showShareDialog);
|
|
706
765
|
} }
|
|
707
|
-
function
|
|
708
|
-
const
|
|
709
|
-
i0.ɵɵelementStart(0, "
|
|
710
|
-
i0.ɵɵlistener("
|
|
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
|
|
807
|
+
const entity_r41 = ctx.$implicit;
|
|
715
808
|
i0.ɵɵadvance();
|
|
716
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
809
|
+
i0.ɵɵtextInterpolate1(" ", entity_r41.Name, " ");
|
|
717
810
|
} }
|
|
718
|
-
function
|
|
719
|
-
i0.ɵɵelementStart(0, "div",
|
|
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
|
|
724
|
-
i0.ɵɵelementStart(0, "div",
|
|
725
|
-
i0.ɵɵrepeaterCreate(2,
|
|
726
|
-
i0.ɵɵconditionalCreate(4,
|
|
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
|
|
730
|
-
i0.ɵɵstyleProp("top",
|
|
731
|
-
i0.ɵɵclassProp("dropdown-above",
|
|
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",
|
|
826
|
+
i0.ɵɵclassProp("open-above", ctx_r4.entityDropdownPosition.openAbove);
|
|
734
827
|
i0.ɵɵadvance();
|
|
735
|
-
i0.ɵɵrepeater(
|
|
828
|
+
i0.ɵɵrepeater(ctx_r4.filteredEntitiesList);
|
|
736
829
|
i0.ɵɵadvance(2);
|
|
737
|
-
i0.ɵɵconditional(
|
|
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
|
-
//
|
|
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
|
-
|
|
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
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
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
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
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
|
-
|
|
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:
|
|
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.
|
|
1444
|
-
i0.ɵɵelement(9, "i"
|
|
1445
|
-
i0.ɵɵtext(10, "
|
|
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(
|
|
1448
|
-
i0.ɵɵlistener("ValueChange", function
|
|
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(
|
|
1451
|
-
i0.ɵɵconditionalCreate(
|
|
1452
|
-
i0.ɵɵconditionalCreate(
|
|
1453
|
-
i0.ɵɵconditionalCreate(
|
|
1454
|
-
i0.ɵɵconditionalCreate(
|
|
1455
|
-
i0.ɵɵ
|
|
1456
|
-
i0.ɵɵ
|
|
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,
|
|
1462
|
-
i0.ɵɵ
|
|
1463
|
-
i0.ɵɵconditionalCreate(
|
|
1464
|
-
i0.ɵɵ
|
|
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(
|
|
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.
|
|
2027
|
+
i0.ɵɵconditional(ctx.tagFilters.length > 0 ? 17 : -1);
|
|
1478
2028
|
i0.ɵɵadvance();
|
|
1479
|
-
i0.ɵɵconditional(
|
|
2029
|
+
i0.ɵɵconditional(ctx.isLoading ? 18 : -1);
|
|
1480
2030
|
i0.ɵɵadvance();
|
|
1481
|
-
i0.ɵɵconditional(!ctx.isLoading && ctx.allLists.length
|
|
2031
|
+
i0.ɵɵconditional(!ctx.isLoading && ctx.allLists.length === 0 ? 19 : -1);
|
|
1482
2032
|
i0.ɵɵadvance();
|
|
1483
|
-
i0.ɵɵconditional(!ctx.isLoading && ctx.
|
|
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 ?
|
|
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.
|
|
2041
|
+
i0.ɵɵconditional(ctx.showCreateDialog ? 26 : -1);
|
|
1488
2042
|
i0.ɵɵadvance();
|
|
1489
|
-
i0.ɵɵconditional(ctx.showCreateDialog ?
|
|
2043
|
+
i0.ɵɵconditional(ctx.showCreateDialog ? 27 : -1);
|
|
1490
2044
|
i0.ɵɵadvance();
|
|
1491
|
-
i0.ɵɵconditional(ctx.
|
|
2045
|
+
i0.ɵɵconditional(ctx.showDeleteConfirm ? 28 : -1);
|
|
1492
2046
|
i0.ɵɵadvance();
|
|
1493
|
-
i0.ɵɵconditional(ctx.showDeleteConfirm ?
|
|
2047
|
+
i0.ɵɵconditional(ctx.showDeleteConfirm ? 29 : -1);
|
|
1494
2048
|
i0.ɵɵadvance();
|
|
1495
|
-
i0.ɵɵconditional(ctx.
|
|
2049
|
+
i0.ɵɵconditional(ctx.shareDialogConfig ? 30 : -1);
|
|
1496
2050
|
i0.ɵɵadvance();
|
|
1497
|
-
i0.ɵɵconditional(ctx.
|
|
2051
|
+
i0.ɵɵconditional(ctx.showInvitationsDialog && ctx.activeShareListId ? 31 : -1);
|
|
1498
2052
|
i0.ɵɵadvance();
|
|
1499
|
-
i0.ɵɵconditional(ctx.
|
|
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
|
|
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
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
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
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
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
|
-
|
|
1817
|
-
<
|
|
1818
|
-
<
|
|
1819
|
-
|
|
1820
|
-
|
|
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
|
-
|
|
1844
|
-
<
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
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
|
-
|
|
1856
|
-
|
|
1857
|
-
<
|
|
1858
|
-
|
|
1859
|
-
|
|
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:
|
|
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
|