@memberjunction/ng-conversations 2.117.0 → 2.118.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/lib/components/collection/collection-artifact-card.component.d.ts +7 -1
  2. package/dist/lib/components/collection/collection-artifact-card.component.d.ts.map +1 -1
  3. package/dist/lib/components/collection/collection-artifact-card.component.js +14 -18
  4. package/dist/lib/components/collection/collection-artifact-card.component.js.map +1 -1
  5. package/dist/lib/components/collection/collections-full-view.component.d.ts +86 -1
  6. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  7. package/dist/lib/components/collection/collections-full-view.component.js +1042 -255
  8. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  9. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +9 -2
  10. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  11. package/dist/lib/components/conversation/conversation-chat-area.component.js +236 -162
  12. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  13. package/dist/lib/components/mention/mention-dropdown.component.js +2 -2
  14. package/dist/lib/components/mention/mention-editor.component.d.ts +21 -0
  15. package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -1
  16. package/dist/lib/components/mention/mention-editor.component.js +299 -2
  17. package/dist/lib/components/mention/mention-editor.component.js.map +1 -1
  18. package/dist/lib/components/message/actionable-commands.component.d.ts +33 -0
  19. package/dist/lib/components/message/actionable-commands.component.d.ts.map +1 -0
  20. package/dist/lib/components/message/actionable-commands.component.js +107 -0
  21. package/dist/lib/components/message/actionable-commands.component.js.map +1 -0
  22. package/dist/lib/components/message/agent-response-form.component.d.ts +72 -0
  23. package/dist/lib/components/message/agent-response-form.component.d.ts.map +1 -0
  24. package/dist/lib/components/message/agent-response-form.component.js +310 -0
  25. package/dist/lib/components/message/agent-response-form.component.js.map +1 -0
  26. package/dist/lib/components/message/form-question.component.d.ts +105 -0
  27. package/dist/lib/components/message/form-question.component.d.ts.map +1 -0
  28. package/dist/lib/components/message/form-question.component.js +621 -0
  29. package/dist/lib/components/message/form-question.component.js.map +1 -0
  30. package/dist/lib/components/message/message-input-box.component.d.ts +12 -0
  31. package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
  32. package/dist/lib/components/message/message-input-box.component.js +14 -1
  33. package/dist/lib/components/message/message-input-box.component.js.map +1 -1
  34. package/dist/lib/components/message/message-input.component.d.ts +3 -3
  35. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  36. package/dist/lib/components/message/message-input.component.js +85 -51
  37. package/dist/lib/components/message/message-input.component.js.map +1 -1
  38. package/dist/lib/components/message/message-item.component.d.ts +39 -6
  39. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  40. package/dist/lib/components/message/message-item.component.js +490 -196
  41. package/dist/lib/components/message/message-item.component.js.map +1 -1
  42. package/dist/lib/components/message/message-list.component.d.ts +2 -1
  43. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  44. package/dist/lib/components/message/message-list.component.js +5 -1
  45. package/dist/lib/components/message/message-list.component.js.map +1 -1
  46. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +23 -6
  47. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  48. package/dist/lib/components/workspace/conversation-workspace.component.js +128 -52
  49. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  50. package/dist/lib/conversations.module.d.ts +60 -56
  51. package/dist/lib/conversations.module.d.ts.map +1 -1
  52. package/dist/lib/conversations.module.js +17 -1
  53. package/dist/lib/conversations.module.js.map +1 -1
  54. package/dist/lib/models/collection-view.model.d.ts +30 -0
  55. package/dist/lib/models/collection-view.model.d.ts.map +1 -0
  56. package/dist/lib/models/collection-view.model.js +2 -0
  57. package/dist/lib/models/collection-view.model.js.map +1 -0
  58. package/dist/lib/models/conversation-state.model.d.ts +1 -0
  59. package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
  60. package/dist/lib/services/conversation-agent.service.d.ts +4 -1
  61. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  62. package/dist/lib/services/conversation-agent.service.js +22 -2
  63. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  64. package/dist/lib/services/data-cache.service.d.ts +12 -0
  65. package/dist/lib/services/data-cache.service.d.ts.map +1 -1
  66. package/dist/lib/services/data-cache.service.js +41 -0
  67. package/dist/lib/services/data-cache.service.js.map +1 -1
  68. package/dist/lib/services/mention-parser.service.d.ts +6 -1
  69. package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
  70. package/dist/lib/services/mention-parser.service.js +114 -34
  71. package/dist/lib/services/mention-parser.service.js.map +1 -1
  72. package/dist/lib/services/ui-command-handler.service.d.ts +45 -0
  73. package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -0
  74. package/dist/lib/services/ui-command-handler.service.js +95 -0
  75. package/dist/lib/services/ui-command-handler.service.js.map +1 -0
  76. package/package.json +15 -14
@@ -6,15 +6,16 @@ import * as i1 from "../../services/dialog.service";
6
6
  import * as i2 from "../../services/artifact-state.service";
7
7
  import * as i3 from "../../services/collection-state.service";
8
8
  import * as i4 from "../../services/collection-permission.service";
9
- import * as i5 from "@angular/common";
10
- import * as i6 from "./collection-share-modal.component";
11
- import * as i7 from "./collection-form-modal.component";
12
- import * as i8 from "./artifact-create-modal.component";
13
- const _forTrack0 = ($index, $item) => $item.version.ID;
9
+ import * as i5 from "@memberjunction/ng-artifacts";
10
+ import * as i6 from "@angular/common";
11
+ import * as i7 from "@angular/forms";
12
+ import * as i8 from "./collection-share-modal.component";
13
+ import * as i9 from "./collection-form-modal.component";
14
+ import * as i10 from "./artifact-create-modal.component";
14
15
  function CollectionsFullViewComponent_span_7_ng_container_1_Template(rf, ctx) { if (rf & 1) {
15
16
  const _r1 = i0.ɵɵgetCurrentView();
16
17
  i0.ɵɵelementContainerStart(0);
17
- i0.ɵɵelement(1, "i", 19);
18
+ i0.ɵɵelement(1, "i", 28);
18
19
  i0.ɵɵelementStart(2, "a", 5);
19
20
  i0.ɵɵlistener("click", function CollectionsFullViewComponent_span_7_ng_container_1_Template_a_click_2_listener() { const crumb_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.navigateTo(crumb_r2)); });
20
21
  i0.ɵɵtext(3);
@@ -29,226 +30,484 @@ function CollectionsFullViewComponent_span_7_ng_container_1_Template(rf, ctx) {
29
30
  i0.ɵɵtextInterpolate1(" ", crumb_r2.name, " ");
30
31
  } }
31
32
  function CollectionsFullViewComponent_span_7_Template(rf, ctx) { if (rf & 1) {
32
- i0.ɵɵelementStart(0, "span", 17);
33
- i0.ɵɵtemplate(1, CollectionsFullViewComponent_span_7_ng_container_1_Template, 4, 3, "ng-container", 18);
33
+ i0.ɵɵelementStart(0, "span", 26);
34
+ i0.ɵɵtemplate(1, CollectionsFullViewComponent_span_7_ng_container_1_Template, 4, 3, "ng-container", 27);
34
35
  i0.ɵɵelementEnd();
35
36
  } if (rf & 2) {
36
37
  const ctx_r2 = i0.ɵɵnextContext();
37
38
  i0.ɵɵadvance();
38
39
  i0.ɵɵproperty("ngForOf", ctx_r2.breadcrumbs);
39
40
  } }
40
- function CollectionsFullViewComponent_button_9_Template(rf, ctx) { if (rf & 1) {
41
+ function CollectionsFullViewComponent_div_11_div_3_Template(rf, ctx) { if (rf & 1) {
42
+ const _r6 = i0.ɵɵgetCurrentView();
43
+ i0.ɵɵelementStart(0, "div", 33)(1, "button", 34);
44
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_11_div_3_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.setSortBy("name")); });
45
+ i0.ɵɵelement(2, "i", 35);
46
+ i0.ɵɵelementStart(3, "span");
47
+ i0.ɵɵtext(4, "Sort by Name");
48
+ i0.ɵɵelementEnd()();
49
+ i0.ɵɵelementStart(5, "button", 34);
50
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_11_div_3_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.setSortBy("date")); });
51
+ i0.ɵɵelement(6, "i", 36);
52
+ i0.ɵɵelementStart(7, "span");
53
+ i0.ɵɵtext(8, "Sort by Date");
54
+ i0.ɵɵelementEnd()();
55
+ i0.ɵɵelementStart(9, "button", 34);
56
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_11_div_3_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.setSortBy("type")); });
57
+ i0.ɵɵelement(10, "i", 37);
58
+ i0.ɵɵelementStart(11, "span");
59
+ i0.ɵɵtext(12, "Sort by Type");
60
+ i0.ɵɵelementEnd()()();
61
+ } if (rf & 2) {
62
+ const ctx_r2 = i0.ɵɵnextContext(2);
63
+ i0.ɵɵadvance();
64
+ i0.ɵɵclassProp("active", ctx_r2.sortBy === "name");
65
+ i0.ɵɵadvance(4);
66
+ i0.ɵɵclassProp("active", ctx_r2.sortBy === "date");
67
+ i0.ɵɵadvance(4);
68
+ i0.ɵɵclassProp("active", ctx_r2.sortBy === "type");
69
+ } }
70
+ function CollectionsFullViewComponent_div_11_Template(rf, ctx) { if (rf & 1) {
41
71
  const _r5 = i0.ɵɵgetCurrentView();
42
- i0.ɵɵelementStart(0, "button", 20);
43
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_button_9_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.createCollection()); });
44
- i0.ɵɵelement(1, "i", 21);
45
- i0.ɵɵtext(2, " New Collection ");
72
+ i0.ɵɵelementStart(0, "div", 29)(1, "button", 30);
73
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_11_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.showSortDropdown = !ctx_r2.showSortDropdown); });
74
+ i0.ɵɵelement(2, "i", 31);
75
+ i0.ɵɵelementEnd();
76
+ i0.ɵɵtemplate(3, CollectionsFullViewComponent_div_11_div_3_Template, 13, 6, "div", 32);
77
+ i0.ɵɵelementEnd();
78
+ } if (rf & 2) {
79
+ const ctx_r2 = i0.ɵɵnextContext();
80
+ i0.ɵɵadvance(3);
81
+ i0.ɵɵproperty("ngIf", ctx_r2.showSortDropdown);
82
+ } }
83
+ function CollectionsFullViewComponent_button_15_Template(rf, ctx) { if (rf & 1) {
84
+ const _r7 = i0.ɵɵgetCurrentView();
85
+ i0.ɵɵelementStart(0, "button", 38);
86
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_button_15_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); ctx_r2.searchQuery = ""; return i0.ɵɵresetView(ctx_r2.onSearchChange("")); });
87
+ i0.ɵɵelement(1, "i", 39);
46
88
  i0.ɵɵelementEnd();
47
89
  } }
48
- function CollectionsFullViewComponent_div_13_Template(rf, ctx) { if (rf & 1) {
49
- i0.ɵɵelementStart(0, "div", 22);
50
- i0.ɵɵelement(1, "i", 23);
51
- i0.ɵɵelementStart(2, "p");
52
- i0.ɵɵtext(3, "Loading collections...");
90
+ function CollectionsFullViewComponent_div_16_div_6_Template(rf, ctx) { if (rf & 1) {
91
+ const _r9 = i0.ɵɵgetCurrentView();
92
+ i0.ɵɵelementStart(0, "div", 44)(1, "button", 34);
93
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_16_div_6_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.createCollection()); });
94
+ i0.ɵɵelement(2, "i", 45);
95
+ i0.ɵɵelementStart(3, "span");
96
+ i0.ɵɵtext(4, "New Collection");
53
97
  i0.ɵɵelementEnd()();
98
+ i0.ɵɵelementStart(5, "button", 46);
99
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_16_div_6_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.addArtifact()); });
100
+ i0.ɵɵelement(6, "i", 47);
101
+ i0.ɵɵelementStart(7, "span");
102
+ i0.ɵɵtext(8, "New Artifact");
103
+ i0.ɵɵelementEnd()()();
104
+ } if (rf & 2) {
105
+ const ctx_r2 = i0.ɵɵnextContext(2);
106
+ i0.ɵɵadvance(5);
107
+ i0.ɵɵproperty("disabled", !ctx_r2.currentCollectionId);
54
108
  } }
55
- function CollectionsFullViewComponent_div_14_button_7_Template(rf, ctx) { if (rf & 1) {
56
- const _r6 = i0.ɵɵgetCurrentView();
57
- i0.ɵɵelementStart(0, "button", 31);
58
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_14_button_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.createCollection()); });
59
- i0.ɵɵelement(1, "i", 32);
60
- i0.ɵɵtext(2, " New Collection ");
109
+ function CollectionsFullViewComponent_div_16_Template(rf, ctx) { if (rf & 1) {
110
+ const _r8 = i0.ɵɵgetCurrentView();
111
+ i0.ɵɵelementStart(0, "div", 29)(1, "button", 40);
112
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_16_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r8); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.showNewDropdown = !ctx_r2.showNewDropdown); });
113
+ i0.ɵɵelement(2, "i", 41);
114
+ i0.ɵɵelementStart(3, "span");
115
+ i0.ɵɵtext(4, "New");
61
116
  i0.ɵɵelementEnd();
62
- } }
63
- function CollectionsFullViewComponent_div_14_div_8_div_1_div_3_Template(rf, ctx) { if (rf & 1) {
64
- i0.ɵɵelementStart(0, "div", 47);
65
- i0.ɵɵelement(1, "i", 48);
117
+ i0.ɵɵelement(5, "i", 42);
118
+ i0.ɵɵelementEnd();
119
+ i0.ɵɵtemplate(6, CollectionsFullViewComponent_div_16_div_6_Template, 9, 1, "div", 43);
66
120
  i0.ɵɵelementEnd();
121
+ } if (rf & 2) {
122
+ const ctx_r2 = i0.ɵɵnextContext();
123
+ i0.ɵɵadvance(6);
124
+ i0.ɵɵproperty("ngIf", ctx_r2.showNewDropdown);
67
125
  } }
68
- function CollectionsFullViewComponent_div_14_div_8_div_1_div_7_Template(rf, ctx) { if (rf & 1) {
69
- i0.ɵɵelementStart(0, "div", 49);
70
- i0.ɵɵelement(1, "i", 50);
71
- i0.ɵɵelementStart(2, "span");
126
+ function CollectionsFullViewComponent_div_19_Template(rf, ctx) { if (rf & 1) {
127
+ const _r10 = i0.ɵɵgetCurrentView();
128
+ i0.ɵɵelementStart(0, "div", 48)(1, "div", 49)(2, "span", 50);
72
129
  i0.ɵɵtext(3);
73
130
  i0.ɵɵelementEnd()();
131
+ i0.ɵɵelementStart(4, "div", 51)(5, "button", 52);
132
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_19_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.clearSelection()); });
133
+ i0.ɵɵelement(6, "i", 39);
134
+ i0.ɵɵtext(7, " Clear Selection ");
135
+ i0.ɵɵelementEnd();
136
+ i0.ɵɵelementStart(8, "button", 53);
137
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_19_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.deleteSelected()); });
138
+ i0.ɵɵelement(9, "i", 54);
139
+ i0.ɵɵtext(10, " Delete Selected ");
140
+ i0.ɵɵelementEnd()()();
74
141
  } if (rf & 2) {
75
- const collection_r8 = i0.ɵɵnextContext().$implicit;
142
+ const ctx_r2 = i0.ɵɵnextContext();
76
143
  i0.ɵɵadvance(3);
77
- i0.ɵɵtextInterpolate(collection_r8.Owner);
144
+ i0.ɵɵtextInterpolate1("", ctx_r2.selectedItems.size, " selected");
78
145
  } }
