@memberjunction/ng-skip-chat 2.19.1 → 2.19.3
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/dynamic-report/linear-report.js +12 -20
- package/dist/lib/dynamic-report/linear-report.js.map +1 -1
- package/dist/lib/dynamic-report/skip-dynamic-report-wrapper.d.ts +6 -1
- package/dist/lib/dynamic-report/skip-dynamic-report-wrapper.d.ts.map +1 -1
- package/dist/lib/dynamic-report/skip-dynamic-report-wrapper.js +13 -3
- package/dist/lib/dynamic-report/skip-dynamic-report-wrapper.js.map +1 -1
- package/dist/lib/module.d.ts +2 -1
- package/dist/lib/module.d.ts.map +1 -1
- package/dist/lib/module.js +6 -4
- package/dist/lib/module.js.map +1 -1
- package/dist/lib/skip-chat/skip-chat.component.d.ts +17 -1
- package/dist/lib/skip-chat/skip-chat.component.d.ts.map +1 -1
- package/dist/lib/skip-chat/skip-chat.component.js +199 -18
- package/dist/lib/skip-chat/skip-chat.component.js.map +1 -1
- package/dist/lib/skip-single-message/skip-single-message.component.d.ts +21 -1
- package/dist/lib/skip-single-message/skip-single-message.component.d.ts.map +1 -1
- package/dist/lib/skip-single-message/skip-single-message.component.js +71 -25
- package/dist/lib/skip-single-message/skip-single-message.component.js.map +1 -1
- package/package.json +15 -13
|
@@ -262,6 +262,27 @@ function SkipChatComponent_kendo_dialog_22_Template(rf, ctx) { if (rf & 1) {
|
|
|
262
262
|
i0.ɵɵadvance(2);
|
|
263
263
|
i0.ɵɵtextInterpolate1(" Would you like to delete ", ctx_r2.SelectedConversation == null ? null : ctx_r2.SelectedConversation.Name, "? ");
|
|
264
264
|
} }
|
|
265
|
+
function SkipChatComponent_kendo_dialog_23_Template(rf, ctx) { if (rf & 1) {
|
|
266
|
+
const _r18 = i0.ɵɵgetCurrentView();
|
|
267
|
+
i0.ɵɵelementStart(0, "kendo-dialog", 60);
|
|
268
|
+
i0.ɵɵlistener("close", function SkipChatComponent_kendo_dialog_23_Template_kendo_dialog_close_0_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeMessageEditOrDeleteDialog("no")); });
|
|
269
|
+
i0.ɵɵelementStart(1, "p", 61);
|
|
270
|
+
i0.ɵɵtext(2);
|
|
271
|
+
i0.ɵɵelementEnd();
|
|
272
|
+
i0.ɵɵelementStart(3, "kendo-dialog-actions")(4, "button", 62);
|
|
273
|
+
i0.ɵɵlistener("click", function SkipChatComponent_kendo_dialog_23_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeMessageEditOrDeleteDialog("yes")); });
|
|
274
|
+
i0.ɵɵtext(5, " Yes ");
|
|
275
|
+
i0.ɵɵelementEnd();
|
|
276
|
+
i0.ɵɵelementStart(6, "button", 63);
|
|
277
|
+
i0.ɵɵlistener("click", function SkipChatComponent_kendo_dialog_23_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeMessageEditOrDeleteDialog("no")); });
|
|
278
|
+
i0.ɵɵtext(7, " No ");
|
|
279
|
+
i0.ɵɵelementEnd()()();
|
|
280
|
+
} if (rf & 2) {
|
|
281
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
282
|
+
i0.ɵɵproperty("minWidth", 250)("width", 450);
|
|
283
|
+
i0.ɵɵadvance(2);
|
|
284
|
+
i0.ɵɵtextInterpolate1(" Would you like to ", ctx_r2.messageEditOrDeleteType, " this message? Doing so will result in any subsequent messages in the conversation being deleted. ");
|
|
285
|
+
} }
|
|
265
286
|
export class SkipChatComponent extends BaseAngularComponent {
|
|
266
287
|
constructor(el, renderer, route, router, location, cdRef, notificationService) {
|
|
267
288
|
super();
|
|
@@ -317,6 +338,10 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
317
338
|
* Event emitted whenever a conversation is selected
|
|
318
339
|
*/
|
|
319
340
|
this.ConversationSelected = new EventEmitter();
|
|
341
|
+
/**
|
|
342
|
+
* This event fires whenever a new report is created.
|
|
343
|
+
*/
|
|
344
|
+
this.NewReportCreated = new EventEmitter();
|
|
320
345
|
/**
|
|
321
346
|
* Internal state variable to track if the conversation list is visible or not. Defaults to true. Conversation List only is shown if this is true and ShowConversationList is true.
|
|
322
347
|
*/
|
|
@@ -365,6 +390,8 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
365
390
|
this._usedStartMessages = [];
|
|
366
391
|
this._processingStatus = {};
|
|
367
392
|
this.isDataContextDialogVisible = false;
|
|
393
|
+
this.confirmMessageEditOrDeleteDialogOpen = false;
|
|
394
|
+
this.messageEditOrDeleteType = 'edit';
|
|
368
395
|
}
|
|
369
396
|
ngOnInit() {
|
|
370
397
|
this.SubscribeToNotifications();
|
|
@@ -717,8 +744,9 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
717
744
|
const newIdx = idx > 0 ? idx - 1 : 0;
|
|
718
745
|
this.SelectConversation(this.Conversations[newIdx]);
|
|
719
746
|
}
|
|
720
|
-
else
|
|
747
|
+
else {
|
|
721
748
|
this.Messages = [];
|
|
749
|
+
}
|
|
722
750
|
}
|
|
723
751
|
else {
|
|
724
752
|
this.notificationService.CreateSimpleNotification('Error deleting conversation', 'error', 5000);
|
|
@@ -802,12 +830,15 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
802
830
|
SelectConversation(conversation) {
|
|
803
831
|
return __awaiter(this, void 0, void 0, function* () {
|
|
804
832
|
var _a;
|
|
833
|
+
if (this.IsSkipProcessing(conversation)) {
|
|
834
|
+
return; // already processing this conversation so don't go back and forth
|
|
835
|
+
}
|
|
805
836
|
if (conversation && conversation.ID !== ((_a = this.SelectedConversation) === null || _a === void 0 ? void 0 : _a.ID)) {
|
|
806
837
|
// load up the conversation if not already the one that's loaded
|
|
807
838
|
this._conversationLoadComplete = false;
|
|
808
839
|
this.ClearMessages();
|
|
809
|
-
const oldStatus = this.
|
|
810
|
-
this.
|
|
840
|
+
const oldStatus = this.IsSkipProcessing(conversation);
|
|
841
|
+
this.setProcessingStatus(conversation.ID, true);
|
|
811
842
|
this.SelectedConversation = conversation;
|
|
812
843
|
this.SetSelectedConversationUser();
|
|
813
844
|
this.DataContextID = conversation.DataContextID ? conversation.DataContextID : '';
|
|
@@ -832,11 +863,11 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
832
863
|
const result = yield this.RunViewToUse.RunView({
|
|
833
864
|
EntityName: 'Conversation Details',
|
|
834
865
|
ExtraFilter: `ConversationID='${conversation.ID}'`,
|
|
835
|
-
OrderBy: '__mj_CreatedAt ASC'
|
|
866
|
+
OrderBy: '__mj_CreatedAt ASC' // show messages in order of creation,
|
|
836
867
|
});
|
|
837
868
|
if (result && result.Success) {
|
|
838
869
|
// copy the results into NEW objects into the array, we don't want to modify the original objects
|
|
839
|
-
this.Messages =
|
|
870
|
+
this.Messages = result.Results;
|
|
840
871
|
// also, cache the messages within the conversation, but create new array with the same objects
|
|
841
872
|
convoAny._Messages = [...this.Messages];
|
|
842
873
|
}
|
|
@@ -850,7 +881,7 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
850
881
|
this._scrollToBottom = true; // this results in the angular after Viewchecked scrolling to bottom when it's done
|
|
851
882
|
this.cdRef.reattach(); // resume change detection
|
|
852
883
|
}
|
|
853
|
-
this.
|
|
884
|
+
this.setProcessingStatus(conversation.ID, oldStatus); // set back to old status as it might have been processing
|
|
854
885
|
InvokeManualResize(500);
|
|
855
886
|
// ensure the list box has the conversation in view
|
|
856
887
|
this.scrollToConversation(conversation.ID);
|
|
@@ -904,16 +935,25 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
904
935
|
this._usedStartMessages.push(SkipChatComponent._startMessages[idx]);
|
|
905
936
|
return SkipChatComponent._startMessages[idx];
|
|
906
937
|
}
|
|
938
|
+
setProcessingStatus(conversationId, status) {
|
|
939
|
+
if (conversationId) {
|
|
940
|
+
this._processingStatus[conversationId] = status;
|
|
941
|
+
// if the current conversation, update the panel messages so they know we've changed our processing state
|
|
942
|
+
if (this.SelectedConversation && this.SelectedConversation.ID === conversationId) {
|
|
943
|
+
this.UpdateAllPanelMessages();
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
}
|
|
907
947
|
sendPrompt(val) {
|
|
908
948
|
return __awaiter(this, void 0, void 0, function* () {
|
|
909
|
-
var _a, _b, _c
|
|
949
|
+
var _a, _b, _c;
|
|
910
950
|
const convoID = this.SelectedConversation ? this.SelectedConversation.ID : '';
|
|
911
951
|
if (this._conversationsInProgress[convoID]) {
|
|
912
952
|
// don't allow sending another message if we're in the midst of sending one
|
|
913
953
|
return;
|
|
914
954
|
}
|
|
915
955
|
if (this.SelectedConversation) {
|
|
916
|
-
this.
|
|
956
|
+
this.setProcessingStatus((_a = this.SelectedConversation) === null || _a === void 0 ? void 0 : _a.ID, true);
|
|
917
957
|
}
|
|
918
958
|
if (val && val.length > 0) {
|
|
919
959
|
this._conversationsInProgress[convoID] = true;
|
|
@@ -938,18 +978,18 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
938
978
|
if (convoID !== ((_b = this.SelectedConversation) === null || _b === void 0 ? void 0 : _b.ID)) {
|
|
939
979
|
// this scenario arises when we have a selected convo change after we submitted our request to skip
|
|
940
980
|
// so we do nothing here other than update the status.
|
|
941
|
-
this.
|
|
981
|
+
this.setProcessingStatus(convoID, false);
|
|
942
982
|
//the next time the user selects this convo, we will fetch messages
|
|
943
983
|
//from the server rather than using the ones in cache
|
|
944
984
|
this._conversationsToReload[convoID] = true;
|
|
945
985
|
}
|
|
946
986
|
else {
|
|
947
|
-
this.
|
|
987
|
+
this.setProcessingStatus(convoID, false);
|
|
948
988
|
const innerResult = JSON.parse(skipResult.Result);
|
|
949
989
|
if (!this.SelectedConversation) {
|
|
950
990
|
const convo = yield p.GetEntityObject('Conversations', p.CurrentUser);
|
|
951
991
|
yield convo.Load(skipResult.ConversationId);
|
|
952
|
-
this.
|
|
992
|
+
this.setProcessingStatus(skipResult.ConversationId, true);
|
|
953
993
|
this.Conversations.push(convo);
|
|
954
994
|
this.SelectedConversation = convo;
|
|
955
995
|
this.SetSelectedConversationUser();
|
|
@@ -977,8 +1017,9 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
977
1017
|
}
|
|
978
1018
|
}
|
|
979
1019
|
this._scrollToBottom = true; // this results in the angular after Viewchecked scrolling to bottom when it's done
|
|
980
|
-
if (this.SelectedConversation)
|
|
981
|
-
this.
|
|
1020
|
+
if (this.SelectedConversation) {
|
|
1021
|
+
this.setProcessingStatus(this.SelectedConversation.ID, false);
|
|
1022
|
+
}
|
|
982
1023
|
this.AllowSend = true;
|
|
983
1024
|
this._conversationsInProgress[convoID] = false;
|
|
984
1025
|
this._messageInProgress = false;
|
|
@@ -1009,6 +1050,10 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
1009
1050
|
}
|
|
1010
1051
|
AddMessageToCurrentConversation(detail, stopChangeDetection, cacheMessage) {
|
|
1011
1052
|
// update the local binding for the UI
|
|
1053
|
+
if (this.Messages.find((m) => m.ID === detail.ID) || this.Messages.find(m => m === detail)) {
|
|
1054
|
+
// we already have this message, so don't add it again
|
|
1055
|
+
return;
|
|
1056
|
+
}
|
|
1012
1057
|
this.Messages.push(detail);
|
|
1013
1058
|
if (cacheMessage) {
|
|
1014
1059
|
// update the cache of messages for the selected conversation
|
|
@@ -1054,6 +1099,25 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
1054
1099
|
this.cdRef.reattach();
|
|
1055
1100
|
}
|
|
1056
1101
|
}
|
|
1102
|
+
UpdatePanelMessage(messageDetail, invokeChangeDetection = true) {
|
|
1103
|
+
const ref = messageDetail._componentRef;
|
|
1104
|
+
if (ref) {
|
|
1105
|
+
const obj = ref.instance;
|
|
1106
|
+
obj.ConversationMessages = this.Messages; // update this so it can handle its rendering appropriately
|
|
1107
|
+
obj.ConversationProcessing = this.IsSkipProcessing(this.SelectedConversation); // update this so it can handle its rendering appropriately
|
|
1108
|
+
if (invokeChangeDetection) {
|
|
1109
|
+
this.cdRef.markForCheck();
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
}
|
|
1113
|
+
UpdateAllPanelMessages() {
|
|
1114
|
+
if (this.Messages && this.Messages.length > 0) {
|
|
1115
|
+
this.Messages.forEach((m) => {
|
|
1116
|
+
this.UpdatePanelMessage(m, false);
|
|
1117
|
+
});
|
|
1118
|
+
this.cdRef.markForCheck();
|
|
1119
|
+
}
|
|
1120
|
+
}
|
|
1057
1121
|
// Method to dynamically add a message
|
|
1058
1122
|
AddMessageToPanel(messageDetail, stopChangeDetection) {
|
|
1059
1123
|
// Temporarily stop change detection for performance
|
|
@@ -1062,9 +1126,19 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
1062
1126
|
const componentRef = this.askSkip.viewContainerRef.createComponent(SkipSingleMessageComponent);
|
|
1063
1127
|
// Pass the message details to the component instance
|
|
1064
1128
|
const obj = componentRef.instance;
|
|
1129
|
+
// bubble up events from the single message component to the parent component
|
|
1065
1130
|
obj.NavigateToMatchingReport.subscribe((reportId) => {
|
|
1066
1131
|
this.NavigateToMatchingReport.emit(reportId);
|
|
1067
1132
|
});
|
|
1133
|
+
obj.NewReportCreated.subscribe((reportId) => {
|
|
1134
|
+
this.NewReportCreated.emit(reportId);
|
|
1135
|
+
});
|
|
1136
|
+
obj.DeleteMessageRequested.subscribe((message) => {
|
|
1137
|
+
this.HandleMessageDeleteRequest(message);
|
|
1138
|
+
});
|
|
1139
|
+
obj.EditMessageRequested.subscribe((message) => {
|
|
1140
|
+
this.HandleMessageEditRequest(message);
|
|
1141
|
+
});
|
|
1068
1142
|
obj.Provider = this.ProviderToUse;
|
|
1069
1143
|
obj.SkipMarkOnlyLogoURL = this.SkipMarkOnlyLogoURL;
|
|
1070
1144
|
obj.UserImage = this.UserImage;
|
|
@@ -1073,6 +1147,8 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
1073
1147
|
obj.DataContext = this.DataContext;
|
|
1074
1148
|
obj.ConversationUser = this.SelectedConversationUser;
|
|
1075
1149
|
obj.ConversationMessages = this.Messages; // pass this on so that the single message has access to the full conversation, for example to know if it is the first/last/only message in the conversation/etc
|
|
1150
|
+
// bind the processing status to the component
|
|
1151
|
+
obj.ConversationProcessing = this.IsSkipProcessing(this.SelectedConversation);
|
|
1076
1152
|
// Whenever the suggested question is clicked on by the user in the single message component, we want to bubble that up here and send the prompt
|
|
1077
1153
|
obj.SuggestedQuestionSelected.subscribe((question) => {
|
|
1078
1154
|
this.sendPrompt(question);
|
|
@@ -1226,11 +1302,15 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
1226
1302
|
});
|
|
1227
1303
|
}
|
|
1228
1304
|
IsSkipProcessing(Conversation) {
|
|
1229
|
-
if (
|
|
1305
|
+
if (!Conversation) {
|
|
1306
|
+
return false;
|
|
1307
|
+
}
|
|
1308
|
+
else if (this._processingStatus[Conversation.ID]) {
|
|
1230
1309
|
return this._processingStatus[Conversation.ID];
|
|
1231
1310
|
}
|
|
1232
|
-
else
|
|
1311
|
+
else {
|
|
1233
1312
|
return false;
|
|
1313
|
+
}
|
|
1234
1314
|
}
|
|
1235
1315
|
IsTextAreaEmpty() {
|
|
1236
1316
|
if (this.askSkipInput && this.askSkipInput.nativeElement) {
|
|
@@ -1278,6 +1358,103 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
1278
1358
|
this.loadConversations(convoIDParam);
|
|
1279
1359
|
});
|
|
1280
1360
|
}
|
|
1361
|
+
HandleMessageEditOrDeleteRequest(message, type) {
|
|
1362
|
+
if (this.SelectedConversation && !this.IsSkipProcessing(this.SelectedConversation)) {
|
|
1363
|
+
this.messageToEditOrDelete = message;
|
|
1364
|
+
this.messageEditOrDeleteType = type;
|
|
1365
|
+
this.confirmMessageEditOrDeleteDialogOpen = true;
|
|
1366
|
+
}
|
|
1367
|
+
}
|
|
1368
|
+
HandleMessageEditRequest(message) {
|
|
1369
|
+
this.HandleMessageEditOrDeleteRequest(message, 'edit');
|
|
1370
|
+
}
|
|
1371
|
+
HandleMessageDeleteRequest(message) {
|
|
1372
|
+
this.HandleMessageEditOrDeleteRequest(message, 'delete');
|
|
1373
|
+
}
|
|
1374
|
+
closeMessageEditOrDeleteDialog(yesno) {
|
|
1375
|
+
this.confirmMessageEditOrDeleteDialogOpen = false;
|
|
1376
|
+
if (this.messageToEditOrDelete && yesno === 'yes') {
|
|
1377
|
+
// the user has requested to either edit or delete the message. This situation calls
|
|
1378
|
+
// for (a) removing all subsequent messages in the conversation in both cases
|
|
1379
|
+
// in the case where they are editing an existing message, we edit the current message
|
|
1380
|
+
// and then resubmit it. In both cases in the UI we have to update by removing all
|
|
1381
|
+
// subsequent messages.
|
|
1382
|
+
if (this.messageEditOrDeleteType === 'edit') {
|
|
1383
|
+
this.editMessage(this.messageToEditOrDelete);
|
|
1384
|
+
}
|
|
1385
|
+
else {
|
|
1386
|
+
this.deleteMessage(this.messageToEditOrDelete);
|
|
1387
|
+
}
|
|
1388
|
+
}
|
|
1389
|
+
}
|
|
1390
|
+
editMessage(message) {
|
|
1391
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1392
|
+
const oldMessageText = message.Message;
|
|
1393
|
+
yield this.deleteMessage(message);
|
|
1394
|
+
// now add the text from the message to the input box
|
|
1395
|
+
this.askSkipInput.nativeElement.value = oldMessageText;
|
|
1396
|
+
// this will let the user edit the message and submit it
|
|
1397
|
+
});
|
|
1398
|
+
}
|
|
1399
|
+
deleteMessage(message) {
|
|
1400
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1401
|
+
if (!this.SelectedConversation || this.IsSkipProcessing(this.SelectedConversation)) {
|
|
1402
|
+
return; // don't allow deleting messages while we're processing or don't have a selected convo
|
|
1403
|
+
}
|
|
1404
|
+
this.setProcessingStatus(this.SelectedConversation.ID, true);
|
|
1405
|
+
// first find all the subsequent messages in the conversation
|
|
1406
|
+
const idx = this.Messages.findIndex((m) => m.ID === message.ID);
|
|
1407
|
+
if (idx >= 0) {
|
|
1408
|
+
const currentAndSubsequentMessages = this.Messages.slice(idx);
|
|
1409
|
+
const tg = yield this.ProviderToUse.CreateTransactionGroup();
|
|
1410
|
+
for (const m of currentAndSubsequentMessages) {
|
|
1411
|
+
// need to create the BaseEntity subclass for the conversation detail entity
|
|
1412
|
+
// as our initial load of the conversation detail entity is not a full object it is
|
|
1413
|
+
// a simple javascript object.
|
|
1414
|
+
const actualEntityObject = yield this.ProviderToUse.GetEntityObject('Conversation Details', this.ProviderToUse.CurrentUser);
|
|
1415
|
+
if (yield actualEntityObject.Load(m.ID)) {
|
|
1416
|
+
// check to see if it loaded succesfully or not, sometimes it is already deleted
|
|
1417
|
+
if (actualEntityObject.ConversationID === this.SelectedConversation.ID) {
|
|
1418
|
+
actualEntityObject.TransactionGroup = tg;
|
|
1419
|
+
actualEntityObject.Delete(); // no await as we'll await the transaciton group below
|
|
1420
|
+
}
|
|
1421
|
+
else {
|
|
1422
|
+
// didn't load successfully, drop to console, possibly the record was already deleted, non-fatal
|
|
1423
|
+
console.log('Error loading conversation detail entity for deletion', m);
|
|
1424
|
+
}
|
|
1425
|
+
}
|
|
1426
|
+
else {
|
|
1427
|
+
// problem loading the entity, drop to console, possibly the record was already deleted, non-fatal
|
|
1428
|
+
console.log('Error loading conversation detail entity for deletion', m);
|
|
1429
|
+
}
|
|
1430
|
+
}
|
|
1431
|
+
// now submit the transaction group
|
|
1432
|
+
if (yield tg.Submit()) {
|
|
1433
|
+
// now clean up the arrays within this.Messages and also the current conversation's Messages array
|
|
1434
|
+
// remove all messages inluding and after the idx
|
|
1435
|
+
// this.Messages = this.Messages.slice(0, idx);
|
|
1436
|
+
// const convoAny = <any>this.SelectedConversation;
|
|
1437
|
+
// if (convoAny) {
|
|
1438
|
+
// convoAny._Messages = this.Messages;
|
|
1439
|
+
// }
|
|
1440
|
+
// for (const m of currentAndSubsequentMessages) {
|
|
1441
|
+
// // now remove the message from the UI
|
|
1442
|
+
// this.RemoveMessageFromCurrentConversation(m);
|
|
1443
|
+
// }
|
|
1444
|
+
// this.UpdateAllPanelMessages(); // update remaining messages in the panel so they have the correct messages array and processing status
|
|
1445
|
+
this.setProcessingStatus(this.SelectedConversation.ID, false); // done
|
|
1446
|
+
const convo = this.SelectedConversation;
|
|
1447
|
+
this.SelectedConversation = undefined; // wipe out so the below does something
|
|
1448
|
+
this.SelectConversation(convo); // reload the conversation to get the latest messages
|
|
1449
|
+
}
|
|
1450
|
+
else {
|
|
1451
|
+
// alert the user to the error
|
|
1452
|
+
this.setProcessingStatus(this.SelectedConversation.ID, false); // done
|
|
1453
|
+
this.notificationService.CreateSimpleNotification('Error deleting messages', 'error', 3000);
|
|
1454
|
+
}
|
|
1455
|
+
}
|
|
1456
|
+
});
|
|
1457
|
+
}
|
|
1281
1458
|
}
|
|
1282
1459
|
SkipChatComponent.__skipChatWindowsCurrentlyVisible = 0;
|
|
1283
1460
|
SkipChatComponent._startMessages = [
|
|
@@ -1308,7 +1485,7 @@ SkipChatComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SkipChatC
|
|
|
1308
1485
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.askSkipInput = _t.first);
|
|
1309
1486
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.scrollContainer = _t.first);
|
|
1310
1487
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.topLevelDiv = _t.first);
|
|
1311
|
-
} }, inputs: { AllowSend: "AllowSend", Messages: "Messages", Conversations: "Conversations", SelectedConversation: "SelectedConversation", ConversationEditMode: "ConversationEditMode", ShowConversationList: "ShowConversationList", AllowNewConversations: "AllowNewConversations", Title: "Title", DataContextID: "DataContextID", LinkedEntity: "LinkedEntity", LinkedEntityCompositeKey: "LinkedEntityCompositeKey", ShowDataContextButton: "ShowDataContextButton", IncludeLinkedConversationsInList: "IncludeLinkedConversationsInList", SkipLogoURL: "SkipLogoURL", SkipMarkOnlyLogoURL: "SkipMarkOnlyLogoURL", UserImage: "UserImage", UpdateAppRoute: "UpdateAppRoute", ShowSkipLogoInConversationList: "ShowSkipLogoInConversationList", DefaultTextboxPlaceholder: "DefaultTextboxPlaceholder", ProcessingTextBoxPlaceholder: "ProcessingTextBoxPlaceholder", WelcomeQuestions: "WelcomeQuestions", AutoLoad: "AutoLoad" }, outputs: { NavigateToMatchingReport: "NavigateToMatchingReport", ConversationSelected: "ConversationSelected" }, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
1488
|
+
} }, inputs: { AllowSend: "AllowSend", Messages: "Messages", Conversations: "Conversations", SelectedConversation: "SelectedConversation", ConversationEditMode: "ConversationEditMode", ShowConversationList: "ShowConversationList", AllowNewConversations: "AllowNewConversations", Title: "Title", DataContextID: "DataContextID", LinkedEntity: "LinkedEntity", LinkedEntityCompositeKey: "LinkedEntityCompositeKey", ShowDataContextButton: "ShowDataContextButton", IncludeLinkedConversationsInList: "IncludeLinkedConversationsInList", SkipLogoURL: "SkipLogoURL", SkipMarkOnlyLogoURL: "SkipMarkOnlyLogoURL", UserImage: "UserImage", UpdateAppRoute: "UpdateAppRoute", ShowSkipLogoInConversationList: "ShowSkipLogoInConversationList", DefaultTextboxPlaceholder: "DefaultTextboxPlaceholder", ProcessingTextBoxPlaceholder: "ProcessingTextBoxPlaceholder", WelcomeQuestions: "WelcomeQuestions", AutoLoad: "AutoLoad" }, outputs: { NavigateToMatchingReport: "NavigateToMatchingReport", ConversationSelected: "ConversationSelected", NewReportCreated: "NewReportCreated" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 24, vars: 14, consts: [["topLevelDiv", ""], ["AskSkipPanel", "", "scrollContainer", ""], ["AskSkipInput", ""], ["conversationList", ""], ["mjFillContainer", "", 1, "chat-container", 3, "bottomMargin", "rightMargin"], [1, "layout"], [1, "left-panel"], [1, "fa-solid", "fa-table-columns", "toggle-icon"], [1, "right-panel"], ["mjFillContainer", "", 1, "conversation-wrapper"], [1, "messages", 3, "scroll"], ["class", "waiting-for-ai", 4, "ngIf"], ["class", "welcome-wrapper", 4, "ngIf"], ["mjContainer", "", "mjSkipResize", "true"], ["class", "scroll-to-bottom-icon", 3, "click", 4, "ngIf"], [1, "input-area"], [1, "text-area-wrapper"], ["type", "text", 3, "keyup.enter", "input", "disabled", "placeholder"], ["kendoButton", ""], ["kendoButton", "", 3, "click", "disabled"], [1, "fas", "fa-solid", "fa-arrow-up"], [4, "ngIf"], ["title", "Please confirm", 3, "minWidth", "width", "close", 4, "ngIf"], [1, "conversation-history"], [1, "new-chat-area"], [1, "fa-solid", "fa-table-columns", "toggle-icon", 3, "click"], [1, "avatar", 3, "src"], [1, "fa-solid", "fa-pen-to-square", "new-convo-icon"], ["mjFillContainer", "", 1, "conversation-list", 3, "data", "itemClass", "fillWidth", "bottomMargin"], ["kendoListViewItemTemplate", ""], [1, "fa-solid", "fa-pen-to-square", "new-convo-icon", 3, "click"], [1, "conversation-item", 3, "click", "ngClass", "title"], ["class", "fa-regular fa-clock", 4, "ngIf"], [1, "text-container"], ["maxlength", "100", 3, "ngModel", "ngModelChange", 4, "ngIf"], ["class", "edit-conversation-panel", 4, "ngIf"], [1, "fa-regular", "fa-clock"], ["maxlength", "100", 3, "ngModelChange", "ngModel"], [1, "edit-conversation-panel"], ["class", "fa-solid fa-pen-to-square", 3, "click", 4, "ngIf"], ["class", "fa-regular fa-trash-can", 3, "click", 4, "ngIf"], ["class", "fa-solid fa-check", 3, "click", 4, "ngIf"], ["class", "fa-solid fa-xmark", 3, "click", 4, "ngIf"], [1, "fa-solid", "fa-pen-to-square", 3, "click"], [1, "fa-regular", "fa-trash-can", 3, "click"], [1, "fa-solid", "fa-check", 3, "click"], [1, "fa-solid", "fa-xmark", 3, "click"], [1, "waiting-for-ai"], [1, "welcome-wrapper"], [1, "welcome-message"], [3, "src"], [1, "welcome-header-text"], [1, "welcome-suggested-questions"], [1, "welcome-suggested-questions-col"], [1, "welcome-question", 3, "click"], [1, "welcome-question-header"], [1, "scroll-to-bottom-icon", 3, "click"], [1, "fas", "fa-arrow-down"], [1, "fa-solid", "fa-gear", 3, "click"], [3, "dialogClosed", "dataContextId", "Provider"], ["title", "Please confirm", 3, "close", "minWidth", "width"], [2, "margin", "30px", "text-align", "center"], ["kendoButton", "", "themeColor", "primary", 3, "click"], ["kendoButton", "", 3, "click"]], template: function SkipChatComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1312
1489
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
1313
1490
|
i0.ɵɵelementStart(0, "div", 4, 0)(2, "div", 5);
|
|
1314
1491
|
i0.ɵɵtemplate(3, SkipChatComponent_Conditional_3_Template, 9, 9, "div", 6)(4, SkipChatComponent_Conditional_4_Template, 1, 0, "span", 7);
|
|
@@ -1326,7 +1503,7 @@ SkipChatComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SkipChatC
|
|
|
1326
1503
|
i0.ɵɵlistener("click", function SkipChatComponent_Template_button_click_19_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.sendSkipMessage()); });
|
|
1327
1504
|
i0.ɵɵelement(20, "span", 20);
|
|
1328
1505
|
i0.ɵɵelementEnd()()()()()();
|
|
1329
|
-
i0.ɵɵtemplate(21, SkipChatComponent_div_21_Template, 2, 2, "div", 21)(22, SkipChatComponent_kendo_dialog_22_Template, 8, 3, "kendo-dialog", 22);
|
|
1506
|
+
i0.ɵɵtemplate(21, SkipChatComponent_div_21_Template, 2, 2, "div", 21)(22, SkipChatComponent_kendo_dialog_22_Template, 8, 3, "kendo-dialog", 22)(23, SkipChatComponent_kendo_dialog_23_Template, 8, 3, "kendo-dialog", 22);
|
|
1330
1507
|
} if (rf & 2) {
|
|
1331
1508
|
i0.ɵɵproperty("bottomMargin", 10)("rightMargin", 10);
|
|
1332
1509
|
i0.ɵɵadvance(3);
|
|
@@ -1349,10 +1526,12 @@ SkipChatComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SkipChatC
|
|
|
1349
1526
|
i0.ɵɵproperty("ngIf", ctx.isDataContextDialogVisible);
|
|
1350
1527
|
i0.ɵɵadvance();
|
|
1351
1528
|
i0.ɵɵproperty("ngIf", ctx.confirmDeleteConversationDialogOpen);
|
|
1529
|
+
i0.ɵɵadvance();
|
|
1530
|
+
i0.ɵɵproperty("ngIf", ctx.confirmMessageEditOrDeleteDialogOpen);
|
|
1352
1531
|
} }, dependencies: [i2.NgClass, i2.NgIf, i4.DefaultValueAccessor, i4.NgControlStatus, i4.MaxLengthValidator, i4.NgModel, i5.DialogComponent, i5.DialogActionsComponent, i6.FillContainer, i6.Container, i7.ItemTemplateDirective, i7.ListViewComponent, i8.ButtonComponent, i9.DataContextDialogComponent], styles: [".layout[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: row; \n\n height: 100%; \n\n width: 100%; \n\n position: relative;\n}\n\n.left-panel[_ngcontent-%COMP%] {\n width: 272px; \n\n background-color: #f8f9fa; \n\n border-right: 1px solid #ddd; \n\n overflow-y: auto; \n\n overflow-x: hidden; \n\n position: relative;\n\n scrollbar-width: thin; \n\n scrollbar-color: #d3d3d3 #f8f9fa; \n\n}\n\n\n\n.left-panel[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 8px; \n\n background-color: #f8f9fa; \n\n}\n\n.left-panel[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background-color: #d3d3d3; \n\n border-radius: 4px; \n\n}\n\n.left-panel[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background-color: #c0c0c0; \n\n}\n\n.left-panel[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background-color: #f8f9fa; \n\n}\n\n.right-panel[_ngcontent-%COMP%] {\n flex: 1; \n\n overflow-y: auto; \n\n}\n\n\n.new-convo-icon[_ngcontent-%COMP%] {\n color: #808080; \n\n font-size: 18px; \n\n cursor: pointer; \n\n z-index: 10; \n\n padding: 5px;\n border-radius: 4px;\n}\n\n.toggle-icon[_ngcontent-%COMP%] {\n color: #808080; \n\n font-size: 18px; \n\n cursor: pointer; \n\n z-index: 10; \n\n margin-left: 6px;\n padding: 3px;\n border-radius: 3px;\n}\n \n\n.right-panel[_ngcontent-%COMP%] .toggle-icon[_ngcontent-%COMP%] {\n margin-left: 3px;\n margin-top: 2px;\n position: absolute;\n top: 10px;\n left: auto;\n right: 10px; \n\n}\n\n\n.chat-container[_ngcontent-%COMP%] {\n padding: 5px;\n display: flex;\n flex-direction: row;\n height: 100%;\n font-family: S\u00F6hne, ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Ubuntu, Cantarell, \"Noto Sans\", sans-serif, \"Helvetica Neue\", Arial, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n\n \n\n width: 100%;\n height: 100%;\n\n background-color: #f9f9f9;\n}\n\n.conversation-wrapper[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n position: relative; \n\n background-color: #f9f9f9;\n}\n\n.new-conversation[_ngcontent-%COMP%] {\n height: 30px;\n font-size: large;\n}\n\n.conversation-history[_ngcontent-%COMP%] {\n width: 240px;\n min-width: 240px;\n height: 95%;\n overflow-y: auto; \n\n overflow-x: hidden; \n\n margin-right: 10px;\n padding-top: 5px;\n background-color: #f9f9f9;\n margin-top: 0px; \n padding: 12px; \n}\n\n.k-tabstrip-content-for-skip[_ngcontent-%COMP%] {\n padding: 0;\n padding-block: 0;\n}\n\n\n.conversation-history[_ngcontent-%COMP%] > button[_ngcontent-%COMP%] {\n height: 25px;\n}\n\n.skip-title[_ngcontent-%COMP%] {\n font-size: larger;\n margin-bottom: 5px;\n height: 20px;\n margin-top: 5px;\n}\n\n.conversation-list[_ngcontent-%COMP%] {\n margin-top: 5px;\n padding-top: 5px;\n \n border: 0;\n background-color: #f9f9f9;\n}\n\n\n\n\n\n.welcome-wrapper[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n height: 100%;\n width: 100%;\n overflow: hidden;\n}\n\n.welcome-message[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n overflow: hidden;\n height: 100%;\n}\n\n.embedded-conversations[_ngcontent-%COMP%] {\n margin-left: 3px;\n margin-top: 5px;\n font-size: 10pt;\n color: rgb(48, 48, 235);\n}\n.embedded-conversations[_ngcontent-%COMP%] > span[_ngcontent-%COMP%] {\n margin-top: 4px;\n margin-left: 5px;\n cursor: pointer;\n}\n.conversation-item-linked[_ngcontent-%COMP%] {\n color: rgb(48, 48, 235);\n}\n\n.welcome-message[_ngcontent-%COMP%] img[_ngcontent-%COMP%] {\n width: 120px;\n height: 50px;\n margin-bottom: 20px; \n\n}\n\n.welcome-header-text[_ngcontent-%COMP%] {\n font-size: larger;\n font-weight: bold;\n}\n\n\n\n.welcome-suggested-questions[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-content: center;\n}\n.welcome-suggested-questions-col[_ngcontent-%COMP%] {\n display: flex;\n}\n\n\n\n.welcome-question[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column; \n\n align-items: left;;\n width: 300px; \n justify-content: space-between;\n margin: 5px; \n\n border: solid 1px rgba(41, 28, 28, 0.08);\n border-radius: 15px;\n padding: 10px;\n cursor: pointer;\n}\n\n.welcome-question[_ngcontent-%COMP%]:hover {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n\n.welcome-question-header[_ngcontent-%COMP%] {\n font-size: 12pt;\n font-weight: bold;\n display: block; \n\n}\n\n\n\n.welcome-question[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:not(.welcome-question-header) {\n font-weight: normal;\n font-size: 10pt;\n}\n\n\n.messages[_ngcontent-%COMP%] {\n overflow-y: auto; \n\n overflow-x: hidden; \n\n \n\n margin-bottom: 5px;\n\n margin-top: 2px; \n\n\n background-color: #f9f9f9;\n flex: 1;\n scrollbar-width: thin; \n\n scrollbar-color: #d3d3d3 #f8f9fa; \n\n}\n\n\n\n.messages[_ngcontent-%COMP%]::-webkit-scrollbar {\nwidth: 8px; \n\nbackground-color: #f8f9fa; \n\n}\n\n.messages[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\nbackground-color: #d3d3d3; \n\nborder-radius: 4px; \n\n}\n\n.messages[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\nbackground-color: #c0c0c0; \n\n}\n\n.messages[_ngcontent-%COMP%]::-webkit-scrollbar-track {\nbackground-color: #f8f9fa; \n\n}\n\n\n\n.new-chat-area[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between; \n\n align-items: center; \n\n}\n.avatar[_ngcontent-%COMP%] {\n max-height: 24px;\n margin-right: 10px;\n margin-left: 5px;\n margin-bottom: 3px;\n \n\n margin-right: auto; \n\n}\n\n.conversation-item[_ngcontent-%COMP%] {\n margin-left: 5px;\n margin-right: 5px;\n padding-top: 10px;\n padding-bottom: 10px;\n padding-left: 5px;\n padding-right: 5px;\n border-radius: 5px;\n cursor: pointer;\n overflow: hidden;\n max-height: 150px;\n font-size: 14px;\n\n display: flex;\n align-items: flex-start; \n\n\n flex-wrap: wrap; \n\n}\n\n.text-container[_ngcontent-%COMP%] {\n flex: 1; \n\n display: flex;\n flex-direction: column; \n\n}\n\n.text-container[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%] {\n resize: none; \n\n \n\n}\n\n.conversation-item[_ngcontent-%COMP%] > .conversation-icon[_ngcontent-%COMP%] {\n margin-top: 3px;\n}\n\n.conversation-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: inline-block;\n white-space: pre-wrap; \n\n overflow: auto;\n word-wrap: break-word;\n margin-left: 3px; \n\n}\n\n.conversation-item[_ngcontent-%COMP%]:hover {\n background-color: rgba(0, 0, 0, 0.05);\n}\n.conversation-item-selected[_ngcontent-%COMP%] {\n background-color: rgba(0, 0, 0, 0.15);\n}\n\n\n.conversation-item[_ngcontent-%COMP%] > .conversation-icon[_ngcontent-%COMP%] {\n margin-right: 11px;\n}\n.edit-conversation-panel[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end; \n\n margin-top: 2px; \n\n margin-right: 2px; \n\n}\n.edit-conversation-panel[_ngcontent-%COMP%] > .k-icon[_ngcontent-%COMP%] {\n margin-left: 5px;\n cursor: pointer;\n}\n.edit-conversation-panel[_ngcontent-%COMP%] > .k-icon[_ngcontent-%COMP%]:hover {\n color: #ff0000;\n}\n\n\n\n.input-area[_ngcontent-%COMP%] {\n min-height: 35px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 15px;\n}\n\n.input-area[_ngcontent-%COMP%] > button[_ngcontent-%COMP%] {\n vertical-align: top;\n width: 30px;\n height: 30px;\n margin-top: 3px;\n border-radius: 12px;\n}\n.input-area[_ngcontent-%COMP%] > button[_ngcontent-%COMP%]:first-of-type {\n margin-left: -40px;\n}\n.input-area[_ngcontent-%COMP%] > button[_ngcontent-%COMP%]:last-child {\n margin-left: -65px;\n}\n\n.text-area-wrapper[_ngcontent-%COMP%] {\n padding: 3px;\n border: solid 1px rgba(0, 0, 0, 0.08) ;\n border-radius: 15px;\n\n margin-top: 4px;\n margin-right: -1px;\n min-height: 42px;\n max-height: 100%; \n\n\n overflow: hidden; \n align-items: center;\n\n \n\n width: 710px; \n padding-right: 90px\n} \n.text-area-wrapper[_ngcontent-%COMP%] > textarea[_ngcontent-%COMP%] {\n border: 0;\n outline: 0;\n resize: none;\n\n min-height: 20px; \n\n\n width: 100%;\n overflow-y: hidden; \n\n\n font-family: S\u00F6hne, ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Ubuntu, Cantarell, \"Noto Sans\", sans-serif, \"Helvetica Neue\", Arial, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n\n margin-left: 7px;\n margin-top: 7px;\n margin-bottom: 5px;\n\n background-color: #f9f9f9;\n}\n\n\n\n\n\n\n.input-wrapper[_ngcontent-%COMP%] {\n flex-grow: 1; \n\n height: 100%;\n}\n\n.waiting-for-ai[_ngcontent-%COMP%] {\n position: absolute;\n display: flex; \n\n bottom: 100px;\n z-index: 999;\n left: 10px; \n}\n \n.scroll-to-bottom-icon[_ngcontent-%COMP%] {\n position: absolute;\n bottom: 100px; \n\n left: 50%; \n\n transform: translateX(-50%); \n\n z-index: 1000; \n\n background-color: white; \n\n color: black; \n\n border-radius: 50%; \n\n width: 40px; \n\n height: 40px; \n\n display: flex;\n justify-content: center;\n align-items: center;\n box-shadow: 0px 0px 5px rgba(0,0,0,0.3); \n\n cursor: pointer;\n}\n\n@media (min-width: 600px) {\n .welcome-suggested-questions[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap; \n\n align-content: flex-end; \n\n }\n}"] });
|
|
1353
1532
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SkipChatComponent, [{
|
|
1354
1533
|
type: Component,
|
|
1355
|
-
args: [{ selector: 'skip-chat', template: "<div class = \"chat-container\" mjFillContainer #topLevelDiv [bottomMargin]=\"10\" [rightMargin]=\"10\">\n <div class=\"layout\">\n @if (IsConversationListVisible) {\n <div class=\"left-panel\">\n <div class=\"conversation-history\">\n <div class=\"new-chat-area\">\n <span class=\"fa-solid fa-table-columns toggle-icon\" (click)=\"DisplayConversationList(false)\"></span>\n @if (ShowSkipLogoInConversationList) {\n <img [src]=\"SkipLogoURL\" class=\"avatar\" />\n }\n @if (AllowNewConversations) {\n <span class=\"fa-solid fa-pen-to-square new-convo-icon\" (click)=\"CreateNewConversation()\"></span> \n }\n </div>\n <kendo-listview\n class=\"conversation-list\"\n [data]=\"Conversations\"\n [style.height.px]=\"280\"\n [itemClass]=\"{ 'item-border': true }\" \n mjFillContainer \n [fillWidth]=\"false\"\n [bottomMargin]=\"50\"\n #conversationList\n >\n <ng-template kendoListViewItemTemplate let-dataItem=\"dataItem\">\n <div class=\"conversation-item\" \n [ngClass]=\"GetConversationItemClass(dataItem)\"\n [title]=\"dataItem.Name\" \n (click)=\"SelectConversation(dataItem)\"> \n <span *ngIf=\"SelectedConversation && IsSkipProcessing(dataItem)\" class=\"fa-regular fa-clock\"></span>\n <div class=\"text-container\">\n <span *ngIf=\"dataItem.ID !== SelectedConversation?.ID || !ConversationEditMode\">{{ dataItem.Name }}</span>\n <textarea *ngIf=\"dataItem.ID === SelectedConversation?.ID && ConversationEditMode\" [(ngModel)]=\"dataItem.Name\" maxlength=\"100\"></textarea>\n </div>\n <div *ngIf=\"SelectedConversation?.ID === dataItem.ID\" class=\"edit-conversation-panel\">\n <span *ngIf=\"!ConversationEditMode\" class=\"fa-solid fa-pen-to-square\" (click)=\"editConvo(dataItem)\"></span>\n <span *ngIf=\"!ConversationEditMode\" class=\"fa-regular fa-trash-can\" (click)=\"showDeleteConvoDialog(dataItem)\"></span>\n <span *ngIf=\"ConversationEditMode\" class=\"fa-solid fa-check\" (click)=\"saveConvoName(dataItem)\"></span>\n <span *ngIf=\"ConversationEditMode\" class=\"fa-solid fa-xmark\" (click)=\"cancelConvoEdit(dataItem)\"></span>\n </div>\n </div>\n </ng-template>\n </kendo-listview>\n <!-- COMMENTED OUT as we don't want to support embedded conversations in the UI for now\n <div class=\"embedded-conversations\"><input kendoCheckBox type=\"checkbox\" [(ngModel)]=\"IncludeLinkedConversationsInList\" (ngModelChange)=\"loadConversations()\"/> <span (click)=\"FlipEmbeddedConversationState()\">Show Linked Conversations</span></div> -->\n </div> \n </div>\n }\n @if (!IsConversationListVisible) {\n <span class=\"fa-solid fa-table-columns toggle-icon\" (click)=\"DisplayConversationList(true)\"></span>\n }\n\n <div class=\"right-panel\">\n <div class=\"conversation-wrapper\" mjFillContainer>\n <div #AskSkipPanel class=\"messages\" #scrollContainer (scroll)=\"checkScroll()\">\n <div class=\"waiting-for-ai\" *ngIf=\"Messages && Messages.length > 0 && SelectedConversation && IsSkipProcessing(SelectedConversation)\">\n <!-- MOVED THIS TO INSIDE MESSAGE - REMOVE THIS ENTIRE DIV ---- <kendo-loader></kendo-loader> -->\n </div>\n <div class=\"welcome-wrapper\" *ngIf=\"(!Messages || Messages.length ===0) && _conversationLoadComplete\">\n <div class='welcome-message'>\n <img [src]=\"SkipLogoURL\" />\n <div class=\"welcome-header-text\">What can I help with today?</div>\n </div>\n <div class='welcome-suggested-questions'>\n <div class=\"welcome-suggested-questions-col\">\n <div class=\"welcome-question\" (click)=\"sendPrompt(WelcomeQuestions[0].prompt)\">\n <span class=\"welcome-question-header\">{{WelcomeQuestions[0].topLine}}</span>\n <span>{{WelcomeQuestions[0].bottomLine}}</span>\n </div>\n <div class=\"welcome-question\" (click)=\"sendPrompt(WelcomeQuestions[1].prompt)\">\n <span class=\"welcome-question-header\">{{WelcomeQuestions[1].topLine}}</span>\n <span>{{WelcomeQuestions[1].bottomLine}}</span>\n </div> \n </div>\n <div class=\"welcome-suggested-questions-col\">\n <div class=\"welcome-question\" (click)=\"sendPrompt(WelcomeQuestions[2].prompt)\">\n <span class=\"welcome-question-header\">{{WelcomeQuestions[2].topLine}}</span>\n <span>{{WelcomeQuestions[2].bottomLine}}</span>\n </div>\n <div class=\"welcome-question\" (click)=\"sendPrompt(WelcomeQuestions[3].prompt)\">\n <span class=\"welcome-question-header\">{{WelcomeQuestions[3].topLine}}</span>\n <span>{{WelcomeQuestions[3].bottomLine}}</span>\n </div> \n </div>\n </div> \n </div>\n <div mjContainer mjSkipResize=\"true\"><!--mjSkipResize results in everything below this level NOT being resized, performance optimization-->\n <!-- Dynamic messages will be injected here -->\n </div>\n <span class=\"scroll-to-bottom-icon\" *ngIf=\"_showScrollToBottomIcon && Messages && Messages.length > 0\" (click)=\"scrollToBottomAnimate()\"><i class=\"fas fa-arrow-down\"></i></span>\n </div>\n <div class=\"input-area\">\n <div class=\"text-area-wrapper\">\n <textarea\n #AskSkipInput \n [disabled]=\"SelectedConversation && IsSkipProcessing(SelectedConversation)\" \n (keyup.enter)=\"onEnter($event)\" \n (input)=\"onInputChange($event)\"\n type=\"text\" \n [placeholder]=\"_AskSkipTextboxPlaceholder\"></textarea>\n </div>\n @if (ShowDataContextButton) {\n <button kendoButton >\n <span class=\"fa-solid fa-gear\" \n (click)=\"showDataContext()\"></span>\n </button> \n }\n <button kendoButton \n [disabled]=\"IsTextAreaEmpty() || (SelectedConversation !== undefined && IsSkipProcessing(SelectedConversation))\" \n (click)=\"sendSkipMessage()\">\n <span class=\"fas fa-solid fa-arrow-up\"></span>\n </button>\n </div>\n </div> \n </div>\n </div> \n</div> \n\n<div *ngIf=\"isDataContextDialogVisible\">\n <mj-data-context-dialog [dataContextId]=\"DataContextID\" (dialogClosed)=\"closeDataContextDialog()\" [Provider]=\"ProviderToUse\"></mj-data-context-dialog>\n</div>\n\n\n<kendo-dialog\n title=\"Please confirm\"\n *ngIf=\"confirmDeleteConversationDialogOpen\"\n (close)=\"closeDeleteConversation('no')\"\n [minWidth]=\"250\"\n [width]=\"450\"\n>\n <p style=\"margin: 30px; text-align: center;\">\n Would you like to delete {{SelectedConversation?.Name}}?\n </p>\n <kendo-dialog-actions>\n <button kendoButton (click)=\"closeDeleteConversation('yes')\" themeColor=\"primary\">\n Yes\n </button>\n <button kendoButton (click)=\"closeDeleteConversation('no')\">\n No\n </button>\n </kendo-dialog-actions>\n</kendo-dialog> ", styles: [".layout {\n display: flex;\n flex-direction: row; /* Ensures left and right panels are side by side */\n height: 100%; /* Fill the available height */\n width: 100%; /* Fill the available width */\n position: relative;\n}\n\n.left-panel {\n width: 272px; /* Fixed width for the conversation list */\n background-color: #f8f9fa; /* Optional: Background color */\n border-right: 1px solid #ddd; /* Optional: Add a divider */\n overflow-y: auto; /* Enable scrolling if content overflows */\n overflow-x: hidden; /* Hide horizontal scrollbar */\n position: relative;\n\n scrollbar-width: thin; /* For Firefox */\n scrollbar-color: #d3d3d3 #f8f9fa; /* Thumb color and track color */\n}\n\n/* For WebKit-based browsers (Chrome, Edge, Safari) */\n.left-panel::-webkit-scrollbar {\n width: 8px; /* Narrower scrollbar */\n background-color: #f8f9fa; /* Scrollbar track color */\n}\n\n.left-panel::-webkit-scrollbar-thumb {\n background-color: #d3d3d3; /* Lighter gray scrollbar thumb */\n border-radius: 4px; /* Rounded corners for the thumb */\n}\n\n.left-panel::-webkit-scrollbar-thumb:hover {\n background-color: #c0c0c0; /* Slightly darker gray on hover */\n}\n\n.left-panel::-webkit-scrollbar-track {\n background-color: #f8f9fa; /* Background of the scrollbar track */\n}\n\n.right-panel {\n flex: 1; /* Take up the remaining space */\n overflow-y: auto; /* Enable scrolling for the conversation content */\n}\n\n\n.new-convo-icon {\n color: #808080; /* Mid-gray */\n font-size: 18px; /* Adjust icon size */\n cursor: pointer; /* Make it clear the icon is clickable */\n z-index: 10; /* Ensure the icon is above other content */\n padding: 5px;\n border-radius: 4px;\n}\n\n.toggle-icon {\n color: #808080; /* Mid-gray */\n font-size: 18px; /* Adjust icon size */\n cursor: pointer; /* Make it clear the icon is clickable */\n z-index: 10; /* Ensure the icon is above other content */\n margin-left: 6px;\n padding: 3px;\n border-radius: 3px;\n}\n \n\n.right-panel .toggle-icon {\n margin-left: 3px;\n margin-top: 2px;\n position: absolute;\n top: 10px;\n left: auto;\n right: 10px; /* For the right panel toggle */\n}\n\n\n.chat-container {\n padding: 5px;\n display: flex;\n flex-direction: row;\n height: 100%;\n font-family: S\u00F6hne, ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Ubuntu, Cantarell, \"Noto Sans\", sans-serif, \"Helvetica Neue\", Arial, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n\n /*initial sizes*/\n width: 100%;\n height: 100%;\n\n background-color: #f9f9f9;\n}\n\n.conversation-wrapper {\n display: flex;\n flex-direction: column;\n position: relative; /* Add this line if the wrapper needs to be a reference point */\n background-color: #f9f9f9;\n}\n\n.new-conversation {\n height: 30px;\n font-size: large;\n}\n\n.conversation-history {\n width: 240px;\n min-width: 240px;\n height: 95%;\n overflow-y: auto; /* Add scroll if the content exceeds the height */\n overflow-x: hidden; /* Hide horizontal scrollbar */\n margin-right: 10px;\n padding-top: 5px;\n background-color: #f9f9f9;\n margin-top: 0px; \n padding: 12px; \n}\n\n.k-tabstrip-content-for-skip {\n padding: 0;\n padding-block: 0;\n}\n\n\n.conversation-history > button {\n height: 25px;\n}\n\n.skip-title {\n font-size: larger;\n margin-bottom: 5px;\n height: 20px;\n margin-top: 5px;\n}\n\n.conversation-list {\n margin-top: 5px;\n padding-top: 5px;\n \n border: 0;\n background-color: #f9f9f9;\n}\n\n\n\n/* Center the welcome message vertically and horizontally */\n.welcome-wrapper {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n height: 100%;\n width: 100%;\n overflow: hidden;\n}\n\n.welcome-message {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n overflow: hidden;\n height: 100%;\n}\n\n.embedded-conversations {\n margin-left: 3px;\n margin-top: 5px;\n font-size: 10pt;\n color: rgb(48, 48, 235);\n}\n.embedded-conversations > span {\n margin-top: 4px;\n margin-left: 5px;\n cursor: pointer;\n}\n.conversation-item-linked {\n color: rgb(48, 48, 235);\n}\n\n.welcome-message img {\n width: 120px;\n height: 50px;\n margin-bottom: 20px; /* Adds some space between the image and the text below */\n}\n\n.welcome-header-text {\n font-size: larger;\n font-weight: bold;\n}\n\n/* Position the welcome-suggested-questions at the bottom of its container */\n.welcome-suggested-questions {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-content: center;\n}\n.welcome-suggested-questions-col {\n display: flex;\n}\n\n/* Flex layout for questions, two per row */\n.welcome-question {\n display: flex;\n flex-direction: column; /* Stack the header and text vertically */\n align-items: left;;\n width: 300px; \n justify-content: space-between;\n margin: 5px; /* Adds some space around each question */\n border: solid 1px rgba(41, 28, 28, 0.08);\n border-radius: 15px;\n padding: 10px;\n cursor: pointer;\n}\n\n.welcome-question:hover {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n\n.welcome-question-header {\n font-size: 12pt;\n font-weight: bold;\n display: block; /* Ensures the header is on its own line */\n}\n\n/* Non-bold text for the content below the header */\n.welcome-question span:not(.welcome-question-header) {\n font-weight: normal;\n font-size: 10pt;\n}\n\n\n.messages {\n overflow-y: auto; /* enable scrolling if the content overflows */\n overflow-x: hidden; /* hide horizontal scrollbar */\n /* border: solid 1px rgba(0, 0, 0, 0.08); */\n margin-bottom: 5px;\n\n margin-top: 2px; /* align it with the top of converation history exactly*/\n\n background-color: #f9f9f9;\n flex: 1;\n scrollbar-width: thin; /* For Firefox */\n scrollbar-color: #d3d3d3 #f8f9fa; /* Thumb color and track color */\n}\n\n/* For WebKit-based browsers (Chrome, Edge, Safari) */\n.messages::-webkit-scrollbar {\nwidth: 8px; /* Narrower scrollbar */\nbackground-color: #f8f9fa; /* Scrollbar track color */\n}\n\n.messages::-webkit-scrollbar-thumb {\nbackground-color: #d3d3d3; /* Lighter gray scrollbar thumb */\nborder-radius: 4px; /* Rounded corners for the thumb */\n}\n\n.messages::-webkit-scrollbar-thumb:hover {\nbackground-color: #c0c0c0; /* Slightly darker gray on hover */\n}\n\n.messages::-webkit-scrollbar-track {\nbackground-color: #f8f9fa; /* Background of the scrollbar track */\n}\n\n\n\n.new-chat-area {\n display: flex;\n justify-content: space-between; /* Aligns children (img and button) to each end */\n align-items: center; /* Centers children vertically */\n}\n.avatar {\n max-height: 24px;\n margin-right: 10px;\n margin-left: 5px;\n margin-bottom: 3px;\n /* Ensure the image aligns to the left */\n margin-right: auto; /* Pushes everything else to the right */\n}\n\n.conversation-item {\n margin-left: 5px;\n margin-right: 5px;\n padding-top: 10px;\n padding-bottom: 10px;\n padding-left: 5px;\n padding-right: 5px;\n border-radius: 5px;\n cursor: pointer;\n overflow: hidden;\n max-height: 150px;\n font-size: 14px;\n\n display: flex;\n align-items: flex-start; /* Align items to the top */\n\n flex-wrap: wrap; /* Allow items to wrap to the next line */\n}\n\n.text-container {\n flex: 1; /* Take up remaining space */\n display: flex;\n flex-direction: column; /* Stack children vertically */\n}\n\n.text-container textarea {\n resize: none; /* Disable resizing */\n /* Add more styles for the textarea if needed */\n}\n\n.conversation-item > .conversation-icon {\n margin-top: 3px;\n}\n\n.conversation-item span {\n display: inline-block;\n white-space: pre-wrap; /* Allow text to wrap */\n overflow: auto;\n word-wrap: break-word;\n margin-left: 3px; /* Move the text to the right */\n}\n\n.conversation-item:hover {\n background-color: rgba(0, 0, 0, 0.05);\n}\n.conversation-item-selected {\n background-color: rgba(0, 0, 0, 0.15);\n}\n\n\n.conversation-item > .conversation-icon {\n margin-right: 11px;\n}\n.edit-conversation-panel {\n display: flex;\n justify-content: flex-end; /* Align icons to the right */\n margin-top: 2px; /* litle buffer on top */\n margin-right: 2px; /* litle buffer to the right */\n}\n.edit-conversation-panel > .k-icon {\n margin-left: 5px;\n cursor: pointer;\n}\n.edit-conversation-panel > .k-icon:hover {\n color: #ff0000;\n}\n\n\n\n.input-area {\n min-height: 35px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 15px;\n}\n\n.input-area > button {\n vertical-align: top;\n width: 30px;\n height: 30px;\n margin-top: 3px;\n border-radius: 12px;\n}\n.input-area > button:first-of-type {\n margin-left: -40px;\n}\n.input-area > button:last-child {\n margin-left: -65px;\n}\n\n.text-area-wrapper {\n padding: 3px;\n border: solid 1px rgba(0, 0, 0, 0.08) ;\n border-radius: 15px;\n\n margin-top: 4px;\n margin-right: -1px;\n min-height: 42px;\n max-height: 100%; /* Prevent it from growing beyond the container */\n\n overflow: hidden; \n align-items: center;\n\n /*combined width and padding is 800*/\n width: 710px; \n padding-right: 90px\n} \n.text-area-wrapper > textarea {\n border: 0;\n outline: 0;\n resize: none;\n\n min-height: 20px; /* Initial height */\n\n width: 100%;\n overflow-y: hidden; /* Hide scrollbar */\n\n font-family: S\u00F6hne, ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Ubuntu, Cantarell, \"Noto Sans\", sans-serif, \"Helvetica Neue\", Arial, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n\n margin-left: 7px;\n margin-top: 7px;\n margin-bottom: 5px;\n\n background-color: #f9f9f9;\n}\n\n/* .text-area-wrapper > textarea:disabled {\n background-color: white;\n} */\n\n.input-wrapper {\n flex-grow: 1; /* This will make the input-wrapper take the remaining space */\n height: 100%;\n}\n\n.waiting-for-ai {\n position: absolute;\n display: flex; /* Use flexbox layout */\n bottom: 100px;\n z-index: 999;\n left: 10px; \n}\n \n.scroll-to-bottom-icon {\n position: absolute;\n bottom: 100px; /* Adjust as needed to position away from the bottom edge */\n left: 50%; /* Start at the exact horizontal center */\n transform: translateX(-50%); /* Shift it back by half its width to center it */\n z-index: 1000; /* Ensure it stays on top */\n background-color: white; /* Circle background color - adjust as needed */\n color: black; /* Icon color - adjust as needed */\n border-radius: 50%; /* Makes the background a circle */\n width: 40px; /* Circle size - adjust as needed */\n height: 40px; /* Circle size - adjust as needed */\n display: flex;\n justify-content: center;\n align-items: center;\n box-shadow: 0px 0px 5px rgba(0,0,0,0.3); /* Optional: Adds a subtle shadow for better visibility */\n cursor: pointer;\n}\n\n@media (min-width: 600px) {\n .welcome-suggested-questions {\n display: flex;\n flex-wrap: wrap; /* Allows questions to wrap to the next line */\n align-content: flex-end; /* Aligns the content to the bottom */\n }\n}\n "] }]
|
|
1534
|
+
args: [{ selector: 'skip-chat', template: "<div class = \"chat-container\" mjFillContainer #topLevelDiv [bottomMargin]=\"10\" [rightMargin]=\"10\">\n <div class=\"layout\">\n @if (IsConversationListVisible) {\n <div class=\"left-panel\">\n <div class=\"conversation-history\">\n <div class=\"new-chat-area\">\n <span class=\"fa-solid fa-table-columns toggle-icon\" (click)=\"DisplayConversationList(false)\"></span>\n @if (ShowSkipLogoInConversationList) {\n <img [src]=\"SkipLogoURL\" class=\"avatar\" />\n }\n @if (AllowNewConversations) {\n <span class=\"fa-solid fa-pen-to-square new-convo-icon\" (click)=\"CreateNewConversation()\"></span> \n }\n </div>\n <kendo-listview\n class=\"conversation-list\"\n [data]=\"Conversations\"\n [style.height.px]=\"280\"\n [itemClass]=\"{ 'item-border': true }\" \n mjFillContainer \n [fillWidth]=\"false\"\n [bottomMargin]=\"50\"\n #conversationList\n >\n <ng-template kendoListViewItemTemplate let-dataItem=\"dataItem\">\n <div class=\"conversation-item\" \n [ngClass]=\"GetConversationItemClass(dataItem)\"\n [title]=\"dataItem.Name\" \n (click)=\"SelectConversation(dataItem)\"> \n <span *ngIf=\"SelectedConversation && IsSkipProcessing(dataItem)\" class=\"fa-regular fa-clock\"></span>\n <div class=\"text-container\">\n <span *ngIf=\"dataItem.ID !== SelectedConversation?.ID || !ConversationEditMode\">{{ dataItem.Name }}</span>\n <textarea *ngIf=\"dataItem.ID === SelectedConversation?.ID && ConversationEditMode\" [(ngModel)]=\"dataItem.Name\" maxlength=\"100\"></textarea>\n </div>\n <div *ngIf=\"SelectedConversation?.ID === dataItem.ID\" class=\"edit-conversation-panel\">\n <span *ngIf=\"!ConversationEditMode\" class=\"fa-solid fa-pen-to-square\" (click)=\"editConvo(dataItem)\"></span>\n <span *ngIf=\"!ConversationEditMode\" class=\"fa-regular fa-trash-can\" (click)=\"showDeleteConvoDialog(dataItem)\"></span>\n <span *ngIf=\"ConversationEditMode\" class=\"fa-solid fa-check\" (click)=\"saveConvoName(dataItem)\"></span>\n <span *ngIf=\"ConversationEditMode\" class=\"fa-solid fa-xmark\" (click)=\"cancelConvoEdit(dataItem)\"></span>\n </div>\n </div>\n </ng-template>\n </kendo-listview>\n <!-- COMMENTED OUT as we don't want to support embedded conversations in the UI for now\n <div class=\"embedded-conversations\"><input kendoCheckBox type=\"checkbox\" [(ngModel)]=\"IncludeLinkedConversationsInList\" (ngModelChange)=\"loadConversations()\"/> <span (click)=\"FlipEmbeddedConversationState()\">Show Linked Conversations</span></div> -->\n </div> \n </div>\n }\n @if (!IsConversationListVisible) {\n <span class=\"fa-solid fa-table-columns toggle-icon\" (click)=\"DisplayConversationList(true)\"></span>\n }\n\n <div class=\"right-panel\">\n <div class=\"conversation-wrapper\" mjFillContainer>\n <div #AskSkipPanel class=\"messages\" #scrollContainer (scroll)=\"checkScroll()\">\n <div class=\"waiting-for-ai\" *ngIf=\"Messages && Messages.length > 0 && SelectedConversation && IsSkipProcessing(SelectedConversation)\">\n <!-- MOVED THIS TO INSIDE MESSAGE - REMOVE THIS ENTIRE DIV ---- <kendo-loader></kendo-loader> -->\n </div>\n <div class=\"welcome-wrapper\" *ngIf=\"(!Messages || Messages.length ===0) && _conversationLoadComplete\">\n <div class='welcome-message'>\n <img [src]=\"SkipLogoURL\" />\n <div class=\"welcome-header-text\">What can I help with today?</div>\n </div>\n <div class='welcome-suggested-questions'>\n <div class=\"welcome-suggested-questions-col\">\n <div class=\"welcome-question\" (click)=\"sendPrompt(WelcomeQuestions[0].prompt)\">\n <span class=\"welcome-question-header\">{{WelcomeQuestions[0].topLine}}</span>\n <span>{{WelcomeQuestions[0].bottomLine}}</span>\n </div>\n <div class=\"welcome-question\" (click)=\"sendPrompt(WelcomeQuestions[1].prompt)\">\n <span class=\"welcome-question-header\">{{WelcomeQuestions[1].topLine}}</span>\n <span>{{WelcomeQuestions[1].bottomLine}}</span>\n </div> \n </div>\n <div class=\"welcome-suggested-questions-col\">\n <div class=\"welcome-question\" (click)=\"sendPrompt(WelcomeQuestions[2].prompt)\">\n <span class=\"welcome-question-header\">{{WelcomeQuestions[2].topLine}}</span>\n <span>{{WelcomeQuestions[2].bottomLine}}</span>\n </div>\n <div class=\"welcome-question\" (click)=\"sendPrompt(WelcomeQuestions[3].prompt)\">\n <span class=\"welcome-question-header\">{{WelcomeQuestions[3].topLine}}</span>\n <span>{{WelcomeQuestions[3].bottomLine}}</span>\n </div> \n </div>\n </div> \n </div>\n <div mjContainer mjSkipResize=\"true\"><!--mjSkipResize results in everything below this level NOT being resized, performance optimization-->\n <!-- Dynamic messages will be injected here -->\n </div>\n <span class=\"scroll-to-bottom-icon\" *ngIf=\"_showScrollToBottomIcon && Messages && Messages.length > 0\" (click)=\"scrollToBottomAnimate()\"><i class=\"fas fa-arrow-down\"></i></span>\n </div>\n <div class=\"input-area\">\n <div class=\"text-area-wrapper\">\n <textarea\n #AskSkipInput \n [disabled]=\"SelectedConversation && IsSkipProcessing(SelectedConversation)\" \n (keyup.enter)=\"onEnter($event)\" \n (input)=\"onInputChange($event)\"\n type=\"text\" \n [placeholder]=\"_AskSkipTextboxPlaceholder\"></textarea>\n </div>\n @if (ShowDataContextButton) {\n <button kendoButton >\n <span class=\"fa-solid fa-gear\" \n (click)=\"showDataContext()\"></span>\n </button> \n }\n <button kendoButton \n [disabled]=\"IsTextAreaEmpty() || (SelectedConversation !== undefined && IsSkipProcessing(SelectedConversation))\" \n (click)=\"sendSkipMessage()\">\n <span class=\"fas fa-solid fa-arrow-up\"></span>\n </button>\n </div>\n </div> \n </div>\n </div> \n</div> \n\n<div *ngIf=\"isDataContextDialogVisible\">\n <mj-data-context-dialog [dataContextId]=\"DataContextID\" (dialogClosed)=\"closeDataContextDialog()\" [Provider]=\"ProviderToUse\"></mj-data-context-dialog>\n</div>\n\n\n<kendo-dialog\n title=\"Please confirm\"\n *ngIf=\"confirmDeleteConversationDialogOpen\"\n (close)=\"closeDeleteConversation('no')\"\n [minWidth]=\"250\"\n [width]=\"450\"\n>\n <p style=\"margin: 30px; text-align: center;\">\n Would you like to delete {{SelectedConversation?.Name}}?\n </p>\n <kendo-dialog-actions>\n <button kendoButton (click)=\"closeDeleteConversation('yes')\" themeColor=\"primary\">\n Yes\n </button>\n <button kendoButton (click)=\"closeDeleteConversation('no')\">\n No\n </button>\n </kendo-dialog-actions>\n</kendo-dialog> \n\n<kendo-dialog\n title=\"Please confirm\"\n *ngIf=\"confirmMessageEditOrDeleteDialogOpen\"\n (close)=\"closeMessageEditOrDeleteDialog('no')\"\n [minWidth]=\"250\"\n [width]=\"450\"\n>\n <p style=\"margin: 30px; text-align: center;\">\n Would you like to {{messageEditOrDeleteType}} this message? Doing so will result in any subsequent messages in the conversation being deleted.\n </p>\n <kendo-dialog-actions>\n <button kendoButton (click)=\"closeMessageEditOrDeleteDialog('yes')\" themeColor=\"primary\">\n Yes\n </button>\n <button kendoButton (click)=\"closeMessageEditOrDeleteDialog('no')\">\n No\n </button>\n </kendo-dialog-actions>\n</kendo-dialog> ", styles: [".layout {\n display: flex;\n flex-direction: row; /* Ensures left and right panels are side by side */\n height: 100%; /* Fill the available height */\n width: 100%; /* Fill the available width */\n position: relative;\n}\n\n.left-panel {\n width: 272px; /* Fixed width for the conversation list */\n background-color: #f8f9fa; /* Optional: Background color */\n border-right: 1px solid #ddd; /* Optional: Add a divider */\n overflow-y: auto; /* Enable scrolling if content overflows */\n overflow-x: hidden; /* Hide horizontal scrollbar */\n position: relative;\n\n scrollbar-width: thin; /* For Firefox */\n scrollbar-color: #d3d3d3 #f8f9fa; /* Thumb color and track color */\n}\n\n/* For WebKit-based browsers (Chrome, Edge, Safari) */\n.left-panel::-webkit-scrollbar {\n width: 8px; /* Narrower scrollbar */\n background-color: #f8f9fa; /* Scrollbar track color */\n}\n\n.left-panel::-webkit-scrollbar-thumb {\n background-color: #d3d3d3; /* Lighter gray scrollbar thumb */\n border-radius: 4px; /* Rounded corners for the thumb */\n}\n\n.left-panel::-webkit-scrollbar-thumb:hover {\n background-color: #c0c0c0; /* Slightly darker gray on hover */\n}\n\n.left-panel::-webkit-scrollbar-track {\n background-color: #f8f9fa; /* Background of the scrollbar track */\n}\n\n.right-panel {\n flex: 1; /* Take up the remaining space */\n overflow-y: auto; /* Enable scrolling for the conversation content */\n}\n\n\n.new-convo-icon {\n color: #808080; /* Mid-gray */\n font-size: 18px; /* Adjust icon size */\n cursor: pointer; /* Make it clear the icon is clickable */\n z-index: 10; /* Ensure the icon is above other content */\n padding: 5px;\n border-radius: 4px;\n}\n\n.toggle-icon {\n color: #808080; /* Mid-gray */\n font-size: 18px; /* Adjust icon size */\n cursor: pointer; /* Make it clear the icon is clickable */\n z-index: 10; /* Ensure the icon is above other content */\n margin-left: 6px;\n padding: 3px;\n border-radius: 3px;\n}\n \n\n.right-panel .toggle-icon {\n margin-left: 3px;\n margin-top: 2px;\n position: absolute;\n top: 10px;\n left: auto;\n right: 10px; /* For the right panel toggle */\n}\n\n\n.chat-container {\n padding: 5px;\n display: flex;\n flex-direction: row;\n height: 100%;\n font-family: S\u00F6hne, ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Ubuntu, Cantarell, \"Noto Sans\", sans-serif, \"Helvetica Neue\", Arial, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n\n /*initial sizes*/\n width: 100%;\n height: 100%;\n\n background-color: #f9f9f9;\n}\n\n.conversation-wrapper {\n display: flex;\n flex-direction: column;\n position: relative; /* Add this line if the wrapper needs to be a reference point */\n background-color: #f9f9f9;\n}\n\n.new-conversation {\n height: 30px;\n font-size: large;\n}\n\n.conversation-history {\n width: 240px;\n min-width: 240px;\n height: 95%;\n overflow-y: auto; /* Add scroll if the content exceeds the height */\n overflow-x: hidden; /* Hide horizontal scrollbar */\n margin-right: 10px;\n padding-top: 5px;\n background-color: #f9f9f9;\n margin-top: 0px; \n padding: 12px; \n}\n\n.k-tabstrip-content-for-skip {\n padding: 0;\n padding-block: 0;\n}\n\n\n.conversation-history > button {\n height: 25px;\n}\n\n.skip-title {\n font-size: larger;\n margin-bottom: 5px;\n height: 20px;\n margin-top: 5px;\n}\n\n.conversation-list {\n margin-top: 5px;\n padding-top: 5px;\n \n border: 0;\n background-color: #f9f9f9;\n}\n\n\n\n/* Center the welcome message vertically and horizontally */\n.welcome-wrapper {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n height: 100%;\n width: 100%;\n overflow: hidden;\n}\n\n.welcome-message {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n overflow: hidden;\n height: 100%;\n}\n\n.embedded-conversations {\n margin-left: 3px;\n margin-top: 5px;\n font-size: 10pt;\n color: rgb(48, 48, 235);\n}\n.embedded-conversations > span {\n margin-top: 4px;\n margin-left: 5px;\n cursor: pointer;\n}\n.conversation-item-linked {\n color: rgb(48, 48, 235);\n}\n\n.welcome-message img {\n width: 120px;\n height: 50px;\n margin-bottom: 20px; /* Adds some space between the image and the text below */\n}\n\n.welcome-header-text {\n font-size: larger;\n font-weight: bold;\n}\n\n/* Position the welcome-suggested-questions at the bottom of its container */\n.welcome-suggested-questions {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-content: center;\n}\n.welcome-suggested-questions-col {\n display: flex;\n}\n\n/* Flex layout for questions, two per row */\n.welcome-question {\n display: flex;\n flex-direction: column; /* Stack the header and text vertically */\n align-items: left;;\n width: 300px; \n justify-content: space-between;\n margin: 5px; /* Adds some space around each question */\n border: solid 1px rgba(41, 28, 28, 0.08);\n border-radius: 15px;\n padding: 10px;\n cursor: pointer;\n}\n\n.welcome-question:hover {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n\n.welcome-question-header {\n font-size: 12pt;\n font-weight: bold;\n display: block; /* Ensures the header is on its own line */\n}\n\n/* Non-bold text for the content below the header */\n.welcome-question span:not(.welcome-question-header) {\n font-weight: normal;\n font-size: 10pt;\n}\n\n\n.messages {\n overflow-y: auto; /* enable scrolling if the content overflows */\n overflow-x: hidden; /* hide horizontal scrollbar */\n /* border: solid 1px rgba(0, 0, 0, 0.08); */\n margin-bottom: 5px;\n\n margin-top: 2px; /* align it with the top of converation history exactly*/\n\n background-color: #f9f9f9;\n flex: 1;\n scrollbar-width: thin; /* For Firefox */\n scrollbar-color: #d3d3d3 #f8f9fa; /* Thumb color and track color */\n}\n\n/* For WebKit-based browsers (Chrome, Edge, Safari) */\n.messages::-webkit-scrollbar {\nwidth: 8px; /* Narrower scrollbar */\nbackground-color: #f8f9fa; /* Scrollbar track color */\n}\n\n.messages::-webkit-scrollbar-thumb {\nbackground-color: #d3d3d3; /* Lighter gray scrollbar thumb */\nborder-radius: 4px; /* Rounded corners for the thumb */\n}\n\n.messages::-webkit-scrollbar-thumb:hover {\nbackground-color: #c0c0c0; /* Slightly darker gray on hover */\n}\n\n.messages::-webkit-scrollbar-track {\nbackground-color: #f8f9fa; /* Background of the scrollbar track */\n}\n\n\n\n.new-chat-area {\n display: flex;\n justify-content: space-between; /* Aligns children (img and button) to each end */\n align-items: center; /* Centers children vertically */\n}\n.avatar {\n max-height: 24px;\n margin-right: 10px;\n margin-left: 5px;\n margin-bottom: 3px;\n /* Ensure the image aligns to the left */\n margin-right: auto; /* Pushes everything else to the right */\n}\n\n.conversation-item {\n margin-left: 5px;\n margin-right: 5px;\n padding-top: 10px;\n padding-bottom: 10px;\n padding-left: 5px;\n padding-right: 5px;\n border-radius: 5px;\n cursor: pointer;\n overflow: hidden;\n max-height: 150px;\n font-size: 14px;\n\n display: flex;\n align-items: flex-start; /* Align items to the top */\n\n flex-wrap: wrap; /* Allow items to wrap to the next line */\n}\n\n.text-container {\n flex: 1; /* Take up remaining space */\n display: flex;\n flex-direction: column; /* Stack children vertically */\n}\n\n.text-container textarea {\n resize: none; /* Disable resizing */\n /* Add more styles for the textarea if needed */\n}\n\n.conversation-item > .conversation-icon {\n margin-top: 3px;\n}\n\n.conversation-item span {\n display: inline-block;\n white-space: pre-wrap; /* Allow text to wrap */\n overflow: auto;\n word-wrap: break-word;\n margin-left: 3px; /* Move the text to the right */\n}\n\n.conversation-item:hover {\n background-color: rgba(0, 0, 0, 0.05);\n}\n.conversation-item-selected {\n background-color: rgba(0, 0, 0, 0.15);\n}\n\n\n.conversation-item > .conversation-icon {\n margin-right: 11px;\n}\n.edit-conversation-panel {\n display: flex;\n justify-content: flex-end; /* Align icons to the right */\n margin-top: 2px; /* litle buffer on top */\n margin-right: 2px; /* litle buffer to the right */\n}\n.edit-conversation-panel > .k-icon {\n margin-left: 5px;\n cursor: pointer;\n}\n.edit-conversation-panel > .k-icon:hover {\n color: #ff0000;\n}\n\n\n\n.input-area {\n min-height: 35px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 15px;\n}\n\n.input-area > button {\n vertical-align: top;\n width: 30px;\n height: 30px;\n margin-top: 3px;\n border-radius: 12px;\n}\n.input-area > button:first-of-type {\n margin-left: -40px;\n}\n.input-area > button:last-child {\n margin-left: -65px;\n}\n\n.text-area-wrapper {\n padding: 3px;\n border: solid 1px rgba(0, 0, 0, 0.08) ;\n border-radius: 15px;\n\n margin-top: 4px;\n margin-right: -1px;\n min-height: 42px;\n max-height: 100%; /* Prevent it from growing beyond the container */\n\n overflow: hidden; \n align-items: center;\n\n /*combined width and padding is 800*/\n width: 710px; \n padding-right: 90px\n} \n.text-area-wrapper > textarea {\n border: 0;\n outline: 0;\n resize: none;\n\n min-height: 20px; /* Initial height */\n\n width: 100%;\n overflow-y: hidden; /* Hide scrollbar */\n\n font-family: S\u00F6hne, ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Ubuntu, Cantarell, \"Noto Sans\", sans-serif, \"Helvetica Neue\", Arial, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n\n margin-left: 7px;\n margin-top: 7px;\n margin-bottom: 5px;\n\n background-color: #f9f9f9;\n}\n\n/* .text-area-wrapper > textarea:disabled {\n background-color: white;\n} */\n\n.input-wrapper {\n flex-grow: 1; /* This will make the input-wrapper take the remaining space */\n height: 100%;\n}\n\n.waiting-for-ai {\n position: absolute;\n display: flex; /* Use flexbox layout */\n bottom: 100px;\n z-index: 999;\n left: 10px; \n}\n \n.scroll-to-bottom-icon {\n position: absolute;\n bottom: 100px; /* Adjust as needed to position away from the bottom edge */\n left: 50%; /* Start at the exact horizontal center */\n transform: translateX(-50%); /* Shift it back by half its width to center it */\n z-index: 1000; /* Ensure it stays on top */\n background-color: white; /* Circle background color - adjust as needed */\n color: black; /* Icon color - adjust as needed */\n border-radius: 50%; /* Makes the background a circle */\n width: 40px; /* Circle size - adjust as needed */\n height: 40px; /* Circle size - adjust as needed */\n display: flex;\n justify-content: center;\n align-items: center;\n box-shadow: 0px 0px 5px rgba(0,0,0,0.3); /* Optional: Adds a subtle shadow for better visibility */\n cursor: pointer;\n}\n\n@media (min-width: 600px) {\n .welcome-suggested-questions {\n display: flex;\n flex-wrap: wrap; /* Allows questions to wrap to the next line */\n align-content: flex-end; /* Aligns the content to the bottom */\n }\n}\n "] }]
|
|
1356
1535
|
}], () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.Location }, { type: i0.ChangeDetectorRef }, { type: i3.MJNotificationService }], { AllowSend: [{
|
|
1357
1536
|
type: Input
|
|
1358
1537
|
}], Messages: [{
|
|
@@ -1397,6 +1576,8 @@ SkipChatComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SkipChatC
|
|
|
1397
1576
|
type: Output
|
|
1398
1577
|
}], ConversationSelected: [{
|
|
1399
1578
|
type: Output
|
|
1579
|
+
}], NewReportCreated: [{
|
|
1580
|
+
type: Output
|
|
1400
1581
|
}], askSkip: [{
|
|
1401
1582
|
type: ViewChild,
|
|
1402
1583
|
args: [Container, { static: true }]
|