@memberjunction/ng-skip-chat 2.48.0 → 2.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/artifacts/skip-artifact-viewer.component.js +254 -270
- package/dist/lib/artifacts/skip-artifact-viewer.component.js.map +1 -1
- package/dist/lib/artifacts/skip-artifacts-counter.component.js +82 -90
- package/dist/lib/artifacts/skip-artifacts-counter.component.js.map +1 -1
- package/dist/lib/drill-down-info.js +4 -3
- package/dist/lib/drill-down-info.js.map +1 -1
- package/dist/lib/dynamic-report/base-report.js +147 -164
- package/dist/lib/dynamic-report/base-report.js.map +1 -1
- package/dist/lib/dynamic-report/dynamic-chart.js +77 -86
- package/dist/lib/dynamic-report/dynamic-chart.js.map +1 -1
- package/dist/lib/dynamic-report/dynamic-grid.js +80 -93
- package/dist/lib/dynamic-report/dynamic-grid.js.map +1 -1
- package/dist/lib/dynamic-report/dynamic-ui-component.js +173 -188
- package/dist/lib/dynamic-report/dynamic-ui-component.js.map +1 -1
- package/dist/lib/dynamic-report/linear-report.js +16 -26
- package/dist/lib/dynamic-report/linear-report.js.map +1 -1
- package/dist/lib/dynamic-report/skip-dynamic-report-wrapper.js +28 -28
- package/dist/lib/dynamic-report/skip-dynamic-report-wrapper.js.map +1 -1
- package/dist/lib/dynamic-report/skip-react-component-host.js +203 -212
- package/dist/lib/dynamic-report/skip-react-component-host.js.map +1 -1
- package/dist/lib/module.js +22 -22
- package/dist/lib/module.js.map +1 -1
- package/dist/lib/report-cache.js +2 -5
- package/dist/lib/report-cache.js.map +1 -1
- package/dist/lib/skip-chat/skip-chat.component.js +1052 -1087
- package/dist/lib/skip-chat/skip-chat.component.js.map +1 -1
- package/dist/lib/skip-single-message/skip-single-message.component.js +251 -259
- package/dist/lib/skip-single-message/skip-single-message.component.js.map +1 -1
- package/dist/lib/split-panel/skip-split-panel.component.js +52 -51
- package/dist/lib/split-panel/skip-split-panel.component.js.map +1 -1
- package/package.json +13 -13
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
import { Component, EventEmitter, Input, Output, ViewChild, ViewContainerRef } from '@angular/core';
|
|
11
2
|
import { LogError, RunView } from '@memberjunction/core';
|
|
12
3
|
import { SkipResponsePhase } from '@memberjunction/skip-types';
|
|
@@ -174,120 +165,126 @@ function SkipSingleMessageComponent_Conditional_19_Template(rf, ctx) { if (rf &
|
|
|
174
165
|
i0.ɵɵconditional(ctx_r0.ConversationDetailRecord.UserRating === 10 ? 3 : 4);
|
|
175
166
|
} }
|
|
176
167
|
export class SkipSingleMessageComponent extends BaseAngularComponent {
|
|
168
|
+
cdRef;
|
|
169
|
+
notificationService;
|
|
170
|
+
ConversationRecord;
|
|
171
|
+
ConversationDetailRecord;
|
|
172
|
+
ConversationUser;
|
|
173
|
+
DataContext;
|
|
174
|
+
ConversationMessages;
|
|
175
|
+
/**
|
|
176
|
+
* This variable should be set by the component instantiating this one, it should be bound to the state
|
|
177
|
+
* of the conversation processing, so that this component can handle its internal functionality correctly,
|
|
178
|
+
* for example when the conversation is processing, don't show the buttons to edit or delete the message
|
|
179
|
+
*/
|
|
180
|
+
ConversationProcessing = false;
|
|
181
|
+
/**
|
|
182
|
+
* Set this property in order to set the Skip logo. This can either be a URL or a Blob
|
|
183
|
+
*/
|
|
184
|
+
SkipMarkOnlyLogoURL = "assets/Skip - Mark Only - Small.png";
|
|
185
|
+
/**
|
|
186
|
+
* Set this property in order to set the user image. This can either be a URL or a Blob
|
|
187
|
+
*/
|
|
188
|
+
UserImage = undefined;
|
|
189
|
+
/**
|
|
190
|
+
* Default user image to use if the user image is not set
|
|
191
|
+
*/
|
|
192
|
+
DefaultUserImage = undefined;
|
|
193
|
+
/**
|
|
194
|
+
* Optional timestamp when the message was loaded/created
|
|
195
|
+
* If not provided, it will be set to Date.now() in ngAfterViewInit
|
|
196
|
+
*/
|
|
197
|
+
loadTime = undefined;
|
|
198
|
+
/**
|
|
199
|
+
* If set to true, user messages will be shown with a button to allow delete/edit
|
|
200
|
+
*/
|
|
201
|
+
ShowMessageEditPanel = true;
|
|
202
|
+
/**
|
|
203
|
+
* If set to true, AI messages that are the last in the conversation will show thumbs up/down rating
|
|
204
|
+
*/
|
|
205
|
+
ShowMessageRating = true;
|
|
206
|
+
/**
|
|
207
|
+
* If set to true, messages with linked artifacts will show an artifact indicator
|
|
208
|
+
*/
|
|
209
|
+
ShowArtifactIndicator = true;
|
|
210
|
+
/**
|
|
211
|
+
* Indicates if the message is currently being rated and saved to the database
|
|
212
|
+
*/
|
|
213
|
+
RatingBeingSaved = false;
|
|
214
|
+
/**
|
|
215
|
+
* This is an internal property that is turned on just after a user succesfully rates a message, and is never true otherwise. This allows the UI to show a thank you message for the rating.
|
|
216
|
+
*/
|
|
217
|
+
UserJustRated = false;
|
|
218
|
+
/**
|
|
219
|
+
* Controls the visibility of the feedback dialog
|
|
220
|
+
*/
|
|
221
|
+
ShowingFeedbackDialog = false;
|
|
222
|
+
/**
|
|
223
|
+
* Stores the rating value selected by the user before submitting feedback
|
|
224
|
+
*/
|
|
225
|
+
SelectedRating = null;
|
|
226
|
+
/**
|
|
227
|
+
* Stores the feedback text entered by the user
|
|
228
|
+
*/
|
|
229
|
+
UserFeedbackText = '';
|
|
230
|
+
/**
|
|
231
|
+
* The title to show in the feedback dialog based on the rating
|
|
232
|
+
*/
|
|
233
|
+
FeedbackDialogTitle = 'Share more feedback';
|
|
234
|
+
/**
|
|
235
|
+
* Name of the artifact associated with this message, if any
|
|
236
|
+
*/
|
|
237
|
+
ArtifactName = null;
|
|
238
|
+
/**
|
|
239
|
+
* Description of the artifact associated with this message, if any
|
|
240
|
+
*/
|
|
241
|
+
ArtifactDescription = null;
|
|
242
|
+
/**
|
|
243
|
+
* Version of the artifact associated with this message, if any
|
|
244
|
+
*/
|
|
245
|
+
ArtifactVersion = null;
|
|
246
|
+
SuggestedQuestionSelected = new EventEmitter();
|
|
247
|
+
SuggestedAnswerSelected = new EventEmitter();
|
|
248
|
+
/**
|
|
249
|
+
* Event emitted when the user clicks on a matching report and the application needs to handle the navigation
|
|
250
|
+
*/
|
|
251
|
+
NavigateToMatchingReport = new EventEmitter();
|
|
252
|
+
/**
|
|
253
|
+
* This event fires whenever a new report is created.
|
|
254
|
+
*/
|
|
255
|
+
NewReportCreated = new EventEmitter();
|
|
256
|
+
/**
|
|
257
|
+
* This event fires when the user is requesting to edit a message, the container of this component will handle
|
|
258
|
+
*/
|
|
259
|
+
EditMessageRequested = new EventEmitter();
|
|
260
|
+
/**
|
|
261
|
+
* This event fires when the user is requesting to delete a message, the container of this component will handle
|
|
262
|
+
*/
|
|
263
|
+
DeleteMessageRequested = new EventEmitter();
|
|
264
|
+
/**
|
|
265
|
+
* This event fires whenever a drill down is requested within a given report.
|
|
266
|
+
*/
|
|
267
|
+
DrillDownEvent = new EventEmitter();
|
|
268
|
+
/**
|
|
269
|
+
* This event fires when the user clicks on an artifact indicator to view the artifact
|
|
270
|
+
*/
|
|
271
|
+
ArtifactSelected = new EventEmitter();
|
|
272
|
+
SuggestedQuestions = [];
|
|
273
|
+
SuggestedAnswers = [];
|
|
274
|
+
ShowSuggestedQuestions = true;
|
|
275
|
+
HideSuggestedQuestionsAfterClick = true;
|
|
276
|
+
ShowSuggestedAnswers = true;
|
|
277
|
+
HideSuggestedAnswersAfterClick = true;
|
|
278
|
+
SuggestedQuestionsClicked = false;
|
|
279
|
+
SuggestedAnswersClicked = false;
|
|
177
280
|
constructor(cdRef, notificationService) {
|
|
178
281
|
super();
|
|
179
282
|
this.cdRef = cdRef;
|
|
180
283
|
this.notificationService = notificationService;
|
|
181
|
-
/**
|
|
182
|
-
* This variable should be set by the component instantiating this one, it should be bound to the state
|
|
183
|
-
* of the conversation processing, so that this component can handle its internal functionality correctly,
|
|
184
|
-
* for example when the conversation is processing, don't show the buttons to edit or delete the message
|
|
185
|
-
*/
|
|
186
|
-
this.ConversationProcessing = false;
|
|
187
|
-
/**
|
|
188
|
-
* Set this property in order to set the Skip logo. This can either be a URL or a Blob
|
|
189
|
-
*/
|
|
190
|
-
this.SkipMarkOnlyLogoURL = "assets/Skip - Mark Only - Small.png";
|
|
191
|
-
/**
|
|
192
|
-
* Set this property in order to set the user image. This can either be a URL or a Blob
|
|
193
|
-
*/
|
|
194
|
-
this.UserImage = undefined;
|
|
195
|
-
/**
|
|
196
|
-
* Default user image to use if the user image is not set
|
|
197
|
-
*/
|
|
198
|
-
this.DefaultUserImage = undefined;
|
|
199
|
-
/**
|
|
200
|
-
* Optional timestamp when the message was loaded/created
|
|
201
|
-
* If not provided, it will be set to Date.now() in ngAfterViewInit
|
|
202
|
-
*/
|
|
203
|
-
this.loadTime = undefined;
|
|
204
|
-
/**
|
|
205
|
-
* If set to true, user messages will be shown with a button to allow delete/edit
|
|
206
|
-
*/
|
|
207
|
-
this.ShowMessageEditPanel = true;
|
|
208
|
-
/**
|
|
209
|
-
* If set to true, AI messages that are the last in the conversation will show thumbs up/down rating
|
|
210
|
-
*/
|
|
211
|
-
this.ShowMessageRating = true;
|
|
212
|
-
/**
|
|
213
|
-
* If set to true, messages with linked artifacts will show an artifact indicator
|
|
214
|
-
*/
|
|
215
|
-
this.ShowArtifactIndicator = true;
|
|
216
|
-
/**
|
|
217
|
-
* Indicates if the message is currently being rated and saved to the database
|
|
218
|
-
*/
|
|
219
|
-
this.RatingBeingSaved = false;
|
|
220
|
-
/**
|
|
221
|
-
* This is an internal property that is turned on just after a user succesfully rates a message, and is never true otherwise. This allows the UI to show a thank you message for the rating.
|
|
222
|
-
*/
|
|
223
|
-
this.UserJustRated = false;
|
|
224
|
-
/**
|
|
225
|
-
* Controls the visibility of the feedback dialog
|
|
226
|
-
*/
|
|
227
|
-
this.ShowingFeedbackDialog = false;
|
|
228
|
-
/**
|
|
229
|
-
* Stores the rating value selected by the user before submitting feedback
|
|
230
|
-
*/
|
|
231
|
-
this.SelectedRating = null;
|
|
232
|
-
/**
|
|
233
|
-
* Stores the feedback text entered by the user
|
|
234
|
-
*/
|
|
235
|
-
this.UserFeedbackText = '';
|
|
236
|
-
/**
|
|
237
|
-
* The title to show in the feedback dialog based on the rating
|
|
238
|
-
*/
|
|
239
|
-
this.FeedbackDialogTitle = 'Share more feedback';
|
|
240
|
-
/**
|
|
241
|
-
* Name of the artifact associated with this message, if any
|
|
242
|
-
*/
|
|
243
|
-
this.ArtifactName = null;
|
|
244
|
-
/**
|
|
245
|
-
* Description of the artifact associated with this message, if any
|
|
246
|
-
*/
|
|
247
|
-
this.ArtifactDescription = null;
|
|
248
|
-
/**
|
|
249
|
-
* Version of the artifact associated with this message, if any
|
|
250
|
-
*/
|
|
251
|
-
this.ArtifactVersion = null;
|
|
252
|
-
this.SuggestedQuestionSelected = new EventEmitter();
|
|
253
|
-
this.SuggestedAnswerSelected = new EventEmitter();
|
|
254
|
-
/**
|
|
255
|
-
* Event emitted when the user clicks on a matching report and the application needs to handle the navigation
|
|
256
|
-
*/
|
|
257
|
-
this.NavigateToMatchingReport = new EventEmitter();
|
|
258
|
-
/**
|
|
259
|
-
* This event fires whenever a new report is created.
|
|
260
|
-
*/
|
|
261
|
-
this.NewReportCreated = new EventEmitter();
|
|
262
|
-
/**
|
|
263
|
-
* This event fires when the user is requesting to edit a message, the container of this component will handle
|
|
264
|
-
*/
|
|
265
|
-
this.EditMessageRequested = new EventEmitter();
|
|
266
|
-
/**
|
|
267
|
-
* This event fires when the user is requesting to delete a message, the container of this component will handle
|
|
268
|
-
*/
|
|
269
|
-
this.DeleteMessageRequested = new EventEmitter();
|
|
270
|
-
/**
|
|
271
|
-
* This event fires whenever a drill down is requested within a given report.
|
|
272
|
-
*/
|
|
273
|
-
this.DrillDownEvent = new EventEmitter();
|
|
274
|
-
/**
|
|
275
|
-
* This event fires when the user clicks on an artifact indicator to view the artifact
|
|
276
|
-
*/
|
|
277
|
-
this.ArtifactSelected = new EventEmitter();
|
|
278
|
-
this.SuggestedQuestions = [];
|
|
279
|
-
this.SuggestedAnswers = [];
|
|
280
|
-
this.ShowSuggestedQuestions = true;
|
|
281
|
-
this.HideSuggestedQuestionsAfterClick = true;
|
|
282
|
-
this.ShowSuggestedAnswers = true;
|
|
283
|
-
this.HideSuggestedAnswersAfterClick = true;
|
|
284
|
-
this.SuggestedQuestionsClicked = false;
|
|
285
|
-
this.SuggestedAnswersClicked = false;
|
|
286
|
-
this._loadTime = 0;
|
|
287
|
-
this._elapsedTimeFormatted = "";
|
|
288
|
-
this._elapsedTimeInterval = null;
|
|
289
|
-
this._cachedMessage = null;
|
|
290
284
|
}
|
|
285
|
+
reportContainerRef;
|
|
286
|
+
static _detailHtml = {};
|
|
287
|
+
_loadTime = 0;
|
|
291
288
|
get ElapsedTimeSinceLoad() {
|
|
292
289
|
return Date.now() - this._loadTime;
|
|
293
290
|
}
|
|
@@ -304,6 +301,8 @@ export class SkipSingleMessageComponent extends BaseAngularComponent {
|
|
|
304
301
|
}
|
|
305
302
|
return this._elapsedTimeFormatted;
|
|
306
303
|
}
|
|
304
|
+
_elapsedTimeFormatted = "";
|
|
305
|
+
_elapsedTimeInterval = null;
|
|
307
306
|
FormatElapsedTime(elapsedTime) {
|
|
308
307
|
let seconds = Math.floor(elapsedTime / 1000);
|
|
309
308
|
let minutes = Math.floor(seconds / 60);
|
|
@@ -344,6 +343,7 @@ export class SkipSingleMessageComponent extends BaseAngularComponent {
|
|
|
344
343
|
RefreshMessage() {
|
|
345
344
|
this._cachedMessage = null;
|
|
346
345
|
}
|
|
346
|
+
_cachedMessage = null;
|
|
347
347
|
get Message() {
|
|
348
348
|
if (this._cachedMessage === null) {
|
|
349
349
|
if (this.ConversationDetailRecord.ID && this.ConversationDetailRecord.ID.length > 0 &&
|
|
@@ -441,59 +441,56 @@ export class SkipSingleMessageComponent extends BaseAngularComponent {
|
|
|
441
441
|
* @param rating The rating to assign, 10 for thumbs up, 1 for thumbs down
|
|
442
442
|
* @param feedback Optional text feedback from the user
|
|
443
443
|
*/
|
|
444
|
-
RateMessage(
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
444
|
+
async RateMessage(rating, feedback = '') {
|
|
445
|
+
if (!this.ConversationDetailRecord || !this.IsAIMessage) {
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
try {
|
|
449
|
+
this.RatingBeingSaved = true;
|
|
450
|
+
// Update the UserRating property in the local object
|
|
451
|
+
this.ConversationDetailRecord.UserRating = rating;
|
|
452
|
+
// Update the UserFeedback property if provided
|
|
453
|
+
if (feedback) {
|
|
454
|
+
this.ConversationDetailRecord.UserFeedback = feedback;
|
|
448
455
|
}
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
//
|
|
452
|
-
|
|
453
|
-
|
|
456
|
+
let objToSave = this.ConversationDetailRecord;
|
|
457
|
+
if (undefined === this.ConversationDetailRecord.Save) {
|
|
458
|
+
// this means that the current object is not a ConversationDetailEntity, so we can't save it directly, we must load an object first
|
|
459
|
+
const p = this.ProviderToUse;
|
|
460
|
+
const savedID = this.ConversationDetailRecord.ID;
|
|
461
|
+
objToSave = await p.GetEntityObject("Conversation Details", p.CurrentUser);
|
|
462
|
+
await objToSave.Load(savedID);
|
|
463
|
+
objToSave.UserRating = rating;
|
|
464
|
+
// Set feedback if provided
|
|
454
465
|
if (feedback) {
|
|
455
|
-
|
|
456
|
-
}
|
|
457
|
-
let objToSave = this.ConversationDetailRecord;
|
|
458
|
-
if (undefined === this.ConversationDetailRecord.Save) {
|
|
459
|
-
// this means that the current object is not a ConversationDetailEntity, so we can't save it directly, we must load an object first
|
|
460
|
-
const p = this.ProviderToUse;
|
|
461
|
-
const savedID = this.ConversationDetailRecord.ID;
|
|
462
|
-
objToSave = yield p.GetEntityObject("Conversation Details", p.CurrentUser);
|
|
463
|
-
yield objToSave.Load(savedID);
|
|
464
|
-
objToSave.UserRating = rating;
|
|
465
|
-
// Set feedback if provided
|
|
466
|
-
if (feedback) {
|
|
467
|
-
objToSave.UserFeedback = feedback;
|
|
468
|
-
}
|
|
469
|
-
// now we have a real object, we can save it below
|
|
470
|
-
}
|
|
471
|
-
// Save the updated record
|
|
472
|
-
if (yield objToSave.Save()) {
|
|
473
|
-
// Force change detection
|
|
474
|
-
this.UserJustRated = true; // show the thank you message
|
|
475
|
-
// set a timer to wait for 10 seconds and after that we'll set the UserJustRated to false
|
|
476
|
-
setTimeout(() => {
|
|
477
|
-
this.UserJustRated = false;
|
|
478
|
-
}, 10000);
|
|
479
|
-
}
|
|
480
|
-
else {
|
|
481
|
-
throw objToSave.LatestResult.Message;
|
|
466
|
+
objToSave.UserFeedback = feedback;
|
|
482
467
|
}
|
|
468
|
+
// now we have a real object, we can save it below
|
|
483
469
|
}
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
470
|
+
// Save the updated record
|
|
471
|
+
if (await objToSave.Save()) {
|
|
472
|
+
// Force change detection
|
|
473
|
+
this.UserJustRated = true; // show the thank you message
|
|
474
|
+
// set a timer to wait for 10 seconds and after that we'll set the UserJustRated to false
|
|
475
|
+
setTimeout(() => {
|
|
476
|
+
this.UserJustRated = false;
|
|
477
|
+
}, 10000);
|
|
487
478
|
}
|
|
488
|
-
|
|
489
|
-
|
|
479
|
+
else {
|
|
480
|
+
throw objToSave.LatestResult.Message;
|
|
490
481
|
}
|
|
491
|
-
}
|
|
482
|
+
}
|
|
483
|
+
catch (error) {
|
|
484
|
+
LogError('Error rating message:' + error);
|
|
485
|
+
this.notificationService.CreateSimpleNotification('Error saving feedback', "error", 3500);
|
|
486
|
+
}
|
|
487
|
+
finally {
|
|
488
|
+
this.RatingBeingSaved = false;
|
|
489
|
+
}
|
|
492
490
|
}
|
|
493
491
|
AddReportToConversation() {
|
|
494
|
-
var _a;
|
|
495
492
|
const detail = this.ConversationDetailRecord;
|
|
496
|
-
if (this.reportContainerRef &&
|
|
493
|
+
if (this.reportContainerRef && detail?.ID?.length > 0 && detail.Role.trim().toLowerCase() === 'ai') {
|
|
497
494
|
const resultObject = JSON.parse(detail.Message);
|
|
498
495
|
if (resultObject.success) {
|
|
499
496
|
if (resultObject.responsePhase === SkipResponsePhase.analysis_complete) {
|
|
@@ -547,9 +544,8 @@ export class SkipSingleMessageComponent extends BaseAngularComponent {
|
|
|
547
544
|
return 'user-message';
|
|
548
545
|
}
|
|
549
546
|
get IsTemporaryMessage() {
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
if (((_c = this.ConversationDetailRecord.ID) === null || _c === void 0 ? void 0 : _c.length) > 0)
|
|
547
|
+
if (this.ConversationDetailRecord?.Role?.trim().toLowerCase() === 'ai') {
|
|
548
|
+
if (this.ConversationDetailRecord.ID?.length > 0)
|
|
553
549
|
return false;
|
|
554
550
|
else
|
|
555
551
|
return true;
|
|
@@ -652,109 +648,105 @@ export class SkipSingleMessageComponent extends BaseAngularComponent {
|
|
|
652
648
|
/**
|
|
653
649
|
* Loads the artifact information if available
|
|
654
650
|
*/
|
|
655
|
-
loadArtifactInfo() {
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
651
|
+
async loadArtifactInfo() {
|
|
652
|
+
if (!this.HasArtifact || !this.ConversationDetailRecord.ArtifactID) {
|
|
653
|
+
return;
|
|
654
|
+
}
|
|
655
|
+
try {
|
|
656
|
+
const provider = this.ProviderToUse;
|
|
657
|
+
const rv = new RunView(this.RunViewToUse);
|
|
658
|
+
const params = [
|
|
659
|
+
{
|
|
660
|
+
EntityName: 'MJ: Conversation Artifacts',
|
|
661
|
+
ExtraFilter: "ID = '" + this.ConversationDetailRecord.ArtifactID + "'",
|
|
662
|
+
ResultType: 'simple'
|
|
663
|
+
}
|
|
664
|
+
];
|
|
665
|
+
if (this.ConversationDetailRecord.ArtifactVersionID) {
|
|
666
|
+
params.push({
|
|
667
|
+
EntityName: 'MJ: Conversation Artifact Versions',
|
|
668
|
+
ExtraFilter: "ID = '" + this.ConversationDetailRecord.ArtifactVersionID + "'",
|
|
669
|
+
ResultType: 'simple'
|
|
670
|
+
});
|
|
660
671
|
}
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
const
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
672
|
+
const results = await rv.RunViews(params, this.ProviderToUse.CurrentUser);
|
|
673
|
+
if (results) {
|
|
674
|
+
const artifactResult = results[0];
|
|
675
|
+
if (artifactResult && artifactResult.Results?.length > 0) {
|
|
676
|
+
const artifact = artifactResult.Results[0];
|
|
677
|
+
if (artifact) {
|
|
678
|
+
this.ArtifactName = artifact.Name;
|
|
679
|
+
this.ArtifactDescription = artifact.Description;
|
|
669
680
|
}
|
|
670
|
-
];
|
|
671
|
-
if (this.ConversationDetailRecord.ArtifactVersionID) {
|
|
672
|
-
params.push({
|
|
673
|
-
EntityName: 'MJ: Conversation Artifact Versions',
|
|
674
|
-
ExtraFilter: "ID = '" + this.ConversationDetailRecord.ArtifactVersionID + "'",
|
|
675
|
-
ResultType: 'simple'
|
|
676
|
-
});
|
|
677
681
|
}
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
this.ArtifactName = artifact.Name;
|
|
685
|
-
this.ArtifactDescription = artifact.Description;
|
|
686
|
-
}
|
|
687
|
-
}
|
|
688
|
-
if (this.ConversationDetailRecord.ArtifactVersionID) {
|
|
689
|
-
const versionResult = results[1];
|
|
690
|
-
if (versionResult && ((_b = versionResult.Results) === null || _b === void 0 ? void 0 : _b.length) > 0) {
|
|
691
|
-
const version = versionResult.Results[0];
|
|
692
|
-
if (version) {
|
|
693
|
-
this.ArtifactVersion = version.Version;
|
|
694
|
-
}
|
|
682
|
+
if (this.ConversationDetailRecord.ArtifactVersionID) {
|
|
683
|
+
const versionResult = results[1];
|
|
684
|
+
if (versionResult && versionResult.Results?.length > 0) {
|
|
685
|
+
const version = versionResult.Results[0];
|
|
686
|
+
if (version) {
|
|
687
|
+
this.ArtifactVersion = version.Version;
|
|
695
688
|
}
|
|
696
689
|
}
|
|
697
690
|
}
|
|
698
691
|
}
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
}
|
|
692
|
+
}
|
|
693
|
+
catch (err) {
|
|
694
|
+
console.error('Error loading artifact information', err);
|
|
695
|
+
}
|
|
703
696
|
}
|
|
697
|
+
static ɵfac = function SkipSingleMessageComponent_Factory(t) { return new (t || SkipSingleMessageComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.MJNotificationService)); };
|
|
698
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SkipSingleMessageComponent, selectors: [["mj-skip-single-message"]], viewQuery: function SkipSingleMessageComponent_Query(rf, ctx) { if (rf & 1) {
|
|
699
|
+
i0.ɵɵviewQuery(_c0, 5, ViewContainerRef);
|
|
700
|
+
} if (rf & 2) {
|
|
701
|
+
let _t;
|
|
702
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.reportContainerRef = _t.first);
|
|
703
|
+
} }, inputs: { ConversationRecord: "ConversationRecord", ConversationDetailRecord: "ConversationDetailRecord", ConversationUser: "ConversationUser", DataContext: "DataContext", ConversationMessages: "ConversationMessages", ConversationProcessing: "ConversationProcessing", SkipMarkOnlyLogoURL: "SkipMarkOnlyLogoURL", UserImage: "UserImage", DefaultUserImage: "DefaultUserImage", loadTime: "loadTime", ShowMessageEditPanel: "ShowMessageEditPanel", ShowMessageRating: "ShowMessageRating", ShowArtifactIndicator: "ShowArtifactIndicator", ShowSuggestedQuestions: "ShowSuggestedQuestions", HideSuggestedQuestionsAfterClick: "HideSuggestedQuestionsAfterClick", ShowSuggestedAnswers: "ShowSuggestedAnswers", HideSuggestedAnswersAfterClick: "HideSuggestedAnswersAfterClick" }, outputs: { SuggestedQuestionSelected: "SuggestedQuestionSelected", SuggestedAnswerSelected: "SuggestedAnswerSelected", NavigateToMatchingReport: "NavigateToMatchingReport", NewReportCreated: "NewReportCreated", EditMessageRequested: "EditMessageRequested", DeleteMessageRequested: "DeleteMessageRequested", DrillDownEvent: "DrillDownEvent", ArtifactSelected: "ArtifactSelected" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 20, vars: 15, consts: [["reportContainer", ""], [1, "message-row", 3, "ngClass"], [1, "message-image"], [1, "avatar", 3, "src"], [1, "fa-solid", "fa-user", "default-user-image"], [1, "message", 3, "id"], [1, "message-user-name"], ["title", "Message actions", 1, "message-actions"], [1, "completion-time"], [1, "artifact-indicator"], ["class", "suggested-container", 4, "ngIf"], [1, "message-rating"], [3, "title", "minWidth", "width", "close", 4, "ngIf"], [1, "rating-feedback"], [1, "elapsed-time"], ["title", "Edit message", 1, "fa-solid", "fa-edit", 3, "click"], ["title", "Delete message", 1, "fa-solid", "fa-trash", 3, "click"], [1, "artifact-indicator", 3, "click"], [1, "fa-solid", "fa-file-lines"], [1, "artifact-label"], [1, "suggested-container"], [1, "suggested-header"], [1, "suggested-questions-list"], ["class", "suggested-item", 3, "click", 4, "ngFor", "ngForOf"], [1, "suggested-item", 3, "click"], [1, "suggested-answers-list"], [1, "rating-prompt"], [1, "rating-buttons"], ["title", "This was helpful", 1, "fa-solid", "fa-thumbs-up", 3, "click"], ["title", "This wasn't helpful", 1, "fa-solid", "fa-thumbs-down", 3, "click"], [3, "close", "title", "minWidth", "width"], [1, "input-wrapper"], ["placeholder", "What feedback would you like to share about this response?", 3, "ngModelChange", "ngModel", "rows", "resizable"], ["kendoButton", "", "themeColor", "primary", 3, "click"], ["kendoButton", "", 3, "click"], [1, "rating-status-text"], [1, "fa-solid", "fa-thumbs-up", "rating-icon-selected"], [1, "fa-solid", "fa-thumbs-down", "rating-icon-selected"]], template: function SkipSingleMessageComponent_Template(rf, ctx) { if (rf & 1) {
|
|
704
|
+
i0.ɵɵelementStart(0, "div")(1, "div", 1)(2, "div", 2);
|
|
705
|
+
i0.ɵɵtemplate(3, SkipSingleMessageComponent_Conditional_3_Template, 1, 1, "img", 3)(4, SkipSingleMessageComponent_Conditional_4_Template, 1, 0, "span", 4);
|
|
706
|
+
i0.ɵɵelementEnd();
|
|
707
|
+
i0.ɵɵelementStart(5, "div", 5)(6, "div", 6);
|
|
708
|
+
i0.ɵɵtext(7);
|
|
709
|
+
i0.ɵɵelementEnd();
|
|
710
|
+
i0.ɵɵelementStart(8, "div");
|
|
711
|
+
i0.ɵɵtemplate(9, SkipSingleMessageComponent_Conditional_9_Template, 3, 1);
|
|
712
|
+
i0.ɵɵtext(10);
|
|
713
|
+
i0.ɵɵtemplate(11, SkipSingleMessageComponent_Conditional_11_Template, 3, 0, "div", 7)(12, SkipSingleMessageComponent_Conditional_12_Template, 2, 1, "div", 8)(13, SkipSingleMessageComponent_Conditional_13_Template, 4, 2, "div", 9);
|
|
714
|
+
i0.ɵɵelementEnd();
|
|
715
|
+
i0.ɵɵtemplate(14, SkipSingleMessageComponent_Conditional_14_Template, 2, 0, "div")(15, SkipSingleMessageComponent_div_15_Template, 5, 1, "div", 10)(16, SkipSingleMessageComponent_div_16_Template, 3, 1, "div", 10)(17, SkipSingleMessageComponent_Conditional_17_Template, 6, 0, "div", 11)(18, SkipSingleMessageComponent_kendo_dialog_18_Template, 10, 6, "kendo-dialog", 12)(19, SkipSingleMessageComponent_Conditional_19_Template, 5, 2, "div", 13);
|
|
716
|
+
i0.ɵɵelementEnd()()();
|
|
717
|
+
} if (rf & 2) {
|
|
718
|
+
i0.ɵɵadvance();
|
|
719
|
+
i0.ɵɵproperty("ngClass", ctx.GetMessageRowCssClass());
|
|
720
|
+
i0.ɵɵadvance(2);
|
|
721
|
+
i0.ɵɵconditional(ctx.GetUserImageSource() ? 3 : 4);
|
|
722
|
+
i0.ɵɵadvance(2);
|
|
723
|
+
i0.ɵɵproperty("id", "skip_message_" + ctx.ConversationDetailRecord.ID);
|
|
724
|
+
i0.ɵɵadvance(2);
|
|
725
|
+
i0.ɵɵtextInterpolate(ctx.IsAIMessage ? "Skip" : ctx.ConversationUser ? ctx.ConversationUser.FirstName + " " + ctx.ConversationUser.LastName : "You");
|
|
726
|
+
i0.ɵɵadvance(2);
|
|
727
|
+
i0.ɵɵconditional(ctx.IsTemporaryMessage ? 9 : -1);
|
|
728
|
+
i0.ɵɵadvance();
|
|
729
|
+
i0.ɵɵtextInterpolate1(" ", ctx.Message, " ");
|
|
730
|
+
i0.ɵɵadvance();
|
|
731
|
+
i0.ɵɵconditional(!ctx.IsTemporaryMessage && !ctx.IsAIMessage && ctx.ShowMessageEditPanel && !ctx.ConversationProcessing ? 11 : -1);
|
|
732
|
+
i0.ɵɵadvance();
|
|
733
|
+
i0.ɵɵconditional(ctx.ShouldShowCompletionTime ? 12 : -1);
|
|
734
|
+
i0.ɵɵadvance();
|
|
735
|
+
i0.ɵɵconditional(ctx.HasArtifact ? 13 : -1);
|
|
736
|
+
i0.ɵɵadvance();
|
|
737
|
+
i0.ɵɵconditional(!ctx.HasArtifact ? 14 : -1);
|
|
738
|
+
i0.ɵɵadvance();
|
|
739
|
+
i0.ɵɵproperty("ngIf", ctx.IsAIMessage && ctx.SuggestedQuestions.length > 0 && ctx.IsLastMessageInConversation && ctx.ShowSuggestedQuestions && (!ctx.HideSuggestedQuestionsAfterClick || !ctx.SuggestedQuestionsClicked));
|
|
740
|
+
i0.ɵɵadvance();
|
|
741
|
+
i0.ɵɵproperty("ngIf", ctx.IsAIMessage && ctx.SuggestedAnswers.length > 0 && ctx.IsLastMessageInConversation && ctx.ShowSuggestedAnswers && (!ctx.HideSuggestedAnswersAfterClick || !ctx.SuggestedAnswersClicked));
|
|
742
|
+
i0.ɵɵadvance();
|
|
743
|
+
i0.ɵɵconditional(!ctx.IsTemporaryMessage && ctx.ShouldShowRating ? 17 : -1);
|
|
744
|
+
i0.ɵɵadvance();
|
|
745
|
+
i0.ɵɵproperty("ngIf", ctx.ShowingFeedbackDialog);
|
|
746
|
+
i0.ɵɵadvance();
|
|
747
|
+
i0.ɵɵconditional(!ctx.IsTemporaryMessage && ctx.IsAIMessage && ctx.ConversationDetailRecord.UserRating !== null && ctx.UserJustRated ? 19 : -1);
|
|
748
|
+
} }, dependencies: [i2.NgClass, i2.NgForOf, i2.NgIf, i3.NgControlStatus, i3.NgModel, i4.LoaderComponent, i5.DialogComponent, i5.DialogActionsComponent, i6.TextAreaComponent, i7.ButtonComponent], styles: [".message-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: start; \n\n \n\n justify-content: center; \n\n \n padding: 10px;\n}\n\n.message[_ngcontent-%COMP%] {\n word-wrap: break-word;\n width: 100%;\n margin-right: 20px;\n padding-bottom: 30px; \n\n min-height: 60px; \n\n position: relative; \n\n @media (min-width: 1280px) {\n max-width: 48rem;\n }\n}\n\n.message-actions[_ngcontent-%COMP%] {\n position: absolute;\n bottom: 5px;\n right: 10px;\n background-color: #ffffff;\n border-radius: 20px;\n padding: 6px 10px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n z-index: 10;\n transition: opacity 0.3s ease, transform 0.3s ease;\n border: 1px solid #e0e0e0;\n opacity: 0;\n transform: translateY(5px) scale(0.95);\n pointer-events: none;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.message[_ngcontent-%COMP%]:hover .message-actions[_ngcontent-%COMP%] {\n opacity: 1;\n transform: translateY(0) scale(1);\n pointer-events: auto;\n}\n \n.message-actions[_ngcontent-%COMP%] > span[_ngcontent-%COMP%] {\n margin: 0 5px;\n color: #6e7072;\n cursor: pointer;\n font-size: 14px;\n padding: 3px;\n transition: all 0.2s ease;\n width: 18px;\n height: 18px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n}\n\n.message-actions[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:hover {\n color: #333;\n background-color: #f5f5f5;\n}\n\n.message-actions[_ngcontent-%COMP%] > span.fa-edit[_ngcontent-%COMP%]:hover {\n color: #4285f4;\n}\n\n.message-actions[_ngcontent-%COMP%] > span.fa-trash[_ngcontent-%COMP%]:hover {\n color: #ea4335;\n}\n\n.message-image[_ngcontent-%COMP%] {\n max-width: 24px;\n max-height: 24px;\n margin-right: 10px;\n margin-left: 5px;\n margin-bottom: 10px;\n}\n.message-image[_ngcontent-%COMP%] > img[_ngcontent-%COMP%] {\n max-width: 100%;\n max-height: 100%;\n}\n\n\n\n.error-message[_ngcontent-%COMP%] {\n background-color:lightpink;\n}\n\n.ai-message-in-progress[_ngcontent-%COMP%] {\n \n\n opacity: 0.9;\n}\n\n.elapsed-time[_ngcontent-%COMP%] {\n font-style: regular;\n font-size: 0.8rem;\n color: #124be7;\n margin-left: 5px;\n margin-right: 5px;\n}\n\n.message-user-name[_ngcontent-%COMP%] {\n font-weight: 600;\n margin-top: 0px;\n margin-bottom: 10px;\n padding-bottom: 7px;\n height: .5rem;\n}\n\n.suggested-container[_ngcontent-%COMP%] {\n margin-right: 20px; \n\n display: flex;\n flex-direction: column;\n align-items: left;\n justify-content: left;\n padding: 10px;\n margin-top: 10px;\n margin-bottom: 10px;\n border: solid 1px rgba(28, 103, 202, 0.08);\n background-color: rgb(241, 236, 227);\n}\n.suggested-header[_ngcontent-%COMP%] {\n font-weight: 600;\n margin-bottom: 10px;\n}\n.suggested-questions-list[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n}\n.suggested-answers-list[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: none;\n}\n.suggested-item[_ngcontent-%COMP%] {\n margin: 5px;\n padding: 5px 10px;\n border-radius: 5px;\n background-color: #f5f5f5;\n cursor: pointer;\n transition: background-color 0.3s;\n}\n.suggested-item[_ngcontent-%COMP%]:hover {\n background-color: #96d0f1;\n}\n\n.default-user-image[_ngcontent-%COMP%] {\n width: 24px;\n font-size: 22px;\n}\n\n\n\n.message-rating[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n margin-top: 15px;\n padding: 8px 12px;\n background-color: #f5f5f5;\n border-radius: 8px;\n width: fit-content;\n}\n\n.rating-prompt[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n margin-bottom: 8px;\n color: #555;\n}\n\n.rating-buttons[_ngcontent-%COMP%] {\n display: flex;\n gap: 15px;\n}\n\n.rating-buttons[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 1.2rem;\n cursor: pointer;\n padding: 5px;\n border-radius: 4px;\n transition: all 0.2s ease;\n}\n\n.fa-thumbs-up[_ngcontent-%COMP%] {\n color: #4caf50;\n}\n\n.fa-thumbs-up[_ngcontent-%COMP%]:hover {\n background-color: rgba(76, 175, 80, 0.1);\n transform: scale(1.1);\n}\n\n.fa-thumbs-down[_ngcontent-%COMP%] {\n color: #f44336;\n}\n\n.fa-thumbs-down[_ngcontent-%COMP%]:hover {\n background-color: rgba(244, 67, 54, 0.1);\n transform: scale(1.1);\n}\n\n.rating-feedback[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n margin-top: 12px;\n color: #666;\n font-size: 0.85rem;\n font-style: italic;\n}\n\n.rating-status-text[_ngcontent-%COMP%] {\n margin-right: 8px;\n}\n\n.rating-icon-selected[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n}\n\n\n\n.artifact-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n margin-top: 12px;\n padding: 12px 16px;\n background-color: #eef6ff;\n border: 1px solid #d0e1fd;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n}\n\n.artifact-indicator[_ngcontent-%COMP%]:hover {\n background-color: #d2e5ff;\n border-color: #a9c9fc;\n}\n\n.artifact-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n color: #4285f4;\n margin-right: 10px;\n}\n\n.artifact-label[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #4285f4;\n font-weight: 500;\n}\n\n.completion-time[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #666;\n font-style: italic;\n margin-top: 5px;\n display: inline-block;\n}\n\n\n\n .input-wrapper {\n margin-bottom: 16px;\n}\n\n .input-wrapper label {\n display: block;\n font-weight: 500;\n margin-bottom: 8px;\n color: #333;\n}\n\n .k-dialog-actions {\n padding: 16px 20px;\n border-top: 1px solid #eee;\n}\n\n .k-dialog button[kendoButton], \n .k-window button[kendoButton] {\n padding: 8px 16px;\n border-radius: 4px;\n font-weight: 500;\n transition: all 0.2s ease;\n}\n\n .k-textbox-container, \n .k-textarea-container {\n width: 100%;\n}\n\n .k-textarea {\n width: 100%;\n font-family: inherit;\n font-size: 1rem;\n border-color: #ddd;\n padding: 8px 12px;\n border-radius: 4px;\n resize: none;\n box-sizing: border-box;\n}\n\n\n\n .k-textarea-container .k-resize-handle {\n background-color: #ddd;\n height: 6px;\n border-radius: 0 0 4px 4px;\n}\n\n .k-textarea-container .k-resize-handle:hover {\n background-color: #5cc0ed;\n}\n\n .k-textarea:focus {\n border-color: #5cc0ed;\n box-shadow: 0 0 0 2px rgba(92, 192, 237, 0.2);\n}\n\n\n\n .k-dialog {\n max-height: 90vh;\n overflow: auto;\n}"] });
|
|
704
749
|
}
|
|
705
|
-
SkipSingleMessageComponent._detailHtml = {};
|
|
706
|
-
SkipSingleMessageComponent.ɵfac = function SkipSingleMessageComponent_Factory(t) { return new (t || SkipSingleMessageComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.MJNotificationService)); };
|
|
707
|
-
SkipSingleMessageComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SkipSingleMessageComponent, selectors: [["mj-skip-single-message"]], viewQuery: function SkipSingleMessageComponent_Query(rf, ctx) { if (rf & 1) {
|
|
708
|
-
i0.ɵɵviewQuery(_c0, 5, ViewContainerRef);
|
|
709
|
-
} if (rf & 2) {
|
|
710
|
-
let _t;
|
|
711
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.reportContainerRef = _t.first);
|
|
712
|
-
} }, inputs: { ConversationRecord: "ConversationRecord", ConversationDetailRecord: "ConversationDetailRecord", ConversationUser: "ConversationUser", DataContext: "DataContext", ConversationMessages: "ConversationMessages", ConversationProcessing: "ConversationProcessing", SkipMarkOnlyLogoURL: "SkipMarkOnlyLogoURL", UserImage: "UserImage", DefaultUserImage: "DefaultUserImage", loadTime: "loadTime", ShowMessageEditPanel: "ShowMessageEditPanel", ShowMessageRating: "ShowMessageRating", ShowArtifactIndicator: "ShowArtifactIndicator", ShowSuggestedQuestions: "ShowSuggestedQuestions", HideSuggestedQuestionsAfterClick: "HideSuggestedQuestionsAfterClick", ShowSuggestedAnswers: "ShowSuggestedAnswers", HideSuggestedAnswersAfterClick: "HideSuggestedAnswersAfterClick" }, outputs: { SuggestedQuestionSelected: "SuggestedQuestionSelected", SuggestedAnswerSelected: "SuggestedAnswerSelected", NavigateToMatchingReport: "NavigateToMatchingReport", NewReportCreated: "NewReportCreated", EditMessageRequested: "EditMessageRequested", DeleteMessageRequested: "DeleteMessageRequested", DrillDownEvent: "DrillDownEvent", ArtifactSelected: "ArtifactSelected" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 20, vars: 15, consts: [["reportContainer", ""], [1, "message-row", 3, "ngClass"], [1, "message-image"], [1, "avatar", 3, "src"], [1, "fa-solid", "fa-user", "default-user-image"], [1, "message", 3, "id"], [1, "message-user-name"], ["title", "Message actions", 1, "message-actions"], [1, "completion-time"], [1, "artifact-indicator"], ["class", "suggested-container", 4, "ngIf"], [1, "message-rating"], [3, "title", "minWidth", "width", "close", 4, "ngIf"], [1, "rating-feedback"], [1, "elapsed-time"], ["title", "Edit message", 1, "fa-solid", "fa-edit", 3, "click"], ["title", "Delete message", 1, "fa-solid", "fa-trash", 3, "click"], [1, "artifact-indicator", 3, "click"], [1, "fa-solid", "fa-file-lines"], [1, "artifact-label"], [1, "suggested-container"], [1, "suggested-header"], [1, "suggested-questions-list"], ["class", "suggested-item", 3, "click", 4, "ngFor", "ngForOf"], [1, "suggested-item", 3, "click"], [1, "suggested-answers-list"], [1, "rating-prompt"], [1, "rating-buttons"], ["title", "This was helpful", 1, "fa-solid", "fa-thumbs-up", 3, "click"], ["title", "This wasn't helpful", 1, "fa-solid", "fa-thumbs-down", 3, "click"], [3, "close", "title", "minWidth", "width"], [1, "input-wrapper"], ["placeholder", "What feedback would you like to share about this response?", 3, "ngModelChange", "ngModel", "rows", "resizable"], ["kendoButton", "", "themeColor", "primary", 3, "click"], ["kendoButton", "", 3, "click"], [1, "rating-status-text"], [1, "fa-solid", "fa-thumbs-up", "rating-icon-selected"], [1, "fa-solid", "fa-thumbs-down", "rating-icon-selected"]], template: function SkipSingleMessageComponent_Template(rf, ctx) { if (rf & 1) {
|
|
713
|
-
i0.ɵɵelementStart(0, "div")(1, "div", 1)(2, "div", 2);
|
|
714
|
-
i0.ɵɵtemplate(3, SkipSingleMessageComponent_Conditional_3_Template, 1, 1, "img", 3)(4, SkipSingleMessageComponent_Conditional_4_Template, 1, 0, "span", 4);
|
|
715
|
-
i0.ɵɵelementEnd();
|
|
716
|
-
i0.ɵɵelementStart(5, "div", 5)(6, "div", 6);
|
|
717
|
-
i0.ɵɵtext(7);
|
|
718
|
-
i0.ɵɵelementEnd();
|
|
719
|
-
i0.ɵɵelementStart(8, "div");
|
|
720
|
-
i0.ɵɵtemplate(9, SkipSingleMessageComponent_Conditional_9_Template, 3, 1);
|
|
721
|
-
i0.ɵɵtext(10);
|
|
722
|
-
i0.ɵɵtemplate(11, SkipSingleMessageComponent_Conditional_11_Template, 3, 0, "div", 7)(12, SkipSingleMessageComponent_Conditional_12_Template, 2, 1, "div", 8)(13, SkipSingleMessageComponent_Conditional_13_Template, 4, 2, "div", 9);
|
|
723
|
-
i0.ɵɵelementEnd();
|
|
724
|
-
i0.ɵɵtemplate(14, SkipSingleMessageComponent_Conditional_14_Template, 2, 0, "div")(15, SkipSingleMessageComponent_div_15_Template, 5, 1, "div", 10)(16, SkipSingleMessageComponent_div_16_Template, 3, 1, "div", 10)(17, SkipSingleMessageComponent_Conditional_17_Template, 6, 0, "div", 11)(18, SkipSingleMessageComponent_kendo_dialog_18_Template, 10, 6, "kendo-dialog", 12)(19, SkipSingleMessageComponent_Conditional_19_Template, 5, 2, "div", 13);
|
|
725
|
-
i0.ɵɵelementEnd()()();
|
|
726
|
-
} if (rf & 2) {
|
|
727
|
-
i0.ɵɵadvance();
|
|
728
|
-
i0.ɵɵproperty("ngClass", ctx.GetMessageRowCssClass());
|
|
729
|
-
i0.ɵɵadvance(2);
|
|
730
|
-
i0.ɵɵconditional(ctx.GetUserImageSource() ? 3 : 4);
|
|
731
|
-
i0.ɵɵadvance(2);
|
|
732
|
-
i0.ɵɵproperty("id", "skip_message_" + ctx.ConversationDetailRecord.ID);
|
|
733
|
-
i0.ɵɵadvance(2);
|
|
734
|
-
i0.ɵɵtextInterpolate(ctx.IsAIMessage ? "Skip" : ctx.ConversationUser ? ctx.ConversationUser.FirstName + " " + ctx.ConversationUser.LastName : "You");
|
|
735
|
-
i0.ɵɵadvance(2);
|
|
736
|
-
i0.ɵɵconditional(ctx.IsTemporaryMessage ? 9 : -1);
|
|
737
|
-
i0.ɵɵadvance();
|
|
738
|
-
i0.ɵɵtextInterpolate1(" ", ctx.Message, " ");
|
|
739
|
-
i0.ɵɵadvance();
|
|
740
|
-
i0.ɵɵconditional(!ctx.IsTemporaryMessage && !ctx.IsAIMessage && ctx.ShowMessageEditPanel && !ctx.ConversationProcessing ? 11 : -1);
|
|
741
|
-
i0.ɵɵadvance();
|
|
742
|
-
i0.ɵɵconditional(ctx.ShouldShowCompletionTime ? 12 : -1);
|
|
743
|
-
i0.ɵɵadvance();
|
|
744
|
-
i0.ɵɵconditional(ctx.HasArtifact ? 13 : -1);
|
|
745
|
-
i0.ɵɵadvance();
|
|
746
|
-
i0.ɵɵconditional(!ctx.HasArtifact ? 14 : -1);
|
|
747
|
-
i0.ɵɵadvance();
|
|
748
|
-
i0.ɵɵproperty("ngIf", ctx.IsAIMessage && ctx.SuggestedQuestions.length > 0 && ctx.IsLastMessageInConversation && ctx.ShowSuggestedQuestions && (!ctx.HideSuggestedQuestionsAfterClick || !ctx.SuggestedQuestionsClicked));
|
|
749
|
-
i0.ɵɵadvance();
|
|
750
|
-
i0.ɵɵproperty("ngIf", ctx.IsAIMessage && ctx.SuggestedAnswers.length > 0 && ctx.IsLastMessageInConversation && ctx.ShowSuggestedAnswers && (!ctx.HideSuggestedAnswersAfterClick || !ctx.SuggestedAnswersClicked));
|
|
751
|
-
i0.ɵɵadvance();
|
|
752
|
-
i0.ɵɵconditional(!ctx.IsTemporaryMessage && ctx.ShouldShowRating ? 17 : -1);
|
|
753
|
-
i0.ɵɵadvance();
|
|
754
|
-
i0.ɵɵproperty("ngIf", ctx.ShowingFeedbackDialog);
|
|
755
|
-
i0.ɵɵadvance();
|
|
756
|
-
i0.ɵɵconditional(!ctx.IsTemporaryMessage && ctx.IsAIMessage && ctx.ConversationDetailRecord.UserRating !== null && ctx.UserJustRated ? 19 : -1);
|
|
757
|
-
} }, dependencies: [i2.NgClass, i2.NgForOf, i2.NgIf, i3.NgControlStatus, i3.NgModel, i4.LoaderComponent, i5.DialogComponent, i5.DialogActionsComponent, i6.TextAreaComponent, i7.ButtonComponent], styles: [".message-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: start; \n\n \n\n justify-content: center; \n\n \n padding: 10px;\n}\n\n.message[_ngcontent-%COMP%] {\n word-wrap: break-word;\n width: 100%;\n margin-right: 20px;\n padding-bottom: 30px; \n\n min-height: 60px; \n\n position: relative; \n\n @media (min-width: 1280px) {\n max-width: 48rem;\n }\n}\n\n.message-actions[_ngcontent-%COMP%] {\n position: absolute;\n bottom: 5px;\n right: 10px;\n background-color: #ffffff;\n border-radius: 20px;\n padding: 6px 10px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n z-index: 10;\n transition: opacity 0.3s ease, transform 0.3s ease;\n border: 1px solid #e0e0e0;\n opacity: 0;\n transform: translateY(5px) scale(0.95);\n pointer-events: none;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.message[_ngcontent-%COMP%]:hover .message-actions[_ngcontent-%COMP%] {\n opacity: 1;\n transform: translateY(0) scale(1);\n pointer-events: auto;\n}\n \n.message-actions[_ngcontent-%COMP%] > span[_ngcontent-%COMP%] {\n margin: 0 5px;\n color: #6e7072;\n cursor: pointer;\n font-size: 14px;\n padding: 3px;\n transition: all 0.2s ease;\n width: 18px;\n height: 18px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n}\n\n.message-actions[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:hover {\n color: #333;\n background-color: #f5f5f5;\n}\n\n.message-actions[_ngcontent-%COMP%] > span.fa-edit[_ngcontent-%COMP%]:hover {\n color: #4285f4;\n}\n\n.message-actions[_ngcontent-%COMP%] > span.fa-trash[_ngcontent-%COMP%]:hover {\n color: #ea4335;\n}\n\n.message-image[_ngcontent-%COMP%] {\n max-width: 24px;\n max-height: 24px;\n margin-right: 10px;\n margin-left: 5px;\n margin-bottom: 10px;\n}\n.message-image[_ngcontent-%COMP%] > img[_ngcontent-%COMP%] {\n max-width: 100%;\n max-height: 100%;\n}\n\n\n\n.error-message[_ngcontent-%COMP%] {\n background-color:lightpink;\n}\n\n.ai-message-in-progress[_ngcontent-%COMP%] {\n \n\n opacity: 0.9;\n}\n\n.elapsed-time[_ngcontent-%COMP%] {\n font-style: regular;\n font-size: 0.8rem;\n color: #124be7;\n margin-left: 5px;\n margin-right: 5px;\n}\n\n.message-user-name[_ngcontent-%COMP%] {\n font-weight: 600;\n margin-top: 0px;\n margin-bottom: 10px;\n padding-bottom: 7px;\n height: .5rem;\n}\n\n.suggested-container[_ngcontent-%COMP%] {\n margin-right: 20px; \n\n display: flex;\n flex-direction: column;\n align-items: left;\n justify-content: left;\n padding: 10px;\n margin-top: 10px;\n margin-bottom: 10px;\n border: solid 1px rgba(28, 103, 202, 0.08);\n background-color: rgb(241, 236, 227);\n}\n.suggested-header[_ngcontent-%COMP%] {\n font-weight: 600;\n margin-bottom: 10px;\n}\n.suggested-questions-list[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n}\n.suggested-answers-list[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: none;\n}\n.suggested-item[_ngcontent-%COMP%] {\n margin: 5px;\n padding: 5px 10px;\n border-radius: 5px;\n background-color: #f5f5f5;\n cursor: pointer;\n transition: background-color 0.3s;\n}\n.suggested-item[_ngcontent-%COMP%]:hover {\n background-color: #96d0f1;\n}\n\n.default-user-image[_ngcontent-%COMP%] {\n width: 24px;\n font-size: 22px;\n}\n\n\n\n.message-rating[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n margin-top: 15px;\n padding: 8px 12px;\n background-color: #f5f5f5;\n border-radius: 8px;\n width: fit-content;\n}\n\n.rating-prompt[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n margin-bottom: 8px;\n color: #555;\n}\n\n.rating-buttons[_ngcontent-%COMP%] {\n display: flex;\n gap: 15px;\n}\n\n.rating-buttons[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 1.2rem;\n cursor: pointer;\n padding: 5px;\n border-radius: 4px;\n transition: all 0.2s ease;\n}\n\n.fa-thumbs-up[_ngcontent-%COMP%] {\n color: #4caf50;\n}\n\n.fa-thumbs-up[_ngcontent-%COMP%]:hover {\n background-color: rgba(76, 175, 80, 0.1);\n transform: scale(1.1);\n}\n\n.fa-thumbs-down[_ngcontent-%COMP%] {\n color: #f44336;\n}\n\n.fa-thumbs-down[_ngcontent-%COMP%]:hover {\n background-color: rgba(244, 67, 54, 0.1);\n transform: scale(1.1);\n}\n\n.rating-feedback[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n margin-top: 12px;\n color: #666;\n font-size: 0.85rem;\n font-style: italic;\n}\n\n.rating-status-text[_ngcontent-%COMP%] {\n margin-right: 8px;\n}\n\n.rating-icon-selected[_ngcontent-%COMP%] {\n font-size: 0.9rem;\n}\n\n\n\n.artifact-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n margin-top: 12px;\n padding: 12px 16px;\n background-color: #eef6ff;\n border: 1px solid #d0e1fd;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n}\n\n.artifact-indicator[_ngcontent-%COMP%]:hover {\n background-color: #d2e5ff;\n border-color: #a9c9fc;\n}\n\n.artifact-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n color: #4285f4;\n margin-right: 10px;\n}\n\n.artifact-label[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #4285f4;\n font-weight: 500;\n}\n\n.completion-time[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #666;\n font-style: italic;\n margin-top: 5px;\n display: inline-block;\n}\n\n\n\n .input-wrapper {\n margin-bottom: 16px;\n}\n\n .input-wrapper label {\n display: block;\n font-weight: 500;\n margin-bottom: 8px;\n color: #333;\n}\n\n .k-dialog-actions {\n padding: 16px 20px;\n border-top: 1px solid #eee;\n}\n\n .k-dialog button[kendoButton], \n .k-window button[kendoButton] {\n padding: 8px 16px;\n border-radius: 4px;\n font-weight: 500;\n transition: all 0.2s ease;\n}\n\n .k-textbox-container, \n .k-textarea-container {\n width: 100%;\n}\n\n .k-textarea {\n width: 100%;\n font-family: inherit;\n font-size: 1rem;\n border-color: #ddd;\n padding: 8px 12px;\n border-radius: 4px;\n resize: none;\n box-sizing: border-box;\n}\n\n\n\n .k-textarea-container .k-resize-handle {\n background-color: #ddd;\n height: 6px;\n border-radius: 0 0 4px 4px;\n}\n\n .k-textarea-container .k-resize-handle:hover {\n background-color: #5cc0ed;\n}\n\n .k-textarea:focus {\n border-color: #5cc0ed;\n box-shadow: 0 0 0 2px rgba(92, 192, 237, 0.2);\n}\n\n\n\n .k-dialog {\n max-height: 90vh;\n overflow: auto;\n}"] });
|
|
758
750
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SkipSingleMessageComponent, [{
|
|
759
751
|
type: Component,
|
|
760
752
|
args: [{ selector: 'mj-skip-single-message', template: "<div>\n <div class=\"message-row\" [ngClass]=\"GetMessageRowCssClass()\" > \n <div class=\"message-image\">\n @if (GetUserImageSource()) {\n <img [src]=\"GetUserImageSource()\" class=\"avatar\" />\n }\n @else {\n <span class=\"fa-solid fa-user default-user-image\"></span>\n }\n </div>\n <div class=\"message\" \n [id]=\"'skip_message_' + ConversationDetailRecord.ID\">\n <div class=\"message-user-name\">{{IsAIMessage ? 'Skip' : (ConversationUser ? ConversationUser.FirstName + ' ' + ConversationUser.LastName : 'You')}}</div>\n <div>\n @if(IsTemporaryMessage) {\n <kendo-loader></kendo-loader>\n <span class=\"elapsed-time\">{{ElapsedTimeSinceLoadFormatted}}</span>\n }\n {{Message}}\n @if(!IsTemporaryMessage && !IsAIMessage && ShowMessageEditPanel && !ConversationProcessing) {\n <!-- this is a user message, so we need to offer the ability to edit/delete the message. -->\n <div class=\"message-actions\" title=\"Message actions\">\n <span class=\"fa-solid fa-edit\" (click)=\"RaiseMessageEditRequest()\" title=\"Edit message\"></span>\n <span class=\"fa-solid fa-trash\" (click)=\"RaiseMessageDeleteRequest()\" title=\"Delete message\"></span>\n </div>\n }\n \n @if(ShouldShowCompletionTime) {\n <div class=\"completion-time\">{{CompletionTimeFormatted}}</div>\n }\n \n @if(HasArtifact) {\n <!-- Artifact indicator for messages with associated artifacts -->\n <div class=\"artifact-indicator\" (click)=\"onArtifactIndicatorClick()\">\n <i class=\"fa-solid fa-file-lines\"></i>\n <span class=\"artifact-label\">{{ArtifactName || 'View Artifact'}}{{ArtifactVersion ? ' v' + ArtifactVersion : ''}}</span>\n </div>\n }\n </div>\n @if (!HasArtifact) {\n <div #reportContainer>\n <!-- this is where the report will go - dynamically instantiated -->\n </div>\n }\n <div *ngIf=\"IsAIMessage && \n SuggestedQuestions.length > 0 && \n IsLastMessageInConversation && \n ShowSuggestedQuestions && \n (!HideSuggestedQuestionsAfterClick || !SuggestedQuestionsClicked)\" class=\"suggested-container\">\n <div class=\"suggested-header\">Suggested Questions</div>\n <div class=\"suggested-questions-list\">\n <div class=\"suggested-item\" *ngFor=\"let question of SuggestedQuestions\" (click)=\"RaiseSuggestedQuestionSelectedEvent(question)\">\n {{question}}\n </div>\n </div>\n </div>\n <div *ngIf=\"IsAIMessage && \n SuggestedAnswers.length > 0 && \n IsLastMessageInConversation &&\n ShowSuggestedAnswers && \n (!HideSuggestedAnswersAfterClick || !SuggestedAnswersClicked)\" class=\"suggested-container\">\n <div class=\"suggested-answers-list\">\n <div class=\"suggested-item\" *ngFor=\"let answer of SuggestedAnswers\" (click)=\"RaiseSuggestedAnswerSelectedEvent(answer)\">\n {{answer}}\n </div>\n </div>\n </div>\n\n <!-- Rating UI for AI messages that haven't been rated yet -->\n @if(!IsTemporaryMessage && ShouldShowRating) {\n <div class=\"message-rating\">\n <div class=\"rating-prompt\">Was this response helpful?</div>\n <div class=\"rating-buttons\">\n <span class=\"fa-solid fa-thumbs-up\" (click)=\"ShowFeedbackDialog(10)\" title=\"This was helpful\"></span>\n <span class=\"fa-solid fa-thumbs-down\" (click)=\"ShowFeedbackDialog(1)\" title=\"This wasn't helpful\"></span>\n </div>\n </div>\n }\n <!-- Kendo Dialog for feedback -->\n <kendo-dialog *ngIf=\"ShowingFeedbackDialog\" \n [title]=\"FeedbackDialogTitle\"\n [minWidth]=\"400\"\n [width]=\"750\"\n (close)=\"CancelFeedback()\">\n <div class=\"input-wrapper\">\n <label>Feedback</label>\n <kendo-textarea\n placeholder=\"What feedback would you like to share about this response?\" \n [(ngModel)]=\"UserFeedbackText\"\n [rows]=\"12\"\n [resizable]=\"'none'\">\n </kendo-textarea>\n </div>\n <kendo-dialog-actions>\n <button kendoButton (click)=\"SubmitFeedback()\" themeColor=\"primary\">Submit</button>\n <button kendoButton (click)=\"CancelFeedback()\">Cancel</button>\n </kendo-dialog-actions>\n </kendo-dialog>\n <!-- Show rating feedback after user has rated - ONLY AFTER THE USER JUST FINISHED RATING, never in future refreshes of the window -->\n @if(!IsTemporaryMessage && IsAIMessage && ConversationDetailRecord.UserRating !== null && UserJustRated) {\n <div class=\"rating-feedback\">\n <span class=\"rating-status-text\">{{RatingStatusText}}</span>\n @if(ConversationDetailRecord.UserRating === 10) {\n <span class=\"fa-solid fa-thumbs-up rating-icon-selected\"></span>\n } @else {\n <span class=\"fa-solid fa-thumbs-down rating-icon-selected\"></span>\n }\n </div>\n }\n </div>\n </div>\n</div>", styles: [".message-row {\n display: flex;\n align-items: start; /* if you want to align them at the top */\n /* border-bottom: solid 1px rgba(0, 0, 0, 0.08); */\n justify-content: center; /* Center align horizontally */\n \n padding: 10px;\n}\n\n.message {\n word-wrap: break-word;\n width: 100%;\n margin-right: 20px;\n padding-bottom: 30px; /* Increased to ensure space for action buttons */\n min-height: 60px; /* Ensure minimum height for short messages */\n position: relative; /* Ensure position relative for absolute positioning of child elements */\n @media (min-width: 1280px) {\n max-width: 48rem;\n }\n}\n\n.message-actions {\n position: absolute;\n bottom: 5px;\n right: 10px;\n background-color: #ffffff;\n border-radius: 20px;\n padding: 6px 10px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n z-index: 10;\n transition: opacity 0.3s ease, transform 0.3s ease;\n border: 1px solid #e0e0e0;\n opacity: 0;\n transform: translateY(5px) scale(0.95);\n pointer-events: none;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.message:hover .message-actions {\n opacity: 1;\n transform: translateY(0) scale(1);\n pointer-events: auto;\n}\n \n.message-actions > span {\n margin: 0 5px;\n color: #6e7072;\n cursor: pointer;\n font-size: 14px;\n padding: 3px;\n transition: all 0.2s ease;\n width: 18px;\n height: 18px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n}\n\n.message-actions > span:hover {\n color: #333;\n background-color: #f5f5f5;\n}\n\n.message-actions > span.fa-edit:hover {\n color: #4285f4;\n}\n\n.message-actions > span.fa-trash:hover {\n color: #ea4335;\n}\n\n.message-image {\n max-width: 24px;\n max-height: 24px;\n margin-right: 10px;\n margin-left: 5px;\n margin-bottom: 10px;\n}\n.message-image > img {\n max-width: 100%;\n max-height: 100%;\n}\n\n\n\n.error-message {\n background-color:lightpink;\n}\n\n.ai-message-in-progress {\n /* font-style: italic; */\n opacity: 0.9;\n}\n\n.elapsed-time {\n font-style: regular;\n font-size: 0.8rem;\n color: #124be7;\n margin-left: 5px;\n margin-right: 5px;\n}\n\n.message-user-name {\n font-weight: 600;\n margin-top: 0px;\n margin-bottom: 10px;\n padding-bottom: 7px;\n height: .5rem;\n}\n\n.suggested-container {\n margin-right: 20px; /*match the message class*/\n display: flex;\n flex-direction: column;\n align-items: left;\n justify-content: left;\n padding: 10px;\n margin-top: 10px;\n margin-bottom: 10px;\n border: solid 1px rgba(28, 103, 202, 0.08);\n background-color: rgb(241, 236, 227);\n}\n.suggested-header {\n font-weight: 600;\n margin-bottom: 10px;\n}\n.suggested-questions-list {\n display: flex;\n flex-wrap: wrap;\n}\n.suggested-answers-list {\n display: flex;\n flex-wrap: none;\n}\n.suggested-item {\n margin: 5px;\n padding: 5px 10px;\n border-radius: 5px;\n background-color: #f5f5f5;\n cursor: pointer;\n transition: background-color 0.3s;\n}\n.suggested-item:hover {\n background-color: #96d0f1;\n}\n\n.default-user-image {\n width: 24px;\n font-size: 22px;\n}\n\n/* Message rating styles */\n.message-rating {\n display: flex;\n flex-direction: column;\n margin-top: 15px;\n padding: 8px 12px;\n background-color: #f5f5f5;\n border-radius: 8px;\n width: fit-content;\n}\n\n.rating-prompt {\n font-size: 0.9rem;\n margin-bottom: 8px;\n color: #555;\n}\n\n.rating-buttons {\n display: flex;\n gap: 15px;\n}\n\n.rating-buttons span {\n font-size: 1.2rem;\n cursor: pointer;\n padding: 5px;\n border-radius: 4px;\n transition: all 0.2s ease;\n}\n\n.fa-thumbs-up {\n color: #4caf50;\n}\n\n.fa-thumbs-up:hover {\n background-color: rgba(76, 175, 80, 0.1);\n transform: scale(1.1);\n}\n\n.fa-thumbs-down {\n color: #f44336;\n}\n\n.fa-thumbs-down:hover {\n background-color: rgba(244, 67, 54, 0.1);\n transform: scale(1.1);\n}\n\n.rating-feedback {\n display: flex;\n align-items: center;\n margin-top: 12px;\n color: #666;\n font-size: 0.85rem;\n font-style: italic;\n}\n\n.rating-status-text {\n margin-right: 8px;\n}\n\n.rating-icon-selected {\n font-size: 0.9rem;\n}\n\n/* Artifact indicator styles */\n.artifact-indicator {\n display: flex;\n align-items: center;\n margin-top: 12px;\n padding: 12px 16px;\n background-color: #eef6ff;\n border: 1px solid #d0e1fd;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n}\n\n.artifact-indicator:hover {\n background-color: #d2e5ff;\n border-color: #a9c9fc;\n}\n\n.artifact-indicator i {\n font-size: 16px;\n color: #4285f4;\n margin-right: 10px;\n}\n\n.artifact-label {\n font-size: 14px;\n color: #4285f4;\n font-weight: 500;\n}\n\n.completion-time {\n font-size: 12px;\n color: #666;\n font-style: italic;\n margin-top: 5px;\n display: inline-block;\n}\n\n/* Input wrapper styles */\n::ng-deep .input-wrapper {\n margin-bottom: 16px;\n}\n\n::ng-deep .input-wrapper label {\n display: block;\n font-weight: 500;\n margin-bottom: 8px;\n color: #333;\n}\n\n::ng-deep .k-dialog-actions {\n padding: 16px 20px;\n border-top: 1px solid #eee;\n}\n\n::ng-deep .k-dialog button[kendoButton],\n::ng-deep .k-window button[kendoButton] {\n padding: 8px 16px;\n border-radius: 4px;\n font-weight: 500;\n transition: all 0.2s ease;\n}\n\n::ng-deep .k-textbox-container,\n::ng-deep .k-textarea-container {\n width: 100%;\n}\n\n::ng-deep .k-textarea {\n width: 100%;\n font-family: inherit;\n font-size: 1rem;\n border-color: #ddd;\n padding: 8px 12px;\n border-radius: 4px;\n resize: none;\n box-sizing: border-box;\n}\n\n/* Style the kendo-textarea resize handle */\n::ng-deep .k-textarea-container .k-resize-handle {\n background-color: #ddd;\n height: 6px;\n border-radius: 0 0 4px 4px;\n}\n\n::ng-deep .k-textarea-container .k-resize-handle:hover {\n background-color: #5cc0ed;\n}\n\n::ng-deep .k-textarea:focus {\n border-color: #5cc0ed;\n box-shadow: 0 0 0 2px rgba(92, 192, 237, 0.2);\n}\n\n/* Ensure dialog stays within viewport */\n::ng-deep .k-dialog {\n max-height: 90vh;\n overflow: auto;\n}"] }]
|