79
- function CollectionsFullViewComponent_div_14_div_8_div_1_div_8_Template(rf, ctx) { if (rf & 1) {
80
- i0.ɵɵelementStart(0, "div", 51);
81
- i0.ɵɵtext(1);
146
+ function CollectionsFullViewComponent_div_21_Template(rf, ctx) { if (rf & 1) {
147
+ i0.ɵɵelementStart(0, "div", 55);
148
+ i0.ɵɵelement(1, "i", 56);
149
+ i0.ɵɵelementStart(2, "p");
150
+ i0.ɵɵtext(3, "Loading collections...");
151
+ i0.ɵɵelementEnd()();
152
+ } }
153
+ function CollectionsFullViewComponent_div_22_ng_container_2_Template(rf, ctx) { if (rf & 1) {
154
+ i0.ɵɵelementContainerStart(0);
155
+ i0.ɵɵelementStart(1, "h3");
156
+ i0.ɵɵtext(2, "No items found");
157
+ i0.ɵɵelementEnd();
158
+ i0.ɵɵelementStart(3, "p");
159
+ i0.ɵɵtext(4, "Try adjusting your search");
160
+ i0.ɵɵelementEnd();
161
+ i0.ɵɵelementContainerEnd();
162
+ } }
163
+ function CollectionsFullViewComponent_div_22_ng_container_3_button_5_Template(rf, ctx) { if (rf & 1) {
164
+ const _r11 = i0.ɵɵgetCurrentView();
165
+ i0.ɵɵelementStart(0, "button", 40);
166
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_22_ng_container_3_button_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.createCollection()); });
167
+ i0.ɵɵelement(1, "i", 41);
168
+ i0.ɵɵtext(2, " Create Collection ");
169
+ i0.ɵɵelementEnd();
170
+ } }
171
+ function CollectionsFullViewComponent_div_22_ng_container_3_Template(rf, ctx) { if (rf & 1) {
172
+ i0.ɵɵelementContainerStart(0);
173
+ i0.ɵɵelementStart(1, "h3");
174
+ i0.ɵɵtext(2, "No collections yet");
175
+ i0.ɵɵelementEnd();
176
+ i0.ɵɵelementStart(3, "p");
177
+ i0.ɵɵtext(4, "Create your first collection to get started");
178
+ i0.ɵɵelementEnd();
179
+ i0.ɵɵtemplate(5, CollectionsFullViewComponent_div_22_ng_container_3_button_5_Template, 3, 0, "button", 60);
180
+ i0.ɵɵelementContainerEnd();
181
+ } if (rf & 2) {
182
+ const ctx_r2 = i0.ɵɵnextContext(2);
183
+ i0.ɵɵadvance(5);
184
+ i0.ɵɵproperty("ngIf", ctx_r2.canEditCurrent());
185
+ } }
186
+ function CollectionsFullViewComponent_div_22_ng_container_4_Template(rf, ctx) { if (rf & 1) {
187
+ i0.ɵɵelementContainerStart(0);
188
+ i0.ɵɵelementStart(1, "h3");
189
+ i0.ɵɵtext(2, "This collection is empty");
190
+ i0.ɵɵelementEnd();
191
+ i0.ɵɵelementStart(3, "p");
192
+ i0.ɵɵtext(4, "Use the ");
193
+ i0.ɵɵelementStart(5, "strong");
194
+ i0.ɵɵtext(6, "New");
195
+ i0.ɵɵelementEnd();
196
+ i0.ɵɵtext(7, " button above to add collections or artifacts");
197
+ i0.ɵɵelementEnd();
198
+ i0.ɵɵelementContainerEnd();
199
+ } }
200
+ function CollectionsFullViewComponent_div_22_Template(rf, ctx) { if (rf & 1) {
201
+ i0.ɵɵelementStart(0, "div", 57);
202
+ i0.ɵɵelement(1, "i", 58);
203
+ i0.ɵɵtemplate(2, CollectionsFullViewComponent_div_22_ng_container_2_Template, 5, 0, "ng-container", 59)(3, CollectionsFullViewComponent_div_22_ng_container_3_Template, 6, 1, "ng-container", 59)(4, CollectionsFullViewComponent_div_22_ng_container_4_Template, 8, 0, "ng-container", 59);
82
204
  i0.ɵɵelementEnd();
83
205
  } if (rf & 2) {
84
- const collection_r8 = i0.ɵɵnextContext().$implicit;
206
+ const ctx_r2 = i0.ɵɵnextContext();
207
+ i0.ɵɵadvance(2);
208
+ i0.ɵɵproperty("ngIf", ctx_r2.searchQuery);
209
+ i0.ɵɵadvance();
210
+ i0.ɵɵproperty("ngIf", !ctx_r2.searchQuery && !ctx_r2.currentCollectionId);
85
211
  i0.ɵɵadvance();
86
- i0.ɵɵtextInterpolate1(" ", collection_r8.Description, " ");
212
+ i0.ɵɵproperty("ngIf", !ctx_r2.searchQuery && ctx_r2.currentCollectionId);
87
213
  } }
88
- function CollectionsFullViewComponent_div_14_div_8_div_1_button_10_Template(rf, ctx) { if (rf & 1) {
89
- const _r9 = i0.ɵɵgetCurrentView();
90
- i0.ɵɵelementStart(0, "button", 52);
91
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_14_div_8_div_1_button_10_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const collection_r8 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.shareCollection(collection_r8)); });
92
- i0.ɵɵelement(1, "i", 53);
214
+ function CollectionsFullViewComponent_div_23_div_1_div_3_div_3_Template(rf, ctx) { if (rf & 1) {
215
+ i0.ɵɵelementStart(0, "div", 75);
216
+ i0.ɵɵelement(1, "i", 76);
93
217
  i0.ɵɵelementEnd();
94
218
  } }
95
- function CollectionsFullViewComponent_div_14_div_8_div_1_button_11_Template(rf, ctx) { if (rf & 1) {
96
- const _r10 = i0.ɵɵgetCurrentView();
97
- i0.ɵɵelementStart(0, "button", 54);
98
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_14_div_8_div_1_button_11_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const collection_r8 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.editCollection(collection_r8)); });
99
- i0.ɵɵelement(1, "i", 55);
219
+ function CollectionsFullViewComponent_div_23_div_1_div_3_div_7_Template(rf, ctx) { if (rf & 1) {
220
+ i0.ɵɵelementStart(0, "div", 77);
221
+ i0.ɵɵtext(1);
100
222
  i0.ɵɵelementEnd();
223
+ } if (rf & 2) {
224
+ const item_r13 = i0.ɵɵnextContext(2).$implicit;
225
+ i0.ɵɵadvance();
226
+ i0.ɵɵtextInterpolate1(" ", item_r13.description, " ");
101
227
  } }
102
- function CollectionsFullViewComponent_div_14_div_8_div_1_button_12_Template(rf, ctx) { if (rf & 1) {
103
- const _r11 = i0.ɵɵgetCurrentView();
104
- i0.ɵɵelementStart(0, "button", 56);
105
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_14_div_8_div_1_button_12_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r11); const collection_r8 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.deleteCollection(collection_r8)); });
106
- i0.ɵɵelement(1, "i", 57);
228
+ function CollectionsFullViewComponent_div_23_div_1_div_3_div_8_Template(rf, ctx) { if (rf & 1) {
229
+ i0.ɵɵelementStart(0, "div", 78);
230
+ i0.ɵɵtext(1);
107
231
  i0.ɵɵelementEnd();
232
+ } if (rf & 2) {
233
+ const item_r13 = i0.ɵɵnextContext(2).$implicit;
234
+ const ctx_r2 = i0.ɵɵnextContext(2);
235
+ i0.ɵɵadvance();
236
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.getItemCountText(item_r13.itemCount), " ");
108
237
  } }
109
- function CollectionsFullViewComponent_div_14_div_8_div_1_Template(rf, ctx) { if (rf & 1) {
110
- const _r7 = i0.ɵɵgetCurrentView();
111
- i0.ɵɵelementStart(0, "div", 35);
112
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_14_div_8_div_1_Template_div_click_0_listener() { const collection_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openCollection(collection_r8)); });
113
- i0.ɵɵelementStart(1, "div", 36);
114
- i0.ɵɵelement(2, "i", 37);
115
- i0.ɵɵtemplate(3, CollectionsFullViewComponent_div_14_div_8_div_1_div_3_Template, 2, 0, "div", 38);
238
+ function CollectionsFullViewComponent_div_23_div_1_div_3_div_9_Template(rf, ctx) { if (rf & 1) {
239
+ i0.ɵɵelementStart(0, "div", 79);
240
+ i0.ɵɵelement(1, "i", 80);
241
+ i0.ɵɵtext(2);
116
242
  i0.ɵɵelementEnd();
117
- i0.ɵɵelementStart(4, "div", 39)(5, "div", 40);
118
- i0.ɵɵtext(6);
243
+ } if (rf & 2) {
244
+ const item_r13 = i0.ɵɵnextContext(2).$implicit;
245
+ i0.ɵɵadvance(2);
246
+ i0.ɵɵtextInterpolate1(" ", item_r13.owner, " ");
247
+ } }
248
+ function CollectionsFullViewComponent_div_23_div_1_div_3_Template(rf, ctx) { if (rf & 1) {
249
+ i0.ɵɵelementStart(0, "div", 66)(1, "div", 67);
250
+ i0.ɵɵelement(2, "i", 68);
251
+ i0.ɵɵtemplate(3, CollectionsFullViewComponent_div_23_div_1_div_3_div_3_Template, 2, 0, "div", 69);
119
252
  i0.ɵɵelementEnd();
120
- i0.ɵɵtemplate(7, CollectionsFullViewComponent_div_14_div_8_div_1_div_7_Template, 4, 1, "div", 41)(8, CollectionsFullViewComponent_div_14_div_8_div_1_div_8_Template, 2, 1, "div", 42);
253
+ i0.ɵɵelementStart(4, "div", 70)(5, "div", 71);
254
+ i0.ɵɵtext(6);
121
255
  i0.ɵɵelementEnd();
122
- i0.ɵɵelementStart(9, "div", 43);
123
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_14_div_8_div_1_Template_div_click_9_listener($event) { i0.ɵɵrestoreView(_r7); return i0.ɵɵresetView($event.stopPropagation()); });
124
- i0.ɵɵtemplate(10, CollectionsFullViewComponent_div_14_div_8_div_1_button_10_Template, 2, 0, "button", 44)(11, CollectionsFullViewComponent_div_14_div_8_div_1_button_11_Template, 2, 0, "button", 45)(12, CollectionsFullViewComponent_div_14_div_8_div_1_button_12_Template, 2, 0, "button", 46);
256
+ i0.ɵɵtemplate(7, CollectionsFullViewComponent_div_23_div_1_div_3_div_7_Template, 2, 1, "div", 72)(8, CollectionsFullViewComponent_div_23_div_1_div_3_div_8_Template, 2, 1, "div", 73)(9, CollectionsFullViewComponent_div_23_div_1_div_3_div_9_Template, 3, 1, "div", 74);
125
257
  i0.ɵɵelementEnd()();
126
258
  } if (rf & 2) {
127
- const collection_r8 = ctx.$implicit;
128
- const ctx_r2 = i0.ɵɵnextContext(3);
259
+ const item_r13 = i0.ɵɵnextContext().$implicit;
260
+ i0.ɵɵproperty("title", item_r13.description || item_r13.name);
129
261
  i0.ɵɵadvance(3);
130
- i0.ɵɵproperty("ngIf", ctx_r2.isShared(collection_r8));
262
+ i0.ɵɵproperty("ngIf", item_r13.isShared);
131
263
  i0.ɵɵadvance(3);
132
- i0.ɵɵtextInterpolate(collection_r8.Name);
264
+ i0.ɵɵtextInterpolate(item_r13.name);
133
265
  i0.ɵɵadvance();
134
- i0.ɵɵproperty("ngIf", ctx_r2.isShared(collection_r8) && collection_r8.Owner);
266
+ i0.ɵɵproperty("ngIf", item_r13.description);
135
267
  i0.ɵɵadvance();
136
- i0.ɵɵproperty("ngIf", collection_r8.Description);
137
- i0.ɵɵadvance(2);
138
- i0.ɵɵproperty("ngIf", ctx_r2.canShare(collection_r8));
139
- i0.ɵɵadvance();
140
- i0.ɵɵproperty("ngIf", ctx_r2.canEdit(collection_r8));
268
+ i0.ɵɵproperty("ngIf", item_r13.itemCount !== undefined);
141
269
  i0.ɵɵadvance();
142
- i0.ɵɵproperty("ngIf", ctx_r2.canDelete(collection_r8));
270
+ i0.ɵɵproperty("ngIf", item_r13.isShared && item_r13.owner);
143
271
  } }
144
- function CollectionsFullViewComponent_div_14_div_8_Template(rf, ctx) { if (rf & 1) {
145
- i0.ɵɵelementStart(0, "div", 33);
146
- i0.ɵɵtemplate(1, CollectionsFullViewComponent_div_14_div_8_div_1_Template, 13, 7, "div", 34);
272
+ function CollectionsFullViewComponent_div_23_div_1_div_4_div_6_Template(rf, ctx) { if (rf & 1) {
273
+ i0.ɵɵelementStart(0, "div", 77);
274
+ i0.ɵɵtext(1);
147
275
  i0.ɵɵelementEnd();
148
276
  } if (rf & 2) {
149
- const ctx_r2 = i0.ɵɵnextContext(2);
277
+ const item_r13 = i0.ɵɵnextContext(2).$implicit;
150
278
  i0.ɵɵadvance();
151
- i0.ɵɵproperty("ngForOf", ctx_r2.filteredCollections);
279
+ i0.ɵɵtextInterpolate1(" ", item_r13.description, " ");
152
280
  } }
153
- function CollectionsFullViewComponent_div_14_div_9_button_6_Template(rf, ctx) { if (rf & 1) {
154
- const _r12 = i0.ɵɵgetCurrentView();
155
- i0.ɵɵelementStart(0, "button", 31);
156
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_14_div_9_button_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.addArtifact()); });
157
- i0.ɵɵelement(1, "i", 32);
158
- i0.ɵɵtext(2, " Add Artifact ");
281
+ function CollectionsFullViewComponent_div_23_div_1_div_4_span_8_Template(rf, ctx) { if (rf & 1) {
282
+ i0.ɵɵelementStart(0, "span", 84);
283
+ i0.ɵɵtext(1);
159
284
  i0.ɵɵelementEnd();
285
+ } if (rf & 2) {
286
+ const item_r13 = i0.ɵɵnextContext(2).$implicit;
287
+ i0.ɵɵadvance();
288
+ i0.ɵɵtextInterpolate1(" v", item_r13.versionNumber, " ");
160
289
  } }
161
- function CollectionsFullViewComponent_div_14_div_9_div_7_For_2_button_12_Template(rf, ctx) { if (rf & 1) {
162
- const _r15 = i0.ɵɵgetCurrentView();
163
- i0.ɵɵelementStart(0, "button", 68);
164
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_14_div_9_div_7_For_2_button_12_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r15); const item_r14 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.removeArtifact(item_r14)); });
165
- i0.ɵɵelement(1, "i", 69);
290
+ function CollectionsFullViewComponent_div_23_div_1_div_4_span_9_Template(rf, ctx) { if (rf & 1) {
291
+ i0.ɵɵelementStart(0, "span", 85);
292
+ i0.ɵɵtext(1);
166
293
  i0.ɵɵelementEnd();
294
+ } if (rf & 2) {
295
+ const item_r13 = i0.ɵɵnextContext(2).$implicit;
296
+ i0.ɵɵadvance();
297
+ i0.ɵɵtextInterpolate1(" ", item_r13.artifactType, " ");
167
298
  } }
168
- function CollectionsFullViewComponent_div_14_div_9_div_7_For_2_Template(rf, ctx) { if (rf & 1) {
169
- const _r13 = i0.ɵɵgetCurrentView();
170
- i0.ɵɵelementStart(0, "div", 61);
171
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_14_div_9_div_7_For_2_Template_div_click_0_listener() { const item_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.viewArtifact(item_r14)); });
172
- i0.ɵɵelementStart(1, "div", 62);
173
- i0.ɵɵelement(2, "i", 63);
299
+ function CollectionsFullViewComponent_div_23_div_1_div_4_Template(rf, ctx) { if (rf & 1) {
300
+ i0.ɵɵelementStart(0, "div", 66)(1, "div", 81);
301
+ i0.ɵɵelement(2, "i", 9);
174
302
  i0.ɵɵelementEnd();
175
- i0.ɵɵelementStart(3, "div", 39)(4, "div", 40);
303
+ i0.ɵɵelementStart(3, "div", 70)(4, "div", 71);
176
304
  i0.ɵɵtext(5);
177
305
  i0.ɵɵelementEnd();
178
- i0.ɵɵelementStart(6, "div", 64)(7, "span", 65);
179
- i0.ɵɵtext(8);
180
- i0.ɵɵelementEnd();
181
- i0.ɵɵelementStart(9, "span", 66);
182
- i0.ɵɵtext(10);
306
+ i0.ɵɵtemplate(6, CollectionsFullViewComponent_div_23_div_1_div_4_div_6_Template, 2, 1, "div", 72);
307
+ i0.ɵɵelementStart(7, "div", 78);
308
+ i0.ɵɵtemplate(8, CollectionsFullViewComponent_div_23_div_1_div_4_span_8_Template, 2, 1, "span", 82)(9, CollectionsFullViewComponent_div_23_div_1_div_4_span_9_Template, 2, 1, "span", 83);
183
309
  i0.ɵɵelementEnd()()();
184
- i0.ɵɵelementStart(11, "div", 43);
185
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_14_div_9_div_7_For_2_Template_div_click_11_listener($event) { i0.ɵɵrestoreView(_r13); return i0.ɵɵresetView($event.stopPropagation()); });
186
- i0.ɵɵtemplate(12, CollectionsFullViewComponent_div_14_div_9_div_7_For_2_button_12_Template, 2, 0, "button", 67);
187
- i0.ɵɵelementEnd()();
188
310
  } if (rf & 2) {
189
- const item_r14 = ctx.$implicit;
190
- const ctx_r2 = i0.ɵɵnextContext(4);
191
- i0.ɵɵadvance(5);
192
- i0.ɵɵtextInterpolate(item_r14.artifact.Name);
311
+ const item_r13 = i0.ɵɵnextContext().$implicit;
312
+ i0.ɵɵproperty("title", item_r13.description || item_r13.name);
313
+ i0.ɵɵadvance(2);
314
+ i0.ɵɵproperty("ngClass", item_r13.icon);
193
315
  i0.ɵɵadvance(3);
194
- i0.ɵɵtextInterpolate1("v", item_r14.version.VersionNumber, "");
316
+ i0.ɵɵtextInterpolate(item_r13.name);
317
+ i0.ɵɵadvance();
318
+ i0.ɵɵproperty("ngIf", item_r13.description);
195
319
  i0.ɵɵadvance(2);
196
- i0.ɵɵtextInterpolate(item_r14.artifact.Type || "Unknown");
320
+ i0.ɵɵproperty("ngIf", item_r13.versionNumber);
321
+ i0.ɵɵadvance();
322
+ i0.ɵɵproperty("ngIf", item_r13.artifactType);
323
+ } }
324
+ function CollectionsFullViewComponent_div_23_div_1_Template(rf, ctx) { if (rf & 1) {
325
+ const _r12 = i0.ɵɵgetCurrentView();
326
+ i0.ɵɵelementStart(0, "div", 63);
327
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_23_div_1_Template_div_click_0_listener($event) { const item_r13 = i0.ɵɵrestoreView(_r12).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onItemClick(item_r13, $event)); })("contextmenu", function CollectionsFullViewComponent_div_23_div_1_Template_div_contextmenu_0_listener($event) { const item_r13 = i0.ɵɵrestoreView(_r12).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onItemContextMenu(item_r13, $event)); });
328
+ i0.ɵɵelementStart(1, "div", 64);
329
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_23_div_1_Template_div_click_1_listener($event) { const item_r13 = i0.ɵɵrestoreView(_r12).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleItemSelection(item_r13, $event)); });
330
+ i0.ɵɵelement(2, "i", 9);
331
+ i0.ɵɵelementEnd();
332
+ i0.ɵɵtemplate(3, CollectionsFullViewComponent_div_23_div_1_div_3_Template, 10, 6, "div", 65)(4, CollectionsFullViewComponent_div_23_div_1_div_4_Template, 10, 6, "div", 65);
333
+ i0.ɵɵelementEnd();
334
+ } if (rf & 2) {
335
+ const item_r13 = ctx.$implicit;
336
+ const ctx_r2 = i0.ɵɵnextContext(2);
337
+ i0.ɵɵclassProp("selected", item_r13.selected)("active", item_r13.type === "artifact" && (item_r13.artifact == null ? null : item_r13.artifact.ID) === ctx_r2.activeArtifactId);
197
338
  i0.ɵɵadvance(2);
198
- i0.ɵɵproperty("ngIf", ctx_r2.canDeleteCurrent());
339
+ i0.ɵɵproperty("ngClass", item_r13.selected ? "fa-check-circle" : "fa-circle");
340
+ i0.ɵɵadvance();
341
+ i0.ɵɵproperty("ngIf", item_r13.type === "folder");
342
+ i0.ɵɵadvance();
343
+ i0.ɵɵproperty("ngIf", item_r13.type === "artifact");
199
344
  } }
