@memberjunction/ng-conversations 5.48.0 → 5.50.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 +99 -1
- package/dist/lib/components/collection/collections-full-view.component.d.ts +10 -0
- package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.js +74 -14
- package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +76 -5
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +314 -161
- 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 +45 -23
- package/dist/lib/components/conversation/conversation-empty-state.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.d.ts +16 -1
- package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.js +439 -351
- package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
- package/dist/lib/components/export/export-modal.component.d.ts +25 -3
- package/dist/lib/components/export/export-modal.component.d.ts.map +1 -1
- package/dist/lib/components/export/export-modal.component.js +172 -34
- package/dist/lib/components/export/export-modal.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.d.ts +6 -1
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +21 -3
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +58 -1
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +390 -224
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/message/message-list.component.d.ts +36 -1
- package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-list.component.js +102 -4
- package/dist/lib/components/message/message-list.component.js.map +1 -1
- package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.js +2 -2
- package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.js.map +1 -1
- package/dist/lib/components/realtime/media/realtime-media-surface.component.js +2 -2
- package/dist/lib/components/realtime/media/realtime-media-surface.component.js.map +1 -1
- package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts +14 -1
- package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts.map +1 -1
- package/dist/lib/components/sidebar/conversation-sidebar.component.js +38 -5
- package/dist/lib/components/sidebar/conversation-sidebar.component.js.map +1 -1
- package/dist/lib/components/slots/slot-interfaces.d.ts +23 -1
- package/dist/lib/components/slots/slot-interfaces.d.ts.map +1 -1
- package/dist/lib/components/slots/slot-interfaces.js.map +1 -1
- package/dist/lib/directives/chat-slot.directive.d.ts +10 -2
- package/dist/lib/directives/chat-slot.directive.d.ts.map +1 -1
- package/dist/lib/directives/chat-slot.directive.js.map +1 -1
- package/dist/lib/models/lazy-artifact-info.d.ts +8 -7
- package/dist/lib/models/lazy-artifact-info.d.ts.map +1 -1
- package/dist/lib/models/lazy-artifact-info.js +12 -11
- package/dist/lib/models/lazy-artifact-info.js.map +1 -1
- package/dist/lib/services/export.service.d.ts +149 -0
- package/dist/lib/services/export.service.d.ts.map +1 -1
- package/dist/lib/services/export.service.js +270 -36
- package/dist/lib/services/export.service.js.map +1 -1
- package/package.json +29 -29
|
@@ -38,11 +38,30 @@ function ExportModalComponent_Conditional_0_For_10_Template(rf, ctx) { if (rf &
|
|
|
38
38
|
} }
|
|
39
39
|
function ExportModalComponent_Conditional_0_Conditional_28_Template(rf, ctx) { if (rf & 1) {
|
|
40
40
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
41
|
+
i0.ɵɵelementStart(0, "label", 12)(1, "input", 13);
|
|
42
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ExportModalComponent_Conditional_0_Conditional_28_Template_input_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.exportOptions.includeTheme, $event) || (ctx_r1.exportOptions.includeTheme = $event); return i0.ɵɵresetView($event); });
|
|
43
|
+
i0.ɵɵelementEnd();
|
|
44
|
+
i0.ɵɵelementStart(2, "span");
|
|
45
|
+
i0.ɵɵtext(3, "Include branding");
|
|
46
|
+
i0.ɵɵelementEnd();
|
|
47
|
+
i0.ɵɵelementStart(4, "small");
|
|
48
|
+
i0.ɵɵtext(5);
|
|
49
|
+
i0.ɵɵelementEnd()();
|
|
50
|
+
} if (rf & 2) {
|
|
51
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
52
|
+
i0.ɵɵadvance();
|
|
53
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.exportOptions.includeTheme);
|
|
54
|
+
i0.ɵɵproperty("disabled", ctx_r1.isExporting || ctx_r1.selectedFormat === "html" && !ctx_r1.exportOptions.includeCSS);
|
|
55
|
+
i0.ɵɵadvance(4);
|
|
56
|
+
i0.ɵɵtextInterpolate(ctx_r1.brandingHint);
|
|
57
|
+
} }
|
|
58
|
+
function ExportModalComponent_Conditional_0_Conditional_29_Template(rf, ctx) { if (rf & 1) {
|
|
59
|
+
const _r6 = i0.ɵɵgetCurrentView();
|
|
41
60
|
i0.ɵɵelementStart(0, "div", 14)(1, "h4", 26);
|
|
42
61
|
i0.ɵɵtext(2, "JSON Options");
|
|
43
62
|
i0.ɵɵelementEnd();
|
|
44
63
|
i0.ɵɵelementStart(3, "label", 12)(4, "input", 13);
|
|
45
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
64
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ExportModalComponent_Conditional_0_Conditional_29_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.exportOptions.prettyPrint, $event) || (ctx_r1.exportOptions.prettyPrint = $event); return i0.ɵɵresetView($event); });
|
|
46
65
|
i0.ɵɵelementEnd();
|
|
47
66
|
i0.ɵɵelementStart(5, "span");
|
|
48
67
|
i0.ɵɵtext(6, "Pretty print");
|
|
@@ -56,29 +75,55 @@ function ExportModalComponent_Conditional_0_Conditional_28_Template(rf, ctx) { i
|
|
|
56
75
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.exportOptions.prettyPrint);
|
|
57
76
|
i0.ɵɵproperty("disabled", ctx_r1.isExporting);
|
|
58
77
|
} }
|
|
59
|
-
function
|
|
60
|
-
const
|
|
78
|
+
function ExportModalComponent_Conditional_0_Conditional_30_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
79
|
+
const _r8 = i0.ɵɵgetCurrentView();
|
|
80
|
+
i0.ɵɵelementStart(0, "label", 12)(1, "span");
|
|
81
|
+
i0.ɵɵtext(2, "Theme");
|
|
82
|
+
i0.ɵɵelementEnd();
|
|
83
|
+
i0.ɵɵelementStart(3, "select", 27);
|
|
84
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ExportModalComponent_Conditional_0_Conditional_30_Conditional_9_Template_select_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.exportOptions.themeMode, $event) || (ctx_r1.exportOptions.themeMode = $event); return i0.ɵɵresetView($event); });
|
|
85
|
+
i0.ɵɵelementStart(4, "option", 28);
|
|
86
|
+
i0.ɵɵtext(5, "Light");
|
|
87
|
+
i0.ɵɵelementEnd();
|
|
88
|
+
i0.ɵɵelementStart(6, "option", 29);
|
|
89
|
+
i0.ɵɵtext(7, "Dark");
|
|
90
|
+
i0.ɵɵelementEnd()();
|
|
91
|
+
i0.ɵɵelementStart(8, "small");
|
|
92
|
+
i0.ɵɵtext(9, "Palette baked into the exported file");
|
|
93
|
+
i0.ɵɵelementEnd()();
|
|
94
|
+
} if (rf & 2) {
|
|
95
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
96
|
+
i0.ɵɵadvance(3);
|
|
97
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.exportOptions.themeMode);
|
|
98
|
+
i0.ɵɵproperty("disabled", ctx_r1.isExporting);
|
|
99
|
+
} }
|
|
100
|
+
function ExportModalComponent_Conditional_0_Conditional_30_Template(rf, ctx) { if (rf & 1) {
|
|
101
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
61
102
|
i0.ɵɵelementStart(0, "div", 14)(1, "h4", 26);
|
|
62
103
|
i0.ɵɵtext(2, "HTML Options");
|
|
63
104
|
i0.ɵɵelementEnd();
|
|
64
105
|
i0.ɵɵelementStart(3, "label", 12)(4, "input", 13);
|
|
65
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
106
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ExportModalComponent_Conditional_0_Conditional_30_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.exportOptions.includeCSS, $event) || (ctx_r1.exportOptions.includeCSS = $event); return i0.ɵɵresetView($event); });
|
|
66
107
|
i0.ɵɵelementEnd();
|
|
67
108
|
i0.ɵɵelementStart(5, "span");
|
|
68
109
|
i0.ɵɵtext(6, "Include CSS styling");
|
|
69
110
|
i0.ɵɵelementEnd();
|
|
70
111
|
i0.ɵɵelementStart(7, "small");
|
|
71
112
|
i0.ɵɵtext(8, "Embed styles for better presentation");
|
|
72
|
-
i0.ɵɵelementEnd()()
|
|
113
|
+
i0.ɵɵelementEnd()();
|
|
114
|
+
i0.ɵɵconditionalCreate(9, ExportModalComponent_Conditional_0_Conditional_30_Conditional_9_Template, 10, 2, "label", 12);
|
|
115
|
+
i0.ɵɵelementEnd();
|
|
73
116
|
} if (rf & 2) {
|
|
74
117
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
75
118
|
i0.ɵɵadvance(4);
|
|
76
119
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.exportOptions.includeCSS);
|
|
77
120
|
i0.ɵɵproperty("disabled", ctx_r1.isExporting);
|
|
121
|
+
i0.ɵɵadvance(5);
|
|
122
|
+
i0.ɵɵconditional(ctx_r1.exportOptions.includeTheme && ctx_r1.exportOptions.includeCSS ? 9 : -1);
|
|
78
123
|
} }
|
|
79
|
-
function
|
|
124
|
+
function ExportModalComponent_Conditional_0_Conditional_31_Template(rf, ctx) { if (rf & 1) {
|
|
80
125
|
i0.ɵɵelementStart(0, "div", 15);
|
|
81
|
-
i0.ɵɵelement(1, "i",
|
|
126
|
+
i0.ɵɵelement(1, "i", 30);
|
|
82
127
|
i0.ɵɵtext(2);
|
|
83
128
|
i0.ɵɵelementEnd();
|
|
84
129
|
} if (rf & 2) {
|
|
@@ -86,9 +131,9 @@ function ExportModalComponent_Conditional_0_Conditional_30_Template(rf, ctx) { i
|
|
|
86
131
|
i0.ɵɵadvance(2);
|
|
87
132
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.errorMessage, " ");
|
|
88
133
|
} }
|
|
89
|
-
function
|
|
134
|
+
function ExportModalComponent_Conditional_0_Conditional_32_Template(rf, ctx) { if (rf & 1) {
|
|
90
135
|
i0.ɵɵelementStart(0, "div", 16);
|
|
91
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
136
|
+
i0.ɵɵelement(1, "mj-loading", 31);
|
|
92
137
|
i0.ɵɵelementEnd();
|
|
93
138
|
} }
|
|
94
139
|
function ExportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -126,22 +171,24 @@ function ExportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
|
126
171
|
i0.ɵɵelementEnd();
|
|
127
172
|
i0.ɵɵelementStart(26, "small");
|
|
128
173
|
i0.ɵɵtext(27, "Add creation date, IDs, and other metadata");
|
|
129
|
-
i0.ɵɵelementEnd()()
|
|
130
|
-
i0.ɵɵconditionalCreate(28, ExportModalComponent_Conditional_0_Conditional_28_Template,
|
|
174
|
+
i0.ɵɵelementEnd()();
|
|
175
|
+
i0.ɵɵconditionalCreate(28, ExportModalComponent_Conditional_0_Conditional_28_Template, 6, 3, "label", 12);
|
|
176
|
+
i0.ɵɵelementEnd();
|
|
131
177
|
i0.ɵɵconditionalCreate(29, ExportModalComponent_Conditional_0_Conditional_29_Template, 9, 2, "div", 14);
|
|
178
|
+
i0.ɵɵconditionalCreate(30, ExportModalComponent_Conditional_0_Conditional_30_Template, 10, 3, "div", 14);
|
|
132
179
|
i0.ɵɵelementEnd();
|
|
133
|
-
i0.ɵɵconditionalCreate(
|
|
134
|
-
i0.ɵɵconditionalCreate(
|
|
180
|
+
i0.ɵɵconditionalCreate(31, ExportModalComponent_Conditional_0_Conditional_31_Template, 3, 1, "div", 15);
|
|
181
|
+
i0.ɵɵconditionalCreate(32, ExportModalComponent_Conditional_0_Conditional_32_Template, 2, 0, "div", 16);
|
|
135
182
|
i0.ɵɵelementEnd();
|
|
136
|
-
i0.ɵɵelementStart(
|
|
137
|
-
i0.ɵɵlistener("click", function
|
|
138
|
-
i0.ɵɵelement(
|
|
139
|
-
i0.ɵɵtext(
|
|
183
|
+
i0.ɵɵelementStart(33, "mj-dialog-actions")(34, "button", 17);
|
|
184
|
+
i0.ɵɵlistener("click", function ExportModalComponent_Conditional_0_Template_button_click_34_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancel()); });
|
|
185
|
+
i0.ɵɵelement(35, "i", 18);
|
|
186
|
+
i0.ɵɵtext(36, " Cancel ");
|
|
140
187
|
i0.ɵɵelementEnd();
|
|
141
|
-
i0.ɵɵelementStart(
|
|
142
|
-
i0.ɵɵlistener("click", function
|
|
143
|
-
i0.ɵɵelement(
|
|
144
|
-
i0.ɵɵtext(
|
|
188
|
+
i0.ɵɵelementStart(37, "button", 19);
|
|
189
|
+
i0.ɵɵlistener("click", function ExportModalComponent_Conditional_0_Template_button_click_37_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onExport()); });
|
|
190
|
+
i0.ɵɵelement(38, "i", 20);
|
|
191
|
+
i0.ɵɵtext(39, " Export ");
|
|
145
192
|
i0.ɵɵelementEnd()()();
|
|
146
193
|
} if (rf & 2) {
|
|
147
194
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -155,13 +202,15 @@ function ExportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
|
155
202
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.exportOptions.includeMetadata);
|
|
156
203
|
i0.ɵɵproperty("disabled", ctx_r1.isExporting);
|
|
157
204
|
i0.ɵɵadvance(5);
|
|
158
|
-
i0.ɵɵconditional(ctx_r1.selectedFormat === "
|
|
205
|
+
i0.ɵɵconditional(ctx_r1.selectedFormat === "html" || ctx_r1.branding ? 28 : -1);
|
|
206
|
+
i0.ɵɵadvance();
|
|
207
|
+
i0.ɵɵconditional(ctx_r1.selectedFormat === "json" ? 29 : -1);
|
|
159
208
|
i0.ɵɵadvance();
|
|
160
|
-
i0.ɵɵconditional(ctx_r1.selectedFormat === "html" ?
|
|
209
|
+
i0.ɵɵconditional(ctx_r1.selectedFormat === "html" ? 30 : -1);
|
|
161
210
|
i0.ɵɵadvance();
|
|
162
|
-
i0.ɵɵconditional(ctx_r1.errorMessage ?
|
|
211
|
+
i0.ɵɵconditional(ctx_r1.errorMessage ? 31 : -1);
|
|
163
212
|
i0.ɵɵadvance();
|
|
164
|
-
i0.ɵɵconditional(ctx_r1.isExporting ?
|
|
213
|
+
i0.ɵɵconditional(ctx_r1.isExporting ? 32 : -1);
|
|
165
214
|
i0.ɵɵadvance(2);
|
|
166
215
|
i0.ɵɵproperty("disabled", ctx_r1.isExporting);
|
|
167
216
|
i0.ɵɵadvance(3);
|
|
@@ -171,9 +220,31 @@ export class ExportModalComponent {
|
|
|
171
220
|
exportService;
|
|
172
221
|
dialogService;
|
|
173
222
|
toastService;
|
|
174
|
-
|
|
223
|
+
_isVisible = false;
|
|
224
|
+
set isVisible(value) {
|
|
225
|
+
const opening = value && !this._isVisible;
|
|
226
|
+
this._isVisible = value;
|
|
227
|
+
if (opening) {
|
|
228
|
+
// Fresh open: "Include branding" defaults ON only when the host explicitly
|
|
229
|
+
// configured export branding — plain MJ Explorer keeps today's unthemed file.
|
|
230
|
+
// NOTE this reads `branding`, so a host binding both in one change-detection
|
|
231
|
+
// pass must bind [branding] FIRST (Angular sets inputs in template order).
|
|
232
|
+
// chat-area's template does; a host mounting with isVisible already true and
|
|
233
|
+
// branding bound after would get the checkbox defaulted off.
|
|
234
|
+
this.exportOptions.includeTheme = !!this.branding;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
get isVisible() {
|
|
238
|
+
return this._isVisible;
|
|
239
|
+
}
|
|
175
240
|
conversation;
|
|
176
241
|
currentUser;
|
|
242
|
+
/**
|
|
243
|
+
* Host-supplied export branding (theme tokens / logo / title). When set, the
|
|
244
|
+
* HTML format's "Include branding" checkbox defaults on and the branding is
|
|
245
|
+
* passed to {@link ExportService} on export. See `ExportBranding`.
|
|
246
|
+
*/
|
|
247
|
+
branding = null;
|
|
177
248
|
cancelled = new EventEmitter();
|
|
178
249
|
exported = new EventEmitter();
|
|
179
250
|
selectedFormat = 'markdown';
|
|
@@ -183,8 +254,41 @@ export class ExportModalComponent {
|
|
|
183
254
|
includeMessages: true,
|
|
184
255
|
includeMetadata: true,
|
|
185
256
|
prettyPrint: true,
|
|
186
|
-
includeCSS: true
|
|
257
|
+
includeCSS: true,
|
|
258
|
+
includeTheme: false,
|
|
259
|
+
themeMode: 'light'
|
|
187
260
|
};
|
|
261
|
+
/** Format-aware hint under the "Include branding" checkbox. */
|
|
262
|
+
get brandingHint() {
|
|
263
|
+
if (this.selectedFormat === 'html') {
|
|
264
|
+
if (!this.exportOptions.includeCSS) {
|
|
265
|
+
return 'Requires "Include CSS styling"';
|
|
266
|
+
}
|
|
267
|
+
return `Embed the app's theme colors${this.branding?.logoUrl ? ', logo,' : ''} and attribution line`;
|
|
268
|
+
}
|
|
269
|
+
const logo = this.branding?.logoUrl && this.selectedFormat === 'markdown' ? ', logo,' : '';
|
|
270
|
+
return `Add the title${logo} and attribution line`;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* The options actually handed to the service. `includeTheme` is the user's INTENT;
|
|
274
|
+
* this resolves it against the selected format:
|
|
275
|
+
*
|
|
276
|
+
* - HTML with the stylesheet off cannot carry branding (a full-size unstyled logo and
|
|
277
|
+
* an unstyled footer would leak), so it drops.
|
|
278
|
+
* - `includeCSS` is an HTML-only concern and must NOT decide anything for
|
|
279
|
+
* markdown / text / JSON — resolving here rather than mutating `includeTheme` is
|
|
280
|
+
* what keeps an HTML-format toggle from silently following the user into another
|
|
281
|
+
* format.
|
|
282
|
+
*/
|
|
283
|
+
resolveExportOptions() {
|
|
284
|
+
const unstyledHtml = this.selectedFormat === 'html' && !this.exportOptions.includeCSS;
|
|
285
|
+
const brandingOn = !!this.exportOptions.includeTheme && !unstyledHtml;
|
|
286
|
+
return {
|
|
287
|
+
...this.exportOptions,
|
|
288
|
+
includeTheme: brandingOn,
|
|
289
|
+
branding: brandingOn ? (this.branding ?? undefined) : undefined
|
|
290
|
+
};
|
|
291
|
+
}
|
|
188
292
|
get exportTitle() {
|
|
189
293
|
return `Export: ${this.conversation?.Name || 'Conversation'}`;
|
|
190
294
|
}
|
|
@@ -240,7 +344,7 @@ export class ExportModalComponent {
|
|
|
240
344
|
this.isExporting = true;
|
|
241
345
|
this.errorMessage = '';
|
|
242
346
|
try {
|
|
243
|
-
await this.exportService.exportConversation(this.conversation.ID, this.selectedFormat, this.currentUser, this.
|
|
347
|
+
await this.exportService.exportConversation(this.conversation.ID, this.selectedFormat, this.currentUser, this.resolveExportOptions());
|
|
244
348
|
this.toastService.success('Conversation exported successfully');
|
|
245
349
|
this.exported.emit();
|
|
246
350
|
this.resetForm();
|
|
@@ -265,16 +369,18 @@ export class ExportModalComponent {
|
|
|
265
369
|
includeMessages: true,
|
|
266
370
|
includeMetadata: true,
|
|
267
371
|
prettyPrint: true,
|
|
268
|
-
includeCSS: true
|
|
372
|
+
includeCSS: true,
|
|
373
|
+
includeTheme: !!this.branding,
|
|
374
|
+
themeMode: 'light'
|
|
269
375
|
};
|
|
270
376
|
this.isVisible = false;
|
|
271
377
|
}
|
|
272
378
|
static ɵfac = function ExportModalComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ExportModalComponent)(i0.ɵɵdirectiveInject(i1.ExportService), i0.ɵɵdirectiveInject(i2.DialogService), i0.ɵɵdirectiveInject(i3.ToastService)); };
|
|
273
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ExportModalComponent, selectors: [["mj-export-modal"]], inputs: { isVisible: "isVisible", conversation: "conversation", currentUser: "currentUser" }, outputs: { cancelled: "cancelled", exported: "exported" }, standalone: false, decls: 1, vars: 1, consts: [[3, "Title", "Width", "Height", "Visible"], [3, "Close", "Title", "Width", "Height", "Visible"], [1, "export-modal-content"], [1, "format-section"], [1, "section-title"], [1, "fa-solid", "fa-file-export"], [1, "section-description"], [1, "format-options"], [1, "format-option", 3, "selected"], [1, "options-section"], [1, "fa-solid", "fa-sliders"], [1, "option-checkboxes"], [1, "checkbox-label"], ["type", "checkbox", 3, "ngModelChange", "ngModel", "disabled"], [1, "format-specific-options"], [1, "error-message"], [1, "loading-indicator"], ["mjButton", "", 3, "click", "disabled"], [1, "fa-solid", "fa-times"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], [1, "fa-solid", "fa-download"], [1, "format-option", 3, "click"], [1, "format-details"], [1, "format-name"], [1, "format-description"], [1, "fa-solid", "fa-check-circle", "check-icon"], [1, "subsection-title"], [1, "fa-solid", "fa-exclamation-triangle"], ["text", "Exporting conversation...", "size", "small"]], template: function ExportModalComponent_Template(rf, ctx) { if (rf & 1) {
|
|
274
|
-
i0.ɵɵconditionalCreate(0, ExportModalComponent_Conditional_0_Template,
|
|
379
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ExportModalComponent, selectors: [["mj-export-modal"]], inputs: { isVisible: "isVisible", conversation: "conversation", currentUser: "currentUser", branding: "branding" }, outputs: { cancelled: "cancelled", exported: "exported" }, standalone: false, decls: 1, vars: 1, consts: [[3, "Title", "Width", "Height", "Visible"], [3, "Close", "Title", "Width", "Height", "Visible"], [1, "export-modal-content"], [1, "format-section"], [1, "section-title"], [1, "fa-solid", "fa-file-export"], [1, "section-description"], [1, "format-options"], [1, "format-option", 3, "selected"], [1, "options-section"], [1, "fa-solid", "fa-sliders"], [1, "option-checkboxes"], [1, "checkbox-label"], ["type", "checkbox", 3, "ngModelChange", "ngModel", "disabled"], [1, "format-specific-options"], [1, "error-message"], [1, "loading-indicator"], ["mjButton", "", 3, "click", "disabled"], [1, "fa-solid", "fa-times"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], [1, "fa-solid", "fa-download"], [1, "format-option", 3, "click"], [1, "format-details"], [1, "format-name"], [1, "format-description"], [1, "fa-solid", "fa-check-circle", "check-icon"], [1, "subsection-title"], [1, "mj-input", "theme-mode-select", 3, "ngModelChange", "ngModel", "disabled"], ["value", "light"], ["value", "dark"], [1, "fa-solid", "fa-exclamation-triangle"], ["text", "Exporting conversation...", "size", "small"]], template: function ExportModalComponent_Template(rf, ctx) { if (rf & 1) {
|
|
380
|
+
i0.ɵɵconditionalCreate(0, ExportModalComponent_Conditional_0_Template, 40, 15, "mj-dialog", 0);
|
|
275
381
|
} if (rf & 2) {
|
|
276
382
|
i0.ɵɵconditional(ctx.isVisible ? 0 : -1);
|
|
277
|
-
} }, dependencies: [i4.CheckboxControlValueAccessor, i4.NgControlStatus, i4.NgModel, i5.MJButtonDirective, i5.MJDialogComponent, i5.MJDialogActionsComponent, i6.LoadingComponent], styles: [".export-modal-content[_ngcontent-%COMP%] {\n padding: 20px;\n max-height: calc(600px - 120px);\n overflow-y: auto;\n }\n\n section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n }\n\n .section-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 8px 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n\n .section-description[_ngcontent-%COMP%] {\n margin: 0 0 16px 0;\n color: var(--mj-text-muted);\n font-size: 14px;\n }\n\n .format-options[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .format-option[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n background: var(--mj-bg-surface-card);\n }\n\n .format-option[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n }\n\n .format-option.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface-card));\n }\n\n .format-option[_ngcontent-%COMP%] > i.fa-solid[_ngcontent-%COMP%], \n .format-option[_ngcontent-%COMP%] > i.fas[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-text-muted);\n width: 32px;\n text-align: center;\n }\n\n .format-option.selected[_ngcontent-%COMP%] > i.fa-solid[_ngcontent-%COMP%], \n .format-option.selected[_ngcontent-%COMP%] > i.fas[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n\n .format-details[_ngcontent-%COMP%] {\n flex: 1;\n }\n\n .format-name[_ngcontent-%COMP%] {\n font-weight: 500;\n font-size: 14px;\n margin-bottom: 2px;\n }\n\n .format-description[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .check-icon[_ngcontent-%COMP%] {\n font-size: 20px;\n color: var(--mj-status-success);\n }\n\n .option-checkboxes[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .checkbox-label[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n cursor: pointer;\n padding: 8px;\n border-radius: 4px;\n transition: background 0.2s;\n }\n\n .checkbox-label[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .checkbox-label[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n margin-right: 8px;\n cursor: pointer;\n }\n\n .checkbox-label[_ngcontent-%COMP%] > span[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n font-size: 14px;\n font-weight: 500;\n }\n\n .checkbox-label[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%]:disabled {\n cursor: not-allowed;\n }\n\n .checkbox-label[_ngcontent-%COMP%] small[_ngcontent-%COMP%] {\n margin-left: 28px;\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .format-specific-options[_ngcontent-%COMP%] {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .subsection-title[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n }\n\n .error-message[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-status-error);\n font-size: 13px;\n margin-top: 15px;\n padding: 10px 12px;\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-status-error);\n border-radius: 4px;\n }\n\n .loading-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-top: 15px;\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n color: var(--mj-text-muted);\n }\n\n mj-dialog-actions[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n padding: 15px 20px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n mj-dialog-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 6px;\n }"] });
|
|
383
|
+
} }, dependencies: [i4.NgSelectOption, i4.ɵNgSelectMultipleOption, i4.CheckboxControlValueAccessor, i4.SelectControlValueAccessor, i4.NgControlStatus, i4.NgModel, i5.MJButtonDirective, i5.MJDialogComponent, i5.MJDialogActionsComponent, i6.LoadingComponent], styles: [".export-modal-content[_ngcontent-%COMP%] {\n padding: 20px;\n max-height: calc(600px - 120px);\n overflow-y: auto;\n }\n\n section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n }\n\n .section-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 8px 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n\n .section-description[_ngcontent-%COMP%] {\n margin: 0 0 16px 0;\n color: var(--mj-text-muted);\n font-size: 14px;\n }\n\n .format-options[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .format-option[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n background: var(--mj-bg-surface-card);\n }\n\n .format-option[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n }\n\n .format-option.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface-card));\n }\n\n .format-option[_ngcontent-%COMP%] > i.fa-solid[_ngcontent-%COMP%], \n .format-option[_ngcontent-%COMP%] > i.fas[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-text-muted);\n width: 32px;\n text-align: center;\n }\n\n .format-option.selected[_ngcontent-%COMP%] > i.fa-solid[_ngcontent-%COMP%], \n .format-option.selected[_ngcontent-%COMP%] > i.fas[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n\n .format-details[_ngcontent-%COMP%] {\n flex: 1;\n }\n\n .format-name[_ngcontent-%COMP%] {\n font-weight: 500;\n font-size: 14px;\n margin-bottom: 2px;\n }\n\n .format-description[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .check-icon[_ngcontent-%COMP%] {\n font-size: 20px;\n color: var(--mj-status-success);\n }\n\n .option-checkboxes[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .checkbox-label[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n cursor: pointer;\n padding: 8px;\n border-radius: 4px;\n transition: background 0.2s;\n }\n\n .checkbox-label[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .checkbox-label[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n margin-right: 8px;\n cursor: pointer;\n }\n\n .checkbox-label[_ngcontent-%COMP%] > span[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n font-size: 14px;\n font-weight: 500;\n }\n\n .checkbox-label[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%]:disabled {\n cursor: not-allowed;\n }\n\n .theme-mode-select[_ngcontent-%COMP%] {\n margin-left: 8px;\n padding: 2px 6px;\n font-size: 13px;\n }\n\n .checkbox-label[_ngcontent-%COMP%] small[_ngcontent-%COMP%] {\n margin-left: 28px;\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .format-specific-options[_ngcontent-%COMP%] {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .subsection-title[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n }\n\n .error-message[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-status-error);\n font-size: 13px;\n margin-top: 15px;\n padding: 10px 12px;\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-status-error);\n border-radius: 4px;\n }\n\n .loading-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-top: 15px;\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n color: var(--mj-text-muted);\n }\n\n mj-dialog-actions[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n padding: 15px 20px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n mj-dialog-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 6px;\n }"] });
|
|
278
384
|
}
|
|
279
385
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ExportModalComponent, [{
|
|
280
386
|
type: Component,
|
|
@@ -335,6 +441,20 @@ export class ExportModalComponent {
|
|
|
335
441
|
<span>Include metadata</span>
|
|
336
442
|
<small>Add creation date, IDs, and other metadata</small>
|
|
337
443
|
</label>
|
|
444
|
+
<!-- Branding applies to EVERY format (HTML gets theme colors + logo +
|
|
445
|
+
footer; markdown/text/JSON get the title and attribution), so it
|
|
446
|
+
belongs here rather than under HTML Options. Shown for HTML even with
|
|
447
|
+
no host branding, because it still snapshots the app's theme. -->
|
|
448
|
+
@if (selectedFormat === 'html' || branding) {
|
|
449
|
+
<label class="checkbox-label">
|
|
450
|
+
<input
|
|
451
|
+
type="checkbox"
|
|
452
|
+
[(ngModel)]="exportOptions.includeTheme"
|
|
453
|
+
[disabled]="isExporting || (selectedFormat === 'html' && !exportOptions.includeCSS)">
|
|
454
|
+
<span>Include branding</span>
|
|
455
|
+
<small>{{ brandingHint }}</small>
|
|
456
|
+
</label>
|
|
457
|
+
}
|
|
338
458
|
</div>
|
|
339
459
|
@if (selectedFormat === 'json') {
|
|
340
460
|
<div class="format-specific-options">
|
|
@@ -360,6 +480,22 @@ export class ExportModalComponent {
|
|
|
360
480
|
<span>Include CSS styling</span>
|
|
361
481
|
<small>Embed styles for better presentation</small>
|
|
362
482
|
</label>
|
|
483
|
+
<!-- Which palette gets baked in — NOT the mode the app happens to be in.
|
|
484
|
+
Exporting from a dark session would otherwise put dark text on the
|
|
485
|
+
export's white page. -->
|
|
486
|
+
@if (exportOptions.includeTheme && exportOptions.includeCSS) {
|
|
487
|
+
<label class="checkbox-label">
|
|
488
|
+
<span>Theme</span>
|
|
489
|
+
<select
|
|
490
|
+
class="mj-input theme-mode-select"
|
|
491
|
+
[(ngModel)]="exportOptions.themeMode"
|
|
492
|
+
[disabled]="isExporting">
|
|
493
|
+
<option value="light">Light</option>
|
|
494
|
+
<option value="dark">Dark</option>
|
|
495
|
+
</select>
|
|
496
|
+
<small>Palette baked into the exported file</small>
|
|
497
|
+
</label>
|
|
498
|
+
}
|
|
363
499
|
</div>
|
|
364
500
|
}
|
|
365
501
|
</section>
|
|
@@ -387,17 +523,19 @@ export class ExportModalComponent {
|
|
|
387
523
|
</mj-dialog-actions>
|
|
388
524
|
</mj-dialog>
|
|
389
525
|
}
|
|
390
|
-
`, styles: ["\n .export-modal-content {\n padding: 20px;\n max-height: calc(600px - 120px);\n overflow-y: auto;\n }\n\n section {\n margin-bottom: 24px;\n }\n\n .section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 8px 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .section-title i {\n color: var(--mj-brand-primary);\n }\n\n .section-description {\n margin: 0 0 16px 0;\n color: var(--mj-text-muted);\n font-size: 14px;\n }\n\n .format-options {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .format-option {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n background: var(--mj-bg-surface-card);\n }\n\n .format-option:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n }\n\n .format-option.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface-card));\n }\n\n .format-option > i.fa-solid,\n .format-option > i.fas {\n font-size: 24px;\n color: var(--mj-text-muted);\n width: 32px;\n text-align: center;\n }\n\n .format-option.selected > i.fa-solid,\n .format-option.selected > i.fas {\n color: var(--mj-brand-primary);\n }\n\n .format-details {\n flex: 1;\n }\n\n .format-name {\n font-weight: 500;\n font-size: 14px;\n margin-bottom: 2px;\n }\n\n .format-description {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .check-icon {\n font-size: 20px;\n color: var(--mj-status-success);\n }\n\n .option-checkboxes {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .checkbox-label {\n display: flex;\n flex-direction: column;\n gap: 4px;\n cursor: pointer;\n padding: 8px;\n border-radius: 4px;\n transition: background 0.2s;\n }\n\n .checkbox-label:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .checkbox-label input[type=\"checkbox\"] {\n margin-right: 8px;\n cursor: pointer;\n }\n\n .checkbox-label > span {\n display: inline-flex;\n align-items: center;\n font-size: 14px;\n font-weight: 500;\n }\n\n .checkbox-label input[type=\"checkbox\"]:disabled {\n cursor: not-allowed;\n }\n\n .checkbox-label small {\n margin-left: 28px;\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .format-specific-options {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .subsection-title {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n }\n\n .error-message {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-status-error);\n font-size: 13px;\n margin-top: 15px;\n padding: 10px 12px;\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-status-error);\n border-radius: 4px;\n }\n\n .loading-indicator {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-top: 15px;\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n color: var(--mj-text-muted);\n }\n\n mj-dialog-actions {\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n padding: 15px 20px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n mj-dialog-actions button i {\n margin-right: 6px;\n }\n "] }]
|
|
526
|
+
`, styles: ["\n .export-modal-content {\n padding: 20px;\n max-height: calc(600px - 120px);\n overflow-y: auto;\n }\n\n section {\n margin-bottom: 24px;\n }\n\n .section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 8px 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .section-title i {\n color: var(--mj-brand-primary);\n }\n\n .section-description {\n margin: 0 0 16px 0;\n color: var(--mj-text-muted);\n font-size: 14px;\n }\n\n .format-options {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .format-option {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n background: var(--mj-bg-surface-card);\n }\n\n .format-option:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n }\n\n .format-option.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface-card));\n }\n\n .format-option > i.fa-solid,\n .format-option > i.fas {\n font-size: 24px;\n color: var(--mj-text-muted);\n width: 32px;\n text-align: center;\n }\n\n .format-option.selected > i.fa-solid,\n .format-option.selected > i.fas {\n color: var(--mj-brand-primary);\n }\n\n .format-details {\n flex: 1;\n }\n\n .format-name {\n font-weight: 500;\n font-size: 14px;\n margin-bottom: 2px;\n }\n\n .format-description {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .check-icon {\n font-size: 20px;\n color: var(--mj-status-success);\n }\n\n .option-checkboxes {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .checkbox-label {\n display: flex;\n flex-direction: column;\n gap: 4px;\n cursor: pointer;\n padding: 8px;\n border-radius: 4px;\n transition: background 0.2s;\n }\n\n .checkbox-label:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .checkbox-label input[type=\"checkbox\"] {\n margin-right: 8px;\n cursor: pointer;\n }\n\n .checkbox-label > span {\n display: inline-flex;\n align-items: center;\n font-size: 14px;\n font-weight: 500;\n }\n\n .checkbox-label input[type=\"checkbox\"]:disabled {\n cursor: not-allowed;\n }\n\n .theme-mode-select {\n margin-left: 8px;\n padding: 2px 6px;\n font-size: 13px;\n }\n\n .checkbox-label small {\n margin-left: 28px;\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .format-specific-options {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .subsection-title {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n }\n\n .error-message {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-status-error);\n font-size: 13px;\n margin-top: 15px;\n padding: 10px 12px;\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-status-error);\n border-radius: 4px;\n }\n\n .loading-indicator {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-top: 15px;\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n color: var(--mj-text-muted);\n }\n\n mj-dialog-actions {\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n padding: 15px 20px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n mj-dialog-actions button i {\n margin-right: 6px;\n }\n "] }]
|
|
391
527
|
}], () => [{ type: i1.ExportService }, { type: i2.DialogService }, { type: i3.ToastService }], { isVisible: [{
|
|
392
528
|
type: Input
|
|
393
529
|
}], conversation: [{
|
|
394
530
|
type: Input
|
|
395
531
|
}], currentUser: [{
|
|
396
532
|
type: Input
|
|
533
|
+
}], branding: [{
|
|
534
|
+
type: Input
|
|
397
535
|
}], cancelled: [{
|
|
398
536
|
type: Output
|
|
399
537
|
}], exported: [{
|
|
400
538
|
type: Output
|
|
401
539
|
}] }); })();
|
|
402
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ExportModalComponent, { className: "ExportModalComponent", filePath: "src/lib/components/export/export-modal.component.ts", lineNumber:
|
|
540
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ExportModalComponent, { className: "ExportModalComponent", filePath: "src/lib/components/export/export-modal.component.ts", lineNumber: 341 }); })();
|
|
403
541
|
//# sourceMappingURL=export-modal.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/export/export-modal.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { MJConversationEntity } from '@memberjunction/core-entities';\nimport { UserInfo } from '@memberjunction/core';\nimport { ExportService, ExportFormat, ExportOptions } from '../../services/export.service';\nimport { DialogService } from '../../services/dialog.service';\nimport { ToastService } from '../../services/toast.service';\n\n@Component({\n standalone: false,\n selector: 'mj-export-modal',\n template: `\n @if (isVisible) {\n <mj-dialog\n [Title]=\"exportTitle\"\n [Width]=\"600\"\n [Height]=\"600\"\n [Visible]=\"true\"\n (Close)=\"onCancel()\">\n <div class=\"export-modal-content\">\n <section class=\"format-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-file-export\"></i>\n Export Format\n </h3>\n <p class=\"section-description\">\n Choose a format to export this conversation:\n </p>\n <div class=\"format-options\">\n @for (format of formats; track format.value) {\n <div\n class=\"format-option\"\n [class.selected]=\"selectedFormat === format.value\"\n (click)=\"selectFormat(format.value)\">\n <i [class]=\"format.icon\"></i>\n <div class=\"format-details\">\n <div class=\"format-name\">{{ format.name }}</div>\n <div class=\"format-description\">{{ format.description }}</div>\n </div>\n @if (selectedFormat === format.value) {\n <i class=\"fa-solid fa-check-circle check-icon\"></i>\n }\n </div>\n }\n </div>\n </section>\n <section class=\"options-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-sliders\"></i>\n Export Options\n </h3>\n <div class=\"option-checkboxes\">\n <label class=\"checkbox-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"exportOptions.includeMessages\"\n [disabled]=\"isExporting\">\n <span>Include messages</span>\n <small>Export all conversation messages</small>\n </label>\n <label class=\"checkbox-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"exportOptions.includeMetadata\"\n [disabled]=\"isExporting\">\n <span>Include metadata</span>\n <small>Add creation date, IDs, and other metadata</small>\n </label>\n </div>\n @if (selectedFormat === 'json') {\n <div class=\"format-specific-options\">\n <h4 class=\"subsection-title\">JSON Options</h4>\n <label class=\"checkbox-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"exportOptions.prettyPrint\"\n [disabled]=\"isExporting\">\n <span>Pretty print</span>\n <small>Format JSON with indentation</small>\n </label>\n </div>\n }\n @if (selectedFormat === 'html') {\n <div class=\"format-specific-options\">\n <h4 class=\"subsection-title\">HTML Options</h4>\n <label class=\"checkbox-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"exportOptions.includeCSS\"\n [disabled]=\"isExporting\">\n <span>Include CSS styling</span>\n <small>Embed styles for better presentation</small>\n </label>\n </div>\n }\n </section>\n @if (errorMessage) {\n <div class=\"error-message\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ errorMessage }}\n </div>\n }\n @if (isExporting) {\n <div class=\"loading-indicator\">\n <mj-loading text=\"Exporting conversation...\" size=\"small\"></mj-loading>\n </div>\n }\n </div>\n <mj-dialog-actions>\n <button mjButton [disabled]=\"isExporting\" (click)=\"onCancel()\">\n <i class=\"fa-solid fa-times\"></i>\n Cancel\n </button>\n <button mjButton variant=\"primary\" [disabled]=\"!canExport\" (click)=\"onExport()\">\n <i class=\"fa-solid fa-download\"></i>\n Export\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n `,\n styles: [`\n .export-modal-content {\n padding: 20px;\n max-height: calc(600px - 120px);\n overflow-y: auto;\n }\n\n section {\n margin-bottom: 24px;\n }\n\n .section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 8px 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .section-title i {\n color: var(--mj-brand-primary);\n }\n\n .section-description {\n margin: 0 0 16px 0;\n color: var(--mj-text-muted);\n font-size: 14px;\n }\n\n .format-options {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .format-option {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n background: var(--mj-bg-surface-card);\n }\n\n .format-option:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n }\n\n .format-option.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface-card));\n }\n\n .format-option > i.fa-solid,\n .format-option > i.fas {\n font-size: 24px;\n color: var(--mj-text-muted);\n width: 32px;\n text-align: center;\n }\n\n .format-option.selected > i.fa-solid,\n .format-option.selected > i.fas {\n color: var(--mj-brand-primary);\n }\n\n .format-details {\n flex: 1;\n }\n\n .format-name {\n font-weight: 500;\n font-size: 14px;\n margin-bottom: 2px;\n }\n\n .format-description {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .check-icon {\n font-size: 20px;\n color: var(--mj-status-success);\n }\n\n .option-checkboxes {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .checkbox-label {\n display: flex;\n flex-direction: column;\n gap: 4px;\n cursor: pointer;\n padding: 8px;\n border-radius: 4px;\n transition: background 0.2s;\n }\n\n .checkbox-label:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .checkbox-label input[type=\"checkbox\"] {\n margin-right: 8px;\n cursor: pointer;\n }\n\n .checkbox-label > span {\n display: inline-flex;\n align-items: center;\n font-size: 14px;\n font-weight: 500;\n }\n\n .checkbox-label input[type=\"checkbox\"]:disabled {\n cursor: not-allowed;\n }\n\n .checkbox-label small {\n margin-left: 28px;\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .format-specific-options {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .subsection-title {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n }\n\n .error-message {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-status-error);\n font-size: 13px;\n margin-top: 15px;\n padding: 10px 12px;\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-status-error);\n border-radius: 4px;\n }\n\n .loading-indicator {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-top: 15px;\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n color: var(--mj-text-muted);\n }\n\n mj-dialog-actions {\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n padding: 15px 20px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n mj-dialog-actions button i {\n margin-right: 6px;\n }\n `]\n})\nexport class ExportModalComponent {\n @Input() isVisible = false;\n @Input() conversation?: MJConversationEntity;\n @Input() currentUser!: UserInfo;\n @Output() cancelled = new EventEmitter<void>();\n @Output() exported = new EventEmitter<void>();\n\n selectedFormat: ExportFormat | null = 'markdown';\n isExporting = false;\n errorMessage = '';\n\n exportOptions: ExportOptions = {\n includeMessages: true,\n includeMetadata: true,\n prettyPrint: true,\n includeCSS: true\n };\n\n get exportTitle(): string {\n return `Export: ${this.conversation?.Name || 'Conversation'}`;\n }\n\n get canExport(): boolean {\n return !this.isExporting &&\n !!this.selectedFormat &&\n (this.exportOptions.includeMessages === true);\n }\n\n formats = [\n {\n value: 'markdown' as ExportFormat,\n name: 'Markdown',\n description: 'Formatted text with markdown syntax',\n icon: 'fa-solid fa-file-alt'\n },\n {\n value: 'json' as ExportFormat,\n name: 'JSON',\n description: 'Structured data format',\n icon: 'fa-solid fa-code'\n },\n {\n value: 'html' as ExportFormat,\n name: 'HTML',\n description: 'Web page format',\n icon: 'fa-solid fa-file-code'\n },\n {\n value: 'text' as ExportFormat,\n name: 'Plain Text',\n description: 'Simple text file',\n icon: 'fa-solid fa-file'\n }\n ];\n\n constructor(\n private exportService: ExportService,\n private dialogService: DialogService,\n private toastService: ToastService\n ) {}\n\n selectFormat(format: ExportFormat): void {\n if (!this.isExporting) {\n this.selectedFormat = format;\n }\n }\n\n async onExport(): Promise<void> {\n if (!this.canExport || !this.conversation) {\n return;\n }\n\n if (!this.exportOptions.includeMessages) {\n this.errorMessage = 'At least \"Include messages\" must be selected';\n return;\n }\n\n this.isExporting = true;\n this.errorMessage = '';\n\n try {\n await this.exportService.exportConversation(\n this.conversation.ID,\n this.selectedFormat!,\n this.currentUser,\n this.exportOptions\n );\n\n this.toastService.success('Conversation exported successfully');\n this.exported.emit();\n this.resetForm();\n } catch (error) {\n console.error('Error exporting conversation:', error);\n this.errorMessage = error instanceof Error ? error.message : 'Failed to export conversation';\n this.toastService.error(this.errorMessage);\n } finally {\n this.isExporting = false;\n }\n }\n\n onCancel(): void {\n this.cancelled.emit();\n this.resetForm();\n }\n\n private resetForm(): void {\n this.selectedFormat = 'markdown';\n this.errorMessage = '';\n this.exportOptions = {\n includeMessages: true,\n includeMetadata: true,\n prettyPrint: true,\n includeCSS: true\n };\n this.isVisible = false;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"export-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/export/export-modal.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { MJConversationEntity } from '@memberjunction/core-entities';\nimport { UserInfo } from '@memberjunction/core';\nimport { ExportService, ExportFormat, ExportOptions, ExportBranding } from '../../services/export.service';\nimport { DialogService } from '../../services/dialog.service';\nimport { ToastService } from '../../services/toast.service';\n\n@Component({\n standalone: false,\n selector: 'mj-export-modal',\n template: `\n @if (isVisible) {\n <mj-dialog\n [Title]=\"exportTitle\"\n [Width]=\"600\"\n [Height]=\"600\"\n [Visible]=\"true\"\n (Close)=\"onCancel()\">\n <div class=\"export-modal-content\">\n <section class=\"format-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-file-export\"></i>\n Export Format\n </h3>\n <p class=\"section-description\">\n Choose a format to export this conversation:\n </p>\n <div class=\"format-options\">\n @for (format of formats; track format.value) {\n <div\n class=\"format-option\"\n [class.selected]=\"selectedFormat === format.value\"\n (click)=\"selectFormat(format.value)\">\n <i [class]=\"format.icon\"></i>\n <div class=\"format-details\">\n <div class=\"format-name\">{{ format.name }}</div>\n <div class=\"format-description\">{{ format.description }}</div>\n </div>\n @if (selectedFormat === format.value) {\n <i class=\"fa-solid fa-check-circle check-icon\"></i>\n }\n </div>\n }\n </div>\n </section>\n <section class=\"options-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-sliders\"></i>\n Export Options\n </h3>\n <div class=\"option-checkboxes\">\n <label class=\"checkbox-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"exportOptions.includeMessages\"\n [disabled]=\"isExporting\">\n <span>Include messages</span>\n <small>Export all conversation messages</small>\n </label>\n <label class=\"checkbox-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"exportOptions.includeMetadata\"\n [disabled]=\"isExporting\">\n <span>Include metadata</span>\n <small>Add creation date, IDs, and other metadata</small>\n </label>\n <!-- Branding applies to EVERY format (HTML gets theme colors + logo +\n footer; markdown/text/JSON get the title and attribution), so it\n belongs here rather than under HTML Options. Shown for HTML even with\n no host branding, because it still snapshots the app's theme. -->\n @if (selectedFormat === 'html' || branding) {\n <label class=\"checkbox-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"exportOptions.includeTheme\"\n [disabled]=\"isExporting || (selectedFormat === 'html' && !exportOptions.includeCSS)\">\n <span>Include branding</span>\n <small>{{ brandingHint }}</small>\n </label>\n }\n </div>\n @if (selectedFormat === 'json') {\n <div class=\"format-specific-options\">\n <h4 class=\"subsection-title\">JSON Options</h4>\n <label class=\"checkbox-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"exportOptions.prettyPrint\"\n [disabled]=\"isExporting\">\n <span>Pretty print</span>\n <small>Format JSON with indentation</small>\n </label>\n </div>\n }\n @if (selectedFormat === 'html') {\n <div class=\"format-specific-options\">\n <h4 class=\"subsection-title\">HTML Options</h4>\n <label class=\"checkbox-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"exportOptions.includeCSS\"\n [disabled]=\"isExporting\">\n <span>Include CSS styling</span>\n <small>Embed styles for better presentation</small>\n </label>\n <!-- Which palette gets baked in — NOT the mode the app happens to be in.\n Exporting from a dark session would otherwise put dark text on the\n export's white page. -->\n @if (exportOptions.includeTheme && exportOptions.includeCSS) {\n <label class=\"checkbox-label\">\n <span>Theme</span>\n <select\n class=\"mj-input theme-mode-select\"\n [(ngModel)]=\"exportOptions.themeMode\"\n [disabled]=\"isExporting\">\n <option value=\"light\">Light</option>\n <option value=\"dark\">Dark</option>\n </select>\n <small>Palette baked into the exported file</small>\n </label>\n }\n </div>\n }\n </section>\n @if (errorMessage) {\n <div class=\"error-message\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ errorMessage }}\n </div>\n }\n @if (isExporting) {\n <div class=\"loading-indicator\">\n <mj-loading text=\"Exporting conversation...\" size=\"small\"></mj-loading>\n </div>\n }\n </div>\n <mj-dialog-actions>\n <button mjButton [disabled]=\"isExporting\" (click)=\"onCancel()\">\n <i class=\"fa-solid fa-times\"></i>\n Cancel\n </button>\n <button mjButton variant=\"primary\" [disabled]=\"!canExport\" (click)=\"onExport()\">\n <i class=\"fa-solid fa-download\"></i>\n Export\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n `,\n styles: [`\n .export-modal-content {\n padding: 20px;\n max-height: calc(600px - 120px);\n overflow-y: auto;\n }\n\n section {\n margin-bottom: 24px;\n }\n\n .section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 8px 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .section-title i {\n color: var(--mj-brand-primary);\n }\n\n .section-description {\n margin: 0 0 16px 0;\n color: var(--mj-text-muted);\n font-size: 14px;\n }\n\n .format-options {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .format-option {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n border: 2px solid var(--mj-border-strong);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n background: var(--mj-bg-surface-card);\n }\n\n .format-option:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n }\n\n .format-option.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface-card));\n }\n\n .format-option > i.fa-solid,\n .format-option > i.fas {\n font-size: 24px;\n color: var(--mj-text-muted);\n width: 32px;\n text-align: center;\n }\n\n .format-option.selected > i.fa-solid,\n .format-option.selected > i.fas {\n color: var(--mj-brand-primary);\n }\n\n .format-details {\n flex: 1;\n }\n\n .format-name {\n font-weight: 500;\n font-size: 14px;\n margin-bottom: 2px;\n }\n\n .format-description {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .check-icon {\n font-size: 20px;\n color: var(--mj-status-success);\n }\n\n .option-checkboxes {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .checkbox-label {\n display: flex;\n flex-direction: column;\n gap: 4px;\n cursor: pointer;\n padding: 8px;\n border-radius: 4px;\n transition: background 0.2s;\n }\n\n .checkbox-label:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .checkbox-label input[type=\"checkbox\"] {\n margin-right: 8px;\n cursor: pointer;\n }\n\n .checkbox-label > span {\n display: inline-flex;\n align-items: center;\n font-size: 14px;\n font-weight: 500;\n }\n\n .checkbox-label input[type=\"checkbox\"]:disabled {\n cursor: not-allowed;\n }\n\n .theme-mode-select {\n margin-left: 8px;\n padding: 2px 6px;\n font-size: 13px;\n }\n\n .checkbox-label small {\n margin-left: 28px;\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .format-specific-options {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .subsection-title {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n }\n\n .error-message {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-status-error);\n font-size: 13px;\n margin-top: 15px;\n padding: 10px 12px;\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-status-error);\n border-radius: 4px;\n }\n\n .loading-indicator {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-top: 15px;\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n color: var(--mj-text-muted);\n }\n\n mj-dialog-actions {\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n padding: 15px 20px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n mj-dialog-actions button i {\n margin-right: 6px;\n }\n `]\n})\nexport class ExportModalComponent {\n private _isVisible = false;\n @Input()\n set isVisible(value: boolean) {\n const opening = value && !this._isVisible;\n this._isVisible = value;\n if (opening) {\n // Fresh open: \"Include branding\" defaults ON only when the host explicitly\n // configured export branding — plain MJ Explorer keeps today's unthemed file.\n // NOTE this reads `branding`, so a host binding both in one change-detection\n // pass must bind [branding] FIRST (Angular sets inputs in template order).\n // chat-area's template does; a host mounting with isVisible already true and\n // branding bound after would get the checkbox defaulted off.\n this.exportOptions.includeTheme = !!this.branding;\n }\n }\n get isVisible(): boolean {\n return this._isVisible;\n }\n\n @Input() conversation?: MJConversationEntity;\n @Input() currentUser!: UserInfo;\n /**\n * Host-supplied export branding (theme tokens / logo / title). When set, the\n * HTML format's \"Include branding\" checkbox defaults on and the branding is\n * passed to {@link ExportService} on export. See `ExportBranding`.\n */\n @Input() branding: ExportBranding | null = null;\n @Output() cancelled = new EventEmitter<void>();\n @Output() exported = new EventEmitter<void>();\n\n selectedFormat: ExportFormat | null = 'markdown';\n isExporting = false;\n errorMessage = '';\n\n exportOptions: ExportOptions = {\n includeMessages: true,\n includeMetadata: true,\n prettyPrint: true,\n includeCSS: true,\n includeTheme: false,\n themeMode: 'light'\n };\n\n /** Format-aware hint under the \"Include branding\" checkbox. */\n get brandingHint(): string {\n if (this.selectedFormat === 'html') {\n if (!this.exportOptions.includeCSS) {\n return 'Requires \"Include CSS styling\"';\n }\n return `Embed the app's theme colors${this.branding?.logoUrl ? ', logo,' : ''} and attribution line`;\n }\n const logo = this.branding?.logoUrl && this.selectedFormat === 'markdown' ? ', logo,' : '';\n return `Add the title${logo} and attribution line`;\n }\n\n /**\n * The options actually handed to the service. `includeTheme` is the user's INTENT;\n * this resolves it against the selected format:\n *\n * - HTML with the stylesheet off cannot carry branding (a full-size unstyled logo and\n * an unstyled footer would leak), so it drops.\n * - `includeCSS` is an HTML-only concern and must NOT decide anything for\n * markdown / text / JSON — resolving here rather than mutating `includeTheme` is\n * what keeps an HTML-format toggle from silently following the user into another\n * format.\n */\n private resolveExportOptions(): ExportOptions {\n const unstyledHtml = this.selectedFormat === 'html' && !this.exportOptions.includeCSS;\n const brandingOn = !!this.exportOptions.includeTheme && !unstyledHtml;\n return {\n ...this.exportOptions,\n includeTheme: brandingOn,\n branding: brandingOn ? (this.branding ?? undefined) : undefined\n };\n }\n\n get exportTitle(): string {\n return `Export: ${this.conversation?.Name || 'Conversation'}`;\n }\n\n get canExport(): boolean {\n return !this.isExporting &&\n !!this.selectedFormat &&\n (this.exportOptions.includeMessages === true);\n }\n\n formats = [\n {\n value: 'markdown' as ExportFormat,\n name: 'Markdown',\n description: 'Formatted text with markdown syntax',\n icon: 'fa-solid fa-file-alt'\n },\n {\n value: 'json' as ExportFormat,\n name: 'JSON',\n description: 'Structured data format',\n icon: 'fa-solid fa-code'\n },\n {\n value: 'html' as ExportFormat,\n name: 'HTML',\n description: 'Web page format',\n icon: 'fa-solid fa-file-code'\n },\n {\n value: 'text' as ExportFormat,\n name: 'Plain Text',\n description: 'Simple text file',\n icon: 'fa-solid fa-file'\n }\n ];\n\n constructor(\n private exportService: ExportService,\n private dialogService: DialogService,\n private toastService: ToastService\n ) {}\n\n selectFormat(format: ExportFormat): void {\n if (!this.isExporting) {\n this.selectedFormat = format;\n }\n }\n\n async onExport(): Promise<void> {\n if (!this.canExport || !this.conversation) {\n return;\n }\n\n if (!this.exportOptions.includeMessages) {\n this.errorMessage = 'At least \"Include messages\" must be selected';\n return;\n }\n\n this.isExporting = true;\n this.errorMessage = '';\n\n try {\n await this.exportService.exportConversation(\n this.conversation.ID,\n this.selectedFormat!,\n this.currentUser,\n this.resolveExportOptions()\n );\n\n this.toastService.success('Conversation exported successfully');\n this.exported.emit();\n this.resetForm();\n } catch (error) {\n console.error('Error exporting conversation:', error);\n this.errorMessage = error instanceof Error ? error.message : 'Failed to export conversation';\n this.toastService.error(this.errorMessage);\n } finally {\n this.isExporting = false;\n }\n }\n\n onCancel(): void {\n this.cancelled.emit();\n this.resetForm();\n }\n\n private resetForm(): void {\n this.selectedFormat = 'markdown';\n this.errorMessage = '';\n this.exportOptions = {\n includeMessages: true,\n includeMetadata: true,\n prettyPrint: true,\n includeCSS: true,\n includeTheme: !!this.branding,\n themeMode: 'light'\n };\n this.isVisible = false;\n }\n}\n"]}
|
|
@@ -41,6 +41,11 @@ export declare class MessageInputComponent extends BaseAngularComponent implemen
|
|
|
41
41
|
parentMessageId?: string;
|
|
42
42
|
enableAttachments: boolean;
|
|
43
43
|
enableMentions: boolean;
|
|
44
|
+
enableAgentMentions: boolean;
|
|
45
|
+
enableEntityMentions: boolean;
|
|
46
|
+
enableSkillCommands: boolean;
|
|
47
|
+
enablePlanMode: boolean;
|
|
48
|
+
enableRealtime: boolean;
|
|
44
49
|
maxAttachments: number;
|
|
45
50
|
maxAttachmentSizeBytes: number;
|
|
46
51
|
acceptedFileTypes: string;
|
|
@@ -625,6 +630,6 @@ export declare class MessageInputComponent extends BaseAngularComponent implemen
|
|
|
625
630
|
*/
|
|
626
631
|
private cleanupCompletionTimestamp;
|
|
627
632
|
static ɵfac: i0.ɵɵFactoryDeclaration<MessageInputComponent, never>;
|
|
628
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<MessageInputComponent, "mj-message-input", never, { "conversationId": { "alias": "conversationId"; "required": false; }; "conversationName": { "alias": "conversationName"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "parentMessageId": { "alias": "parentMessageId"; "required": false; }; "enableAttachments": { "alias": "enableAttachments"; "required": false; }; "enableMentions": { "alias": "enableMentions"; "required": false; }; "maxAttachments": { "alias": "maxAttachments"; "required": false; }; "maxAttachmentSizeBytes": { "alias": "maxAttachmentSizeBytes"; "required": false; }; "acceptedFileTypes": { "alias": "acceptedFileTypes"; "required": false; }; "artifactsByDetailId": { "alias": "artifactsByDetailId"; "required": false; }; "systemArtifactsByDetailId": { "alias": "systemArtifactsByDetailId"; "required": false; }; "agentRunsByDetailId": { "alias": "agentRunsByDetailId"; "required": false; }; "emptyStateMode": { "alias": "emptyStateMode"; "required": false; }; "appContext": { "alias": "appContext"; "required": false; }; "defaultAgentId": { "alias": "defaultAgentId"; "required": false; }; "conversationDefaultAgentId": { "alias": "conversationDefaultAgentId"; "required": false; }; "agentConfigurationPresetId": { "alias": "agentConfigurationPresetId"; "required": false; }; "initialMessage": { "alias": "initialMessage"; "required": false; }; "initialAttachments": { "alias": "initialAttachments"; "required": false; }; "conversationHistory": { "alias": "conversationHistory"; "required": false; }; "inProgressMessageIds": { "alias": "inProgressMessageIds"; "required": false; }; "applicationId": { "alias": "applicationId"; "required": false; }; "initialDraft": { "alias": "initialDraft"; "required": false; }; }, { "messageSent": "messageSent"; "agentResponse": "agentResponse"; "beforeAgentTurn": "beforeAgentTurn"; "afterAgentTurn": "afterAgentTurn"; "agentRunDetected": "agentRunDetected"; "agentRunUpdate": "agentRunUpdate"; "messageComplete": "messageComplete"; "artifactCreated": "artifactCreated"; "conversationRenamed": "conversationRenamed"; "intentCheckStarted": "intentCheckStarted"; "intentCheckCompleted": "intentCheckCompleted"; "initialMessageAutoSendStarted": "initialMessageAutoSendStarted"; "initialMessageAutoSendFailed": "initialMessageAutoSendFailed"; "emptyStateSubmit": "emptyStateSubmit"; "uploadStateChanged": "uploadStateChanged"; "initialDraftApplied": "initialDraftApplied"; "DraftStateChanged": "DraftStateChanged"; "ComposerBlurred": "ComposerBlurred"; }, never, never, false, never>;
|
|
633
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<MessageInputComponent, "mj-message-input", never, { "conversationId": { "alias": "conversationId"; "required": false; }; "conversationName": { "alias": "conversationName"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "parentMessageId": { "alias": "parentMessageId"; "required": false; }; "enableAttachments": { "alias": "enableAttachments"; "required": false; }; "enableMentions": { "alias": "enableMentions"; "required": false; }; "enableAgentMentions": { "alias": "enableAgentMentions"; "required": false; }; "enableEntityMentions": { "alias": "enableEntityMentions"; "required": false; }; "enableSkillCommands": { "alias": "enableSkillCommands"; "required": false; }; "enablePlanMode": { "alias": "enablePlanMode"; "required": false; }; "enableRealtime": { "alias": "enableRealtime"; "required": false; }; "maxAttachments": { "alias": "maxAttachments"; "required": false; }; "maxAttachmentSizeBytes": { "alias": "maxAttachmentSizeBytes"; "required": false; }; "acceptedFileTypes": { "alias": "acceptedFileTypes"; "required": false; }; "artifactsByDetailId": { "alias": "artifactsByDetailId"; "required": false; }; "systemArtifactsByDetailId": { "alias": "systemArtifactsByDetailId"; "required": false; }; "agentRunsByDetailId": { "alias": "agentRunsByDetailId"; "required": false; }; "emptyStateMode": { "alias": "emptyStateMode"; "required": false; }; "appContext": { "alias": "appContext"; "required": false; }; "defaultAgentId": { "alias": "defaultAgentId"; "required": false; }; "conversationDefaultAgentId": { "alias": "conversationDefaultAgentId"; "required": false; }; "agentConfigurationPresetId": { "alias": "agentConfigurationPresetId"; "required": false; }; "initialMessage": { "alias": "initialMessage"; "required": false; }; "initialAttachments": { "alias": "initialAttachments"; "required": false; }; "conversationHistory": { "alias": "conversationHistory"; "required": false; }; "inProgressMessageIds": { "alias": "inProgressMessageIds"; "required": false; }; "applicationId": { "alias": "applicationId"; "required": false; }; "initialDraft": { "alias": "initialDraft"; "required": false; }; }, { "messageSent": "messageSent"; "agentResponse": "agentResponse"; "beforeAgentTurn": "beforeAgentTurn"; "afterAgentTurn": "afterAgentTurn"; "agentRunDetected": "agentRunDetected"; "agentRunUpdate": "agentRunUpdate"; "messageComplete": "messageComplete"; "artifactCreated": "artifactCreated"; "conversationRenamed": "conversationRenamed"; "intentCheckStarted": "intentCheckStarted"; "intentCheckCompleted": "intentCheckCompleted"; "initialMessageAutoSendStarted": "initialMessageAutoSendStarted"; "initialMessageAutoSendFailed": "initialMessageAutoSendFailed"; "emptyStateSubmit": "emptyStateSubmit"; "uploadStateChanged": "uploadStateChanged"; "initialDraftApplied": "initialDraftApplied"; "DraftStateChanged": "DraftStateChanged"; "ComposerBlurred": "ComposerBlurred"; }, never, never, false, never>;
|
|
629
634
|
}
|
|
630
635
|
//# sourceMappingURL=message-input.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-input.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/message/message-input.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAa,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9I,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAY,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAmE,MAAM,+BAA+B,CAAC;AAC5I,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAAsB,MAAM,8BAA8B,CAAC;AACvH,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AACrF,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,4BAA4B,EAAkD,MAAM,+CAA+C,CAAC;AAI7I,OAAO,EAAE,kBAAkB,EAA+G,MAAM,8BAA8B,CAAC;AAC/K,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,gDAAgD,CAAC;AAG/F,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;;AAUhF,qBAMa,qBAAsB,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa;
|
|
1
|
+
{"version":3,"file":"message-input.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/message/message-input.component.ts"],"names":[],"mappings":"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"}
|