@memberjunction/ng-conversations 5.22.0 → 5.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -0
- package/dist/lib/components/artifact/artifact-share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/artifact/artifact-share-modal.component.js +58 -60
- package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.js +31 -32
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.js.map +1 -1
- package/dist/lib/components/collection/artifact-create-modal.component.d.ts +1 -0
- package/dist/lib/components/collection/artifact-create-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/artifact-create-modal.component.js +81 -63
- package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-artifact-card.component.js +7 -6
- package/dist/lib/components/collection/collection-artifact-card.component.js.map +1 -1
- package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-form-modal.component.js +22 -22
- package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-share-modal.component.js +65 -67
- package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-view.component.js +71 -59
- package/dist/lib/components/collection/collection-view.component.js.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.js +7 -8
- package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +25 -28
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +478 -572
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.d.ts +7 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.js +101 -52
- package/dist/lib/components/conversation/conversation-empty-state.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.d.ts +3 -3
- package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.js +44 -30
- package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
- package/dist/lib/components/dialogs/input-dialog.component.d.ts +0 -3
- package/dist/lib/components/dialogs/input-dialog.component.d.ts.map +1 -1
- package/dist/lib/components/dialogs/input-dialog.component.js +12 -17
- package/dist/lib/components/dialogs/input-dialog.component.js.map +1 -1
- package/dist/lib/components/export/export-modal.component.d.ts.map +1 -1
- package/dist/lib/components/export/export-modal.component.js +23 -23
- package/dist/lib/components/export/export-modal.component.js.map +1 -1
- package/dist/lib/components/members/members-modal.component.d.ts.map +1 -1
- package/dist/lib/components/members/members-modal.component.js +96 -85
- package/dist/lib/components/members/members-modal.component.js.map +1 -1
- package/dist/lib/components/message/actionable-commands.component.d.ts +2 -2
- package/dist/lib/components/message/actionable-commands.component.d.ts.map +1 -1
- package/dist/lib/components/message/actionable-commands.component.js +9 -10
- package/dist/lib/components/message/actionable-commands.component.js.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.d.ts +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.js +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.d.ts +6 -4
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +31 -21
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +14 -2
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +31 -28
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/message/message-list.component.d.ts +1 -2
- package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-list.component.js +1 -1
- package/dist/lib/components/message/message-list.component.js.map +1 -1
- package/dist/lib/components/overlay/chat-overlay.component.d.ts +157 -0
- package/dist/lib/components/overlay/chat-overlay.component.d.ts.map +1 -0
- package/dist/lib/components/overlay/chat-overlay.component.js +462 -0
- package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -0
- package/dist/lib/components/project/project-form-modal.component.d.ts +2 -2
- package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
- package/dist/lib/components/project/project-form-modal.component.js +24 -28
- package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
- package/dist/lib/components/project/project-selector.component.d.ts +4 -3
- package/dist/lib/components/project/project-selector.component.d.ts.map +1 -1
- package/dist/lib/components/project/project-selector.component.js +78 -115
- package/dist/lib/components/project/project-selector.component.js.map +1 -1
- package/dist/lib/components/search/search-panel.component.js +84 -84
- package/dist/lib/components/search/search-panel.component.js.map +1 -1
- package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/share/share-modal.component.js +77 -68
- package/dist/lib/components/share/share-modal.component.js.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts +2 -3
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +29 -32
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/conversations.module.d.ts +19 -26
- package/dist/lib/conversations.module.d.ts.map +1 -1
- package/dist/lib/conversations.module.js +20 -43
- package/dist/lib/conversations.module.js.map +1 -1
- package/dist/lib/services/active-tasks.service.d.ts +1 -3
- package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
- package/dist/lib/services/active-tasks.service.js +6 -9
- package/dist/lib/services/active-tasks.service.js.map +1 -1
- package/dist/lib/services/conversation-agent.service.d.ts +9 -4
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.js +83 -61
- package/dist/lib/services/conversation-agent.service.js.map +1 -1
- package/dist/lib/services/dialog.service.d.ts +6 -6
- package/dist/lib/services/dialog.service.d.ts.map +1 -1
- package/dist/lib/services/dialog.service.js +26 -23
- package/dist/lib/services/dialog.service.js.map +1 -1
- package/dist/public-api.d.ts +1 -2
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -2
- package/dist/public-api.js.map +1 -1
- package/package.json +21 -27
- package/dist/lib/models/conversation-complete-query.model.d.ts +0 -95
- package/dist/lib/models/conversation-complete-query.model.d.ts.map +0 -1
- package/dist/lib/models/conversation-complete-query.model.js +0 -22
- package/dist/lib/models/conversation-complete-query.model.js.map +0 -1
- package/dist/lib/services/conversation-data.service.d.ts +0 -134
- package/dist/lib/services/conversation-data.service.d.ts.map +0 -1
- package/dist/lib/services/conversation-data.service.js +0 -287
- package/dist/lib/services/conversation-data.service.js.map +0 -1
|
@@ -5,12 +5,21 @@ import * as i0 from "@angular/core";
|
|
|
5
5
|
import * as i1 from "../../services/toast.service";
|
|
6
6
|
import * as i2 from "../../services/collection-permission.service";
|
|
7
7
|
import * as i3 from "@angular/forms";
|
|
8
|
-
import * as i4 from "@
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
i0.ɵɵ
|
|
13
|
-
i0.ɵɵ
|
|
8
|
+
import * as i4 from "@memberjunction/ng-ui-components";
|
|
9
|
+
const _forTrack0 = ($index, $item) => $item.ID;
|
|
10
|
+
function ArtifactCreateModalComponent_Conditional_0_For_18_Template(rf, ctx) { if (rf & 1) {
|
|
11
|
+
i0.ɵɵelementStart(0, "option", 10);
|
|
12
|
+
i0.ɵɵtext(1);
|
|
13
|
+
i0.ɵɵelementEnd();
|
|
14
|
+
} if (rf & 2) {
|
|
15
|
+
const type_r3 = ctx.$implicit;
|
|
16
|
+
i0.ɵɵproperty("value", type_r3.ID);
|
|
17
|
+
i0.ɵɵadvance();
|
|
18
|
+
i0.ɵɵtextInterpolate(type_r3.Name);
|
|
19
|
+
} }
|
|
20
|
+
function ArtifactCreateModalComponent_Conditional_0_Conditional_34_Template(rf, ctx) { if (rf & 1) {
|
|
21
|
+
i0.ɵɵelementStart(0, "div", 15);
|
|
22
|
+
i0.ɵɵelement(1, "i", 18);
|
|
14
23
|
i0.ɵɵtext(2);
|
|
15
24
|
i0.ɵɵelementEnd();
|
|
16
25
|
} if (rf & 2) {
|
|
@@ -20,8 +29,8 @@ function ArtifactCreateModalComponent_Conditional_0_Conditional_30_Template(rf,
|
|
|
20
29
|
} }
|
|
21
30
|
function ArtifactCreateModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
22
31
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
23
|
-
i0.ɵɵelementStart(0, "
|
|
24
|
-
i0.ɵɵlistener("
|
|
32
|
+
i0.ɵɵelementStart(0, "mj-dialog", 2);
|
|
33
|
+
i0.ɵɵlistener("Close", function ArtifactCreateModalComponent_Conditional_0_Template_mj_dialog_Close_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancel()); });
|
|
25
34
|
i0.ɵɵelementStart(1, "div", 3)(2, "div", 4)(3, "label", 5);
|
|
26
35
|
i0.ɵɵtext(4, " Name ");
|
|
27
36
|
i0.ɵɵelementStart(5, "span", 6);
|
|
@@ -35,58 +44,62 @@ function ArtifactCreateModalComponent_Conditional_0_Template(rf, ctx) { if (rf &
|
|
|
35
44
|
i0.ɵɵelementStart(12, "span", 6);
|
|
36
45
|
i0.ɵɵtext(13, "*");
|
|
37
46
|
i0.ɵɵelementEnd()();
|
|
38
|
-
i0.ɵɵelementStart(14, "
|
|
39
|
-
i0.ɵɵ
|
|
47
|
+
i0.ɵɵelementStart(14, "select", 8);
|
|
48
|
+
i0.ɵɵlistener("ngModelChange", function ArtifactCreateModalComponent_Conditional_0_Template_select_ngModelChange_14_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onTypeSelected($event)); });
|
|
49
|
+
i0.ɵɵelementStart(15, "option", 9);
|
|
50
|
+
i0.ɵɵtext(16, "Select a type...");
|
|
51
|
+
i0.ɵɵelementEnd();
|
|
52
|
+
i0.ɵɵrepeaterCreate(17, ArtifactCreateModalComponent_Conditional_0_For_18_Template, 2, 2, "option", 10, _forTrack0);
|
|
40
53
|
i0.ɵɵelementEnd()();
|
|
41
|
-
i0.ɵɵelementStart(
|
|
42
|
-
i0.ɵɵtext(
|
|
54
|
+
i0.ɵɵelementStart(19, "div", 4)(20, "label", 5);
|
|
55
|
+
i0.ɵɵtext(21, "Description");
|
|
43
56
|
i0.ɵɵelementEnd();
|
|
44
|
-
i0.ɵɵelementStart(
|
|
45
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
46
|
-
i0.ɵɵtext(
|
|
57
|
+
i0.ɵɵelementStart(22, "textarea", 11);
|
|
58
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ArtifactCreateModalComponent_Conditional_0_Template_textarea_ngModelChange_22_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.formData.description, $event) || (ctx_r1.formData.description = $event); return i0.ɵɵresetView($event); });
|
|
59
|
+
i0.ɵɵtext(23, " ");
|
|
47
60
|
i0.ɵɵelementEnd()();
|
|
48
|
-
i0.ɵɵelementStart(
|
|
49
|
-
i0.ɵɵtext(
|
|
50
|
-
i0.ɵɵelementStart(
|
|
51
|
-
i0.ɵɵtext(
|
|
61
|
+
i0.ɵɵelementStart(24, "div", 4)(25, "label", 5);
|
|
62
|
+
i0.ɵɵtext(26, " Content ");
|
|
63
|
+
i0.ɵɵelementStart(27, "span", 6);
|
|
64
|
+
i0.ɵɵtext(28, "*");
|
|
52
65
|
i0.ɵɵelementEnd()();
|
|
53
|
-
i0.ɵɵelementStart(
|
|
54
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
55
|
-
i0.ɵɵtext(
|
|
66
|
+
i0.ɵɵelementStart(29, "textarea", 12);
|
|
67
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ArtifactCreateModalComponent_Conditional_0_Template_textarea_ngModelChange_29_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.formData.content, $event) || (ctx_r1.formData.content = $event); return i0.ɵɵresetView($event); });
|
|
68
|
+
i0.ɵɵtext(30, " ");
|
|
56
69
|
i0.ɵɵelementEnd();
|
|
57
|
-
i0.ɵɵelementStart(
|
|
58
|
-
i0.ɵɵelement(
|
|
59
|
-
i0.ɵɵtext(
|
|
70
|
+
i0.ɵɵelementStart(31, "div", 13);
|
|
71
|
+
i0.ɵɵelement(32, "i", 14);
|
|
72
|
+
i0.ɵɵtext(33, " Paste or type the artifact content. The content will be saved as version 1. ");
|
|
60
73
|
i0.ɵɵelementEnd()();
|
|
61
|
-
i0.ɵɵconditionalCreate(
|
|
74
|
+
i0.ɵɵconditionalCreate(34, ArtifactCreateModalComponent_Conditional_0_Conditional_34_Template, 3, 1, "div", 15);
|
|
62
75
|
i0.ɵɵelementEnd();
|
|
63
|
-
i0.ɵɵelementStart(
|
|
64
|
-
i0.ɵɵlistener("click", function
|
|
65
|
-
i0.ɵɵtext(
|
|
76
|
+
i0.ɵɵelementStart(35, "mj-dialog-actions")(36, "button", 16);
|
|
77
|
+
i0.ɵɵlistener("click", function ArtifactCreateModalComponent_Conditional_0_Template_button_click_36_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancel()); });
|
|
78
|
+
i0.ɵɵtext(37, " Cancel ");
|
|
66
79
|
i0.ɵɵelementEnd();
|
|
67
|
-
i0.ɵɵelementStart(
|
|
68
|
-
i0.ɵɵlistener("click", function
|
|
69
|
-
i0.ɵɵtext(
|
|
80
|
+
i0.ɵɵelementStart(38, "button", 17);
|
|
81
|
+
i0.ɵɵlistener("click", function ArtifactCreateModalComponent_Conditional_0_Template_button_click_38_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSave()); });
|
|
82
|
+
i0.ɵɵtext(39);
|
|
70
83
|
i0.ɵɵelementEnd()()();
|
|
71
84
|
} if (rf & 2) {
|
|
72
85
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
73
|
-
i0.ɵɵproperty("
|
|
86
|
+
i0.ɵɵproperty("Width", 600)("MinWidth", 400)("Visible", true);
|
|
74
87
|
i0.ɵɵadvance(7);
|
|
75
88
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formData.name);
|
|
76
89
|
i0.ɵɵadvance(7);
|
|
77
|
-
i0.ɵɵproperty("
|
|
78
|
-
i0.ɵɵ
|
|
79
|
-
i0.ɵɵ
|
|
80
|
-
i0.ɵɵadvance(
|
|
90
|
+
i0.ɵɵproperty("ngModel", (ctx_r1.formData.selectedType == null ? null : ctx_r1.formData.selectedType.ID) || "")("disabled", ctx_r1.isLoadingTypes);
|
|
91
|
+
i0.ɵɵadvance(3);
|
|
92
|
+
i0.ɵɵrepeater(ctx_r1.artifactTypes);
|
|
93
|
+
i0.ɵɵadvance(5);
|
|
81
94
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formData.description);
|
|
82
95
|
i0.ɵɵadvance(7);
|
|
83
96
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formData.content);
|
|
84
97
|
i0.ɵɵadvance(5);
|
|
85
|
-
i0.ɵɵconditional(ctx_r1.errorMessage ?
|
|
98
|
+
i0.ɵɵconditional(ctx_r1.errorMessage ? 34 : -1);
|
|
86
99
|
i0.ɵɵadvance(2);
|
|
87
100
|
i0.ɵɵproperty("disabled", ctx_r1.isSaving);
|
|
88
101
|
i0.ɵɵadvance(2);
|
|
89
|
-
i0.ɵɵproperty("
|
|
102
|
+
i0.ɵɵproperty("disabled", !ctx_r1.canSave || ctx_r1.isSaving);
|
|
90
103
|
i0.ɵɵadvance();
|
|
91
104
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.isSaving ? "Creating..." : "Create Artifact", " ");
|
|
92
105
|
} }
|
|
@@ -161,6 +174,9 @@ export class ArtifactCreateModalComponent {
|
|
|
161
174
|
this.cdr.detectChanges(); // zone.js 0.15: async RunView doesn't trigger CD
|
|
162
175
|
}
|
|
163
176
|
}
|
|
177
|
+
onTypeSelected(typeId) {
|
|
178
|
+
this.formData.selectedType = this.artifactTypes.find(t => UUIDsEqual(t.ID, typeId)) || null;
|
|
179
|
+
}
|
|
164
180
|
async onSave() {
|
|
165
181
|
if (!this.canSave)
|
|
166
182
|
return;
|
|
@@ -249,21 +265,22 @@ export class ArtifactCreateModalComponent {
|
|
|
249
265
|
this.errorMessage = '';
|
|
250
266
|
}
|
|
251
267
|
static ɵfac = function ArtifactCreateModalComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ArtifactCreateModalComponent)(i0.ɵɵdirectiveInject(i1.ToastService), i0.ɵɵdirectiveInject(i2.CollectionPermissionService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
252
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ArtifactCreateModalComponent, selectors: [["mj-artifact-create-modal"]], inputs: { isOpen: "isOpen", collectionId: "collectionId", environmentId: "environmentId", currentUser: "currentUser" }, outputs: { saved: "saved", cancelled: "cancelled" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["nameInput", ""], ["
|
|
253
|
-
i0.ɵɵconditionalCreate(0, ArtifactCreateModalComponent_Conditional_0_Template,
|
|
268
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ArtifactCreateModalComponent, selectors: [["mj-artifact-create-modal"]], inputs: { isOpen: "isOpen", collectionId: "collectionId", environmentId: "environmentId", currentUser: "currentUser" }, outputs: { saved: "saved", cancelled: "cancelled" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["nameInput", ""], ["Title", "Create Artifact", 3, "Width", "MinWidth", "Visible"], ["Title", "Create Artifact", 3, "Close", "Width", "MinWidth", "Visible"], [1, "artifact-form"], [1, "form-group"], [1, "form-label"], [1, "required"], ["type", "text", "placeholder", "Artifact name", 1, "k-textbox", "form-control", 3, "ngModelChange", "ngModel"], [1, "form-control", "mj-select", 3, "ngModelChange", "ngModel", "disabled"], ["value", "", "disabled", ""], [3, "value"], ["placeholder", "Optional description", "rows", "2", 1, "k-textarea", "form-control", 3, "ngModelChange", "ngModel"], ["placeholder", "Paste your content here...", "rows", "12", 1, "k-textarea", "form-control", "content-area", 3, "ngModelChange", "ngModel"], [1, "content-hint"], [1, "fas", "fa-info-circle"], [1, "form-error"], ["mjButton", "", 3, "click", "disabled"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], [1, "fas", "fa-exclamation-circle"]], template: function ArtifactCreateModalComponent_Template(rf, ctx) { if (rf & 1) {
|
|
269
|
+
i0.ɵɵconditionalCreate(0, ArtifactCreateModalComponent_Conditional_0_Template, 40, 12, "mj-dialog", 1);
|
|
254
270
|
} if (rf & 2) {
|
|
255
271
|
i0.ɵɵconditional(ctx.isOpen ? 0 : -1);
|
|
256
|
-
} }, dependencies: [i3.DefaultValueAccessor, i3.NgControlStatus, i3.NgModel, i4.
|
|
272
|
+
} }, dependencies: [i3.NgSelectOption, i3.ɵNgSelectMultipleOption, i3.DefaultValueAccessor, i3.SelectControlValueAccessor, i3.NgControlStatus, i3.NgModel, i4.MJButtonDirective, i4.MJDialogComponent, i4.MJDialogActionsComponent], styles: [".artifact-form[_ngcontent-%COMP%] {\n padding: 20px 0;\n }\n\n .form-group[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n }\n\n .form-label[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 8px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .required[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n }\n\n .form-control[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .content-area[_ngcontent-%COMP%] {\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace;\n font-size: 13px;\n line-height: 1.5;\n }\n\n .content-hint[_ngcontent-%COMP%] {\n display: flex;\n align-items: start;\n gap: 8px;\n margin-top: 8px;\n padding: 8px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-brand-primary);\n }\n\n .content-hint[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n flex-shrink: 0;\n margin-top: 2px;\n }\n\n .form-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n border-radius: 6px;\n color: var(--mj-status-error);\n font-size: 14px;\n }\n\n .form-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n flex-shrink: 0;\n }"] });
|
|
257
273
|
}
|
|
258
274
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ArtifactCreateModalComponent, [{
|
|
259
275
|
type: Component,
|
|
260
276
|
args: [{ standalone: false, selector: 'mj-artifact-create-modal', template: `
|
|
261
277
|
@if (isOpen) {
|
|
262
|
-
<
|
|
263
|
-
|
|
264
|
-
(
|
|
265
|
-
[
|
|
266
|
-
[
|
|
278
|
+
<mj-dialog
|
|
279
|
+
Title="Create Artifact"
|
|
280
|
+
(Close)="onCancel()"
|
|
281
|
+
[Width]="600"
|
|
282
|
+
[MinWidth]="400"
|
|
283
|
+
[Visible]="true">
|
|
267
284
|
<div class="artifact-form">
|
|
268
285
|
<div class="form-group">
|
|
269
286
|
<label class="form-label">
|
|
@@ -280,15 +297,16 @@ export class ArtifactCreateModalComponent {
|
|
|
280
297
|
<label class="form-label">
|
|
281
298
|
Type <span class="required">*</span>
|
|
282
299
|
</label>
|
|
283
|
-
<
|
|
284
|
-
[
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
300
|
+
<select
|
|
301
|
+
[ngModel]="formData.selectedType?.ID || ''"
|
|
302
|
+
(ngModelChange)="onTypeSelected($event)"
|
|
303
|
+
class="form-control mj-select"
|
|
304
|
+
[disabled]="isLoadingTypes">
|
|
305
|
+
<option value="" disabled>Select a type...</option>
|
|
306
|
+
@for (type of artifactTypes; track type.ID) {
|
|
307
|
+
<option [value]="type.ID">{{ type.Name }}</option>
|
|
308
|
+
}
|
|
309
|
+
</select>
|
|
292
310
|
</div>
|
|
293
311
|
<div class="form-group">
|
|
294
312
|
<label class="form-label">Description</label>
|
|
@@ -321,18 +339,18 @@ export class ArtifactCreateModalComponent {
|
|
|
321
339
|
</div>
|
|
322
340
|
}
|
|
323
341
|
</div>
|
|
324
|
-
<
|
|
325
|
-
<button
|
|
342
|
+
<mj-dialog-actions>
|
|
343
|
+
<button mjButton (click)="onCancel()" [disabled]="isSaving">
|
|
326
344
|
Cancel
|
|
327
345
|
</button>
|
|
328
|
-
<button
|
|
329
|
-
|
|
346
|
+
<button mjButton
|
|
347
|
+
variant="primary"
|
|
330
348
|
(click)="onSave()"
|
|
331
349
|
[disabled]="!canSave || isSaving">
|
|
332
350
|
{{ isSaving ? 'Creating...' : 'Create Artifact' }}
|
|
333
351
|
</button>
|
|
334
|
-
</
|
|
335
|
-
</
|
|
352
|
+
</mj-dialog-actions>
|
|
353
|
+
</mj-dialog>
|
|
336
354
|
}
|
|
337
355
|
`, styles: ["\n .artifact-form {\n padding: 20px 0;\n }\n\n .form-group {\n margin-bottom: 20px;\n }\n\n .form-label {\n display: block;\n margin-bottom: 8px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .required {\n color: var(--mj-status-error);\n }\n\n .form-control {\n width: 100%;\n }\n\n .content-area {\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace;\n font-size: 13px;\n line-height: 1.5;\n }\n\n .content-hint {\n display: flex;\n align-items: start;\n gap: 8px;\n margin-top: 8px;\n padding: 8px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-brand-primary);\n }\n\n .content-hint i {\n flex-shrink: 0;\n margin-top: 2px;\n }\n\n .form-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n border-radius: 6px;\n color: var(--mj-status-error);\n font-size: 14px;\n }\n\n .form-error i {\n flex-shrink: 0;\n }\n "] }]
|
|
338
356
|
}], () => [{ type: i1.ToastService }, { type: i2.CollectionPermissionService }, { type: i0.ChangeDetectorRef }], { isOpen: [{
|
|
@@ -348,5 +366,5 @@ export class ArtifactCreateModalComponent {
|
|
|
348
366
|
}], cancelled: [{
|
|
349
367
|
type: Output
|
|
350
368
|
}] }); })();
|
|
351
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ArtifactCreateModalComponent, { className: "ArtifactCreateModalComponent", filePath: "src/lib/components/collection/artifact-create-modal.component.ts", lineNumber:
|
|
369
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ArtifactCreateModalComponent, { className: "ArtifactCreateModalComponent", filePath: "src/lib/components/collection/artifact-create-modal.component.ts", lineNumber: 159 }); })();
|
|
352
370
|
//# sourceMappingURL=artifact-create-modal.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-create-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/collection/artifact-create-modal.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAA+C,MAAM,eAAe,CAAC;AACpH,OAAO,EAAY,QAAQ,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAInE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;;;;;;;;;IAkExC,+BAAwB;IACtB,wBAAyC;IACzC,YACF;IAAA,iBAAM;;;IADJ,eACF;IADE,oDACF;;;;IA3DN,uCAImB;IAFjB,sMAAS,iBAAU,KAAC;IAKhB,AADF,AADF,8BAA2B,aACD,eACI;IACxB,sBAAK;IAAA,+BAAuB;IAAA,iBAAC;IAC/B,AAD+B,iBAAO,EAC9B;IACR,mCAKa;IAFX,8TAA2B;IAG/B,AANE,iBAKa,EACT;IAEJ,AADF,8BAAwB,gBACI;IACxB,uBAAK;IAAA,gCAAuB;IAAA,kBAAC;IAC/B,AAD+B,iBAAO,EAC9B;IACR,8CAO6B;IAL3B,4VAAmC;IAOvC,AADE,iBAAqB,EACjB;IAEJ,AADF,+BAAwB,gBACI;IAAA,4BAAW;IAAA,iBAAQ;IAC7C,oCAIW;IAFT,gVAAkC;IAGpC,6BAAA;IACF,AADE,iBAAW,EACP;IAEJ,AADF,+BAAwB,gBACI;IACxB,0BAAQ;IAAA,gCAAuB;IAAA,kBAAC;IAClC,AADkC,iBAAO,EACjC;IACR,qCAIY;IAFV,wUAA8B;IAGhC,6BAAA;IAAA,iBAAW;IACX,gCAA0B;IACxB,yBAAkC;IAClC,8FACF;IACF,AADE,iBAAM,EACF;IACN,+GAAoB;IAMtB,iBAAM;IAEJ,AADF,6CAAsB,kBAC2C;IAA3C,iMAAS,iBAAU,KAAC;IACtC,yBACF;IAAA,iBAAS;IACT,mCAGoC;IADlC,iMAAS,eAAQ,KAAC;IAElB,aACF;IAEJ,AADE,AADE,iBAAS,EACY,EACV;;;IArEb,AADA,2BAAa,iBACG;IASV,eAA2B;IAA3B,oDAA2B;IAS3B,eAAsB;IAAtB,2CAAsB;IACtB,4DAAmC;IAKnC,AAFA,sCAAwB,kCAEE;IAO1B,eAAkC;IAAlC,2DAAkC;IAWlC,eAA8B;IAA9B,uDAA8B;IASlC,eAKC;IALD,+CAKC;IAGwC,eAAqB;IAArB,0CAAqB;IAI5D,eAAgB;IAEhB,AAFA,8BAAgB,gDAEiB;IACjC,cACF;IADE,oFACF;;AA/EV;;GAEG;AAmJH,MAAM,OAAO,4BAA4B;IAsB7B;IACA;IACA;IAvBD,MAAM,GAAY,KAAK,CAAC;IACxB,YAAY,CAAU;IACtB,aAAa,CAAU;IACvB,WAAW,CAAY;IAEtB,KAAK,GAAG,IAAI,YAAY,EAAoB,CAAC;IAC7C,SAAS,GAAG,IAAI,YAAY,EAAQ,CAAC;IAExC,QAAQ,GAAG;QAChB,IAAI,EAAE,EAAE;QACR,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,EAAE;QACX,YAAY,EAAE,IAAmC;KAClD,CAAC;IAEK,aAAa,GAA2B,EAAE,CAAC;IAC3C,cAAc,GAAY,KAAK,CAAC;IAChC,QAAQ,GAAY,KAAK,CAAC;IAC1B,YAAY,GAAW,EAAE,CAAC;IAEjC,YACU,YAA0B,EAC1B,iBAA8C,EAC9C,GAAsB;QAFtB,iBAAY,GAAZ,YAAY,CAAc;QAC1B,sBAAiB,GAAjB,iBAAiB,CAA6B;QAC9C,QAAG,GAAH,GAAG,CAAmB;IAC7B,CAAC;IAEJ,WAAW,CAAC,OAAsB;QAChC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACrC,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YACpC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YACvC,IAAI,CAAC,QAAQ,CAAC,YAAY,KAAK,IAAI,CAAC;IAC7C,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAC7B;gBACE,UAAU,EAAE,oBAAoB;gBAChC,WAAW,EAAE,aAAa;gBAC1B,OAAO,EAAE,UAAU;gBACnB,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,eAAe;aAC5B,EACD,IAAI,CAAC,WAAW,CACjB,CAAC;YAEF,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACrC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC;gBACpC,kCAAkC;gBAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;gBAC1F,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,QAAQ,CAAC;gBACxC,CAAC;qBAAM,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzC,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;YACtD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC3D,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,iDAAiD;QAC7E,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAE1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAEvB,IAAI,CAAC;YACH,qDAAqD;YACrD,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,eAAe,CAAqB,iBAAiB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACrG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAEzC,kDAAkD;YAClD,IAAI,UAAU,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC/E,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAC7D,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,WAAW,CAAC,EAAE,EACnB,IAAI,CAAC,WAAW,CACjB,CAAC;gBAEF,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;oBACzB,IAAI,CAAC,YAAY,GAAG,sEAAsE,CAAC;oBAC3F,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;oBACtB,OAAO;gBACT,CAAC;YACH,CAAC;YAED,8BAA8B;YAC9B,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,eAAe,CAAmB,eAAe,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAC/F,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1C,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;YAChE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAa,CAAC,EAAE,CAAC;YACjD,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YAC5C,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAEtC,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,YAAY,EAAE,OAAO,IAAI,2BAA2B,CAAC;gBAClF,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC3C,OAAO;YACT,CAAC;YAED,mCAAmC;YACnC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,eAAe,CAA0B,uBAAuB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAC7G,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC;YAC1B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC/C,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,wBAAwB;YAClE,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;YAE/D,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YAC1C,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,0DAA0D;gBAC1D,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACxB,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,OAAO,IAAI,mCAAmC,CAAC;gBACzF,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC3C,OAAO;YACT,CAAC;YAED,4BAA4B;YAC5B,MAAM,kBAAkB,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,0BAA0B,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACjG,kBAA0B,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;YAC5D,kBAA0B,CAAC,iBAAiB,GAAG,OAAO,CAAC,EAAE,CAAC;YAE3D,MAAM,mBAAmB,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,CAAC;YAC5D,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACzB,iEAAiE;gBACjE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;gBACvB,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACxB,IAAI,CAAC,YAAY,GAAG,sCAAsC,CAAC;gBAC3D,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC3C,OAAO;YACT,CAAC;YAED,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;YAC3D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1B,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;YACjD,IAAI,CAAC,YAAY,GAAG,8BAA8B,CAAC;YACnD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7C,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,QAAQ,GAAG;YACd,IAAI,EAAE,EAAE;YACR,WAAW,EAAE,EAAE;YACf,OAAO,EAAE,EAAE;YACX,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;SAC3E,CAAC;QACF,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;IACzB,CAAC;sHA9KU,4BAA4B;6DAA5B,4BAA4B;YA9IrC,yGAAc;;YAAd,qCA2EC;;;iFAmEQ,4BAA4B;cAlJxC,SAAS;6BACI,KAAK,YACP,0BAA0B,YAC1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA6EP;;kBAmEF,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAEL,MAAM;;kBACN,MAAM;;kFAPI,4BAA4B","sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';\nimport { UserInfo, Metadata, RunView } from '@memberjunction/core';\nimport { MJArtifactEntity, MJArtifactTypeEntity, MJArtifactVersionEntity, MJCollectionEntity } from '@memberjunction/core-entities';\nimport { ToastService } from '../../services/toast.service';\nimport { CollectionPermissionService } from '../../services/collection-permission.service';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Modal for creating new artifacts and adding them to collections\n */\n@Component({\n standalone: false,\n selector: 'mj-artifact-create-modal',\n template: `\n @if (isOpen) {\n <kendo-dialog\n title=\"Create Artifact\"\n (close)=\"onCancel()\"\n [width]=\"600\"\n [minWidth]=\"400\">\n <div class=\"artifact-form\">\n <div class=\"form-group\">\n <label class=\"form-label\">\n Name <span class=\"required\">*</span>\n </label>\n <input\n type=\"text\"\n class=\"k-textbox form-control\"\n [(ngModel)]=\"formData.name\"\n placeholder=\"Artifact name\"\n #nameInput>\n </div>\n <div class=\"form-group\">\n <label class=\"form-label\">\n Type <span class=\"required\">*</span>\n </label>\n <kendo-dropdownlist\n [data]=\"artifactTypes\"\n [(ngModel)]=\"formData.selectedType\"\n textField=\"Name\"\n valueField=\"ID\"\n [valuePrimitive]=\"false\"\n class=\"form-control\"\n [loading]=\"isLoadingTypes\">\n </kendo-dropdownlist>\n </div>\n <div class=\"form-group\">\n <label class=\"form-label\">Description</label>\n <textarea\n class=\"k-textarea form-control\"\n [(ngModel)]=\"formData.description\"\n placeholder=\"Optional description\"\n rows=\"2\">\n </textarea>\n </div>\n <div class=\"form-group\">\n <label class=\"form-label\">\n Content <span class=\"required\">*</span>\n </label>\n <textarea\n class=\"k-textarea form-control content-area\"\n [(ngModel)]=\"formData.content\"\n placeholder=\"Paste your content here...\"\n rows=\"12\">\n </textarea>\n <div class=\"content-hint\">\n <i class=\"fas fa-info-circle\"></i>\n Paste or type the artifact content. The content will be saved as version 1.\n </div>\n </div>\n @if (errorMessage) {\n <div class=\"form-error\">\n <i class=\"fas fa-exclamation-circle\"></i>\n {{ errorMessage }}\n </div>\n }\n </div>\n <kendo-dialog-actions>\n <button kendoButton (click)=\"onCancel()\" [disabled]=\"isSaving\">\n Cancel\n </button>\n <button kendoButton\n [primary]=\"true\"\n (click)=\"onSave()\"\n [disabled]=\"!canSave || isSaving\">\n {{ isSaving ? 'Creating...' : 'Create Artifact' }}\n </button>\n </kendo-dialog-actions>\n </kendo-dialog>\n }\n `,\n styles: [`\n .artifact-form {\n padding: 20px 0;\n }\n\n .form-group {\n margin-bottom: 20px;\n }\n\n .form-label {\n display: block;\n margin-bottom: 8px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .required {\n color: var(--mj-status-error);\n }\n\n .form-control {\n width: 100%;\n }\n\n .content-area {\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace;\n font-size: 13px;\n line-height: 1.5;\n }\n\n .content-hint {\n display: flex;\n align-items: start;\n gap: 8px;\n margin-top: 8px;\n padding: 8px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-brand-primary);\n }\n\n .content-hint i {\n flex-shrink: 0;\n margin-top: 2px;\n }\n\n .form-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n border-radius: 6px;\n color: var(--mj-status-error);\n font-size: 14px;\n }\n\n .form-error i {\n flex-shrink: 0;\n }\n `]\n})\nexport class ArtifactCreateModalComponent implements OnChanges {\n @Input() isOpen: boolean = false;\n @Input() collectionId!: string;\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n\n @Output() saved = new EventEmitter<MJArtifactEntity>();\n @Output() cancelled = new EventEmitter<void>();\n\n public formData = {\n name: '',\n description: '',\n content: '',\n selectedType: null as MJArtifactTypeEntity | null\n };\n\n public artifactTypes: MJArtifactTypeEntity[] = [];\n public isLoadingTypes: boolean = false;\n public isSaving: boolean = false;\n public errorMessage: string = '';\n\n constructor(\n private toastService: ToastService,\n private permissionService: CollectionPermissionService,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['isOpen'] && this.isOpen) {\n this.resetForm();\n this.loadArtifactTypes();\n }\n }\n\n get canSave(): boolean {\n return this.formData.name.trim().length > 0 &&\n this.formData.content.trim().length > 0 &&\n this.formData.selectedType !== null;\n }\n\n private async loadArtifactTypes(): Promise<void> {\n this.isLoadingTypes = true;\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJArtifactTypeEntity>(\n {\n EntityName: 'MJ: Artifact Types',\n ExtraFilter: 'IsEnabled=1',\n OrderBy: 'Name ASC',\n MaxRows: 1000,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (result.Success && result.Results) {\n this.artifactTypes = result.Results;\n // Default to \"Text\" or first type\n const textType = this.artifactTypes.find(t => t.Name === 'Text' || t.Name === 'Markdown');\n if (textType) {\n this.formData.selectedType = textType;\n } else if (this.artifactTypes.length > 0) {\n this.formData.selectedType = this.artifactTypes[0];\n }\n }\n } catch (error) {\n console.error('Error loading artifact types:', error);\n this.toastService.error('Failed to load artifact types');\n } finally {\n this.isLoadingTypes = false;\n this.cdr.detectChanges(); // zone.js 0.15: async RunView doesn't trigger CD\n }\n }\n\n async onSave(): Promise<void> {\n if (!this.canSave) return;\n\n this.isSaving = true;\n this.errorMessage = '';\n\n try {\n // Validate permission to add artifacts to collection\n const md = new Metadata();\n const collection = await md.GetEntityObject<MJCollectionEntity>('MJ: Collections', this.currentUser);\n await collection.Load(this.collectionId);\n\n // Check if user has Edit permission on collection\n if (collection.OwnerID && !UUIDsEqual(collection.OwnerID, this.currentUser.ID)) {\n const permission = await this.permissionService.checkPermission(\n this.collectionId,\n this.currentUser.ID,\n this.currentUser\n );\n\n if (!permission?.canEdit) {\n this.errorMessage = 'You do not have Edit permission to add artifacts to this collection.';\n this.isSaving = false;\n return;\n }\n }\n\n // Step 1: Create the artifact\n const artifact = await md.GetEntityObject<MJArtifactEntity>('MJ: Artifacts', this.currentUser);\n artifact.Name = this.formData.name.trim();\n artifact.Description = this.formData.description.trim() || null;\n artifact.TypeID = this.formData.selectedType!.ID;\n artifact.EnvironmentID = this.environmentId;\n artifact.UserID = this.currentUser.ID;\n\n const artifactSaved = await artifact.Save();\n if (!artifactSaved) {\n this.errorMessage = artifact.LatestResult?.Message || 'Failed to create artifact';\n this.toastService.error(this.errorMessage);\n return;\n }\n\n // Step 2: Create the first version\n const version = await md.GetEntityObject<MJArtifactVersionEntity>('MJ: Artifact Versions', this.currentUser);\n version.ArtifactID = artifact.ID;\n version.VersionNumber = 1;\n version.Content = this.formData.content.trim();\n version.UserID = this.currentUser.ID;\n version.Name = this.formData.name.trim(); // Version inherits name\n version.Description = this.formData.description.trim() || null;\n\n const versionSaved = await version.Save();\n if (!versionSaved) {\n // Rollback: delete the artifact if version creation fails\n await artifact.Delete();\n this.errorMessage = version.LatestResult?.Message || 'Failed to create artifact version';\n this.toastService.error(this.errorMessage);\n return;\n }\n\n // Step 3: Add to collection\n const collectionArtifact = await md.GetEntityObject('MJ: Collection Artifacts', this.currentUser);\n (collectionArtifact as any).CollectionID = this.collectionId;\n (collectionArtifact as any).ArtifactVersionID = version.ID;\n\n const collectionLinkSaved = await collectionArtifact.Save();\n if (!collectionLinkSaved) {\n // Rollback: delete version and artifact if collection link fails\n await version.Delete();\n await artifact.Delete();\n this.errorMessage = 'Failed to add artifact to collection';\n this.toastService.error(this.errorMessage);\n return;\n }\n\n this.toastService.success('Artifact created successfully');\n this.saved.emit(artifact);\n this.resetForm();\n } catch (error) {\n console.error('Error creating artifact:', error);\n this.errorMessage = 'An unexpected error occurred';\n this.toastService.error(this.errorMessage);\n } finally {\n this.isSaving = false;\n }\n }\n\n onCancel(): void {\n this.resetForm();\n this.cancelled.emit();\n }\n\n private resetForm(): void {\n this.formData = {\n name: '',\n description: '',\n content: '',\n selectedType: this.artifactTypes.length > 0 ? this.artifactTypes[0] : null\n };\n this.errorMessage = '';\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"artifact-create-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/collection/artifact-create-modal.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';\nimport { UserInfo, Metadata, RunView } from '@memberjunction/core';\nimport { MJArtifactEntity, MJArtifactTypeEntity, MJArtifactVersionEntity, MJCollectionEntity } from '@memberjunction/core-entities';\nimport { ToastService } from '../../services/toast.service';\nimport { CollectionPermissionService } from '../../services/collection-permission.service';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Modal for creating new artifacts and adding them to collections\n */\n@Component({\n standalone: false,\n selector: 'mj-artifact-create-modal',\n template: `\n @if (isOpen) {\n <mj-dialog\n Title=\"Create Artifact\"\n (Close)=\"onCancel()\"\n [Width]=\"600\"\n [MinWidth]=\"400\"\n [Visible]=\"true\">\n <div class=\"artifact-form\">\n <div class=\"form-group\">\n <label class=\"form-label\">\n Name <span class=\"required\">*</span>\n </label>\n <input\n type=\"text\"\n class=\"k-textbox form-control\"\n [(ngModel)]=\"formData.name\"\n placeholder=\"Artifact name\"\n #nameInput>\n </div>\n <div class=\"form-group\">\n <label class=\"form-label\">\n Type <span class=\"required\">*</span>\n </label>\n <select\n [ngModel]=\"formData.selectedType?.ID || ''\"\n (ngModelChange)=\"onTypeSelected($event)\"\n class=\"form-control mj-select\"\n [disabled]=\"isLoadingTypes\">\n <option value=\"\" disabled>Select a type...</option>\n @for (type of artifactTypes; track type.ID) {\n <option [value]=\"type.ID\">{{ type.Name }}</option>\n }\n </select>\n </div>\n <div class=\"form-group\">\n <label class=\"form-label\">Description</label>\n <textarea\n class=\"k-textarea form-control\"\n [(ngModel)]=\"formData.description\"\n placeholder=\"Optional description\"\n rows=\"2\">\n </textarea>\n </div>\n <div class=\"form-group\">\n <label class=\"form-label\">\n Content <span class=\"required\">*</span>\n </label>\n <textarea\n class=\"k-textarea form-control content-area\"\n [(ngModel)]=\"formData.content\"\n placeholder=\"Paste your content here...\"\n rows=\"12\">\n </textarea>\n <div class=\"content-hint\">\n <i class=\"fas fa-info-circle\"></i>\n Paste or type the artifact content. The content will be saved as version 1.\n </div>\n </div>\n @if (errorMessage) {\n <div class=\"form-error\">\n <i class=\"fas fa-exclamation-circle\"></i>\n {{ errorMessage }}\n </div>\n }\n </div>\n <mj-dialog-actions>\n <button mjButton (click)=\"onCancel()\" [disabled]=\"isSaving\">\n Cancel\n </button>\n <button mjButton\n variant=\"primary\"\n (click)=\"onSave()\"\n [disabled]=\"!canSave || isSaving\">\n {{ isSaving ? 'Creating...' : 'Create Artifact' }}\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n `,\n styles: [`\n .artifact-form {\n padding: 20px 0;\n }\n\n .form-group {\n margin-bottom: 20px;\n }\n\n .form-label {\n display: block;\n margin-bottom: 8px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .required {\n color: var(--mj-status-error);\n }\n\n .form-control {\n width: 100%;\n }\n\n .content-area {\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace;\n font-size: 13px;\n line-height: 1.5;\n }\n\n .content-hint {\n display: flex;\n align-items: start;\n gap: 8px;\n margin-top: 8px;\n padding: 8px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-brand-primary);\n }\n\n .content-hint i {\n flex-shrink: 0;\n margin-top: 2px;\n }\n\n .form-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n border-radius: 6px;\n color: var(--mj-status-error);\n font-size: 14px;\n }\n\n .form-error i {\n flex-shrink: 0;\n }\n `]\n})\nexport class ArtifactCreateModalComponent implements OnChanges {\n @Input() isOpen: boolean = false;\n @Input() collectionId!: string;\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n\n @Output() saved = new EventEmitter<MJArtifactEntity>();\n @Output() cancelled = new EventEmitter<void>();\n\n public formData = {\n name: '',\n description: '',\n content: '',\n selectedType: null as MJArtifactTypeEntity | null\n };\n\n public artifactTypes: MJArtifactTypeEntity[] = [];\n public isLoadingTypes: boolean = false;\n public isSaving: boolean = false;\n public errorMessage: string = '';\n\n constructor(\n private toastService: ToastService,\n private permissionService: CollectionPermissionService,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['isOpen'] && this.isOpen) {\n this.resetForm();\n this.loadArtifactTypes();\n }\n }\n\n get canSave(): boolean {\n return this.formData.name.trim().length > 0 &&\n this.formData.content.trim().length > 0 &&\n this.formData.selectedType !== null;\n }\n\n private async loadArtifactTypes(): Promise<void> {\n this.isLoadingTypes = true;\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJArtifactTypeEntity>(\n {\n EntityName: 'MJ: Artifact Types',\n ExtraFilter: 'IsEnabled=1',\n OrderBy: 'Name ASC',\n MaxRows: 1000,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (result.Success && result.Results) {\n this.artifactTypes = result.Results;\n // Default to \"Text\" or first type\n const textType = this.artifactTypes.find(t => t.Name === 'Text' || t.Name === 'Markdown');\n if (textType) {\n this.formData.selectedType = textType;\n } else if (this.artifactTypes.length > 0) {\n this.formData.selectedType = this.artifactTypes[0];\n }\n }\n } catch (error) {\n console.error('Error loading artifact types:', error);\n this.toastService.error('Failed to load artifact types');\n } finally {\n this.isLoadingTypes = false;\n this.cdr.detectChanges(); // zone.js 0.15: async RunView doesn't trigger CD\n }\n }\n\n onTypeSelected(typeId: string): void {\n this.formData.selectedType = this.artifactTypes.find(t => UUIDsEqual(t.ID, typeId)) || null;\n }\n\n async onSave(): Promise<void> {\n if (!this.canSave) return;\n\n this.isSaving = true;\n this.errorMessage = '';\n\n try {\n // Validate permission to add artifacts to collection\n const md = new Metadata();\n const collection = await md.GetEntityObject<MJCollectionEntity>('MJ: Collections', this.currentUser);\n await collection.Load(this.collectionId);\n\n // Check if user has Edit permission on collection\n if (collection.OwnerID && !UUIDsEqual(collection.OwnerID, this.currentUser.ID)) {\n const permission = await this.permissionService.checkPermission(\n this.collectionId,\n this.currentUser.ID,\n this.currentUser\n );\n\n if (!permission?.canEdit) {\n this.errorMessage = 'You do not have Edit permission to add artifacts to this collection.';\n this.isSaving = false;\n return;\n }\n }\n\n // Step 1: Create the artifact\n const artifact = await md.GetEntityObject<MJArtifactEntity>('MJ: Artifacts', this.currentUser);\n artifact.Name = this.formData.name.trim();\n artifact.Description = this.formData.description.trim() || null;\n artifact.TypeID = this.formData.selectedType!.ID;\n artifact.EnvironmentID = this.environmentId;\n artifact.UserID = this.currentUser.ID;\n\n const artifactSaved = await artifact.Save();\n if (!artifactSaved) {\n this.errorMessage = artifact.LatestResult?.Message || 'Failed to create artifact';\n this.toastService.error(this.errorMessage);\n return;\n }\n\n // Step 2: Create the first version\n const version = await md.GetEntityObject<MJArtifactVersionEntity>('MJ: Artifact Versions', this.currentUser);\n version.ArtifactID = artifact.ID;\n version.VersionNumber = 1;\n version.Content = this.formData.content.trim();\n version.UserID = this.currentUser.ID;\n version.Name = this.formData.name.trim(); // Version inherits name\n version.Description = this.formData.description.trim() || null;\n\n const versionSaved = await version.Save();\n if (!versionSaved) {\n // Rollback: delete the artifact if version creation fails\n await artifact.Delete();\n this.errorMessage = version.LatestResult?.Message || 'Failed to create artifact version';\n this.toastService.error(this.errorMessage);\n return;\n }\n\n // Step 3: Add to collection\n const collectionArtifact = await md.GetEntityObject('MJ: Collection Artifacts', this.currentUser);\n (collectionArtifact as any).CollectionID = this.collectionId;\n (collectionArtifact as any).ArtifactVersionID = version.ID;\n\n const collectionLinkSaved = await collectionArtifact.Save();\n if (!collectionLinkSaved) {\n // Rollback: delete version and artifact if collection link fails\n await version.Delete();\n await artifact.Delete();\n this.errorMessage = 'Failed to add artifact to collection';\n this.toastService.error(this.errorMessage);\n return;\n }\n\n this.toastService.success('Artifact created successfully');\n this.saved.emit(artifact);\n this.resetForm();\n } catch (error) {\n console.error('Error creating artifact:', error);\n this.errorMessage = 'An unexpected error occurred';\n this.toastService.error(this.errorMessage);\n } finally {\n this.isSaving = false;\n }\n }\n\n onCancel(): void {\n this.resetForm();\n this.cancelled.emit();\n }\n\n private resetForm(): void {\n this.formData = {\n name: '',\n description: '',\n content: '',\n selectedType: this.artifactTypes.length > 0 ? this.artifactTypes[0] : null\n };\n this.errorMessage = '';\n }\n}\n"]}
|
|
@@ -3,6 +3,7 @@ import * as i0 from "@angular/core";
|
|
|
3
3
|
import * as i1 from "../../services/artifact-permission.service";
|
|
4
4
|
import * as i2 from "@memberjunction/ng-artifacts";
|
|
5
5
|
import * as i3 from "@angular/common";
|
|
6
|
+
import * as i4 from "@memberjunction/ng-ui-components";
|
|
6
7
|
function CollectionArtifactCardComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
7
8
|
i0.ɵɵelementStart(0, "span", 6);
|
|
8
9
|
i0.ɵɵtext(1);
|
|
@@ -121,7 +122,7 @@ export class CollectionArtifactCardComponent {
|
|
|
121
122
|
this.removed.emit(this.artifact);
|
|
122
123
|
}
|
|
123
124
|
static ɵfac = function CollectionArtifactCardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CollectionArtifactCardComponent)(i0.ɵɵdirectiveInject(i1.ArtifactPermissionService), i0.ɵɵdirectiveInject(i2.ArtifactIconService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
124
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CollectionArtifactCardComponent, selectors: [["mj-collection-artifact-card"]], inputs: { artifact: "artifact", version: "version", currentUser: "currentUser" }, outputs: { selected: "selected", viewed: "viewed", shared: "shared", edited: "edited", removed: "removed" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 19, vars: 9, consts: [[1, "artifact-card", 3, "click"], [1, "card-icon"], [1, "fas", 3, "ngClass"], [1, "card-content"], [1, "card-header"], [1, "artifact-name"], [1, "version-badge"], [1, "artifact-type"], [1, "artifact-description"], [1, "artifact-meta"], [1, "meta-item"], [1, "card-actions"], ["
|
|
125
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CollectionArtifactCardComponent, selectors: [["mj-collection-artifact-card"]], inputs: { artifact: "artifact", version: "version", currentUser: "currentUser" }, outputs: { selected: "selected", viewed: "viewed", shared: "shared", edited: "edited", removed: "removed" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 19, vars: 9, consts: [[1, "artifact-card", 3, "click"], [1, "card-icon"], [1, "fas", 3, "ngClass"], [1, "card-content"], [1, "card-header"], [1, "artifact-name"], [1, "version-badge"], [1, "artifact-type"], [1, "artifact-description"], [1, "artifact-meta"], [1, "meta-item"], [1, "card-actions"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "View", 3, "click"], [1, "fas", "fa-eye"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Share"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Edit"], ["mjButton", "", "variant", "danger", "size", "sm", "title", "Remove from collection"], [1, "fas", "fa-clock"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Share", 3, "click"], [1, "fas", "fa-share-nodes"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Edit", 3, "click"], [1, "fas", "fa-edit"], ["mjButton", "", "variant", "danger", "size", "sm", "title", "Remove from collection", 3, "click"], [1, "fas", "fa-times"]], template: function CollectionArtifactCardComponent_Template(rf, ctx) { if (rf & 1) {
|
|
125
126
|
i0.ɵɵelementStart(0, "div", 0);
|
|
126
127
|
i0.ɵɵlistener("click", function CollectionArtifactCardComponent_Template_div_click_0_listener() { return ctx.onSelect(); });
|
|
127
128
|
i0.ɵɵelementStart(1, "div", 1);
|
|
@@ -165,7 +166,7 @@ export class CollectionArtifactCardComponent {
|
|
|
165
166
|
i0.ɵɵconditional(ctx.canEdit ? 17 : -1);
|
|
166
167
|
i0.ɵɵadvance();
|
|
167
168
|
i0.ɵɵconditional(ctx.canEdit ? 18 : -1);
|
|
168
|
-
} }, dependencies: [i3.NgClass, i3.DatePipe], styles: [".artifact-card[_ngcontent-%COMP%] { display: flex; gap: 16px; padding: 16px; border: 1px solid var(--mj-border-default); border-radius: 8px; cursor: pointer; transition: all 150ms ease; background: var(--mj-bg-surface); }\n .artifact-card[_ngcontent-%COMP%]:hover { border-color: var(--mj-brand-primary); box-shadow: var(--mj-shadow-sm); }\n\n .card-icon[_ngcontent-%COMP%] { display: flex; align-items: center; justify-content: center; width: 48px; height: 48px; border-radius: 8px; background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); color: var(--mj-brand-primary); font-size: 20px; }\n\n .card-content[_ngcontent-%COMP%] { flex: 1; min-width: 0; }\n .card-header[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 12px; margin-bottom: 6px; }\n .artifact-name[_ngcontent-%COMP%] { margin: 0; font-size: 15px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .version-badge[_ngcontent-%COMP%] { padding: 2px 8px; background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface)); color: var(--mj-status-warning); border-radius: 3px; font-size: 11px; font-weight: 600; font-family: monospace; }\n .artifact-type[_ngcontent-%COMP%] { padding: 2px 8px; background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); color: var(--mj-brand-primary); border-radius: 3px; font-size: 11px; font-weight: 500; text-transform: uppercase; }\n\n .artifact-description[_ngcontent-%COMP%] { font-size: 13px; color: var(--mj-text-muted); margin-bottom: 8px; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }\n\n .artifact-meta[_ngcontent-%COMP%] { display: flex; gap: 16px; font-size: 12px; color: var(--mj-text-disabled); }\n .meta-item[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 4px; }\n\n .card-actions[_ngcontent-%COMP%] { display: none; align-items: center; gap: 4px; }\n .artifact-card[_ngcontent-%COMP%]:hover .card-actions[_ngcontent-%COMP%] { display: flex; }\n .action-btn[_ngcontent-%COMP%] { padding: 8px; background: transparent; border: none; cursor: pointer; border-radius: 4px; color: var(--mj-text-muted); transition: all 150ms ease; }\n .action-btn[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-sunken); color: var(--mj-brand-primary); }"] });
|
|
169
|
+
} }, dependencies: [i3.NgClass, i4.MJButtonDirective, i3.DatePipe], styles: [".artifact-card[_ngcontent-%COMP%] { display: flex; gap: 16px; padding: 16px; border: 1px solid var(--mj-border-default); border-radius: 8px; cursor: pointer; transition: all 150ms ease; background: var(--mj-bg-surface); }\n .artifact-card[_ngcontent-%COMP%]:hover { border-color: var(--mj-brand-primary); box-shadow: var(--mj-shadow-sm); }\n\n .card-icon[_ngcontent-%COMP%] { display: flex; align-items: center; justify-content: center; width: 48px; height: 48px; border-radius: 8px; background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); color: var(--mj-brand-primary); font-size: 20px; }\n\n .card-content[_ngcontent-%COMP%] { flex: 1; min-width: 0; }\n .card-header[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 12px; margin-bottom: 6px; }\n .artifact-name[_ngcontent-%COMP%] { margin: 0; font-size: 15px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .version-badge[_ngcontent-%COMP%] { padding: 2px 8px; background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface)); color: var(--mj-status-warning); border-radius: 3px; font-size: 11px; font-weight: 600; font-family: monospace; }\n .artifact-type[_ngcontent-%COMP%] { padding: 2px 8px; background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); color: var(--mj-brand-primary); border-radius: 3px; font-size: 11px; font-weight: 500; text-transform: uppercase; }\n\n .artifact-description[_ngcontent-%COMP%] { font-size: 13px; color: var(--mj-text-muted); margin-bottom: 8px; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }\n\n .artifact-meta[_ngcontent-%COMP%] { display: flex; gap: 16px; font-size: 12px; color: var(--mj-text-disabled); }\n .meta-item[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 4px; }\n\n .card-actions[_ngcontent-%COMP%] { display: none; align-items: center; gap: 4px; }\n .artifact-card[_ngcontent-%COMP%]:hover .card-actions[_ngcontent-%COMP%] { display: flex; }\n .action-btn[_ngcontent-%COMP%] { padding: 8px; background: transparent; border: none; cursor: pointer; border-radius: 4px; color: var(--mj-text-muted); transition: all 150ms ease; }\n .action-btn[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-sunken); color: var(--mj-brand-primary); }"] });
|
|
169
170
|
}
|
|
170
171
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CollectionArtifactCardComponent, [{
|
|
171
172
|
type: Component,
|
|
@@ -196,21 +197,21 @@ export class CollectionArtifactCardComponent {
|
|
|
196
197
|
</div>
|
|
197
198
|
</div>
|
|
198
199
|
<div class="card-actions">
|
|
199
|
-
<button
|
|
200
|
+
<button mjButton variant="flat" size="sm" (click)="onView($event)" title="View">
|
|
200
201
|
<i class="fas fa-eye"></i>
|
|
201
202
|
</button>
|
|
202
203
|
@if (canShare) {
|
|
203
|
-
<button
|
|
204
|
+
<button mjButton variant="flat" size="sm" (click)="onShare($event)" title="Share">
|
|
204
205
|
<i class="fas fa-share-nodes"></i>
|
|
205
206
|
</button>
|
|
206
207
|
}
|
|
207
208
|
@if (canEdit) {
|
|
208
|
-
<button
|
|
209
|
+
<button mjButton variant="flat" size="sm" (click)="onEdit($event)" title="Edit">
|
|
209
210
|
<i class="fas fa-edit"></i>
|
|
210
211
|
</button>
|
|
211
212
|
}
|
|
212
213
|
@if (canEdit) {
|
|
213
|
-
<button
|
|
214
|
+
<button mjButton variant="danger" size="sm" (click)="onRemove($event)" title="Remove from collection">
|
|
214
215
|
<i class="fas fa-times"></i>
|
|
215
216
|
</button>
|
|
216
217
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection-artifact-card.component.js","sourceRoot":"","sources":["../../../../src/lib/components/collection/collection-artifact-card.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';\nimport { MJArtifactEntity, MJArtifactVersionEntity } from '@memberjunction/core-entities';\nimport { UserInfo } from '@memberjunction/core';\nimport { ArtifactPermissionService } from '../../services/artifact-permission.service';\nimport { ArtifactIconService } from '@memberjunction/ng-artifacts';\n\n@Component({\n standalone: false,\n selector: 'mj-collection-artifact-card',\n template: `\n <div class=\"artifact-card\" (click)=\"onSelect()\">\n <div class=\"card-icon\">\n <i class=\"fas\" [ngClass]=\"getIconClass()\"></i>\n </div>\n <div class=\"card-content\">\n <div class=\"card-header\">\n <h4 class=\"artifact-name\">{{ artifact.Name }}</h4>\n @if (version) {\n <span class=\"version-badge\">v{{ version.VersionNumber }}</span>\n }\n <span class=\"artifact-type\">{{ artifact.Type }}</span>\n </div>\n @if (artifact.Description) {\n <div class=\"artifact-description\">\n {{ artifact.Description }}\n </div>\n }\n <div class=\"artifact-meta\">\n @if (version && version.__mj_UpdatedAt) {\n <span class=\"meta-item\">\n <i class=\"fas fa-clock\"></i> {{ version.__mj_UpdatedAt | date:'short' }}\n </span>\n }\n </div>\n </div>\n <div class=\"card-actions\">\n <button class=\"action-btn\" (click)=\"onView($event)\" title=\"View\">\n <i class=\"fas fa-eye\"></i>\n </button>\n @if (canShare) {\n <button class=\"action-btn\" (click)=\"onShare($event)\" title=\"Share\">\n <i class=\"fas fa-share-nodes\"></i>\n </button>\n }\n @if (canEdit) {\n <button class=\"action-btn\" (click)=\"onEdit($event)\" title=\"Edit\">\n <i class=\"fas fa-edit\"></i>\n </button>\n }\n @if (canEdit) {\n <button class=\"action-btn\" (click)=\"onRemove($event)\" title=\"Remove from collection\">\n <i class=\"fas fa-times\"></i>\n </button>\n }\n </div>\n </div>\n `,\n styles: [`\n .artifact-card { display: flex; gap: 16px; padding: 16px; border: 1px solid var(--mj-border-default); border-radius: 8px; cursor: pointer; transition: all 150ms ease; background: var(--mj-bg-surface); }\n .artifact-card:hover { border-color: var(--mj-brand-primary); box-shadow: var(--mj-shadow-sm); }\n\n .card-icon { display: flex; align-items: center; justify-content: center; width: 48px; height: 48px; border-radius: 8px; background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); color: var(--mj-brand-primary); font-size: 20px; }\n\n .card-content { flex: 1; min-width: 0; }\n .card-header { display: flex; align-items: center; gap: 12px; margin-bottom: 6px; }\n .artifact-name { margin: 0; font-size: 15px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .version-badge { padding: 2px 8px; background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface)); color: var(--mj-status-warning); border-radius: 3px; font-size: 11px; font-weight: 600; font-family: monospace; }\n .artifact-type { padding: 2px 8px; background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); color: var(--mj-brand-primary); border-radius: 3px; font-size: 11px; font-weight: 500; text-transform: uppercase; }\n\n .artifact-description { font-size: 13px; color: var(--mj-text-muted); margin-bottom: 8px; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }\n\n .artifact-meta { display: flex; gap: 16px; font-size: 12px; color: var(--mj-text-disabled); }\n .meta-item { display: flex; align-items: center; gap: 4px; }\n\n .card-actions { display: none; align-items: center; gap: 4px; }\n .artifact-card:hover .card-actions { display: flex; }\n .action-btn { padding: 8px; background: transparent; border: none; cursor: pointer; border-radius: 4px; color: var(--mj-text-muted); transition: all 150ms ease; }\n .action-btn:hover { background: var(--mj-bg-surface-sunken); color: var(--mj-brand-primary); }\n `]\n})\nexport class CollectionArtifactCardComponent implements OnInit, OnChanges {\n @Input() artifact!: MJArtifactEntity;\n @Input() version?: MJArtifactVersionEntity; // Optional version info\n @Input() currentUser!: UserInfo;\n\n @Output() selected = new EventEmitter<any>();\n @Output() viewed = new EventEmitter<any>();\n @Output() shared = new EventEmitter<any>();\n @Output() edited = new EventEmitter<any>();\n @Output() removed = new EventEmitter<any>();\n\n canShare: boolean = false;\n canEdit: boolean = false;\n\n constructor(\n private artifactPermissionService: ArtifactPermissionService,\n private artifactIconService: ArtifactIconService,\n private cdr: ChangeDetectorRef\n ) {}\n\n async ngOnInit(): Promise<void> {\n await this.loadPermissions();\n }\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n if (changes['artifact'] && !changes['artifact'].isFirstChange()) {\n await this.loadPermissions();\n }\n }\n\n private async loadPermissions(): Promise<void> {\n if (!this.artifact || !this.currentUser) return;\n\n try {\n this.canShare = await this.artifactPermissionService.checkPermission(\n this.artifact.ID,\n this.currentUser.ID,\n 'share',\n this.currentUser\n );\n\n this.canEdit = await this.artifactPermissionService.checkPermission(\n this.artifact.ID,\n this.currentUser.ID,\n 'edit',\n this.currentUser\n );\n } catch (err) {\n console.error('Error loading artifact permissions:', err);\n } finally {\n this.cdr.detectChanges(); // zone.js 0.15: async permission checks don't trigger CD\n }\n }\n\n /**\n * Get the icon for this artifact using the centralized icon service.\n * Fallback priority: Plugin icon > Metadata icon > Hardcoded mapping > Generic icon\n */\n getIconClass(): string {\n return this.artifactIconService.getArtifactIcon(this.artifact);\n }\n\n onSelect(): void {\n this.selected.emit(this.artifact);\n }\n\n onView(event: Event): void {\n event.stopPropagation();\n this.viewed.emit(this.artifact);\n }\n\n onShare(event: Event): void {\n event.stopPropagation();\n this.shared.emit(this.artifact);\n }\n\n onEdit(event: Event): void {\n event.stopPropagation();\n this.edited.emit(this.artifact);\n }\n\n onRemove(event: Event): void {\n event.stopPropagation();\n this.removed.emit(this.artifact);\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"collection-artifact-card.component.js","sourceRoot":"","sources":["../../../../src/lib/components/collection/collection-artifact-card.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';\nimport { MJArtifactEntity, MJArtifactVersionEntity } from '@memberjunction/core-entities';\nimport { UserInfo } from '@memberjunction/core';\nimport { ArtifactPermissionService } from '../../services/artifact-permission.service';\nimport { ArtifactIconService } from '@memberjunction/ng-artifacts';\n\n@Component({\n standalone: false,\n selector: 'mj-collection-artifact-card',\n template: `\n <div class=\"artifact-card\" (click)=\"onSelect()\">\n <div class=\"card-icon\">\n <i class=\"fas\" [ngClass]=\"getIconClass()\"></i>\n </div>\n <div class=\"card-content\">\n <div class=\"card-header\">\n <h4 class=\"artifact-name\">{{ artifact.Name }}</h4>\n @if (version) {\n <span class=\"version-badge\">v{{ version.VersionNumber }}</span>\n }\n <span class=\"artifact-type\">{{ artifact.Type }}</span>\n </div>\n @if (artifact.Description) {\n <div class=\"artifact-description\">\n {{ artifact.Description }}\n </div>\n }\n <div class=\"artifact-meta\">\n @if (version && version.__mj_UpdatedAt) {\n <span class=\"meta-item\">\n <i class=\"fas fa-clock\"></i> {{ version.__mj_UpdatedAt | date:'short' }}\n </span>\n }\n </div>\n </div>\n <div class=\"card-actions\">\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"onView($event)\" title=\"View\">\n <i class=\"fas fa-eye\"></i>\n </button>\n @if (canShare) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"onShare($event)\" title=\"Share\">\n <i class=\"fas fa-share-nodes\"></i>\n </button>\n }\n @if (canEdit) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"onEdit($event)\" title=\"Edit\">\n <i class=\"fas fa-edit\"></i>\n </button>\n }\n @if (canEdit) {\n <button mjButton variant=\"danger\" size=\"sm\" (click)=\"onRemove($event)\" title=\"Remove from collection\">\n <i class=\"fas fa-times\"></i>\n </button>\n }\n </div>\n </div>\n `,\n styles: [`\n .artifact-card { display: flex; gap: 16px; padding: 16px; border: 1px solid var(--mj-border-default); border-radius: 8px; cursor: pointer; transition: all 150ms ease; background: var(--mj-bg-surface); }\n .artifact-card:hover { border-color: var(--mj-brand-primary); box-shadow: var(--mj-shadow-sm); }\n\n .card-icon { display: flex; align-items: center; justify-content: center; width: 48px; height: 48px; border-radius: 8px; background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); color: var(--mj-brand-primary); font-size: 20px; }\n\n .card-content { flex: 1; min-width: 0; }\n .card-header { display: flex; align-items: center; gap: 12px; margin-bottom: 6px; }\n .artifact-name { margin: 0; font-size: 15px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .version-badge { padding: 2px 8px; background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface)); color: var(--mj-status-warning); border-radius: 3px; font-size: 11px; font-weight: 600; font-family: monospace; }\n .artifact-type { padding: 2px 8px; background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); color: var(--mj-brand-primary); border-radius: 3px; font-size: 11px; font-weight: 500; text-transform: uppercase; }\n\n .artifact-description { font-size: 13px; color: var(--mj-text-muted); margin-bottom: 8px; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }\n\n .artifact-meta { display: flex; gap: 16px; font-size: 12px; color: var(--mj-text-disabled); }\n .meta-item { display: flex; align-items: center; gap: 4px; }\n\n .card-actions { display: none; align-items: center; gap: 4px; }\n .artifact-card:hover .card-actions { display: flex; }\n .action-btn { padding: 8px; background: transparent; border: none; cursor: pointer; border-radius: 4px; color: var(--mj-text-muted); transition: all 150ms ease; }\n .action-btn:hover { background: var(--mj-bg-surface-sunken); color: var(--mj-brand-primary); }\n `]\n})\nexport class CollectionArtifactCardComponent implements OnInit, OnChanges {\n @Input() artifact!: MJArtifactEntity;\n @Input() version?: MJArtifactVersionEntity; // Optional version info\n @Input() currentUser!: UserInfo;\n\n @Output() selected = new EventEmitter<any>();\n @Output() viewed = new EventEmitter<any>();\n @Output() shared = new EventEmitter<any>();\n @Output() edited = new EventEmitter<any>();\n @Output() removed = new EventEmitter<any>();\n\n canShare: boolean = false;\n canEdit: boolean = false;\n\n constructor(\n private artifactPermissionService: ArtifactPermissionService,\n private artifactIconService: ArtifactIconService,\n private cdr: ChangeDetectorRef\n ) {}\n\n async ngOnInit(): Promise<void> {\n await this.loadPermissions();\n }\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n if (changes['artifact'] && !changes['artifact'].isFirstChange()) {\n await this.loadPermissions();\n }\n }\n\n private async loadPermissions(): Promise<void> {\n if (!this.artifact || !this.currentUser) return;\n\n try {\n this.canShare = await this.artifactPermissionService.checkPermission(\n this.artifact.ID,\n this.currentUser.ID,\n 'share',\n this.currentUser\n );\n\n this.canEdit = await this.artifactPermissionService.checkPermission(\n this.artifact.ID,\n this.currentUser.ID,\n 'edit',\n this.currentUser\n );\n } catch (err) {\n console.error('Error loading artifact permissions:', err);\n } finally {\n this.cdr.detectChanges(); // zone.js 0.15: async permission checks don't trigger CD\n }\n }\n\n /**\n * Get the icon for this artifact using the centralized icon service.\n * Fallback priority: Plugin icon > Metadata icon > Hardcoded mapping > Generic icon\n */\n getIconClass(): string {\n return this.artifactIconService.getArtifactIcon(this.artifact);\n }\n\n onSelect(): void {\n this.selected.emit(this.artifact);\n }\n\n onView(event: Event): void {\n event.stopPropagation();\n this.viewed.emit(this.artifact);\n }\n\n onShare(event: Event): void {\n event.stopPropagation();\n this.shared.emit(this.artifact);\n }\n\n onEdit(event: Event): void {\n event.stopPropagation();\n this.edited.emit(this.artifact);\n }\n\n onRemove(event: Event): void {\n event.stopPropagation();\n this.removed.emit(this.artifact);\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection-form-modal.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/collection/collection-form-modal.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACjG,OAAO,EAAE,QAAQ,EAAY,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;;AAG3F;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"collection-form-modal.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/collection/collection-form-modal.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACjG,OAAO,EAAE,QAAQ,EAAY,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;;AAG3F;;GAEG;AACH,qBAuHa,4BAA6B,YAAW,SAAS;IAmB1D,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,iBAAiB;IAnBlB,MAAM,EAAE,OAAO,CAAS;IACxB,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;IACtC,aAAa,EAAG,MAAM,CAAC;IACvB,WAAW,EAAG,QAAQ,CAAC;IAEtB,KAAK,mCAA0C;IAC/C,SAAS,qBAA4B;IAExC,QAAQ;;;MAGb;IAEK,QAAQ,EAAE,OAAO,CAAS;IAC1B,YAAY,EAAE,MAAM,CAAM;gBAGvB,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,2BAA2B;IAGxD,WAAW,CAAC,OAAO,EAAE,aAAa;IAWlC,IAAI,OAAO,IAAI,OAAO,CAErB;IAEK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAsG7B,QAAQ,IAAI,IAAI;IAKhB,OAAO,CAAC,SAAS;yCAjJN,4BAA4B;2CAA5B,4BAA4B;CAwJxC"}
|