200
- function CollectionsFullViewComponent_div_14_div_9_div_7_Template(rf, ctx) { if (rf & 1) {
201
- i0.ɵɵelementStart(0, "div", 59);
202
- i0.ɵɵrepeaterCreate(1, CollectionsFullViewComponent_div_14_div_9_div_7_For_2_Template, 13, 4, "div", 60, _forTrack0);
345
+ function CollectionsFullViewComponent_div_23_Template(rf, ctx) { if (rf & 1) {
346
+ i0.ɵɵelementStart(0, "div", 61);
347
+ i0.ɵɵtemplate(1, CollectionsFullViewComponent_div_23_div_1_Template, 5, 7, "div", 62);
203
348
  i0.ɵɵelementEnd();
204
349
  } if (rf & 2) {
205
- const ctx_r2 = i0.ɵɵnextContext(3);
350
+ const ctx_r2 = i0.ɵɵnextContext();
206
351
  i0.ɵɵadvance();
207
- i0.ɵɵrepeater(ctx_r2.filteredArtifactVersions);
352
+ i0.ɵɵproperty("ngForOf", ctx_r2.unifiedItems);
353
+ } }
354
+ function CollectionsFullViewComponent_div_24_i_9_Template(rf, ctx) { if (rf & 1) {
355
+ i0.ɵɵelement(0, "i", 31);
208
356
  } }
209
- function CollectionsFullViewComponent_div_14_div_9_Template(rf, ctx) { if (rf & 1) {
210
- i0.ɵɵelementStart(0, "div", 25)(1, "div", 26)(2, "h3");
211
- i0.ɵɵtext(3, "Artifacts");
357
+ function CollectionsFullViewComponent_div_24_i_10_Template(rf, ctx) { if (rf & 1) {
358
+ i0.ɵɵelement(0, "i", 9);
359
+ } if (rf & 2) {
360
+ const ctx_r2 = i0.ɵɵnextContext(2);
361
+ i0.ɵɵproperty("ngClass", ctx_r2.sortOrder === "asc" ? "fa-sort-up" : "fa-sort-down");
362
+ } }
363
+ function CollectionsFullViewComponent_div_24_i_14_Template(rf, ctx) { if (rf & 1) {
364
+ i0.ɵɵelement(0, "i", 31);
365
+ } }
366
+ function CollectionsFullViewComponent_div_24_i_15_Template(rf, ctx) { if (rf & 1) {
367
+ i0.ɵɵelement(0, "i", 9);
368
+ } if (rf & 2) {
369
+ const ctx_r2 = i0.ɵɵnextContext(2);
370
+ i0.ɵɵproperty("ngClass", ctx_r2.sortOrder === "asc" ? "fa-sort-up" : "fa-sort-down");
371
+ } }
372
+ function CollectionsFullViewComponent_div_24_i_19_Template(rf, ctx) { if (rf & 1) {
373
+ i0.ɵɵelement(0, "i", 31);
374
+ } }
375
+ function CollectionsFullViewComponent_div_24_i_20_Template(rf, ctx) { if (rf & 1) {
376
+ i0.ɵɵelement(0, "i", 9);
377
+ } if (rf & 2) {
378
+ const ctx_r2 = i0.ɵɵnextContext(2);
379
+ i0.ɵɵproperty("ngClass", ctx_r2.sortOrder === "asc" ? "fa-sort-up" : "fa-sort-down");
380
+ } }
381
+ function CollectionsFullViewComponent_div_24_tr_24_i_8_Template(rf, ctx) { if (rf & 1) {
382
+ i0.ɵɵelement(0, "i", 103);
383
+ } }
384
+ function CollectionsFullViewComponent_div_24_tr_24_span_10_Template(rf, ctx) { if (rf & 1) {
385
+ i0.ɵɵelementStart(0, "span");
386
+ i0.ɵɵtext(1, "Folder");
212
387
  i0.ɵɵelementEnd();
213
- i0.ɵɵelementStart(4, "span", 27);
214
- i0.ɵɵtext(5);
388
+ } }
389
+ function CollectionsFullViewComponent_div_24_tr_24_span_11_Template(rf, ctx) { if (rf & 1) {
390
+ i0.ɵɵelementStart(0, "span", 85);
391
+ i0.ɵɵtext(1);
215
392
  i0.ɵɵelementEnd();
216
- i0.ɵɵtemplate(6, CollectionsFullViewComponent_div_14_div_9_button_6_Template, 3, 0, "button", 28);
393
+ } if (rf & 2) {
394
+ const item_r16 = i0.ɵɵnextContext().$implicit;
395
+ i0.ɵɵadvance();
396
+ i0.ɵɵtextInterpolate1(" ", item_r16.artifactType, " ");
397
+ } }
398
+ function CollectionsFullViewComponent_div_24_tr_24_span_13_Template(rf, ctx) { if (rf & 1) {
399
+ i0.ɵɵelementStart(0, "span");
400
+ i0.ɵɵtext(1);
401
+ i0.ɵɵpipe(2, "date");
217
402
  i0.ɵɵelementEnd();
218
- i0.ɵɵtemplate(7, CollectionsFullViewComponent_div_14_div_9_div_7_Template, 3, 0, "div", 58);
403
+ } if (rf & 2) {
404
+ const item_r16 = i0.ɵɵnextContext().$implicit;
405
+ i0.ɵɵadvance();
406
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(2, 1, item_r16.lastModified, "short"), " ");
407
+ } }
408
+ function CollectionsFullViewComponent_div_24_tr_24_span_15_Template(rf, ctx) { if (rf & 1) {
409
+ i0.ɵɵelementStart(0, "span");
410
+ i0.ɵɵtext(1);
219
411
  i0.ɵɵelementEnd();
220
412
  } if (rf & 2) {
413
+ const item_r16 = i0.ɵɵnextContext().$implicit;
414
+ i0.ɵɵadvance();
415
+ i0.ɵɵtextInterpolate(item_r16.owner);
416
+ } }
417
+ function CollectionsFullViewComponent_div_24_tr_24_Template(rf, ctx) { if (rf & 1) {
418
+ const _r15 = i0.ɵɵgetCurrentView();
419
+ i0.ɵɵelementStart(0, "tr", 97);
420
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_24_tr_24_Template_tr_click_0_listener($event) { const item_r16 = i0.ɵɵrestoreView(_r15).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onItemClick(item_r16, $event)); })("contextmenu", function CollectionsFullViewComponent_div_24_tr_24_Template_tr_contextmenu_0_listener($event) { const item_r16 = i0.ɵɵrestoreView(_r15).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onItemContextMenu(item_r16, $event)); });
421
+ i0.ɵɵelementStart(1, "td", 88)(2, "i", 89);
422
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_24_tr_24_Template_i_click_2_listener($event) { const item_r16 = i0.ɵɵrestoreView(_r15).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleItemSelection(item_r16, $event)); });
423
+ i0.ɵɵelementEnd()();
424
+ i0.ɵɵelementStart(3, "td", 98)(4, "div", 99);
425
+ i0.ɵɵelement(5, "i", 9);
426
+ i0.ɵɵelementStart(6, "span");
427
+ i0.ɵɵtext(7);
428
+ i0.ɵɵelementEnd();
429
+ i0.ɵɵtemplate(8, CollectionsFullViewComponent_div_24_tr_24_i_8_Template, 1, 0, "i", 100);
430
+ i0.ɵɵelementEnd()();
431
+ i0.ɵɵelementStart(9, "td", 101);
432
+ i0.ɵɵtemplate(10, CollectionsFullViewComponent_div_24_tr_24_span_10_Template, 2, 0, "span", 59)(11, CollectionsFullViewComponent_div_24_tr_24_span_11_Template, 2, 1, "span", 83);
433
+ i0.ɵɵelementEnd();
434
+ i0.ɵɵelementStart(12, "td", 102);
435
+ i0.ɵɵtemplate(13, CollectionsFullViewComponent_div_24_tr_24_span_13_Template, 3, 4, "span", 59);
436
+ i0.ɵɵelementEnd();
437
+ i0.ɵɵelementStart(14, "td", 95);
438
+ i0.ɵɵtemplate(15, CollectionsFullViewComponent_div_24_tr_24_span_15_Template, 2, 1, "span", 59);
439
+ i0.ɵɵelementEnd()();
440
+ } if (rf & 2) {
441
+ const item_r16 = ctx.$implicit;
221
442
  const ctx_r2 = i0.ɵɵnextContext(2);
222
- i0.ɵɵadvance(5);
223
- i0.ɵɵtextInterpolate(ctx_r2.filteredArtifactVersions.length);
443
+ i0.ɵɵclassProp("selected", item_r16.selected)("active", item_r16.type === "artifact" && (item_r16.artifact == null ? null : item_r16.artifact.ID) === ctx_r2.activeArtifactId);
444
+ i0.ɵɵadvance(2);
445
+ i0.ɵɵproperty("ngClass", item_r16.selected ? "fa-check-circle" : "fa-circle");
446
+ i0.ɵɵadvance(3);
447
+ i0.ɵɵproperty("ngClass", item_r16.type === "folder" ? "fa-folder" : item_r16.icon);
448
+ i0.ɵɵadvance(2);
449
+ i0.ɵɵtextInterpolate(item_r16.name);
224
450
  i0.ɵɵadvance();
225
- i0.ɵɵproperty("ngIf", ctx_r2.canEditCurrent());
451
+ i0.ɵɵproperty("ngIf", item_r16.isShared);
452
+ i0.ɵɵadvance(2);
453
+ i0.ɵɵproperty("ngIf", item_r16.type === "folder");
226
454
  i0.ɵɵadvance();
227
- i0.ɵɵproperty("ngIf", ctx_r2.filteredArtifactVersions.length > 0);
455
+ i0.ɵɵproperty("ngIf", item_r16.type === "artifact");
456
+ i0.ɵɵadvance(2);
457
+ i0.ɵɵproperty("ngIf", item_r16.lastModified);
458
+ i0.ɵɵadvance(2);
459
+ i0.ɵɵproperty("ngIf", item_r16.owner);
228
460
  } }
229
- function CollectionsFullViewComponent_div_14_Template(rf, ctx) { if (rf & 1) {
230
- i0.ɵɵelementStart(0, "div", 24)(1, "div", 25)(2, "div", 26)(3, "h3");
231
- i0.ɵɵtext(4, "Collections");
461
+ function CollectionsFullViewComponent_div_24_Template(rf, ctx) { if (rf & 1) {
462
+ const _r14 = i0.ɵɵgetCurrentView();
463
+ i0.ɵɵelementStart(0, "div", 86)(1, "table", 87)(2, "thead")(3, "tr")(4, "th", 88)(5, "i", 89);
464
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_24_Template_i_click_5_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.selectedItems.size === ctx_r2.unifiedItems.length ? ctx_r2.clearSelection() : ctx_r2.selectAll()); });
465
+ i0.ɵɵelementEnd()();
466
+ i0.ɵɵelementStart(6, "th", 90);
467
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_24_Template_th_click_6_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setSortBy("name")); });
468
+ i0.ɵɵelementStart(7, "span");
469
+ i0.ɵɵtext(8, "Name");
232
470
  i0.ɵɵelementEnd();
233
- i0.ɵɵelementStart(5, "span", 27);
234
- i0.ɵɵtext(6);
471
+ i0.ɵɵtemplate(9, CollectionsFullViewComponent_div_24_i_9_Template, 1, 0, "i", 91)(10, CollectionsFullViewComponent_div_24_i_10_Template, 1, 1, "i", 92);
235
472
  i0.ɵɵelementEnd();
236
- i0.ɵɵtemplate(7, CollectionsFullViewComponent_div_14_button_7_Template, 3, 0, "button", 28);
473
+ i0.ɵɵelementStart(11, "th", 93);
474
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_24_Template_th_click_11_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setSortBy("type")); });
475
+ i0.ɵɵelementStart(12, "span");
476
+ i0.ɵɵtext(13, "Type");
237
477
  i0.ɵɵelementEnd();
238
- i0.ɵɵtemplate(8, CollectionsFullViewComponent_div_14_div_8_Template, 2, 1, "div", 29);
478
+ i0.ɵɵtemplate(14, CollectionsFullViewComponent_div_24_i_14_Template, 1, 0, "i", 91)(15, CollectionsFullViewComponent_div_24_i_15_Template, 1, 1, "i", 92);
239
479
  i0.ɵɵelementEnd();
240
- i0.ɵɵtemplate(9, CollectionsFullViewComponent_div_14_div_9_Template, 8, 3, "div", 30);
480
+ i0.ɵɵelementStart(16, "th", 94);
481
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_div_24_Template_th_click_16_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setSortBy("date")); });
482
+ i0.ɵɵelementStart(17, "span");
483
+ i0.ɵɵtext(18, "Modified");
241
484
  i0.ɵɵelementEnd();
485
+ i0.ɵɵtemplate(19, CollectionsFullViewComponent_div_24_i_19_Template, 1, 0, "i", 91)(20, CollectionsFullViewComponent_div_24_i_20_Template, 1, 1, "i", 92);
486
+ i0.ɵɵelementEnd();
487
+ i0.ɵɵelementStart(21, "th", 95);
488
+ i0.ɵɵtext(22, "Owner");
489
+ i0.ɵɵelementEnd()()();
490
+ i0.ɵɵelementStart(23, "tbody");
491
+ i0.ɵɵtemplate(24, CollectionsFullViewComponent_div_24_tr_24_Template, 16, 12, "tr", 96);
492
+ i0.ɵɵelementEnd()()();
242
493
  } if (rf & 2) {
243
494
  const ctx_r2 = i0.ɵɵnextContext();
244
- i0.ɵɵadvance(6);
245
- i0.ɵɵtextInterpolate(ctx_r2.filteredCollections.length);
495
+ i0.ɵɵadvance(5);
496
+ i0.ɵɵproperty("ngClass", ctx_r2.selectedItems.size === ctx_r2.unifiedItems.length ? "fa-check-square" : "fa-square");
497
+ i0.ɵɵadvance(4);
498
+ i0.ɵɵproperty("ngIf", ctx_r2.sortBy !== "name");
246
499
  i0.ɵɵadvance();
247
- i0.ɵɵproperty("ngIf", ctx_r2.canEditCurrent());
500
+ i0.ɵɵproperty("ngIf", ctx_r2.sortBy === "name");
501
+ i0.ɵɵadvance(4);
502
+ i0.ɵɵproperty("ngIf", ctx_r2.sortBy !== "type");
248
503
  i0.ɵɵadvance();
249
- i0.ɵɵproperty("ngIf", ctx_r2.filteredCollections.length > 0);
504
+ i0.ɵɵproperty("ngIf", ctx_r2.sortBy === "type");
505
+ i0.ɵɵadvance(4);
506
+ i0.ɵɵproperty("ngIf", ctx_r2.sortBy !== "date");
250
507
  i0.ɵɵadvance();
251
- i0.ɵɵproperty("ngIf", ctx_r2.currentCollectionId);
508
+ i0.ɵɵproperty("ngIf", ctx_r2.sortBy === "date");
509
+ i0.ɵɵadvance(4);
510
+ i0.ɵɵproperty("ngForOf", ctx_r2.unifiedItems);
252
511
  } }
