@memberjunction/ng-skip-chat 2.47.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.
Files changed (43) hide show
  1. package/README.md +1 -1
  2. package/dist/lib/artifacts/skip-artifact-viewer.component.js +254 -270
  3. package/dist/lib/artifacts/skip-artifact-viewer.component.js.map +1 -1
  4. package/dist/lib/artifacts/skip-artifacts-counter.component.js +82 -90
  5. package/dist/lib/artifacts/skip-artifacts-counter.component.js.map +1 -1
  6. package/dist/lib/drill-down-info.js +4 -3
  7. package/dist/lib/drill-down-info.js.map +1 -1
  8. package/dist/lib/dynamic-report/base-report.js +147 -164
  9. package/dist/lib/dynamic-report/base-report.js.map +1 -1
  10. package/dist/lib/dynamic-report/dynamic-chart.js +77 -86
  11. package/dist/lib/dynamic-report/dynamic-chart.js.map +1 -1
  12. package/dist/lib/dynamic-report/dynamic-grid.js +80 -93
  13. package/dist/lib/dynamic-report/dynamic-grid.js.map +1 -1
  14. package/dist/lib/dynamic-report/{dynamic-html-report.d.ts → dynamic-ui-component.d.ts} +64 -8
  15. package/dist/lib/dynamic-report/dynamic-ui-component.d.ts.map +1 -0
  16. package/dist/lib/dynamic-report/dynamic-ui-component.js +1756 -0
  17. package/dist/lib/dynamic-report/dynamic-ui-component.js.map +1 -0
  18. package/dist/lib/dynamic-report/linear-report.js +21 -31
  19. package/dist/lib/dynamic-report/linear-report.js.map +1 -1
  20. package/dist/lib/dynamic-report/skip-dynamic-report-wrapper.js +28 -28
  21. package/dist/lib/dynamic-report/skip-dynamic-report-wrapper.js.map +1 -1
  22. package/dist/lib/dynamic-report/skip-react-component-host.js +203 -212
  23. package/dist/lib/dynamic-report/skip-react-component-host.js.map +1 -1
  24. package/dist/lib/module.d.ts +4 -3
  25. package/dist/lib/module.d.ts.map +1 -1
  26. package/dist/lib/module.js +31 -27
  27. package/dist/lib/module.js.map +1 -1
  28. package/dist/lib/report-cache.js +2 -5
  29. package/dist/lib/report-cache.js.map +1 -1
  30. package/dist/lib/skip-chat/skip-chat.component.js +1052 -1087
  31. package/dist/lib/skip-chat/skip-chat.component.js.map +1 -1
  32. package/dist/lib/skip-single-message/skip-single-message.component.js +251 -259
  33. package/dist/lib/skip-single-message/skip-single-message.component.js.map +1 -1
  34. package/dist/lib/split-panel/skip-split-panel.component.js +52 -51
  35. package/dist/lib/split-panel/skip-split-panel.component.js.map +1 -1
  36. package/dist/public-api.d.ts +1 -1
  37. package/dist/public-api.d.ts.map +1 -1
  38. package/dist/public-api.js +1 -1
  39. package/dist/public-api.js.map +1 -1
  40. package/package.json +14 -12
  41. package/dist/lib/dynamic-report/dynamic-html-report.d.ts.map +0 -1
  42. package/dist/lib/dynamic-report/dynamic-html-report.js +0 -1104
  43. package/dist/lib/dynamic-report/dynamic-html-report.js.map +0 -1
@@ -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(rating_1) {
445
- return __awaiter(this, arguments, void 0, function* (rating, feedback = '') {
446
- if (!this.ConversationDetailRecord || !this.IsAIMessage) {
447
- return;
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
- try {
450
- this.RatingBeingSaved = true;
451
- // Update the UserRating property in the local object
452
- this.ConversationDetailRecord.UserRating = rating;
453
- // Update the UserFeedback property if provided
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
- this.ConversationDetailRecord.UserFeedback = feedback;
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
- catch (error) {
485
- LogError('Error rating message:' + error);
486
- this.notificationService.CreateSimpleNotification('Error saving feedback', "error", 3500);
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
- finally {
489
- this.RatingBeingSaved = false;
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 && ((_a = detail === null || detail === void 0 ? void 0 : detail.ID) === null || _a === void 0 ? void 0 : _a.length) > 0 && detail.Role.trim().toLowerCase() === 'ai') {
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
- var _a, _b, _c;
551
- if (((_b = (_a = this.ConversationDetailRecord) === null || _a === void 0 ? void 0 : _a.Role) === null || _b === void 0 ? void 0 : _b.trim().toLowerCase()) === 'ai') {
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
- return __awaiter(this, void 0, void 0, function* () {
657
- var _a, _b;
658
- if (!this.HasArtifact || !this.ConversationDetailRecord.ArtifactID) {
659
- return;
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
- try {
662
- const provider = this.ProviderToUse;
663
- const rv = new RunView(this.RunViewToUse);
664
- const params = [
665
- {
666
- EntityName: 'MJ: Conversation Artifacts',
667
- ExtraFilter: "ID = '" + this.ConversationDetailRecord.ArtifactID + "'",
668
- ResultType: 'simple'
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
- const results = yield rv.RunViews(params, this.ProviderToUse.CurrentUser);
679
- if (results) {
680
- const artifactResult = results[0];
681
- if (artifactResult && ((_a = artifactResult.Results) === null || _a === void 0 ? void 0 : _a.length) > 0) {
682
- const artifact = artifactResult.Results[0];
683
- if (artifact) {
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
- catch (err) {
700
- console.error('Error loading artifact information', err);
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}"] }]