253
512
  /**
254
513
  * Full-panel Collections view component
@@ -259,6 +518,7 @@ export class CollectionsFullViewComponent {
259
518
  artifactState;
260
519
  collectionState;
261
520
  permissionService;
521
+ artifactIconService;
262
522
  environmentId;
263
523
  currentUser;
264
524
  collectionNavigated = new EventEmitter();
@@ -276,18 +536,31 @@ export class CollectionsFullViewComponent {
276
536
  userPermissions = new Map();
277
537
  isShareModalOpen = false;
278
538
  sharingCollection = null;
539
+ // New UI state for Mac Finder-style view
540
+ viewMode = 'grid';
541
+ sortBy = 'name';
542
+ sortOrder = 'asc';
543
+ searchQuery = '';
544
+ unifiedItems = [];
545
+ selectedItems = new Set();
546
+ showNewDropdown = false;
547
+ showSortDropdown = false;
548
+ activeArtifactId = null; // Track which artifact is currently being viewed
279
549
  destroy$ = new Subject();
280
550
  isNavigatingProgrammatically = false;
281
- constructor(dialogService, artifactState, collectionState, permissionService) {
551
+ constructor(dialogService, artifactState, collectionState, permissionService, artifactIconService) {
282
552
  this.dialogService = dialogService;
283
553
  this.artifactState = artifactState;
284
554
  this.collectionState = collectionState;
285
555
  this.permissionService = permissionService;
556
+ this.artifactIconService = artifactIconService;
286
557
  }
287
558
  ngOnInit() {
288
559
  this.loadData();
289
560
  // Subscribe to collection state changes for deep linking
290
561
  this.subscribeToCollectionState();
562
+ // Subscribe to artifact state changes to track active artifact
563
+ this.subscribeToArtifactState();
291
564
  }
292
565
  ngOnDestroy() {
293
566
  this.destroy$.next();
@@ -318,14 +591,40 @@ export class CollectionsFullViewComponent {
318
591
  }
319
592
  });
320
593
  }
594
+ /**
595
+ * Subscribe to artifact state changes to track which artifact is currently open
596
+ */
597
+ subscribeToArtifactState() {
598
+ this.artifactState.activeArtifact$
599
+ .pipe(takeUntil(this.destroy$))
600
+ .subscribe(artifact => {
601
+ // Update active artifact ID for highlighting
602
+ this.activeArtifactId = artifact?.ID || null;
603
+ });
604
+ }
321
605
  async loadData() {
322
606
  this.isLoading = true;
323
607
  try {
608
+ // Load saved view preferences from localStorage
609
+ const savedMode = localStorage.getItem('collections-view-mode');
610
+ if (savedMode === 'grid' || savedMode === 'list') {
611
+ this.viewMode = savedMode;
612
+ }
613
+ const savedSortBy = localStorage.getItem('collections-sort-by');
614
+ if (savedSortBy === 'name' || savedSortBy === 'date' || savedSortBy === 'type') {
615
+ this.sortBy = savedSortBy;
616
+ }
617
+ const savedSortOrder = localStorage.getItem('collections-sort-order');
618
+ if (savedSortOrder === 'asc' || savedSortOrder === 'desc') {
619
+ this.sortOrder = savedSortOrder;
620
+ }
324
621
  await Promise.all([
325
622
  this.loadCollections(),
326
623
  this.loadArtifacts(),
327
624
  this.loadCurrentCollectionPermission()
328
625
  ]);
626
+ // Build unified item list after data loads
627
+ this.buildUnifiedItemList();
329
628
  }
330
629
  finally {
331
630
  this.isLoading = false;
@@ -399,10 +698,11 @@ export class CollectionsFullViewComponent {
399
698
  this.breadcrumbs.push({ id: collection.ID, name: collection.Name });
400
699
  this.currentCollectionId = collection.ID;
401
700
  this.currentCollection = collection;
701
+ this.activeArtifactId = null; // Clear active artifact when switching collections
402
702
  await this.loadData();
403
703
  // Update state service
404
704
  this.collectionState.setActiveCollection(collection.ID);
405
- // Emit navigation event
705
+ // Close any open artifact when switching collections
406
706
  this.collectionNavigated.emit({
407
707
  collectionId: collection.ID,
408
708
  versionId: null
@@ -426,7 +726,7 @@ export class CollectionsFullViewComponent {
426
726
  await this.loadData();
427
727
  // Update state service
428
728
  this.collectionState.setActiveCollection(crumb.id);
429
- // Emit navigation event
729
+ // Close any open artifact when navigating collections
430
730
  this.collectionNavigated.emit({
431
731
  collectionId: crumb.id,
432
732
  versionId: null
@@ -446,7 +746,7 @@ export class CollectionsFullViewComponent {
446
746
  await this.loadData();
447
747
  // Update state service
448
748
  this.collectionState.setActiveCollection(null);
449
- // Emit navigation event
749
+ // Close any open artifact when navigating to root
450
750
  this.collectionNavigated.emit({
451
751
  collectionId: null,
452
752
  versionId: null
@@ -529,6 +829,7 @@ export class CollectionsFullViewComponent {
529
829
  if (!canEdit)
530
830
  return;
531
831
  }
832
+ this.showNewDropdown = false;
532
833
  this.editingCollection = undefined;
533
834
  this.isFormModalOpen = true;
534
835
  }
@@ -608,6 +909,8 @@ export class CollectionsFullViewComponent {
608
909
  await this.loadCollections();
609
910
  // Reload current collection permission (it was cleared by loadUserPermissions)
610
911
  await this.loadCurrentCollectionPermission();
912
+ // Rebuild unified list to show new collection
913
+ this.buildUnifiedItemList();
611
914
  }
612
915
  onFormCancelled() {
613
916
  this.isFormModalOpen = false;
@@ -620,6 +923,7 @@ export class CollectionsFullViewComponent {
620
923
  if (!canEdit)
621
924
  return;
622
925
  }
926
+ this.showNewDropdown = false;
623
927
  this.isArtifactModalOpen = true;
624
928
  }
625
929
  async onArtifactSaved(artifact) {
@@ -672,12 +976,11 @@ export class CollectionsFullViewComponent {
672
976
  }
673
977
  }
674
978
  viewArtifact(item) {
979
+ this.activeArtifactId = item.artifact.ID;
675
980
  this.artifactState.openArtifact(item.artifact.ID, item.version.VersionNumber);
676
- // Emit navigation event with collection and version ID
677
- this.collectionNavigated.emit({
678
- collectionId: this.currentCollectionId,
679
- versionId: item.version.ID
680
- });
981
+ // Don't emit navigation event when just viewing an artifact in current collection
982
+ // Only emit when actually navigating between collections (handled by openCollection, navigateTo, etc.)
983
+ // The artifactState.openArtifact() already handles updating the artifact viewer
681
984
  }
682
985
  // Permission validation and checking methods
683
986
  async validatePermission(collection, requiredPermission) {
@@ -759,9 +1062,280 @@ export class CollectionsFullViewComponent {
759
1062
  this.isShareModalOpen = false;
760
1063
  this.sharingCollection = null;
761
1064
  }
762
- static ɵfac = function CollectionsFullViewComponent_Factory(t) { return new (t || CollectionsFullViewComponent)(i0.ɵɵdirectiveInject(i1.DialogService), i0.ɵɵdirectiveInject(i2.ArtifactStateService), i0.ɵɵdirectiveInject(i3.CollectionStateService), i0.ɵɵdirectiveInject(i4.CollectionPermissionService)); };
763
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CollectionsFullViewComponent, selectors: [["mj-collections-full-view"]], inputs: { environmentId: "environmentId", currentUser: "currentUser" }, outputs: { collectionNavigated: "collectionNavigated" }, decls: 18, vars: 17, consts: [[1, "collections-view"], [1, "collections-header"], [1, "collections-breadcrumb"], [1, "breadcrumb-item"], [1, "fas", "fa-home"], [1, "breadcrumb-link", 3, "click"], ["class", "breadcrumb-path", 4, "ngIf"], [1, "collections-actions"], ["class", "btn-primary", "title", "New Collection", 3, "click", 4, "ngIf"], ["title", "Refresh", 1, "btn-secondary", 3, "click"], [1, "fas", "fa-sync"], [1, "collections-content"], ["class", "loading-state", 4, "ngIf"], ["class", "content-grid", 4, "ngIf"], [3, "saved", "cancelled", "isOpen", "collection", "parentCollection", "environmentId", "currentUser"], [3, "saved", "cancelled", "isOpen", "collectionId", "environmentId", "currentUser"], [3, "saved", "cancelled", "isOpen", "collection", "currentUser", "currentUserPermissions"], [1, "breadcrumb-path"], [4, "ngFor", "ngForOf"], [1, "fas", "fa-chevron-right", "breadcrumb-separator"], ["title", "New Collection", 1, "btn-primary", 3, "click"], [1, "fas", "fa-folder-plus"], [1, "loading-state"], [1, "fas", "fa-spinner", "fa-spin"], [1, "content-grid"], [1, "section"], [1, "section-header"], [1, "section-count"], ["class", "btn-primary btn-sm", 3, "click", 4, "ngIf"], ["class", "collection-grid", 4, "ngIf"], ["class", "section", 4, "ngIf"], [1, "btn-primary", "btn-sm", 3, "click"], [1, "fas", "fa-plus"], [1, "collection-grid"], ["class", "collection-card", 3, "click", 4, "ngFor", "ngForOf"], [1, "collection-card", 3, "click"], [1, "card-icon"], [1, "fas", "fa-folder"], ["class", "shared-badge", "title", "Shared with you", 4, "ngIf"], [1, "card-content"], [1, "card-name"], ["class", "card-owner", 4, "ngIf"], ["class", "card-description", 4, "ngIf"], [1, "card-actions", 3, "click"], ["class", "card-action-btn", "title", "Share", 3, "click", 4, "ngIf"], ["class", "card-action-btn", "title", "Edit", 3, "click", 4, "ngIf"], ["class", "card-action-btn danger", "title", "Delete", 3, "click", 4, "ngIf"], ["title", "Shared with you", 1, "shared-badge"], [1, "fas", "fa-users"], [1, "card-owner"], [1, "fas", "fa-user"], [1, "card-description"], ["title", "Share", 1, "card-action-btn", 3, "click"], [1, "fas", "fa-share-alt"], ["title", "Edit", 1, "card-action-btn", 3, "click"], [1, "fas", "fa-edit"], ["title", "Delete", 1, "card-action-btn", "danger", 3, "click"], [1, "fas", "fa-trash"], ["class", "artifact-grid", 4, "ngIf"], [1, "artifact-grid"], [1, "artifact-card"], [1, "artifact-card", 3, "click"], [1, "card-icon", "artifact-icon"], [1, "fas", "fa-file-alt"], [1, "card-meta"], [1, "version-badge"], [1, "artifact-type"], ["class", "card-action-btn", "title", "Remove from collection", 3, "click", 4, "ngIf"], ["title", "Remove from collection", 1, "card-action-btn", 3, "click"], [1, "fas", "fa-times"]], template: function CollectionsFullViewComponent_Template(rf, ctx) { if (rf & 1) {
764
- i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "div", 3);
1065
+ /**
1066
+ * Get the icon for an artifact using the centralized icon service.
1067
+ * Fallback priority: Plugin icon > Metadata icon > Hardcoded mapping > Generic icon
1068
+ */
1069
+ getArtifactIcon(artifact) {
1070
+ return this.artifactIconService.getArtifactIcon(artifact);
1071
+ }
1072
+ // ==================== NEW MAC FINDER-STYLE METHODS ====================
1073
+ /**
1074
+ * Build unified list of folders and artifacts (Phase 1)
1075
+ */
1076
+ buildUnifiedItemList() {
1077
+ const items = [];
1078
+ // Add folders first (collections)
1079
+ for (const collection of this.filteredCollections) {
1080
+ items.push({
1081
+ type: 'folder',
1082
+ id: collection.ID,
1083
+ name: collection.Name,
1084
+ description: collection.Description || undefined,
1085
+ icon: 'fa-folder',
1086
+ itemCount: 0, // TODO: calculate actual count
1087
+ owner: collection.Owner || undefined,
1088
+ isShared: this.isShared(collection),
1089
+ selected: this.selectedItems.has(collection.ID),
1090
+ collection: collection
1091
+ });
1092
+ }
1093
+ // Then add artifacts
1094
+ for (const item of this.filteredArtifactVersions) {
1095
+ items.push({
1096
+ type: 'artifact',
1097
+ id: item.version.ID,
1098
+ name: item.artifact.Name,
1099
+ description: item.artifact.Description || undefined,
1100
+ icon: this.getArtifactIcon(item.artifact),
1101
+ versionNumber: item.version.VersionNumber,
1102
+ artifactType: item.artifact.Type,
1103
+ lastModified: item.version.__mj_UpdatedAt,
1104
+ selected: this.selectedItems.has(item.version.ID),
1105
+ artifact: item.artifact,
1106
+ version: item.version
1107
+ });
1108
+ }
1109
+ // Apply sorting
1110
+ this.unifiedItems = this.sortItems(items);
1111
+ }
1112
+ /**
1113
+ * Sort items by selected criteria (Phase 2)
1114
+ */
1115
+ sortItems(items) {
1116
+ return items.sort((a, b) => {
1117
+ let comparison = 0;
1118
+ // Always keep folders before artifacts
1119
+ if (a.type !== b.type) {
1120
+ return a.type === 'folder' ? -1 : 1;
1121
+ }
1122
+ // Then sort by selected criteria
1123
+ switch (this.sortBy) {
1124
+ case 'name':
1125
+ comparison = a.name.localeCompare(b.name);
1126
+ break;
1127
+ case 'date':
1128
+ const aDate = a.lastModified || new Date(0);
1129
+ const bDate = b.lastModified || new Date(0);
1130
+ comparison = aDate.getTime() - bDate.getTime();
1131
+ break;
1132
+ case 'type':
1133
+ comparison = (a.artifactType || '').localeCompare(b.artifactType || '');
1134
+ break;
1135
+ }
1136
+ return this.sortOrder === 'asc' ? comparison : -comparison;
1137
+ });
1138
+ }
1139
+ /**
1140
+ * Toggle between grid and list view
1141
+ */
1142
+ toggleViewMode() {
1143
+ this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';
1144
+ // Save preference to localStorage
1145
+ localStorage.setItem('collections-view-mode', this.viewMode);
1146
+ }
1147
+ /**
1148
+ * Set view mode explicitly
1149
+ */
1150
+ setViewMode(mode) {
1151
+ this.viewMode = mode;
1152
+ // Save preference to localStorage
1153
+ localStorage.setItem('collections-view-mode', mode);
1154
+ }
1155
+ /**
1156
+ * Set sort order - toggles asc/desc if clicking same column
1157
+ */
1158
+ setSortBy(sortBy) {
1159
+ if (this.sortBy === sortBy) {
1160
+ // Toggle order if same sort
1161
+ this.sortOrder = this.sortOrder === 'asc' ? 'desc' : 'asc';
1162
+ }
1163
+ else {
1164
+ this.sortBy = sortBy;
1165
+ this.sortOrder = 'asc';
1166
+ }
1167
+ // Save sort preferences to localStorage
1168
+ localStorage.setItem('collections-sort-by', this.sortBy);
1169
+ localStorage.setItem('collections-sort-order', this.sortOrder);
1170
+ // Close dropdown and rebuild list
1171
+ this.showSortDropdown = false;
1172
+ this.buildUnifiedItemList();
1173
+ }
1174
+ /**
1175
+ * Filter items by search query (Phase 2)
1176
+ */
1177
+ onSearchChange(query) {
1178
+ // If query parameter provided, use it; otherwise use searchQuery property
1179
+ const searchText = query !== undefined ? query : this.searchQuery;
1180
+ if (!searchText.trim()) {
1181
+ // Reset to all items
1182
+ this.buildUnifiedItemList();
1183
+ return;
1184
+ }
1185
+ const lowerQuery = searchText.toLowerCase();
1186
+ this.unifiedItems = this.unifiedItems.filter(item => item.name.toLowerCase().includes(lowerQuery) ||
1187
+ item.description?.toLowerCase().includes(lowerQuery));
1188
+ }
1189
+ /**
1190
+ * Multi-select: Toggle item selection (Phase 3)
1191
+ */
1192
+ toggleItemSelection(item, event) {
1193
+ event.stopPropagation();
1194
+ if (event.metaKey || event.ctrlKey) {
1195
+ // Cmd/Ctrl+Click: Toggle individual selection
1196
+ if (this.selectedItems.has(item.id)) {
1197
+ this.selectedItems.delete(item.id);
1198
+ }
1199
+ else {
1200
+ this.selectedItems.add(item.id);
1201
+ }
1202
+ }
1203
+ else if (event.shiftKey) {
1204
+ // Shift+Click: Select range (TODO: implement range selection)
1205
+ this.selectedItems.add(item.id);
1206
+ }
1207
+ else {
1208
+ // Regular click: Select only this item
1209
+ this.selectedItems.clear();
1210
+ this.selectedItems.add(item.id);
1211
+ }
1212
+ this.buildUnifiedItemList(); // Refresh to update selected states
1213
+ }
1214
+ /**
1215
+ * Multi-select: Select all items (Phase 3)
1216
+ */
1217
+ selectAll() {
1218
+ this.selectedItems.clear();
1219
+ for (const item of this.unifiedItems) {
1220
+ this.selectedItems.add(item.id);
1221
+ }
1222
+ this.buildUnifiedItemList();
1223
+ }
1224
+ /**
1225
+ * Multi-select: Clear selection (Phase 3)
1226
+ */
1227
+ clearSelection() {
1228
+ this.selectedItems.clear();
1229
+ this.buildUnifiedItemList();
1230
+ }
1231
+ /**
1232
+ * Multi-select: Delete selected items (Phase 3)
1233
+ */
1234
+ async deleteSelected() {
1235
+ if (this.selectedItems.size === 0)
1236
+ return;
1237
+ const confirmed = await this.dialogService.confirm({
1238
+ title: `Delete ${this.selectedItems.size} item(s)?`,
1239
+ message: 'This action cannot be undone.',
1240
+ dangerous: true
1241
+ });
1242
+ if (!confirmed)
1243
+ return;
1244
+ // TODO: Implement batch delete
1245
+ this.clearSelection();
1246
+ }
1247
+ /**
1248
+ * Get count of items in folder (Phase 1)
1249
+ */
1250
+ async getCollectionItemCount(collectionId) {
1251
+ // TODO: Query for actual count
1252
+ return 0;
1253
+ }
1254
+ /**
1255
+ * Handle clicking on unified item (Phase 1)
1256
+ */
1257
+ onItemClick(item, event) {
1258
+ if (item.type === 'folder' && item.collection) {
1259
+ this.openCollection(item.collection);
1260
+ }
1261
+ else if (item.type === 'artifact') {
1262
+ this.viewArtifact({ artifact: item.artifact, version: item.version });
1263
+ }
1264
+ }
1265
+ /**
1266
+ * Get item count text for display
1267
+ */
1268
+ getItemCountText(itemCount) {
1269
+ if (itemCount !== undefined) {
1270
+ if (itemCount === 0)
1271
+ return 'Empty';
1272
+ if (itemCount === 1)
1273
+ return '1 item';
1274
+ return `${itemCount} items`;
1275
+ }
1276
+ const folders = this.unifiedItems.filter(i => i.type === 'folder').length;
1277
+ const artifacts = this.unifiedItems.filter(i => i.type === 'artifact').length;
1278
+ const total = folders + artifacts;
1279
+ if (total === 0)
1280
+ return 'No items';
1281
+ if (total === 1)
1282
+ return '1 item';
1283
+ const parts = [];
1284
+ if (folders > 0)
1285
+ parts.push(`${folders} folder${folders > 1 ? 's' : ''}`);
1286
+ if (artifacts > 0)
1287
+ parts.push(`${artifacts} artifact${artifacts > 1 ? 's' : ''}`);
1288
+ return parts.join(', ');
1289
+ }
1290
+ /**
1291
+ * Handle keyboard shortcuts
1292
+ * - Cmd/Ctrl+A: Select all
1293
+ * - Escape: Clear selection
1294
+ * - Delete/Backspace: Delete selected items
1295
+ */
1296
+ handleKeyboardShortcut(event) {
1297
+ // Cmd+A / Ctrl+A: Select all
1298
+ if ((event.metaKey || event.ctrlKey) && event.key === 'a') {
1299
+ event.preventDefault();
1300
+ this.selectAll();
1301
+ return;
1302
+ }
1303
+ // Escape: Clear selection
1304
+ if (event.key === 'Escape' && this.selectedItems.size > 0) {
1305
+ event.preventDefault();
1306
+ this.clearSelection();
1307
+ return;
1308
+ }
1309
+ // Delete/Backspace: Delete selected items
1310
+ if ((event.key === 'Delete' || event.key === 'Backspace') && this.selectedItems.size > 0) {
1311
+ // Only if not focused on an input
1312
+ const target = event.target;
1313
+ if (target.tagName !== 'INPUT' && target.tagName !== 'TEXTAREA') {
1314
+ event.preventDefault();
1315
+ this.deleteSelected();
1316
+ }
1317
+ return;
1318
+ }
1319
+ }
1320
+ /**
1321
+ * Handle right-click context menu
1322
+ * Opens browser context menu for now - can be extended with custom menu
1323
+ */
1324
+ onItemContextMenu(item, event) {
1325
+ // Select the item if not already selected
1326
+ if (!item.selected) {
1327
+ this.clearSelection();
1328
+ this.toggleItemSelection(item, event);
1329
+ }
1330
+ // Allow browser's default context menu for now
1331
+ // Future enhancement: implement custom context menu with actions
1332
+ // event.preventDefault();
1333
+ }
1334
+ static ɵfac = function CollectionsFullViewComponent_Factory(t) { return new (t || CollectionsFullViewComponent)(i0.ɵɵdirectiveInject(i1.DialogService), i0.ɵɵdirectiveInject(i2.ArtifactStateService), i0.ɵɵdirectiveInject(i3.CollectionStateService), i0.ɵɵdirectiveInject(i4.CollectionPermissionService), i0.ɵɵdirectiveInject(i5.ArtifactIconService)); };
1335
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CollectionsFullViewComponent, selectors: [["mj-collections-full-view"]], inputs: { environmentId: "environmentId", currentUser: "currentUser" }, outputs: { collectionNavigated: "collectionNavigated" }, decls: 28, vars: 25, consts: [[1, "collections-view", 3, "keydown"], [1, "collections-header"], [1, "collections-breadcrumb"], [1, "breadcrumb-item"], [1, "fas", "fa-home"], [1, "breadcrumb-link", 3, "click"], ["class", "breadcrumb-path", 4, "ngIf"], [1, "collections-actions"], [1, "btn-icon", 3, "click", "title"], [1, "fas", 3, "ngClass"], ["class", "dropdown-container", 4, "ngIf"], [1, "search-container"], [1, "fas", "fa-search"], ["type", "text", "placeholder", "Search...", 1, "search-input", 3, "ngModelChange", "ngModel"], ["class", "search-clear", "title", "Clear search", 3, "click", 4, "ngIf"], ["title", "Refresh", 1, "btn-icon", 3, "click"], [1, "fas", "fa-sync"], ["class", "selection-toolbar", 4, "ngIf"], [1, "collections-content"], ["class", "loading-state", 4, "ngIf"], ["class", "empty-state", 4, "ngIf"], ["class", "unified-grid", 4, "ngIf"], ["class", "unified-list", 4, "ngIf"], [3, "saved", "cancelled", "isOpen", "collection", "parentCollection", "environmentId", "currentUser"], [3, "saved", "cancelled", "isOpen", "collectionId", "environmentId", "currentUser"], [3, "saved", "cancelled", "isOpen", "collection", "currentUser", "currentUserPermissions"], [1, "breadcrumb-path"], [4, "ngFor", "ngForOf"], [1, "fas", "fa-chevron-right", "breadcrumb-separator"], [1, "dropdown-container"], ["title", "Sort options", 1, "btn-icon", 3, "click"], [1, "fas", "fa-sort"], ["class", "dropdown-menu", 4, "ngIf"], [1, "dropdown-menu"], [1, "dropdown-item", 3, "click"], [1, "fas", "fa-sort-alpha-down"], [1, "fas", "fa-calendar"], [1, "fas", "fa-tag"], ["title", "Clear search", 1, "search-clear", 3, "click"], [1, "fas", "fa-times"], [1, "btn-primary", 3, "click"], [1, "fas", "fa-plus"], [1, "fas", "fa-chevron-down"], ["class", "dropdown-menu dropdown-menu-right", 4, "ngIf"], [1, "dropdown-menu", "dropdown-menu-right"], [1, "fas", "fa-folder-plus"], [1, "dropdown-item", 3, "click", "disabled"], [1, "fas", "fa-file-plus"], [1, "selection-toolbar"], [1, "selection-info"], [1, "selection-count"], [1, "selection-actions"], [1, "btn-toolbar", 3, "click"], [1, "btn-toolbar", "btn-danger", 3, "click"], [1, "fas", "fa-trash"], [1, "loading-state"], [1, "fas", "fa-spinner", "fa-spin"], [1, "empty-state"], [1, "fas", "fa-folder-open"], [4, "ngIf"], ["class", "btn-primary", 3, "click", 4, "ngIf"], [1, "unified-grid"], ["class", "grid-item", 3, "selected", "active", "click", "contextmenu", 4, "ngFor", "ngForOf"], [1, "grid-item", 3, "click", "contextmenu"], [1, "item-checkbox", 3, "click"], ["class", "grid-item-content", 3, "title", 4, "ngIf"], [1, "grid-item-content", 3, "title"], [1, "grid-icon", "folder-icon"], [1, "fas", "fa-folder"], ["class", "shared-badge", "title", "Shared", 4, "ngIf"], [1, "grid-info"], [1, "grid-name"], ["class", "grid-description", 4, "ngIf"], ["class", "grid-meta", 4, "ngIf"], ["class", "grid-owner", 4, "ngIf"], ["title", "Shared", 1, "shared-badge"], [1, "fas", "fa-users"], [1, "grid-description"], [1, "grid-meta"], [1, "grid-owner"], [1, "fas", "fa-user"], [1, "grid-icon", "artifact-icon"], ["class", "version-badge", 4, "ngIf"], ["class", "artifact-type-badge", 4, "ngIf"], [1, "version-badge"], [1, "artifact-type-badge"], [1, "unified-list"], [1, "list-table"], [1, "col-checkbox"], [1, "fas", 3, "click", "ngClass"], [1, "col-name", "sortable", 3, "click"], ["class", "fas fa-sort", 4, "ngIf"], ["class", "fas", 3, "ngClass", 4, "ngIf"], [1, "col-type", "sortable", 3, "click"], [1, "col-modified", "sortable", 3, "click"], [1, "col-owner"], ["class", "list-item", 3, "selected", "active", "click", "contextmenu", 4, "ngFor", "ngForOf"], [1, "list-item", 3, "click", "contextmenu"], [1, "col-name"], [1, "list-name-cell"], ["class", "fas fa-users shared-indicator", "title", "Shared", 4, "ngIf"], [1, "col-type"], [1, "col-modified"], ["title", "Shared", 1, "fas", "fa-users", "shared-indicator"]], template: function CollectionsFullViewComponent_Template(rf, ctx) { if (rf & 1) {
1336
+ i0.ɵɵelementStart(0, "div", 0);
1337
+ i0.ɵɵlistener("keydown", function CollectionsFullViewComponent_Template_div_keydown_0_listener($event) { return ctx.handleKeyboardShortcut($event); });
1338
+ i0.ɵɵelementStart(1, "div", 1)(2, "div", 2)(3, "div", 3);
765
1339
  i0.ɵɵelement(4, "i", 4);
766
1340
  i0.ɵɵelementStart(5, "a", 5);
767
1341
  i0.ɵɵlistener("click", function CollectionsFullViewComponent_Template_a_click_5_listener() { return ctx.navigateToRoot(); });
@@ -769,46 +1343,77 @@ export class CollectionsFullViewComponent {
769
1343
  i0.ɵɵelementEnd()();
770
1344
  i0.ɵɵtemplate(7, CollectionsFullViewComponent_span_7_Template, 2, 1, "span", 6);
771
1345
  i0.ɵɵelementEnd();
772
- i0.ɵɵelementStart(8, "div", 7);
773
- i0.ɵɵtemplate(9, CollectionsFullViewComponent_button_9_Template, 3, 0, "button", 8);
774
- i0.ɵɵelementStart(10, "button", 9);
775
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Template_button_click_10_listener() { return ctx.refresh(); });
776
- i0.ɵɵelement(11, "i", 10);
777
- i0.ɵɵelementEnd()()();
1346
+ i0.ɵɵelementStart(8, "div", 7)(9, "button", 8);
1347
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Template_button_click_9_listener() { return ctx.toggleViewMode(); });
1348
+ i0.ɵɵelement(10, "i", 9);
1349
+ i0.ɵɵelementEnd();
1350
+ i0.ɵɵtemplate(11, CollectionsFullViewComponent_div_11_Template, 4, 1, "div", 10);
778
1351
  i0.ɵɵelementStart(12, "div", 11);
779
- i0.ɵɵtemplate(13, CollectionsFullViewComponent_div_13_Template, 4, 0, "div", 12)(14, CollectionsFullViewComponent_div_14_Template, 10, 4, "div", 13);
1352
+ i0.ɵɵelement(13, "i", 12);
1353
+ i0.ɵɵelementStart(14, "input", 13);
1354
+ i0.ɵɵtwoWayListener("ngModelChange", function CollectionsFullViewComponent_Template_input_ngModelChange_14_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.searchQuery, $event) || (ctx.searchQuery = $event); return $event; });
1355
+ i0.ɵɵlistener("ngModelChange", function CollectionsFullViewComponent_Template_input_ngModelChange_14_listener($event) { return ctx.onSearchChange($event); });
1356
+ i0.ɵɵelementEnd();
1357
+ i0.ɵɵtemplate(15, CollectionsFullViewComponent_button_15_Template, 2, 0, "button", 14);
1358
+ i0.ɵɵelementEnd();
1359
+ i0.ɵɵtemplate(16, CollectionsFullViewComponent_div_16_Template, 7, 1, "div", 10);
1360
+ i0.ɵɵelementStart(17, "button", 15);
1361
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Template_button_click_17_listener() { return ctx.refresh(); });
1362
+ i0.ɵɵelement(18, "i", 16);
1363
+ i0.ɵɵelementEnd()()();
1364
+ i0.ɵɵtemplate(19, CollectionsFullViewComponent_div_19_Template, 11, 1, "div", 17);
1365
+ i0.ɵɵelementStart(20, "div", 18);
1366
+ i0.ɵɵtemplate(21, CollectionsFullViewComponent_div_21_Template, 4, 0, "div", 19)(22, CollectionsFullViewComponent_div_22_Template, 5, 3, "div", 20)(23, CollectionsFullViewComponent_div_23_Template, 2, 1, "div", 21)(24, CollectionsFullViewComponent_div_24_Template, 25, 8, "div", 22);
780
1367
  i0.ɵɵelementEnd()();
781
- i0.ɵɵelementStart(15, "mj-collection-form-modal", 14);
782
- i0.ɵɵlistener("saved", function CollectionsFullViewComponent_Template_mj_collection_form_modal_saved_15_listener($event) { return ctx.onCollectionSaved($event); })("cancelled", function CollectionsFullViewComponent_Template_mj_collection_form_modal_cancelled_15_listener() { return ctx.onFormCancelled(); });
1368
+ i0.ɵɵelementStart(25, "mj-collection-form-modal", 23);
1369
+ i0.ɵɵlistener("saved", function CollectionsFullViewComponent_Template_mj_collection_form_modal_saved_25_listener($event) { return ctx.onCollectionSaved($event); })("cancelled", function CollectionsFullViewComponent_Template_mj_collection_form_modal_cancelled_25_listener() { return ctx.onFormCancelled(); });
783
1370
  i0.ɵɵelementEnd();
784
- i0.ɵɵelementStart(16, "mj-artifact-create-modal", 15);
785
- i0.ɵɵlistener("saved", function CollectionsFullViewComponent_Template_mj_artifact_create_modal_saved_16_listener($event) { return ctx.onArtifactSaved($event); })("cancelled", function CollectionsFullViewComponent_Template_mj_artifact_create_modal_cancelled_16_listener() { return ctx.onArtifactModalCancelled(); });
1371
+ i0.ɵɵelementStart(26, "mj-artifact-create-modal", 24);
1372
+ i0.ɵɵlistener("saved", function CollectionsFullViewComponent_Template_mj_artifact_create_modal_saved_26_listener($event) { return ctx.onArtifactSaved($event); })("cancelled", function CollectionsFullViewComponent_Template_mj_artifact_create_modal_cancelled_26_listener() { return ctx.onArtifactModalCancelled(); });
786
1373
  i0.ɵɵelementEnd();
787
- i0.ɵɵelementStart(17, "mj-collection-share-modal", 16);
788
- i0.ɵɵlistener("saved", function CollectionsFullViewComponent_Template_mj_collection_share_modal_saved_17_listener() { return ctx.onPermissionsChanged(); })("cancelled", function CollectionsFullViewComponent_Template_mj_collection_share_modal_cancelled_17_listener() { return ctx.onShareModalCancelled(); });
1374
+ i0.ɵɵelementStart(27, "mj-collection-share-modal", 25);
1375
+ i0.ɵɵlistener("saved", function CollectionsFullViewComponent_Template_mj_collection_share_modal_saved_27_listener() { return ctx.onPermissionsChanged(); })("cancelled", function CollectionsFullViewComponent_Template_mj_collection_share_modal_cancelled_27_listener() { return ctx.onShareModalCancelled(); });
789
1376
  i0.ɵɵelementEnd();
790
1377
  } if (rf & 2) {
791
1378
  i0.ɵɵadvance(7);
792
1379
  i0.ɵɵproperty("ngIf", ctx.breadcrumbs.length > 0);
793
1380
  i0.ɵɵadvance(2);
1381
+ i0.ɵɵproperty("title", ctx.viewMode === "grid" ? "Switch to List View" : "Switch to Grid View");
1382
+ i0.ɵɵadvance();
1383
+ i0.ɵɵproperty("ngClass", ctx.viewMode === "grid" ? "fa-list" : "fa-th");
1384
+ i0.ɵɵadvance();
1385
+ i0.ɵɵproperty("ngIf", ctx.viewMode === "grid");
1386
+ i0.ɵɵadvance(3);
1387
+ i0.ɵɵtwoWayProperty("ngModel", ctx.searchQuery);
1388
+ i0.ɵɵadvance();
1389
+ i0.ɵɵproperty("ngIf", ctx.searchQuery);
1390
+ i0.ɵɵadvance();
794
1391
  i0.ɵɵproperty("ngIf", ctx.canEditCurrent());
795
- i0.ɵɵadvance(4);
1392
+ i0.ɵɵadvance(3);
1393
+ i0.ɵɵproperty("ngIf", ctx.selectedItems.size > 0);
1394
+ i0.ɵɵadvance(2);
796
1395
  i0.ɵɵproperty("ngIf", ctx.isLoading);
797
1396
  i0.ɵɵadvance();
798
- i0.ɵɵproperty("ngIf", !ctx.isLoading);
1397
+ i0.ɵɵproperty("ngIf", !ctx.isLoading && ctx.unifiedItems.length === 0);
1398
+ i0.ɵɵadvance();
1399
+ i0.ɵɵproperty("ngIf", !ctx.isLoading && ctx.unifiedItems.length > 0 && ctx.viewMode === "grid");
1400
+ i0.ɵɵadvance();
1401
+ i0.ɵɵproperty("ngIf", !ctx.isLoading && ctx.unifiedItems.length > 0 && ctx.viewMode === "list");
799
1402
  i0.ɵɵadvance();
800
1403
  i0.ɵɵproperty("isOpen", ctx.isFormModalOpen)("collection", ctx.editingCollection)("parentCollection", ctx.currentCollection || undefined)("environmentId", ctx.environmentId)("currentUser", ctx.currentUser);
801
1404
  i0.ɵɵadvance();
802
1405
  i0.ɵɵproperty("isOpen", ctx.isArtifactModalOpen)("collectionId", ctx.currentCollectionId || "")("environmentId", ctx.environmentId)("currentUser", ctx.currentUser);
803
1406
  i0.ɵɵadvance();
804
1407
  i0.ɵɵproperty("isOpen", ctx.isShareModalOpen)("collection", ctx.sharingCollection)("currentUser", ctx.currentUser)("currentUserPermissions", ctx.sharingCollection ? ctx.userPermissions.get(ctx.sharingCollection.ID) || null : null);
805
- } }, dependencies: [i5.NgForOf, i5.NgIf, i6.CollectionShareModalComponent, i7.CollectionFormModalComponent, i8.ArtifactCreateModalComponent], styles: [".collections-view[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: white;\n }\n\n .collections-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 16px 24px;\n border-bottom: 1px solid #E5E7EB;\n gap: 16px;\n }\n\n .collections-breadcrumb[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n }\n\n .breadcrumb-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .breadcrumb-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #6B7280;\n font-size: 14px;\n }\n\n .breadcrumb-link[_ngcontent-%COMP%] {\n color: #111827;\n font-weight: 500;\n cursor: pointer;\n text-decoration: none;\n white-space: nowrap;\n transition: color 150ms ease;\n }\n\n .breadcrumb-link[_ngcontent-%COMP%]:hover {\n color: #1e40af;\n }\n\n .breadcrumb-link.active[_ngcontent-%COMP%] {\n color: #6B7280;\n cursor: default;\n }\n\n .breadcrumb-path[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n overflow-x: auto;\n }\n\n .breadcrumb-separator[_ngcontent-%COMP%] {\n color: #D1D5DB;\n font-size: 10px;\n }\n\n .collections-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n }\n\n .btn-primary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: #1e40af;\n border: none;\n border-radius: 6px;\n color: white;\n font-size: 14px;\n cursor: pointer;\n transition: background 150ms ease;\n }\n\n .btn-primary[_ngcontent-%COMP%]:hover {\n background: #1e3a8a;\n }\n\n .btn-secondary[_ngcontent-%COMP%] {\n padding: 8px 12px;\n background: transparent;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n cursor: pointer;\n color: #6B7280;\n transition: all 150ms ease;\n }\n\n .btn-secondary[_ngcontent-%COMP%]:hover {\n background: #F9FAFB;\n color: #111827;\n }\n\n .btn-sm[_ngcontent-%COMP%] {\n padding: 6px 12px;\n font-size: 13px;\n }\n\n .collections-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n }\n\n .loading-state[_ngcontent-%COMP%], .empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: #9CA3AF;\n max-width: 400px;\n margin: 0 auto;\n text-align: center;\n padding: 48px 24px;\n }\n\n .loading-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.5;\n }\n\n .empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 64px;\n margin-bottom: 24px;\n opacity: 0.3;\n color: #D1D5DB;\n }\n\n .empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: #374151;\n font-size: 20px;\n font-weight: 600;\n }\n\n .empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 24px 0;\n font-size: 14px;\n color: #6B7280;\n line-height: 1.5;\n }\n\n .loading-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n }\n\n .empty-state[_ngcontent-%COMP%] .btn-primary[_ngcontent-%COMP%] {\n padding: 10px 20px;\n font-size: 14px;\n font-weight: 500;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n }\n\n .empty-state[_ngcontent-%COMP%] .btn-primary[_ngcontent-%COMP%]:hover {\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);\n }\n\n .content-grid[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 32px;\n }\n\n .section[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .section-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #111827;\n }\n\n .section-count[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n padding: 0 8px;\n background: #EFF6FF;\n border-radius: 12px;\n font-size: 13px;\n font-weight: 600;\n color: #1e40af;\n }\n\n .collection-grid[_ngcontent-%COMP%], .artifact-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n }\n\n .collection-card[_ngcontent-%COMP%], .artifact-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: start;\n gap: 16px;\n padding: 20px;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n cursor: pointer;\n transition: all 150ms ease;\n position: relative;\n }\n\n .collection-card[_ngcontent-%COMP%]:hover, .artifact-card[_ngcontent-%COMP%]:hover {\n border-color: #1e40af;\n box-shadow: 0 2px 8px rgba(0,0,0,0.08);\n }\n\n .card-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #EFF6FF;\n border-radius: 8px;\n flex-shrink: 0;\n position: relative;\n }\n\n .card-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n color: #1e40af;\n }\n\n .shared-badge[_ngcontent-%COMP%] {\n position: absolute;\n top: -4px;\n right: -4px;\n width: 18px;\n height: 18px;\n background: #10B981;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid white;\n }\n\n .shared-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 9px;\n color: white;\n }\n\n .artifact-icon[_ngcontent-%COMP%] {\n background: #F0FDF4;\n }\n\n .artifact-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #059669;\n }\n\n .card-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n }\n\n .card-name[_ngcontent-%COMP%] {\n font-size: 15px;\n font-weight: 500;\n color: #111827;\n margin-bottom: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .card-owner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 6px;\n font-size: 12px;\n color: #6B7280;\n }\n\n .card-owner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n }\n\n .card-description[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6B7280;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .card-meta[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #9CA3AF;\n }\n\n .artifact-type[_ngcontent-%COMP%] {\n padding: 2px 8px;\n background: #F3F4F6;\n border-radius: 4px;\n font-weight: 500;\n }\n\n .card-actions[_ngcontent-%COMP%] {\n position: absolute;\n top: 12px;\n right: 12px;\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 150ms ease;\n }\n\n .collection-card[_ngcontent-%COMP%]:hover .card-actions[_ngcontent-%COMP%], \n .artifact-card[_ngcontent-%COMP%]:hover .card-actions[_ngcontent-%COMP%] {\n opacity: 1;\n }\n\n .card-action-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n color: #6B7280;\n cursor: pointer;\n transition: all 150ms ease;\n }\n\n .card-action-btn[_ngcontent-%COMP%]:hover {\n background: #F9FAFB;\n color: #111827;\n border-color: #D1D5DB;\n }\n\n .card-action-btn.danger[_ngcontent-%COMP%]:hover {\n background: #FEE2E2;\n color: #DC2626;\n border-color: #FCA5A5;\n }"] });
1408
+ } }, dependencies: [i6.NgClass, i6.NgForOf, i6.NgIf, i7.DefaultValueAccessor, i7.NgControlStatus, i7.NgModel, i8.CollectionShareModalComponent, i9.CollectionFormModalComponent, i10.ArtifactCreateModalComponent, i6.DatePipe], styles: ["\n\n .collections-view[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: #FAFAFA;\n position: relative;\n }\n\n \n\n .collections-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 12px 20px;\n border-bottom: 1px solid #E5E7EB;\n gap: 16px;\n background: white;\n }\n\n .collections-breadcrumb[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1;\n min-width: 0;\n }\n\n .breadcrumb-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .breadcrumb-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #6B7280;\n font-size: 14px;\n }\n\n .breadcrumb-link[_ngcontent-%COMP%] {\n color: #111827;\n font-weight: 500;\n cursor: pointer;\n text-decoration: none;\n white-space: nowrap;\n transition: color 150ms ease;\n font-size: 14px;\n }\n\n .breadcrumb-link[_ngcontent-%COMP%]:hover {\n color: #0076D6;\n }\n\n .breadcrumb-link.active[_ngcontent-%COMP%] {\n color: #6B7280;\n cursor: default;\n }\n\n .breadcrumb-path[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n overflow-x: auto;\n }\n\n .breadcrumb-separator[_ngcontent-%COMP%] {\n color: #D1D5DB;\n font-size: 10px;\n }\n\n .collections-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n \n\n .btn-primary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: #007AFF;\n border: none;\n border-radius: 6px;\n color: white;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 150ms ease;\n }\n\n .btn-primary[_ngcontent-%COMP%]:hover {\n background: #0051D5;\n }\n\n .btn-primary[_ngcontent-%COMP%] i.fa-chevron-down[_ngcontent-%COMP%] {\n font-size: 10px;\n margin-left: 2px;\n }\n\n .btn-icon[_ngcontent-%COMP%] {\n padding: 6px 10px;\n background: transparent;\n border: 1px solid #D1D5DB;\n border-radius: 6px;\n cursor: pointer;\n color: #6B7280;\n transition: all 150ms ease;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .btn-icon[_ngcontent-%COMP%]:hover {\n background: #F9FAFB;\n color: #111827;\n border-color: #9CA3AF;\n }\n\n \n\n .dropdown-container[_ngcontent-%COMP%] {\n position: relative;\n }\n\n .dropdown-menu[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n min-width: 200px;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 4px;\n z-index: 1000;\n }\n\n .dropdown-menu-right[_ngcontent-%COMP%] {\n left: auto;\n right: 0;\n }\n\n .dropdown-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 8px 12px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: #111827;\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 100ms ease;\n }\n\n .dropdown-item[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #F3F4F6;\n }\n\n .dropdown-item[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .dropdown-item.active[_ngcontent-%COMP%] {\n background: #EFF6FF;\n color: #007AFF;\n }\n\n .dropdown-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n width: 16px;\n text-align: center;\n color: #6B7280;\n }\n\n .dropdown-item.active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #007AFF;\n }\n\n .dropdown-divider[_ngcontent-%COMP%] {\n height: 1px;\n background: #E5E7EB;\n margin: 4px 0;\n }\n\n \n\n .search-container[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n min-width: 200px;\n }\n\n .search-container[_ngcontent-%COMP%] i.fa-search[_ngcontent-%COMP%] {\n position: absolute;\n left: 10px;\n color: #9CA3AF;\n font-size: 13px;\n pointer-events: none;\n }\n\n .search-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 6px 32px 6px 32px;\n border: 1px solid #D1D5DB;\n border-radius: 6px;\n font-size: 13px;\n outline: none;\n transition: all 150ms ease;\n }\n\n .search-input[_ngcontent-%COMP%]:focus {\n border-color: #007AFF;\n box-shadow: 0 0 0 3px rgba(0, 122, 255, 0.1);\n }\n\n .search-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 6px;\n padding: 4px;\n background: transparent;\n border: none;\n color: #9CA3AF;\n cursor: pointer;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .search-clear[_ngcontent-%COMP%]:hover {\n background: #F3F4F6;\n color: #6B7280;\n }\n\n \n\n .selection-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 20px;\n background: #EFF6FF;\n border-bottom: 1px solid #BFDBFE;\n }\n\n .selection-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .selection-count[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: #1E40AF;\n }\n\n .selection-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n }\n\n .btn-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: white;\n border: 1px solid #D1D5DB;\n border-radius: 6px;\n color: #374151;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n }\n\n .btn-toolbar[_ngcontent-%COMP%]:hover {\n background: #F9FAFB;\n border-color: #9CA3AF;\n }\n\n .btn-toolbar.btn-danger[_ngcontent-%COMP%] {\n color: #DC2626;\n border-color: #FCA5A5;\n }\n\n .btn-toolbar.btn-danger[_ngcontent-%COMP%]:hover {\n background: #FEE2E2;\n border-color: #DC2626;\n }\n\n \n\n .collections-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n }\n\n \n\n .loading-state[_ngcontent-%COMP%], .empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: #9CA3AF;\n text-align: center;\n padding: 48px 24px;\n }\n\n .loading-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.5;\n }\n\n .loading-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n }\n\n .empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 64px;\n margin-bottom: 24px;\n opacity: 0.3;\n color: #D1D5DB;\n }\n\n .empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: #374151;\n font-size: 18px;\n font-weight: 600;\n }\n\n .empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 24px 0;\n font-size: 14px;\n color: #6B7280;\n }\n\n .empty-state-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n justify-content: center;\n }\n\n \n\n .unified-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));\n gap: 16px;\n padding: 4px;\n }\n\n .grid-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n padding: 12px;\n background: white;\n border: 2px solid transparent;\n border-radius: 8px;\n cursor: pointer;\n transition: all 150ms ease;\n position: relative;\n }\n\n .grid-item[_ngcontent-%COMP%]:hover {\n background: #F9FAFB;\n border-color: #D1D5DB;\n }\n\n .grid-item.selected[_ngcontent-%COMP%] {\n background: #EFF6FF;\n border-color: #007AFF;\n }\n\n .grid-item.active[_ngcontent-%COMP%] {\n background: #FEF3C7;\n border-color: #F59E0B;\n box-shadow: 0 0 0 1px #F59E0B;\n }\n\n .grid-item.active[_ngcontent-%COMP%]:hover {\n background: #FDE68A;\n }\n\n .item-checkbox[_ngcontent-%COMP%] {\n position: absolute;\n top: 8px;\n right: 8px;\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 10;\n }\n\n .item-checkbox[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n color: #9CA3AF;\n transition: color 150ms ease;\n }\n\n .grid-item.selected[_ngcontent-%COMP%] .item-checkbox[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n .item-checkbox[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%] {\n color: #007AFF;\n }\n\n .grid-item-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n }\n\n .grid-icon[_ngcontent-%COMP%] {\n width: 64px;\n height: 64px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n position: relative;\n }\n\n .grid-icon.folder-icon[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #60A5FA 0%, #3B82F6 100%);\n }\n\n .grid-icon.folder-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 36px;\n color: white;\n }\n\n .grid-icon.artifact-icon[_ngcontent-%COMP%] {\n background: #F3F4F6;\n }\n\n .grid-icon.artifact-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n color: #6B7280;\n }\n\n .shared-badge[_ngcontent-%COMP%] {\n position: absolute;\n top: -4px;\n right: -4px;\n width: 20px;\n height: 20px;\n background: #10B981;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid white;\n }\n\n .shared-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n color: white;\n }\n\n .grid-info[_ngcontent-%COMP%] {\n width: 100%;\n text-align: center;\n }\n\n .grid-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: #111827;\n line-height: 1.3;\n margin-bottom: 4px;\n \n\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n word-break: break-word;\n }\n\n .grid-description[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #6B7280;\n line-height: 1.3;\n margin-bottom: 4px;\n \n\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n word-break: break-word;\n }\n\n .grid-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #6B7280;\n margin-top: 4px;\n }\n\n .grid-owner[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #6B7280;\n margin-top: 2px;\n }\n\n .grid-owner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n margin-right: 3px;\n }\n\n .version-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 6px;\n background: #FEF3C7;\n color: #92400E;\n border-radius: 3px;\n font-size: 10px;\n font-weight: 600;\n font-family: monospace;\n margin-right: 4px;\n }\n\n .artifact-type-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 6px;\n background: #DBEAFE;\n color: #1E40AF;\n border-radius: 3px;\n font-size: 10px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n \n\n .unified-list[_ngcontent-%COMP%] {\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n overflow: hidden;\n }\n\n .list-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n }\n\n .list-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] {\n background: #F9FAFB;\n border-bottom: 1px solid #E5E7EB;\n }\n\n .list-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 10px 16px;\n text-align: left;\n font-size: 12px;\n font-weight: 600;\n color: #6B7280;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .list-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%] {\n cursor: pointer;\n user-select: none;\n transition: color 150ms ease;\n }\n\n .list-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%]:hover {\n color: #007AFF;\n }\n\n .list-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: inline-block;\n margin-right: 6px;\n }\n\n .list-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n opacity: 0.5;\n }\n\n .list-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%] {\n opacity: 1;\n }\n\n .list-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n border-bottom: 1px solid #F3F4F6;\n transition: background 150ms ease;\n }\n\n .list-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n }\n\n .list-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: #F9FAFB;\n }\n\n .list-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.selected[_ngcontent-%COMP%] {\n background: #EFF6FF;\n }\n\n .list-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.active[_ngcontent-%COMP%] {\n background: #FEF3C7;\n border-left: 3px solid #F59E0B;\n }\n\n .list-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.active[_ngcontent-%COMP%]:hover {\n background: #FDE68A;\n }\n\n .list-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px 16px;\n font-size: 13px;\n color: #374151;\n }\n\n .col-checkbox[_ngcontent-%COMP%] {\n width: 40px;\n text-align: center;\n }\n\n .col-checkbox[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n color: #9CA3AF;\n cursor: pointer;\n transition: color 150ms ease;\n }\n\n .col-checkbox[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:hover, \n .list-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.selected[_ngcontent-%COMP%] .col-checkbox[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #007AFF;\n }\n\n .col-name[_ngcontent-%COMP%] {\n min-width: 300px;\n }\n\n .list-name-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .list-name-cell[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n color: #6B7280;\n width: 20px;\n text-align: center;\n }\n\n .list-name-cell[_ngcontent-%COMP%] .fa-folder[_ngcontent-%COMP%] {\n color: #3B82F6;\n }\n\n .shared-indicator[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #10B981;\n margin-left: auto;\n }\n\n .col-type[_ngcontent-%COMP%] {\n width: 150px;\n }\n\n .col-modified[_ngcontent-%COMP%] {\n width: 180px;\n }\n\n .col-owner[_ngcontent-%COMP%] {\n width: 150px;\n }"] });
806
1409
  }
807
1410
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CollectionsFullViewComponent, [{
808
1411
  type: Component,
809
1412
  args: [{ selector: 'mj-collections-full-view', template: `
810
- <div class="collections-view">
1413
+ <div class="collections-view" (keydown)="handleKeyboardShortcut($event)">
1414
+ <!-- Mac Finder-style Header -->
811
1415
  <div class="collections-header">
1416
+ <!-- Breadcrumb navigation -->
812
1417
  <div class="collections-breadcrumb">
813
1418
  <div class="breadcrumb-item">
814
1419
  <i class="fas fa-home"></i>
@@ -825,108 +1430,292 @@ export class CollectionsFullViewComponent {
825
1430
  </ng-container>
826
1431
  </span>
827
1432
  </div>
1433
+
1434
+ <!-- Action buttons -->
828
1435
  <div class="collections-actions">
829
- <button class="btn-primary" (click)="createCollection()" *ngIf="canEditCurrent()" title="New Collection">
830
- <i class="fas fa-folder-plus"></i>
831
- New Collection
1436
+ <!-- View mode toggle -->
1437
+ <button class="btn-icon"
1438
+ (click)="toggleViewMode()"
1439
+ [title]="viewMode === 'grid' ? 'Switch to List View' : 'Switch to Grid View'">
1440
+ <i class="fas" [ngClass]="viewMode === 'grid' ? 'fa-list' : 'fa-th'"></i>
832
1441
  </button>
833
- <button class="btn-secondary" (click)="refresh()" title="Refresh">
1442
+
1443
+ <!-- Sort dropdown (grid view only) -->
1444
+ <div class="dropdown-container" *ngIf="viewMode === 'grid'">
1445
+ <button class="btn-icon"
1446
+ (click)="showSortDropdown = !showSortDropdown"
1447
+ title="Sort options">
1448
+ <i class="fas fa-sort"></i>
1449
+ </button>
1450
+ <div class="dropdown-menu" *ngIf="showSortDropdown">
1451
+ <button class="dropdown-item"
1452
+ [class.active]="sortBy === 'name'"
1453
+ (click)="setSortBy('name')">
1454
+ <i class="fas fa-sort-alpha-down"></i>
1455
+ <span>Sort by Name</span>
1456
+ </button>
1457
+ <button class="dropdown-item"
1458
+ [class.active]="sortBy === 'date'"
1459
+ (click)="setSortBy('date')">
1460
+ <i class="fas fa-calendar"></i>
1461
+ <span>Sort by Date</span>
1462
+ </button>
1463
+ <button class="dropdown-item"
1464
+ [class.active]="sortBy === 'type'"
1465
+ (click)="setSortBy('type')">
1466
+ <i class="fas fa-tag"></i>
1467
+ <span>Sort by Type</span>
1468
+ </button>
1469
+ </div>
1470
+ </div>
1471
+
1472
+ <!-- Search -->
1473
+ <div class="search-container">
1474
+ <i class="fas fa-search"></i>
1475
+ <input type="text"
1476
+ class="search-input"
1477
+ placeholder="Search..."
1478
+ [(ngModel)]="searchQuery"
1479
+ (ngModelChange)="onSearchChange($event)">
1480
+ <button class="search-clear"
1481
+ *ngIf="searchQuery"
1482
+ (click)="searchQuery = ''; onSearchChange('')"
1483
+ title="Clear search">
1484
+ <i class="fas fa-times"></i>
1485
+ </button>
1486
+ </div>
1487
+
1488
+ <!-- New dropdown -->
1489
+ <div class="dropdown-container" *ngIf="canEditCurrent()">
1490
+ <button class="btn-primary"
1491
+ (click)="showNewDropdown = !showNewDropdown">
1492
+ <i class="fas fa-plus"></i>
1493
+ <span>New</span>
1494
+ <i class="fas fa-chevron-down"></i>
1495
+ </button>
1496
+ <div class="dropdown-menu dropdown-menu-right" *ngIf="showNewDropdown">
1497
+ <button class="dropdown-item" (click)="createCollection()">
1498
+ <i class="fas fa-folder-plus"></i>
1499
+ <span>New Collection</span>
1500
+ </button>
1501
+ <button class="dropdown-item"
1502
+ (click)="addArtifact()"
1503
+ [disabled]="!currentCollectionId">
1504
+ <i class="fas fa-file-plus"></i>
1505
+ <span>New Artifact</span>
1506
+ </button>
1507
+ </div>
1508
+ </div>
1509
+
1510
+ <!-- Refresh button -->
1511
+ <button class="btn-icon" (click)="refresh()" title="Refresh">
834
1512
  <i class="fas fa-sync"></i>
835
1513
  </button>
836
1514
  </div>
837
1515
  </div>
838
1516
 
1517
+ <!-- Multi-select toolbar (appears when items selected) -->
1518
+ <div class="selection-toolbar" *ngIf="selectedItems.size > 0">
1519
+ <div class="selection-info">
1520
+ <span class="selection-count">{{ selectedItems.size }} selected</span>
1521
+ </div>
1522
+ <div class="selection-actions">
1523
+ <button class="btn-toolbar" (click)="clearSelection()">
1524
+ <i class="fas fa-times"></i>
1525
+ Clear Selection
1526
+ </button>
1527
+ <button class="btn-toolbar btn-danger" (click)="deleteSelected()">
1528
+ <i class="fas fa-trash"></i>
1529
+ Delete Selected
1530
+ </button>
1531
+ </div>
1532
+ </div>
1533
+
1534
+ <!-- Content area -->
839
1535
  <div class="collections-content">
1536
+ <!-- Loading state -->
840
1537
  <div *ngIf="isLoading" class="loading-state">
841
1538
  <i class="fas fa-spinner fa-spin"></i>
842
1539
  <p>Loading collections...</p>
843
1540
  </div>
844
1541
 
845
- <div *ngIf="!isLoading" class="content-grid">
846
- <!-- Sub-collections -->
847
- <div class="section">
848
- <div class="section-header">
849
- <h3>Collections</h3>
850
- <span class="section-count">{{ filteredCollections.length }}</span>
851
- <button class="btn-primary btn-sm" (click)="createCollection()" *ngIf="canEditCurrent()">
852
- <i class="fas fa-plus"></i>
853
- New Collection
854
- </button>
1542
+ <!-- Empty state -->
1543
+ <div *ngIf="!isLoading && unifiedItems.length === 0" class="empty-state">
1544
+ <i class="fas fa-folder-open"></i>
1545
+
1546
+ <!-- Search returned no results -->
1547
+ <ng-container *ngIf="searchQuery">
1548
+ <h3>No items found</h3>
1549
+ <p>Try adjusting your search</p>
1550
+ </ng-container>
1551
+
1552
+ <!-- Empty root level -->
1553
+ <ng-container *ngIf="!searchQuery && !currentCollectionId">
1554
+ <h3>No collections yet</h3>
1555
+ <p>Create your first collection to get started</p>
1556
+ <button class="btn-primary"
1557
+ (click)="createCollection()"
1558
+ *ngIf="canEditCurrent()">
1559
+ <i class="fas fa-plus"></i>
1560
+ Create Collection
1561
+ </button>
1562
+ </ng-container>
1563
+
1564
+ <!-- Empty collection (has parent) -->
1565
+ <ng-container *ngIf="!searchQuery && currentCollectionId">
1566
+ <h3>This collection is empty</h3>
1567
+ <p>Use the <strong>New</strong> button above to add collections or artifacts</p>
1568
+ </ng-container>
1569
+ </div>
1570
+
1571
+ <!-- Grid view -->
1572
+ <div *ngIf="!isLoading && unifiedItems.length > 0 && viewMode === 'grid'"
1573
+ class="unified-grid">
1574
+ <div *ngFor="let item of unifiedItems"
1575
+ class="grid-item"
1576
+ [class.selected]="item.selected"
1577
+ [class.active]="item.type === 'artifact' && item.artifact?.ID === activeArtifactId"
1578
+ (click)="onItemClick(item, $event)"
1579
+ (contextmenu)="onItemContextMenu(item, $event)">
1580
+
1581
+ <!-- Selection checkbox -->
1582
+ <div class="item-checkbox"
1583
+ (click)="toggleItemSelection(item, $event)">
1584
+ <i class="fas"
1585
+ [ngClass]="item.selected ? 'fa-check-circle' : 'fa-circle'"></i>
855
1586
  </div>
856
- <div class="collection-grid" *ngIf="filteredCollections.length > 0">
857
- <div *ngFor="let collection of filteredCollections"
858
- class="collection-card"
859
- (click)="openCollection(collection)">
860
- <div class="card-icon">
861
- <i class="fas fa-folder"></i>
862
- <!-- Shared indicator -->
863
- <div class="shared-badge" *ngIf="isShared(collection)" title="Shared with you">
864
- <i class="fas fa-users"></i>
865
- </div>
1587
+
1588
+ <!-- Folder item -->
1589
+ <div *ngIf="item.type === 'folder'"
1590
+ class="grid-item-content"
1591
+ [title]="item.description || item.name">
1592
+ <div class="grid-icon folder-icon">
1593
+ <i class="fas fa-folder"></i>
1594
+ <div class="shared-badge" *ngIf="item.isShared" title="Shared">
1595
+ <i class="fas fa-users"></i>
866
1596
  </div>
867
- <div class="card-content">
868
- <div class="card-name">{{ collection.Name }}</div>
869
- <div class="card-owner" *ngIf="isShared(collection) && collection.Owner">
870
- <i class="fas fa-user"></i>
871
- <span>{{ collection.Owner }}</span>
872
- </div>
873
- <div class="card-description" *ngIf="collection.Description">
874
- {{ collection.Description }}
875
- </div>
1597
+ </div>
1598
+ <div class="grid-info">
1599
+ <div class="grid-name">{{ item.name }}</div>
1600
+ <div class="grid-description" *ngIf="item.description">
1601
+ {{ item.description }}
1602
+ </div>
1603
+ <div class="grid-meta" *ngIf="item.itemCount !== undefined">
1604
+ {{ getItemCountText(item.itemCount) }}
876
1605
  </div>
877
- <div class="card-actions" (click)="$event.stopPropagation()">
878
- <button class="card-action-btn" *ngIf="canShare(collection)" (click)="shareCollection(collection)" title="Share">
879
- <i class="fas fa-share-alt"></i>
880
- </button>
881
- <button class="card-action-btn" *ngIf="canEdit(collection)" (click)="editCollection(collection)" title="Edit">
882
- <i class="fas fa-edit"></i>
883
- </button>
884
- <button class="card-action-btn danger" *ngIf="canDelete(collection)" (click)="deleteCollection(collection)" title="Delete">
885
- <i class="fas fa-trash"></i>
886
- </button>
1606
+ <div class="grid-owner" *ngIf="item.isShared && item.owner">
1607
+ <i class="fas fa-user"></i>
1608
+ {{ item.owner }}
887
1609
  </div>
888
1610
  </div>
889
1611
  </div>
890
- </div>
891
1612
 
892
- <!-- Artifacts in current collection -->
893
- <div class="section" *ngIf="currentCollectionId">
894
- <div class="section-header">
895
- <h3>Artifacts</h3>
896
- <span class="section-count">{{ filteredArtifactVersions.length }}</span>
897
- <button class="btn-primary btn-sm" (click)="addArtifact()" *ngIf="canEditCurrent()">
898
- <i class="fas fa-plus"></i>
899
- Add Artifact
900
- </button>
901
- </div>
902
- <div class="artifact-grid" *ngIf="filteredArtifactVersions.length > 0">
903
- @for (item of filteredArtifactVersions; track item.version.ID) {
904
- <div class="artifact-card"
905
- (click)="viewArtifact(item)">
906
- <div class="card-icon artifact-icon">
907
- <i class="fas fa-file-alt"></i>
908
- </div>
909
- <div class="card-content">
910
- <div class="card-name">{{ item.artifact.Name }}</div>
911
- <div class="card-meta">
912
- <span class="version-badge">v{{ item.version.VersionNumber }}</span>
913
- <span class="artifact-type">{{ item.artifact.Type || 'Unknown' }}</span>
914
- </div>
915
- </div>
916
- <div class="card-actions" (click)="$event.stopPropagation()">
917
- <button class="card-action-btn" (click)="removeArtifact(item)" title="Remove from collection" *ngIf="canDeleteCurrent()">
918
- <i class="fas fa-times"></i>
919
- </button>
920
- </div>
1613
+ <!-- Artifact item -->
1614
+ <div *ngIf="item.type === 'artifact'"
1615
+ class="grid-item-content"
1616
+ [title]="item.description || item.name">
1617
+ <div class="grid-icon artifact-icon">
1618
+ <i class="fas" [ngClass]="item.icon"></i>
1619
+ </div>
1620
+ <div class="grid-info">
1621
+ <div class="grid-name">{{ item.name }}</div>
1622
+ <div class="grid-description" *ngIf="item.description">
1623
+ {{ item.description }}
1624
+ </div>
1625
+ <div class="grid-meta">
1626
+ <span class="version-badge" *ngIf="item.versionNumber">
1627
+ v{{ item.versionNumber }}
1628
+ </span>
1629
+ <span class="artifact-type-badge" *ngIf="item.artifactType">
1630
+ {{ item.artifactType }}
1631
+ </span>
921
1632
  </div>
922
- }
1633
+ </div>
923
1634
  </div>
924
1635
  </div>
925
1636
  </div>
1637
+
1638
+ <!-- List view -->
1639
+ <div *ngIf="!isLoading && unifiedItems.length > 0 && viewMode === 'list'"
1640
+ class="unified-list">
1641
+ <table class="list-table">
1642
+ <thead>
1643
+ <tr>
1644
+ <th class="col-checkbox">
1645
+ <i class="fas"
1646
+ [ngClass]="selectedItems.size === unifiedItems.length ? 'fa-check-square' : 'fa-square'"
1647
+ (click)="selectedItems.size === unifiedItems.length ? clearSelection() : selectAll()"></i>
1648
+ </th>
1649
+ <th class="col-name sortable" (click)="setSortBy('name')">
1650
+ <span>Name</span>
1651
+ <i class="fas fa-sort" *ngIf="sortBy !== 'name'"></i>
1652
+ <i class="fas" *ngIf="sortBy === 'name'"
1653
+ [ngClass]="sortOrder === 'asc' ? 'fa-sort-up' : 'fa-sort-down'"></i>
1654
+ </th>
1655
+ <th class="col-type sortable" (click)="setSortBy('type')">
1656
+ <span>Type</span>
1657
+ <i class="fas fa-sort" *ngIf="sortBy !== 'type'"></i>
1658
+ <i class="fas" *ngIf="sortBy === 'type'"
1659
+ [ngClass]="sortOrder === 'asc' ? 'fa-sort-up' : 'fa-sort-down'"></i>
1660
+ </th>
1661
+ <th class="col-modified sortable" (click)="setSortBy('date')">
1662
+ <span>Modified</span>
1663
+ <i class="fas fa-sort" *ngIf="sortBy !== 'date'"></i>
1664
+ <i class="fas" *ngIf="sortBy === 'date'"
1665
+ [ngClass]="sortOrder === 'asc' ? 'fa-sort-up' : 'fa-sort-down'"></i>
1666
+ </th>
1667
+ <th class="col-owner">Owner</th>
1668
+ </tr>
1669
+ </thead>
1670
+ <tbody>
1671
+ <tr *ngFor="let item of unifiedItems"
1672
+ class="list-item"
1673
+ [class.selected]="item.selected"
1674
+ [class.active]="item.type === 'artifact' && item.artifact?.ID === activeArtifactId"
1675
+ (click)="onItemClick(item, $event)"
1676
+ (contextmenu)="onItemContextMenu(item, $event)">
1677
+
1678
+ <td class="col-checkbox">
1679
+ <i class="fas"
1680
+ [ngClass]="item.selected ? 'fa-check-circle' : 'fa-circle'"
1681
+ (click)="toggleItemSelection(item, $event)"></i>
1682
+ </td>
1683
+
1684
+ <td class="col-name">
1685
+ <div class="list-name-cell">
1686
+ <i class="fas"
1687
+ [ngClass]="item.type === 'folder' ? 'fa-folder' : item.icon"></i>
1688
+ <span>{{ item.name }}</span>
1689
+ <i class="fas fa-users shared-indicator"
1690
+ *ngIf="item.isShared"
1691
+ title="Shared"></i>
1692
+ </div>
1693
+ </td>
1694
+
1695
+ <td class="col-type">
1696
+ <span *ngIf="item.type === 'folder'">Folder</span>
1697
+ <span *ngIf="item.type === 'artifact'" class="artifact-type-badge">
1698
+ {{ item.artifactType }}
1699
+ </span>
1700
+ </td>
1701
+
1702
+ <td class="col-modified">
1703
+ <span *ngIf="item.lastModified">
1704
+ {{ item.lastModified | date:'short' }}
1705
+ </span>
1706
+ </td>
1707
+
1708
+ <td class="col-owner">
1709
+ <span *ngIf="item.owner">{{ item.owner }}</span>
1710
+ </td>
1711
+ </tr>
1712
+ </tbody>
1713
+ </table>
1714
+ </div>
926
1715
  </div>
927
1716
  </div>
928
1717
 
929
- <!-- Collection Form Modal -->
1718
+ <!-- Modals (unchanged) -->
930
1719
  <mj-collection-form-modal
931
1720
  [isOpen]="isFormModalOpen"
932
1721
  [collection]="editingCollection"
@@ -937,7 +1726,6 @@ export class CollectionsFullViewComponent {
937
1726
  (cancelled)="onFormCancelled()">
938
1727
  </mj-collection-form-modal>
939
1728
 
940
- <!-- Artifact Create Modal -->
941
1729
  <mj-artifact-create-modal
942
1730
  [isOpen]="isArtifactModalOpen"
943
1731
  [collectionId]="currentCollectionId || ''"
@@ -947,7 +1735,6 @@ export class CollectionsFullViewComponent {
947
1735
  (cancelled)="onArtifactModalCancelled()">
948
1736
  </mj-artifact-create-modal>
949
1737
 
950
- <!-- Share Modal -->
951
1738
  <mj-collection-share-modal
952
1739
  [isOpen]="isShareModalOpen"
953
1740
  [collection]="sharingCollection"
@@ -956,13 +1743,13 @@ export class CollectionsFullViewComponent {
956
1743
  (saved)="onPermissionsChanged()"
957
1744
  (cancelled)="onShareModalCancelled()">
958
1745
  </mj-collection-share-modal>
959
- `, styles: ["\n .collections-view {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: white;\n }\n\n .collections-header {\n display: flex;\n align-items: center;\n padding: 16px 24px;\n border-bottom: 1px solid #E5E7EB;\n gap: 16px;\n }\n\n .collections-breadcrumb {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n }\n\n .breadcrumb-item {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .breadcrumb-item i {\n color: #6B7280;\n font-size: 14px;\n }\n\n .breadcrumb-link {\n color: #111827;\n font-weight: 500;\n cursor: pointer;\n text-decoration: none;\n white-space: nowrap;\n transition: color 150ms ease;\n }\n\n .breadcrumb-link:hover {\n color: #1e40af;\n }\n\n .breadcrumb-link.active {\n color: #6B7280;\n cursor: default;\n }\n\n .breadcrumb-path {\n display: flex;\n align-items: center;\n gap: 8px;\n overflow-x: auto;\n }\n\n .breadcrumb-separator {\n color: #D1D5DB;\n font-size: 10px;\n }\n\n .collections-actions {\n display: flex;\n gap: 8px;\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: #1e40af;\n border: none;\n border-radius: 6px;\n color: white;\n font-size: 14px;\n cursor: pointer;\n transition: background 150ms ease;\n }\n\n .btn-primary:hover {\n background: #1e3a8a;\n }\n\n .btn-secondary {\n padding: 8px 12px;\n background: transparent;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n cursor: pointer;\n color: #6B7280;\n transition: all 150ms ease;\n }\n\n .btn-secondary:hover {\n background: #F9FAFB;\n color: #111827;\n }\n\n .btn-sm {\n padding: 6px 12px;\n font-size: 13px;\n }\n\n .collections-content {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n }\n\n .loading-state, .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: #9CA3AF;\n max-width: 400px;\n margin: 0 auto;\n text-align: center;\n padding: 48px 24px;\n }\n\n .loading-state i {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.5;\n }\n\n .empty-state i {\n font-size: 64px;\n margin-bottom: 24px;\n opacity: 0.3;\n color: #D1D5DB;\n }\n\n .empty-state h3 {\n margin: 0 0 8px 0;\n color: #374151;\n font-size: 20px;\n font-weight: 600;\n }\n\n .empty-state p {\n margin: 0 0 24px 0;\n font-size: 14px;\n color: #6B7280;\n line-height: 1.5;\n }\n\n .loading-state p {\n margin: 0;\n font-size: 14px;\n }\n\n .empty-state .btn-primary {\n padding: 10px 20px;\n font-size: 14px;\n font-weight: 500;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n }\n\n .empty-state .btn-primary:hover {\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);\n }\n\n .content-grid {\n display: flex;\n flex-direction: column;\n gap: 32px;\n }\n\n .section {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .section-header {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .section-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #111827;\n }\n\n .section-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n padding: 0 8px;\n background: #EFF6FF;\n border-radius: 12px;\n font-size: 13px;\n font-weight: 600;\n color: #1e40af;\n }\n\n .collection-grid, .artifact-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n }\n\n .collection-card, .artifact-card {\n display: flex;\n align-items: start;\n gap: 16px;\n padding: 20px;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n cursor: pointer;\n transition: all 150ms ease;\n position: relative;\n }\n\n .collection-card:hover, .artifact-card:hover {\n border-color: #1e40af;\n box-shadow: 0 2px 8px rgba(0,0,0,0.08);\n }\n\n .card-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #EFF6FF;\n border-radius: 8px;\n flex-shrink: 0;\n position: relative;\n }\n\n .card-icon i {\n font-size: 20px;\n color: #1e40af;\n }\n\n .shared-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n width: 18px;\n height: 18px;\n background: #10B981;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid white;\n }\n\n .shared-badge i {\n font-size: 9px;\n color: white;\n }\n\n .artifact-icon {\n background: #F0FDF4;\n }\n\n .artifact-icon i {\n color: #059669;\n }\n\n .card-content {\n flex: 1;\n min-width: 0;\n }\n\n .card-name {\n font-size: 15px;\n font-weight: 500;\n color: #111827;\n margin-bottom: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .card-owner {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 6px;\n font-size: 12px;\n color: #6B7280;\n }\n\n .card-owner i {\n font-size: 10px;\n }\n\n .card-description {\n font-size: 13px;\n color: #6B7280;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .card-meta {\n font-size: 12px;\n color: #9CA3AF;\n }\n\n .artifact-type {\n padding: 2px 8px;\n background: #F3F4F6;\n border-radius: 4px;\n font-weight: 500;\n }\n\n .card-actions {\n position: absolute;\n top: 12px;\n right: 12px;\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 150ms ease;\n }\n\n .collection-card:hover .card-actions,\n .artifact-card:hover .card-actions {\n opacity: 1;\n }\n\n .card-action-btn {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n color: #6B7280;\n cursor: pointer;\n transition: all 150ms ease;\n }\n\n .card-action-btn:hover {\n background: #F9FAFB;\n color: #111827;\n border-color: #D1D5DB;\n }\n\n .card-action-btn.danger:hover {\n background: #FEE2E2;\n color: #DC2626;\n border-color: #FCA5A5;\n }\n "] }]
960
- }], () => [{ type: i1.DialogService }, { type: i2.ArtifactStateService }, { type: i3.CollectionStateService }, { type: i4.CollectionPermissionService }], { environmentId: [{
1746
+ `, styles: ["\n /* Main container */\n .collections-view {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: #FAFAFA;\n position: relative;\n }\n\n /* Header */\n .collections-header {\n display: flex;\n align-items: center;\n padding: 12px 20px;\n border-bottom: 1px solid #E5E7EB;\n gap: 16px;\n background: white;\n }\n\n .collections-breadcrumb {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1;\n min-width: 0;\n }\n\n .breadcrumb-item {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .breadcrumb-item i {\n color: #6B7280;\n font-size: 14px;\n }\n\n .breadcrumb-link {\n color: #111827;\n font-weight: 500;\n cursor: pointer;\n text-decoration: none;\n white-space: nowrap;\n transition: color 150ms ease;\n font-size: 14px;\n }\n\n .breadcrumb-link:hover {\n color: #0076D6;\n }\n\n .breadcrumb-link.active {\n color: #6B7280;\n cursor: default;\n }\n\n .breadcrumb-path {\n display: flex;\n align-items: center;\n gap: 6px;\n overflow-x: auto;\n }\n\n .breadcrumb-separator {\n color: #D1D5DB;\n font-size: 10px;\n }\n\n .collections-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n /* Button styles */\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: #007AFF;\n border: none;\n border-radius: 6px;\n color: white;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 150ms ease;\n }\n\n .btn-primary:hover {\n background: #0051D5;\n }\n\n .btn-primary i.fa-chevron-down {\n font-size: 10px;\n margin-left: 2px;\n }\n\n .btn-icon {\n padding: 6px 10px;\n background: transparent;\n border: 1px solid #D1D5DB;\n border-radius: 6px;\n cursor: pointer;\n color: #6B7280;\n transition: all 150ms ease;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .btn-icon:hover {\n background: #F9FAFB;\n color: #111827;\n border-color: #9CA3AF;\n }\n\n /* Dropdown menus */\n .dropdown-container {\n position: relative;\n }\n\n .dropdown-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n min-width: 200px;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 4px;\n z-index: 1000;\n }\n\n .dropdown-menu-right {\n left: auto;\n right: 0;\n }\n\n .dropdown-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 8px 12px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: #111827;\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 100ms ease;\n }\n\n .dropdown-item:hover:not(:disabled) {\n background: #F3F4F6;\n }\n\n .dropdown-item:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .dropdown-item.active {\n background: #EFF6FF;\n color: #007AFF;\n }\n\n .dropdown-item i {\n font-size: 14px;\n width: 16px;\n text-align: center;\n color: #6B7280;\n }\n\n .dropdown-item.active i {\n color: #007AFF;\n }\n\n .dropdown-divider {\n height: 1px;\n background: #E5E7EB;\n margin: 4px 0;\n }\n\n /* Search */\n .search-container {\n position: relative;\n display: flex;\n align-items: center;\n min-width: 200px;\n }\n\n .search-container i.fa-search {\n position: absolute;\n left: 10px;\n color: #9CA3AF;\n font-size: 13px;\n pointer-events: none;\n }\n\n .search-input {\n width: 100%;\n padding: 6px 32px 6px 32px;\n border: 1px solid #D1D5DB;\n border-radius: 6px;\n font-size: 13px;\n outline: none;\n transition: all 150ms ease;\n }\n\n .search-input:focus {\n border-color: #007AFF;\n box-shadow: 0 0 0 3px rgba(0, 122, 255, 0.1);\n }\n\n .search-clear {\n position: absolute;\n right: 6px;\n padding: 4px;\n background: transparent;\n border: none;\n color: #9CA3AF;\n cursor: pointer;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .search-clear:hover {\n background: #F3F4F6;\n color: #6B7280;\n }\n\n /* Selection toolbar */\n .selection-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 20px;\n background: #EFF6FF;\n border-bottom: 1px solid #BFDBFE;\n }\n\n .selection-info {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .selection-count {\n font-size: 13px;\n font-weight: 600;\n color: #1E40AF;\n }\n\n .selection-actions {\n display: flex;\n gap: 8px;\n }\n\n .btn-toolbar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: white;\n border: 1px solid #D1D5DB;\n border-radius: 6px;\n color: #374151;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n }\n\n .btn-toolbar:hover {\n background: #F9FAFB;\n border-color: #9CA3AF;\n }\n\n .btn-toolbar.btn-danger {\n color: #DC2626;\n border-color: #FCA5A5;\n }\n\n .btn-toolbar.btn-danger:hover {\n background: #FEE2E2;\n border-color: #DC2626;\n }\n\n /* Content area */\n .collections-content {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n }\n\n /* Loading and empty states */\n .loading-state, .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: #9CA3AF;\n text-align: center;\n padding: 48px 24px;\n }\n\n .loading-state i {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.5;\n }\n\n .loading-state p {\n margin: 0;\n font-size: 14px;\n }\n\n .empty-state i {\n font-size: 64px;\n margin-bottom: 24px;\n opacity: 0.3;\n color: #D1D5DB;\n }\n\n .empty-state h3 {\n margin: 0 0 8px 0;\n color: #374151;\n font-size: 18px;\n font-weight: 600;\n }\n\n .empty-state p {\n margin: 0 0 24px 0;\n font-size: 14px;\n color: #6B7280;\n }\n\n .empty-state-actions {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n justify-content: center;\n }\n\n /* Grid view */\n .unified-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));\n gap: 16px;\n padding: 4px;\n }\n\n .grid-item {\n display: flex;\n flex-direction: column;\n padding: 12px;\n background: white;\n border: 2px solid transparent;\n border-radius: 8px;\n cursor: pointer;\n transition: all 150ms ease;\n position: relative;\n }\n\n .grid-item:hover {\n background: #F9FAFB;\n border-color: #D1D5DB;\n }\n\n .grid-item.selected {\n background: #EFF6FF;\n border-color: #007AFF;\n }\n\n .grid-item.active {\n background: #FEF3C7;\n border-color: #F59E0B;\n box-shadow: 0 0 0 1px #F59E0B;\n }\n\n .grid-item.active:hover {\n background: #FDE68A;\n }\n\n .item-checkbox {\n position: absolute;\n top: 8px;\n right: 8px;\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 10;\n }\n\n .item-checkbox i {\n font-size: 16px;\n color: #9CA3AF;\n transition: color 150ms ease;\n }\n\n .grid-item.selected .item-checkbox i,\n .item-checkbox:hover i {\n color: #007AFF;\n }\n\n .grid-item-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n }\n\n .grid-icon {\n width: 64px;\n height: 64px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n position: relative;\n }\n\n .grid-icon.folder-icon {\n background: linear-gradient(135deg, #60A5FA 0%, #3B82F6 100%);\n }\n\n .grid-icon.folder-icon i {\n font-size: 36px;\n color: white;\n }\n\n .grid-icon.artifact-icon {\n background: #F3F4F6;\n }\n\n .grid-icon.artifact-icon i {\n font-size: 32px;\n color: #6B7280;\n }\n\n .shared-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n width: 20px;\n height: 20px;\n background: #10B981;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid white;\n }\n\n .shared-badge i {\n font-size: 10px;\n color: white;\n }\n\n .grid-info {\n width: 100%;\n text-align: center;\n }\n\n .grid-name {\n font-size: 13px;\n font-weight: 500;\n color: #111827;\n line-height: 1.3;\n margin-bottom: 4px;\n /* Allow wrapping to 2 lines max */\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n word-break: break-word;\n }\n\n .grid-description {\n font-size: 11px;\n color: #6B7280;\n line-height: 1.3;\n margin-bottom: 4px;\n /* Allow wrapping to 2 lines max */\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n word-break: break-word;\n }\n\n .grid-meta {\n font-size: 11px;\n color: #6B7280;\n margin-top: 4px;\n }\n\n .grid-owner {\n font-size: 11px;\n color: #6B7280;\n margin-top: 2px;\n }\n\n .grid-owner i {\n font-size: 10px;\n margin-right: 3px;\n }\n\n .version-badge {\n display: inline-block;\n padding: 2px 6px;\n background: #FEF3C7;\n color: #92400E;\n border-radius: 3px;\n font-size: 10px;\n font-weight: 600;\n font-family: monospace;\n margin-right: 4px;\n }\n\n .artifact-type-badge {\n display: inline-block;\n padding: 2px 6px;\n background: #DBEAFE;\n color: #1E40AF;\n border-radius: 3px;\n font-size: 10px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n /* List view */\n .unified-list {\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n overflow: hidden;\n }\n\n .list-table {\n width: 100%;\n border-collapse: collapse;\n }\n\n .list-table thead {\n background: #F9FAFB;\n border-bottom: 1px solid #E5E7EB;\n }\n\n .list-table th {\n padding: 10px 16px;\n text-align: left;\n font-size: 12px;\n font-weight: 600;\n color: #6B7280;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .list-table th.sortable {\n cursor: pointer;\n user-select: none;\n transition: color 150ms ease;\n }\n\n .list-table th.sortable:hover {\n color: #007AFF;\n }\n\n .list-table th.sortable span {\n display: inline-block;\n margin-right: 6px;\n }\n\n .list-table th.sortable i {\n font-size: 10px;\n opacity: 0.5;\n }\n\n .list-table th.sortable:hover i {\n opacity: 1;\n }\n\n .list-table tbody tr {\n border-bottom: 1px solid #F3F4F6;\n transition: background 150ms ease;\n }\n\n .list-table tbody tr:last-child {\n border-bottom: none;\n }\n\n .list-table tbody tr:hover {\n background: #F9FAFB;\n }\n\n .list-table tbody tr.selected {\n background: #EFF6FF;\n }\n\n .list-table tbody tr.active {\n background: #FEF3C7;\n border-left: 3px solid #F59E0B;\n }\n\n .list-table tbody tr.active:hover {\n background: #FDE68A;\n }\n\n .list-table td {\n padding: 12px 16px;\n font-size: 13px;\n color: #374151;\n }\n\n .col-checkbox {\n width: 40px;\n text-align: center;\n }\n\n .col-checkbox i {\n font-size: 16px;\n color: #9CA3AF;\n cursor: pointer;\n transition: color 150ms ease;\n }\n\n .col-checkbox i:hover,\n .list-table tbody tr.selected .col-checkbox i {\n color: #007AFF;\n }\n\n .col-name {\n min-width: 300px;\n }\n\n .list-name-cell {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .list-name-cell i {\n font-size: 16px;\n color: #6B7280;\n width: 20px;\n text-align: center;\n }\n\n .list-name-cell .fa-folder {\n color: #3B82F6;\n }\n\n .shared-indicator {\n font-size: 12px;\n color: #10B981;\n margin-left: auto;\n }\n\n .col-type {\n width: 150px;\n }\n\n .col-modified {\n width: 180px;\n }\n\n .col-owner {\n width: 150px;\n }\n "] }]
1747
+ }], () => [{ type: i1.DialogService }, { type: i2.ArtifactStateService }, { type: i3.CollectionStateService }, { type: i4.CollectionPermissionService }, { type: i5.ArtifactIconService }], { environmentId: [{
961
1748
  type: Input
962
1749
  }], currentUser: [{
963
1750
  type: Input
964
1751
  }], collectionNavigated: [{
965
1752
  type: Output
966
1753
  }] }); })();
967
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CollectionsFullViewComponent, { className: "CollectionsFullViewComponent", filePath: "src/lib/components/collection/collections-full-view.component.ts", lineNumber: 535 }); })();
1754
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CollectionsFullViewComponent, { className: "CollectionsFullViewComponent", filePath: "src/lib/components/collection/collections-full-view.component.ts", lineNumber: 1038 }); })();
968
1755
  //# sourceMappingURL=collections-full-view.component.js.map