@memberjunction/ng-skip-chat 2.19.0 → 2.19.2
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/base-report.d.ts +5 -1
- package/dist/lib/dynamic-report/base-report.d.ts.map +1 -1
- package/dist/lib/dynamic-report/base-report.js +8 -1
- package/dist/lib/dynamic-report/base-report.js.map +1 -1
- 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 +39 -1
- package/dist/lib/skip-chat/skip-chat.component.d.ts.map +1 -1
- package/dist/lib/skip-chat/skip-chat.component.js +360 -139
- 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
|
@@ -21,13 +21,12 @@ import * as i0 from "@angular/core";
|
|
|
21
21
|
import * as i1 from "@angular/router";
|
|
22
22
|
import * as i2 from "@angular/common";
|
|
23
23
|
import * as i3 from "@memberjunction/ng-notifications";
|
|
24
|
-
import * as i4 from "@
|
|
25
|
-
import * as i5 from "@angular
|
|
26
|
-
import * as i6 from "@
|
|
27
|
-
import * as i7 from "@
|
|
28
|
-
import * as i8 from "@progress/kendo-angular-
|
|
29
|
-
import * as i9 from "@
|
|
30
|
-
import * as i10 from "@memberjunction/ng-data-context";
|
|
24
|
+
import * as i4 from "@angular/forms";
|
|
25
|
+
import * as i5 from "@progress/kendo-angular-dialog";
|
|
26
|
+
import * as i6 from "@memberjunction/ng-container-directives";
|
|
27
|
+
import * as i7 from "@progress/kendo-angular-listview";
|
|
28
|
+
import * as i8 from "@progress/kendo-angular-buttons";
|
|
29
|
+
import * as i9 from "@memberjunction/ng-data-context";
|
|
31
30
|
const _c0 = ["AskSkipPanel"];
|
|
32
31
|
const _c1 = ["mjContainer"];
|
|
33
32
|
const _c2 = ["conversationList"];
|
|
@@ -35,17 +34,22 @@ const _c3 = ["AskSkipInput"];
|
|
|
35
34
|
const _c4 = ["scrollContainer"];
|
|
36
35
|
const _c5 = ["topLevelDiv"];
|
|
37
36
|
const _c6 = () => ({ "item-border": true });
|
|
38
|
-
function
|
|
37
|
+
function SkipChatComponent_Conditional_3_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
38
|
+
i0.ɵɵelement(0, "img", 26);
|
|
39
|
+
} if (rf & 2) {
|
|
40
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
41
|
+
i0.ɵɵproperty("src", ctx_r2.SkipLogoURL, i0.ɵɵsanitizeUrl);
|
|
42
|
+
} }
|
|
43
|
+
function SkipChatComponent_Conditional_3_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
39
44
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
40
|
-
i0.ɵɵelementStart(0, "
|
|
41
|
-
i0.ɵɵlistener("click", function
|
|
42
|
-
i0.ɵɵtext(1, "+");
|
|
45
|
+
i0.ɵɵelementStart(0, "span", 30);
|
|
46
|
+
i0.ɵɵlistener("click", function SkipChatComponent_Conditional_3_Conditional_5_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CreateNewConversation()); });
|
|
43
47
|
i0.ɵɵelementEnd();
|
|
44
48
|
} }
|
|
45
|
-
function
|
|
46
|
-
i0.ɵɵelement(0, "span",
|
|
49
|
+
function SkipChatComponent_Conditional_3_ng_template_8_span_1_Template(rf, ctx) { if (rf & 1) {
|
|
50
|
+
i0.ɵɵelement(0, "span", 36);
|
|
47
51
|
} }
|
|
48
|
-
function
|
|
52
|
+
function SkipChatComponent_Conditional_3_ng_template_8_span_3_Template(rf, ctx) { if (rf & 1) {
|
|
49
53
|
i0.ɵɵelementStart(0, "span");
|
|
50
54
|
i0.ɵɵtext(1);
|
|
51
55
|
i0.ɵɵelementEnd();
|
|
@@ -54,45 +58,45 @@ function SkipChatComponent_kendo_splitter_pane_3_div_1_ng_template_6_span_3_Temp
|
|
|
54
58
|
i0.ɵɵadvance();
|
|
55
59
|
i0.ɵɵtextInterpolate(dataItem_r6.Name);
|
|
56
60
|
} }
|
|
57
|
-
function
|
|
61
|
+
function SkipChatComponent_Conditional_3_ng_template_8_textarea_4_Template(rf, ctx) { if (rf & 1) {
|
|
58
62
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
59
|
-
i0.ɵɵelementStart(0, "textarea",
|
|
60
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
63
|
+
i0.ɵɵelementStart(0, "textarea", 37);
|
|
64
|
+
i0.ɵɵtwoWayListener("ngModelChange", function SkipChatComponent_Conditional_3_ng_template_8_textarea_4_Template_textarea_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r7); const dataItem_r6 = i0.ɵɵnextContext().dataItem; i0.ɵɵtwoWayBindingSet(dataItem_r6.Name, $event) || (dataItem_r6.Name = $event); return i0.ɵɵresetView($event); });
|
|
61
65
|
i0.ɵɵelementEnd();
|
|
62
66
|
} if (rf & 2) {
|
|
63
67
|
const dataItem_r6 = i0.ɵɵnextContext().dataItem;
|
|
64
68
|
i0.ɵɵtwoWayProperty("ngModel", dataItem_r6.Name);
|
|
65
69
|
} }
|
|
66
|
-
function
|
|
70
|
+
function SkipChatComponent_Conditional_3_ng_template_8_div_5_span_1_Template(rf, ctx) { if (rf & 1) {
|
|
67
71
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
68
|
-
i0.ɵɵelementStart(0, "span",
|
|
69
|
-
i0.ɵɵlistener("click", function
|
|
72
|
+
i0.ɵɵelementStart(0, "span", 43);
|
|
73
|
+
i0.ɵɵlistener("click", function SkipChatComponent_Conditional_3_ng_template_8_div_5_span_1_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r8); const dataItem_r6 = i0.ɵɵnextContext(2).dataItem; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.editConvo(dataItem_r6)); });
|
|
70
74
|
i0.ɵɵelementEnd();
|
|
71
75
|
} }
|
|
72
|
-
function
|
|
76
|
+
function SkipChatComponent_Conditional_3_ng_template_8_div_5_span_2_Template(rf, ctx) { if (rf & 1) {
|
|
73
77
|
const _r9 = i0.ɵɵgetCurrentView();
|
|
74
|
-
i0.ɵɵelementStart(0, "span",
|
|
75
|
-
i0.ɵɵlistener("click", function
|
|
78
|
+
i0.ɵɵelementStart(0, "span", 44);
|
|
79
|
+
i0.ɵɵlistener("click", function SkipChatComponent_Conditional_3_ng_template_8_div_5_span_2_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r9); const dataItem_r6 = i0.ɵɵnextContext(2).dataItem; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.showDeleteConvoDialog(dataItem_r6)); });
|
|
76
80
|
i0.ɵɵelementEnd();
|
|
77
81
|
} }
|
|
78
|
-
function
|
|
82
|
+
function SkipChatComponent_Conditional_3_ng_template_8_div_5_span_3_Template(rf, ctx) { if (rf & 1) {
|
|
79
83
|
const _r10 = i0.ɵɵgetCurrentView();
|
|
80
|
-
i0.ɵɵelementStart(0, "span",
|
|
81
|
-
i0.ɵɵlistener("click", function
|
|
84
|
+
i0.ɵɵelementStart(0, "span", 45);
|
|
85
|
+
i0.ɵɵlistener("click", function SkipChatComponent_Conditional_3_ng_template_8_div_5_span_3_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r10); const dataItem_r6 = i0.ɵɵnextContext(2).dataItem; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.saveConvoName(dataItem_r6)); });
|
|
82
86
|
i0.ɵɵelementEnd();
|
|
83
87
|
} }
|
|
84
|
-
function
|
|
88
|
+
function SkipChatComponent_Conditional_3_ng_template_8_div_5_span_4_Template(rf, ctx) { if (rf & 1) {
|
|
85
89
|
const _r11 = i0.ɵɵgetCurrentView();
|
|
86
|
-
i0.ɵɵelementStart(0, "span",
|
|
87
|
-
i0.ɵɵlistener("click", function
|
|
90
|
+
i0.ɵɵelementStart(0, "span", 46);
|
|
91
|
+
i0.ɵɵlistener("click", function SkipChatComponent_Conditional_3_ng_template_8_div_5_span_4_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r11); const dataItem_r6 = i0.ɵɵnextContext(2).dataItem; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.cancelConvoEdit(dataItem_r6)); });
|
|
88
92
|
i0.ɵɵelementEnd();
|
|
89
93
|
} }
|
|
90
|
-
function
|
|
91
|
-
i0.ɵɵelementStart(0, "div",
|
|
92
|
-
i0.ɵɵtemplate(1,
|
|
94
|
+
function SkipChatComponent_Conditional_3_ng_template_8_div_5_Template(rf, ctx) { if (rf & 1) {
|
|
95
|
+
i0.ɵɵelementStart(0, "div", 38);
|
|
96
|
+
i0.ɵɵtemplate(1, SkipChatComponent_Conditional_3_ng_template_8_div_5_span_1_Template, 1, 0, "span", 39)(2, SkipChatComponent_Conditional_3_ng_template_8_div_5_span_2_Template, 1, 0, "span", 40)(3, SkipChatComponent_Conditional_3_ng_template_8_div_5_span_3_Template, 1, 0, "span", 41)(4, SkipChatComponent_Conditional_3_ng_template_8_div_5_span_4_Template, 1, 0, "span", 42);
|
|
93
97
|
i0.ɵɵelementEnd();
|
|
94
98
|
} if (rf & 2) {
|
|
95
|
-
const ctx_r2 = i0.ɵɵnextContext(
|
|
99
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
96
100
|
i0.ɵɵadvance();
|
|
97
101
|
i0.ɵɵproperty("ngIf", !ctx_r2.ConversationEditMode);
|
|
98
102
|
i0.ɵɵadvance();
|
|
@@ -102,19 +106,19 @@ function SkipChatComponent_kendo_splitter_pane_3_div_1_ng_template_6_div_5_Templ
|
|
|
102
106
|
i0.ɵɵadvance();
|
|
103
107
|
i0.ɵɵproperty("ngIf", ctx_r2.ConversationEditMode);
|
|
104
108
|
} }
|
|
105
|
-
function
|
|
109
|
+
function SkipChatComponent_Conditional_3_ng_template_8_Template(rf, ctx) { if (rf & 1) {
|
|
106
110
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
107
|
-
i0.ɵɵelementStart(0, "div",
|
|
108
|
-
i0.ɵɵlistener("click", function
|
|
109
|
-
i0.ɵɵtemplate(1,
|
|
110
|
-
i0.ɵɵelementStart(2, "div",
|
|
111
|
-
i0.ɵɵtemplate(3,
|
|
111
|
+
i0.ɵɵelementStart(0, "div", 31);
|
|
112
|
+
i0.ɵɵlistener("click", function SkipChatComponent_Conditional_3_ng_template_8_Template_div_click_0_listener() { const dataItem_r6 = i0.ɵɵrestoreView(_r5).dataItem; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.SelectConversation(dataItem_r6)); });
|
|
113
|
+
i0.ɵɵtemplate(1, SkipChatComponent_Conditional_3_ng_template_8_span_1_Template, 1, 0, "span", 32);
|
|
114
|
+
i0.ɵɵelementStart(2, "div", 33);
|
|
115
|
+
i0.ɵɵtemplate(3, SkipChatComponent_Conditional_3_ng_template_8_span_3_Template, 2, 1, "span", 21)(4, SkipChatComponent_Conditional_3_ng_template_8_textarea_4_Template, 1, 1, "textarea", 34);
|
|
112
116
|
i0.ɵɵelementEnd();
|
|
113
|
-
i0.ɵɵtemplate(5,
|
|
117
|
+
i0.ɵɵtemplate(5, SkipChatComponent_Conditional_3_ng_template_8_div_5_Template, 5, 4, "div", 35);
|
|
114
118
|
i0.ɵɵelementEnd();
|
|
115
119
|
} if (rf & 2) {
|
|
116
120
|
const dataItem_r6 = ctx.dataItem;
|
|
117
|
-
const ctx_r2 = i0.ɵɵnextContext(
|
|
121
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
118
122
|
i0.ɵɵproperty("ngClass", ctx_r2.GetConversationItemClass(dataItem_r6))("title", dataItem_r6.Name);
|
|
119
123
|
i0.ɵɵadvance();
|
|
120
124
|
i0.ɵɵproperty("ngIf", ctx_r2.SelectedConversation && ctx_r2.IsSkipProcessing(dataItem_r6));
|
|
@@ -125,73 +129,69 @@ function SkipChatComponent_kendo_splitter_pane_3_div_1_ng_template_6_Template(rf
|
|
|
125
129
|
i0.ɵɵadvance();
|
|
126
130
|
i0.ɵɵproperty("ngIf", (ctx_r2.SelectedConversation == null ? null : ctx_r2.SelectedConversation.ID) === dataItem_r6.ID);
|
|
127
131
|
} }
|
|
128
|
-
function
|
|
129
|
-
i0.ɵɵ
|
|
130
|
-
i0.ɵɵ
|
|
131
|
-
i0.ɵɵ
|
|
132
|
+
function SkipChatComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
133
|
+
const _r2 = i0.ɵɵgetCurrentView();
|
|
134
|
+
i0.ɵɵelementStart(0, "div", 6)(1, "div", 23)(2, "div", 24)(3, "span", 25);
|
|
135
|
+
i0.ɵɵlistener("click", function SkipChatComponent_Conditional_3_Template_span_click_3_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.DisplayConversationList(false)); });
|
|
132
136
|
i0.ɵɵelementEnd();
|
|
133
|
-
i0.ɵɵ
|
|
134
|
-
i0.ɵɵ
|
|
135
|
-
i0.ɵɵ
|
|
137
|
+
i0.ɵɵtemplate(4, SkipChatComponent_Conditional_3_Conditional_4_Template, 1, 1, "img", 26)(5, SkipChatComponent_Conditional_3_Conditional_5_Template, 1, 0, "span", 27);
|
|
138
|
+
i0.ɵɵelementEnd();
|
|
139
|
+
i0.ɵɵelementStart(6, "kendo-listview", 28, 3);
|
|
140
|
+
i0.ɵɵtemplate(8, SkipChatComponent_Conditional_3_ng_template_8_Template, 6, 6, "ng-template", 29);
|
|
141
|
+
i0.ɵɵelementEnd()()();
|
|
136
142
|
} if (rf & 2) {
|
|
137
|
-
const ctx_r2 = i0.ɵɵnextContext(
|
|
138
|
-
i0.ɵɵadvance(
|
|
139
|
-
i0.ɵɵ
|
|
143
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
144
|
+
i0.ɵɵadvance(4);
|
|
145
|
+
i0.ɵɵconditional(ctx_r2.ShowSkipLogoInConversationList ? 4 : -1);
|
|
140
146
|
i0.ɵɵadvance();
|
|
141
|
-
i0.ɵɵ
|
|
147
|
+
i0.ɵɵconditional(ctx_r2.AllowNewConversations ? 5 : -1);
|
|
142
148
|
i0.ɵɵadvance();
|
|
143
149
|
i0.ɵɵstyleProp("height", 280, "px");
|
|
144
|
-
i0.ɵɵproperty("data", ctx_r2.Conversations)("itemClass", i0.ɵɵpureFunction0(8, _c6))("fillWidth", false)("bottomMargin",
|
|
150
|
+
i0.ɵɵproperty("data", ctx_r2.Conversations)("itemClass", i0.ɵɵpureFunction0(8, _c6))("fillWidth", false)("bottomMargin", 50);
|
|
145
151
|
} }
|
|
146
|
-
function
|
|
147
|
-
const
|
|
148
|
-
i0.ɵɵelementStart(0, "
|
|
149
|
-
i0.ɵɵlistener("
|
|
150
|
-
i0.ɵɵtemplate(1, SkipChatComponent_kendo_splitter_pane_3_div_1_Template, 7, 9, "div", 22);
|
|
152
|
+
function SkipChatComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
153
|
+
const _r12 = i0.ɵɵgetCurrentView();
|
|
154
|
+
i0.ɵɵelementStart(0, "span", 25);
|
|
155
|
+
i0.ɵɵlistener("click", function SkipChatComponent_Conditional_4_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.DisplayConversationList(true)); });
|
|
151
156
|
i0.ɵɵelementEnd();
|
|
152
|
-
} if (rf & 2) {
|
|
153
|
-
const ctx_r2 = i0.ɵɵnextContext();
|
|
154
|
-
i0.ɵɵproperty("collapsible", true)("scrollable", false)("resizable", false);
|
|
155
|
-
i0.ɵɵadvance();
|
|
156
|
-
i0.ɵɵproperty("ngIf", ctx_r2.ShowConversationList);
|
|
157
|
-
} }
|
|
158
|
-
function SkipChatComponent_div_9_Template(rf, ctx) { if (rf & 1) {
|
|
159
|
-
i0.ɵɵelement(0, "div", 46);
|
|
160
157
|
} }
|
|
161
158
|
function SkipChatComponent_div_10_Template(rf, ctx) { if (rf & 1) {
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
i0.ɵɵ
|
|
159
|
+
i0.ɵɵelement(0, "div", 47);
|
|
160
|
+
} }
|
|
161
|
+
function SkipChatComponent_div_11_Template(rf, ctx) { if (rf & 1) {
|
|
162
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
163
|
+
i0.ɵɵelementStart(0, "div", 48)(1, "div", 49);
|
|
164
|
+
i0.ɵɵelement(2, "img", 50);
|
|
165
|
+
i0.ɵɵelementStart(3, "div", 51);
|
|
166
166
|
i0.ɵɵtext(4, "What can I help with today?");
|
|
167
167
|
i0.ɵɵelementEnd()();
|
|
168
|
-
i0.ɵɵelementStart(5, "div",
|
|
169
|
-
i0.ɵɵlistener("click", function
|
|
170
|
-
i0.ɵɵelementStart(8, "span",
|
|
168
|
+
i0.ɵɵelementStart(5, "div", 52)(6, "div", 53)(7, "div", 54);
|
|
169
|
+
i0.ɵɵlistener("click", function SkipChatComponent_div_11_Template_div_click_7_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.sendPrompt(ctx_r2.WelcomeQuestions[0].prompt)); });
|
|
170
|
+
i0.ɵɵelementStart(8, "span", 55);
|
|
171
171
|
i0.ɵɵtext(9);
|
|
172
172
|
i0.ɵɵelementEnd();
|
|
173
173
|
i0.ɵɵelementStart(10, "span");
|
|
174
174
|
i0.ɵɵtext(11);
|
|
175
175
|
i0.ɵɵelementEnd()();
|
|
176
|
-
i0.ɵɵelementStart(12, "div",
|
|
177
|
-
i0.ɵɵlistener("click", function
|
|
178
|
-
i0.ɵɵelementStart(13, "span",
|
|
176
|
+
i0.ɵɵelementStart(12, "div", 54);
|
|
177
|
+
i0.ɵɵlistener("click", function SkipChatComponent_div_11_Template_div_click_12_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.sendPrompt(ctx_r2.WelcomeQuestions[1].prompt)); });
|
|
178
|
+
i0.ɵɵelementStart(13, "span", 55);
|
|
179
179
|
i0.ɵɵtext(14);
|
|
180
180
|
i0.ɵɵelementEnd();
|
|
181
181
|
i0.ɵɵelementStart(15, "span");
|
|
182
182
|
i0.ɵɵtext(16);
|
|
183
183
|
i0.ɵɵelementEnd()()();
|
|
184
|
-
i0.ɵɵelementStart(17, "div",
|
|
185
|
-
i0.ɵɵlistener("click", function
|
|
186
|
-
i0.ɵɵelementStart(19, "span",
|
|
184
|
+
i0.ɵɵelementStart(17, "div", 53)(18, "div", 54);
|
|
185
|
+
i0.ɵɵlistener("click", function SkipChatComponent_div_11_Template_div_click_18_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.sendPrompt(ctx_r2.WelcomeQuestions[2].prompt)); });
|
|
186
|
+
i0.ɵɵelementStart(19, "span", 55);
|
|
187
187
|
i0.ɵɵtext(20);
|
|
188
188
|
i0.ɵɵelementEnd();
|
|
189
189
|
i0.ɵɵelementStart(21, "span");
|
|
190
190
|
i0.ɵɵtext(22);
|
|
191
191
|
i0.ɵɵelementEnd()();
|
|
192
|
-
i0.ɵɵelementStart(23, "div",
|
|
193
|
-
i0.ɵɵlistener("click", function
|
|
194
|
-
i0.ɵɵelementStart(24, "span",
|
|
192
|
+
i0.ɵɵelementStart(23, "div", 54);
|
|
193
|
+
i0.ɵɵlistener("click", function SkipChatComponent_div_11_Template_div_click_23_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.sendPrompt(ctx_r2.WelcomeQuestions[3].prompt)); });
|
|
194
|
+
i0.ɵɵelementStart(24, "span", 55);
|
|
195
195
|
i0.ɵɵtext(25);
|
|
196
196
|
i0.ɵɵelementEnd();
|
|
197
197
|
i0.ɵɵelementStart(26, "span");
|
|
@@ -218,42 +218,42 @@ function SkipChatComponent_div_10_Template(rf, ctx) { if (rf & 1) {
|
|
|
218
218
|
i0.ɵɵadvance(2);
|
|
219
219
|
i0.ɵɵtextInterpolate(ctx_r2.WelcomeQuestions[3].bottomLine);
|
|
220
220
|
} }
|
|
221
|
-
function
|
|
222
|
-
const
|
|
223
|
-
i0.ɵɵelementStart(0, "span",
|
|
224
|
-
i0.ɵɵlistener("click", function
|
|
225
|
-
i0.ɵɵelement(1, "i",
|
|
221
|
+
function SkipChatComponent_span_13_Template(rf, ctx) { if (rf & 1) {
|
|
222
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
223
|
+
i0.ɵɵelementStart(0, "span", 56);
|
|
224
|
+
i0.ɵɵlistener("click", function SkipChatComponent_span_13_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.scrollToBottomAnimate()); });
|
|
225
|
+
i0.ɵɵelement(1, "i", 57);
|
|
226
226
|
i0.ɵɵelementEnd();
|
|
227
227
|
} }
|
|
228
|
-
function
|
|
229
|
-
const
|
|
230
|
-
i0.ɵɵelementStart(0, "button",
|
|
231
|
-
i0.ɵɵlistener("click", function
|
|
228
|
+
function SkipChatComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
229
|
+
const _r15 = i0.ɵɵgetCurrentView();
|
|
230
|
+
i0.ɵɵelementStart(0, "button", 18)(1, "span", 58);
|
|
231
|
+
i0.ɵɵlistener("click", function SkipChatComponent_Conditional_18_Template_span_click_1_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.showDataContext()); });
|
|
232
232
|
i0.ɵɵelementEnd()();
|
|
233
233
|
} }
|
|
234
|
-
function
|
|
235
|
-
const
|
|
236
|
-
i0.ɵɵelementStart(0, "div")(1, "mj-data-context-dialog",
|
|
237
|
-
i0.ɵɵlistener("dialogClosed", function
|
|
234
|
+
function SkipChatComponent_div_21_Template(rf, ctx) { if (rf & 1) {
|
|
235
|
+
const _r16 = i0.ɵɵgetCurrentView();
|
|
236
|
+
i0.ɵɵelementStart(0, "div")(1, "mj-data-context-dialog", 59);
|
|
237
|
+
i0.ɵɵlistener("dialogClosed", function SkipChatComponent_div_21_Template_mj_data_context_dialog_dialogClosed_1_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeDataContextDialog()); });
|
|
238
238
|
i0.ɵɵelementEnd()();
|
|
239
239
|
} if (rf & 2) {
|
|
240
240
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
241
241
|
i0.ɵɵadvance();
|
|
242
242
|
i0.ɵɵproperty("dataContextId", ctx_r2.DataContextID)("Provider", ctx_r2.ProviderToUse);
|
|
243
243
|
} }
|
|
244
|
-
function
|
|
245
|
-
const
|
|
246
|
-
i0.ɵɵelementStart(0, "kendo-dialog",
|
|
247
|
-
i0.ɵɵlistener("close", function
|
|
248
|
-
i0.ɵɵelementStart(1, "p",
|
|
244
|
+
function SkipChatComponent_kendo_dialog_22_Template(rf, ctx) { if (rf & 1) {
|
|
245
|
+
const _r17 = i0.ɵɵgetCurrentView();
|
|
246
|
+
i0.ɵɵelementStart(0, "kendo-dialog", 60);
|
|
247
|
+
i0.ɵɵlistener("close", function SkipChatComponent_kendo_dialog_22_Template_kendo_dialog_close_0_listener() { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeDeleteConversation("no")); });
|
|
248
|
+
i0.ɵɵelementStart(1, "p", 61);
|
|
249
249
|
i0.ɵɵtext(2);
|
|
250
250
|
i0.ɵɵelementEnd();
|
|
251
|
-
i0.ɵɵelementStart(3, "kendo-dialog-actions")(4, "button",
|
|
252
|
-
i0.ɵɵlistener("click", function
|
|
251
|
+
i0.ɵɵelementStart(3, "kendo-dialog-actions")(4, "button", 62);
|
|
252
|
+
i0.ɵɵlistener("click", function SkipChatComponent_kendo_dialog_22_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeDeleteConversation("yes")); });
|
|
253
253
|
i0.ɵɵtext(5, " Yes ");
|
|
254
254
|
i0.ɵɵelementEnd();
|
|
255
|
-
i0.ɵɵelementStart(6, "button",
|
|
256
|
-
i0.ɵɵlistener("click", function
|
|
255
|
+
i0.ɵɵelementStart(6, "button", 63);
|
|
256
|
+
i0.ɵɵlistener("click", function SkipChatComponent_kendo_dialog_22_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeDeleteConversation("no")); });
|
|
257
257
|
i0.ɵɵtext(7, " No ");
|
|
258
258
|
i0.ɵɵelementEnd()()();
|
|
259
259
|
} if (rf & 2) {
|
|
@@ -262,6 +262,27 @@ function SkipChatComponent_kendo_dialog_21_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();
|
|
@@ -276,6 +297,9 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
276
297
|
this.Messages = [];
|
|
277
298
|
this.Conversations = [];
|
|
278
299
|
this.ConversationEditMode = false;
|
|
300
|
+
/**
|
|
301
|
+
* If true, the component will show the conversation list. Default is true.
|
|
302
|
+
*/
|
|
279
303
|
this.ShowConversationList = true;
|
|
280
304
|
this.AllowNewConversations = true;
|
|
281
305
|
this.Title = 'Ask Skip';
|
|
@@ -294,6 +318,18 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
294
318
|
* If true, the component will update the browser URL when the conversation changes. If false, it will not update the URL. Default is true.
|
|
295
319
|
*/
|
|
296
320
|
this.UpdateAppRoute = true;
|
|
321
|
+
/**
|
|
322
|
+
* When set to true, the small Skip logo is shown in the conversation list on the top left of the component
|
|
323
|
+
*/
|
|
324
|
+
this.ShowSkipLogoInConversationList = false;
|
|
325
|
+
/**
|
|
326
|
+
* This property is used to set the placeholder text for the textbox where the user types their message to Skip.
|
|
327
|
+
*/
|
|
328
|
+
this.DefaultTextboxPlaceholder = 'Type your message to Skip here...';
|
|
329
|
+
/**
|
|
330
|
+
* This property is used to set the placeholder text for the textbox where the user types their message to Skip when Skip is processing a request and the text area is disabled.
|
|
331
|
+
*/
|
|
332
|
+
this.ProcessingTextBoxPlaceholder = 'Please wait...';
|
|
297
333
|
/**
|
|
298
334
|
* Event emitted when the user clicks on a matching report and the application needs to handle the navigation
|
|
299
335
|
*/
|
|
@@ -302,7 +338,16 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
302
338
|
* Event emitted whenever a conversation is selected
|
|
303
339
|
*/
|
|
304
340
|
this.ConversationSelected = new EventEmitter();
|
|
341
|
+
/**
|
|
342
|
+
* This event fires whenever a new report is created.
|
|
343
|
+
*/
|
|
344
|
+
this.NewReportCreated = new EventEmitter();
|
|
345
|
+
/**
|
|
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.
|
|
347
|
+
*/
|
|
348
|
+
this.IsConversationListVisible = true;
|
|
305
349
|
this._showScrollToBottomIcon = false;
|
|
350
|
+
this._AskSkipTextboxPlaceholder = 'Type your message here...';
|
|
306
351
|
this._messageInProgress = false;
|
|
307
352
|
this._conversationsInProgress = {};
|
|
308
353
|
this._conversationsToReload = {};
|
|
@@ -345,6 +390,8 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
345
390
|
this._usedStartMessages = [];
|
|
346
391
|
this._processingStatus = {};
|
|
347
392
|
this.isDataContextDialogVisible = false;
|
|
393
|
+
this.confirmMessageEditOrDeleteDialogOpen = false;
|
|
394
|
+
this.messageEditOrDeleteType = 'edit';
|
|
348
395
|
}
|
|
349
396
|
ngOnInit() {
|
|
350
397
|
this.SubscribeToNotifications();
|
|
@@ -381,6 +428,16 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
381
428
|
splitterCollapseStateChanged(e) {
|
|
382
429
|
InvokeManualResize();
|
|
383
430
|
}
|
|
431
|
+
get ConversationListCurrentlyVisible() {
|
|
432
|
+
return this.IsConversationListVisible && this.ShowConversationList;
|
|
433
|
+
}
|
|
434
|
+
DisplayConversationList(show = true) {
|
|
435
|
+
if (show !== this.IsConversationListVisible) {
|
|
436
|
+
this.IsConversationListVisible = show;
|
|
437
|
+
this.cdRef.detectChanges();
|
|
438
|
+
InvokeManualResize();
|
|
439
|
+
}
|
|
440
|
+
}
|
|
384
441
|
GetConversationItemClass(item) {
|
|
385
442
|
var _a;
|
|
386
443
|
let classInfo = '';
|
|
@@ -417,6 +474,7 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
417
474
|
obj.RefreshMessage();
|
|
418
475
|
}
|
|
419
476
|
}
|
|
477
|
+
this._AskSkipTextboxPlaceholder = this.ProcessingTextBoxPlaceholder;
|
|
420
478
|
}
|
|
421
479
|
else {
|
|
422
480
|
if (this._temporaryMessage) {
|
|
@@ -424,6 +482,7 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
424
482
|
this.RemoveMessageFromCurrentConversation(this._temporaryMessage);
|
|
425
483
|
this._temporaryMessage = undefined;
|
|
426
484
|
}
|
|
485
|
+
this._AskSkipTextboxPlaceholder = this.DefaultTextboxPlaceholder;
|
|
427
486
|
}
|
|
428
487
|
}
|
|
429
488
|
SetSelectedConversationUser() {
|
|
@@ -685,8 +744,9 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
685
744
|
const newIdx = idx > 0 ? idx - 1 : 0;
|
|
686
745
|
this.SelectConversation(this.Conversations[newIdx]);
|
|
687
746
|
}
|
|
688
|
-
else
|
|
747
|
+
else {
|
|
689
748
|
this.Messages = [];
|
|
749
|
+
}
|
|
690
750
|
}
|
|
691
751
|
else {
|
|
692
752
|
this.notificationService.CreateSimpleNotification('Error deleting conversation', 'error', 5000);
|
|
@@ -770,12 +830,15 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
770
830
|
SelectConversation(conversation) {
|
|
771
831
|
return __awaiter(this, void 0, void 0, function* () {
|
|
772
832
|
var _a;
|
|
833
|
+
if (this.IsSkipProcessing(conversation)) {
|
|
834
|
+
return; // already processing this conversation so don't go back and forth
|
|
835
|
+
}
|
|
773
836
|
if (conversation && conversation.ID !== ((_a = this.SelectedConversation) === null || _a === void 0 ? void 0 : _a.ID)) {
|
|
774
837
|
// load up the conversation if not already the one that's loaded
|
|
775
838
|
this._conversationLoadComplete = false;
|
|
776
839
|
this.ClearMessages();
|
|
777
|
-
const oldStatus = this.
|
|
778
|
-
this.
|
|
840
|
+
const oldStatus = this.IsSkipProcessing(conversation);
|
|
841
|
+
this.setProcessingStatus(conversation.ID, true);
|
|
779
842
|
this.SelectedConversation = conversation;
|
|
780
843
|
this.SetSelectedConversationUser();
|
|
781
844
|
this.DataContextID = conversation.DataContextID ? conversation.DataContextID : '';
|
|
@@ -800,11 +863,11 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
800
863
|
const result = yield this.RunViewToUse.RunView({
|
|
801
864
|
EntityName: 'Conversation Details',
|
|
802
865
|
ExtraFilter: `ConversationID='${conversation.ID}'`,
|
|
803
|
-
OrderBy: '__mj_CreatedAt ASC'
|
|
866
|
+
OrderBy: '__mj_CreatedAt ASC' // show messages in order of creation,
|
|
804
867
|
});
|
|
805
868
|
if (result && result.Success) {
|
|
806
869
|
// copy the results into NEW objects into the array, we don't want to modify the original objects
|
|
807
|
-
this.Messages =
|
|
870
|
+
this.Messages = result.Results;
|
|
808
871
|
// also, cache the messages within the conversation, but create new array with the same objects
|
|
809
872
|
convoAny._Messages = [...this.Messages];
|
|
810
873
|
}
|
|
@@ -818,7 +881,7 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
818
881
|
this._scrollToBottom = true; // this results in the angular after Viewchecked scrolling to bottom when it's done
|
|
819
882
|
this.cdRef.reattach(); // resume change detection
|
|
820
883
|
}
|
|
821
|
-
this.
|
|
884
|
+
this.setProcessingStatus(conversation.ID, oldStatus); // set back to old status as it might have been processing
|
|
822
885
|
InvokeManualResize(500);
|
|
823
886
|
// ensure the list box has the conversation in view
|
|
824
887
|
this.scrollToConversation(conversation.ID);
|
|
@@ -872,16 +935,25 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
872
935
|
this._usedStartMessages.push(SkipChatComponent._startMessages[idx]);
|
|
873
936
|
return SkipChatComponent._startMessages[idx];
|
|
874
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
|
+
}
|
|
875
947
|
sendPrompt(val) {
|
|
876
948
|
return __awaiter(this, void 0, void 0, function* () {
|
|
877
|
-
var _a, _b, _c
|
|
949
|
+
var _a, _b, _c;
|
|
878
950
|
const convoID = this.SelectedConversation ? this.SelectedConversation.ID : '';
|
|
879
951
|
if (this._conversationsInProgress[convoID]) {
|
|
880
952
|
// don't allow sending another message if we're in the midst of sending one
|
|
881
953
|
return;
|
|
882
954
|
}
|
|
883
955
|
if (this.SelectedConversation) {
|
|
884
|
-
this.
|
|
956
|
+
this.setProcessingStatus((_a = this.SelectedConversation) === null || _a === void 0 ? void 0 : _a.ID, true);
|
|
885
957
|
}
|
|
886
958
|
if (val && val.length > 0) {
|
|
887
959
|
this._conversationsInProgress[convoID] = true;
|
|
@@ -906,18 +978,18 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
906
978
|
if (convoID !== ((_b = this.SelectedConversation) === null || _b === void 0 ? void 0 : _b.ID)) {
|
|
907
979
|
// this scenario arises when we have a selected convo change after we submitted our request to skip
|
|
908
980
|
// so we do nothing here other than update the status.
|
|
909
|
-
this.
|
|
981
|
+
this.setProcessingStatus(convoID, false);
|
|
910
982
|
//the next time the user selects this convo, we will fetch messages
|
|
911
983
|
//from the server rather than using the ones in cache
|
|
912
984
|
this._conversationsToReload[convoID] = true;
|
|
913
985
|
}
|
|
914
986
|
else {
|
|
915
|
-
this.
|
|
987
|
+
this.setProcessingStatus(convoID, false);
|
|
916
988
|
const innerResult = JSON.parse(skipResult.Result);
|
|
917
989
|
if (!this.SelectedConversation) {
|
|
918
990
|
const convo = yield p.GetEntityObject('Conversations', p.CurrentUser);
|
|
919
991
|
yield convo.Load(skipResult.ConversationId);
|
|
920
|
-
this.
|
|
992
|
+
this.setProcessingStatus(skipResult.ConversationId, true);
|
|
921
993
|
this.Conversations.push(convo);
|
|
922
994
|
this.SelectedConversation = convo;
|
|
923
995
|
this.SetSelectedConversationUser();
|
|
@@ -945,8 +1017,9 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
945
1017
|
}
|
|
946
1018
|
}
|
|
947
1019
|
this._scrollToBottom = true; // this results in the angular after Viewchecked scrolling to bottom when it's done
|
|
948
|
-
if (this.SelectedConversation)
|
|
949
|
-
this.
|
|
1020
|
+
if (this.SelectedConversation) {
|
|
1021
|
+
this.setProcessingStatus(this.SelectedConversation.ID, false);
|
|
1022
|
+
}
|
|
950
1023
|
this.AllowSend = true;
|
|
951
1024
|
this._conversationsInProgress[convoID] = false;
|
|
952
1025
|
this._messageInProgress = false;
|
|
@@ -977,6 +1050,10 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
977
1050
|
}
|
|
978
1051
|
AddMessageToCurrentConversation(detail, stopChangeDetection, cacheMessage) {
|
|
979
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
|
+
}
|
|
980
1057
|
this.Messages.push(detail);
|
|
981
1058
|
if (cacheMessage) {
|
|
982
1059
|
// update the cache of messages for the selected conversation
|
|
@@ -1022,6 +1099,25 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
1022
1099
|
this.cdRef.reattach();
|
|
1023
1100
|
}
|
|
1024
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
|
+
}
|
|
1025
1121
|
// Method to dynamically add a message
|
|
1026
1122
|
AddMessageToPanel(messageDetail, stopChangeDetection) {
|
|
1027
1123
|
// Temporarily stop change detection for performance
|
|
@@ -1030,9 +1126,19 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
1030
1126
|
const componentRef = this.askSkip.viewContainerRef.createComponent(SkipSingleMessageComponent);
|
|
1031
1127
|
// Pass the message details to the component instance
|
|
1032
1128
|
const obj = componentRef.instance;
|
|
1129
|
+
// bubble up events from the single message component to the parent component
|
|
1033
1130
|
obj.NavigateToMatchingReport.subscribe((reportId) => {
|
|
1034
1131
|
this.NavigateToMatchingReport.emit(reportId);
|
|
1035
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
|
+
});
|
|
1036
1142
|
obj.Provider = this.ProviderToUse;
|
|
1037
1143
|
obj.SkipMarkOnlyLogoURL = this.SkipMarkOnlyLogoURL;
|
|
1038
1144
|
obj.UserImage = this.UserImage;
|
|
@@ -1041,6 +1147,8 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
1041
1147
|
obj.DataContext = this.DataContext;
|
|
1042
1148
|
obj.ConversationUser = this.SelectedConversationUser;
|
|
1043
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);
|
|
1044
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
|
|
1045
1153
|
obj.SuggestedQuestionSelected.subscribe((question) => {
|
|
1046
1154
|
this.sendPrompt(question);
|
|
@@ -1194,11 +1302,15 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
1194
1302
|
});
|
|
1195
1303
|
}
|
|
1196
1304
|
IsSkipProcessing(Conversation) {
|
|
1197
|
-
if (
|
|
1305
|
+
if (!Conversation) {
|
|
1306
|
+
return false;
|
|
1307
|
+
}
|
|
1308
|
+
else if (this._processingStatus[Conversation.ID]) {
|
|
1198
1309
|
return this._processingStatus[Conversation.ID];
|
|
1199
1310
|
}
|
|
1200
|
-
else
|
|
1311
|
+
else {
|
|
1201
1312
|
return false;
|
|
1313
|
+
}
|
|
1202
1314
|
}
|
|
1203
1315
|
IsTextAreaEmpty() {
|
|
1204
1316
|
if (this.askSkipInput && this.askSkipInput.nativeElement) {
|
|
@@ -1246,6 +1358,103 @@ export class SkipChatComponent extends BaseAngularComponent {
|
|
|
1246
1358
|
this.loadConversations(convoIDParam);
|
|
1247
1359
|
});
|
|
1248
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
|
+
}
|
|
1249
1458
|
}
|
|
1250
1459
|
SkipChatComponent.__skipChatWindowsCurrentlyVisible = 0;
|
|
1251
1460
|
SkipChatComponent._startMessages = [
|
|
@@ -1276,29 +1485,31 @@ SkipChatComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SkipChatC
|
|
|
1276
1485
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.askSkipInput = _t.first);
|
|
1277
1486
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.scrollContainer = _t.first);
|
|
1278
1487
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.topLevelDiv = _t.first);
|
|
1279
|
-
} }, 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", 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) {
|
|
1280
1489
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
1281
|
-
i0.ɵɵelementStart(0, "div", 4, 0)(2, "
|
|
1282
|
-
i0.ɵɵtemplate(3,
|
|
1283
|
-
i0.ɵɵelementStart(
|
|
1284
|
-
i0.ɵɵlistener("scroll", function
|
|
1285
|
-
i0.ɵɵtemplate(
|
|
1286
|
-
i0.ɵɵelement(
|
|
1287
|
-
i0.ɵɵtemplate(
|
|
1490
|
+
i0.ɵɵelementStart(0, "div", 4, 0)(2, "div", 5);
|
|
1491
|
+
i0.ɵɵtemplate(3, SkipChatComponent_Conditional_3_Template, 9, 9, "div", 6)(4, SkipChatComponent_Conditional_4_Template, 1, 0, "span", 7);
|
|
1492
|
+
i0.ɵɵelementStart(5, "div", 8)(6, "div", 9)(7, "div", 10, 1);
|
|
1493
|
+
i0.ɵɵlistener("scroll", function SkipChatComponent_Template_div_scroll_7_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.checkScroll()); });
|
|
1494
|
+
i0.ɵɵtemplate(10, SkipChatComponent_div_10_Template, 1, 0, "div", 11)(11, SkipChatComponent_div_11_Template, 28, 9, "div", 12);
|
|
1495
|
+
i0.ɵɵelement(12, "div", 13);
|
|
1496
|
+
i0.ɵɵtemplate(13, SkipChatComponent_span_13_Template, 2, 0, "span", 14);
|
|
1288
1497
|
i0.ɵɵelementEnd();
|
|
1289
|
-
i0.ɵɵelementStart(
|
|
1290
|
-
i0.ɵɵlistener("keyup.enter", function
|
|
1498
|
+
i0.ɵɵelementStart(14, "div", 15)(15, "div", 16)(16, "textarea", 17, 2);
|
|
1499
|
+
i0.ɵɵlistener("keyup.enter", function SkipChatComponent_Template_textarea_keyup_enter_16_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onEnter($event)); })("input", function SkipChatComponent_Template_textarea_input_16_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onInputChange($event)); });
|
|
1291
1500
|
i0.ɵɵelementEnd()();
|
|
1292
|
-
i0.ɵɵtemplate(
|
|
1293
|
-
i0.ɵɵelementStart(
|
|
1294
|
-
i0.ɵɵlistener("click", function
|
|
1295
|
-
i0.ɵɵelement(
|
|
1501
|
+
i0.ɵɵtemplate(18, SkipChatComponent_Conditional_18_Template, 2, 0, "button", 18);
|
|
1502
|
+
i0.ɵɵelementStart(19, "button", 19);
|
|
1503
|
+
i0.ɵɵlistener("click", function SkipChatComponent_Template_button_click_19_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.sendSkipMessage()); });
|
|
1504
|
+
i0.ɵɵelement(20, "span", 20);
|
|
1296
1505
|
i0.ɵɵelementEnd()()()()()();
|
|
1297
|
-
i0.ɵɵtemplate(
|
|
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);
|
|
1298
1507
|
} if (rf & 2) {
|
|
1299
1508
|
i0.ɵɵproperty("bottomMargin", 10)("rightMargin", 10);
|
|
1300
1509
|
i0.ɵɵadvance(3);
|
|
1301
|
-
i0.ɵɵ
|
|
1510
|
+
i0.ɵɵconditional(ctx.IsConversationListVisible ? 3 : -1);
|
|
1511
|
+
i0.ɵɵadvance();
|
|
1512
|
+
i0.ɵɵconditional(!ctx.IsConversationListVisible ? 4 : -1);
|
|
1302
1513
|
i0.ɵɵadvance(6);
|
|
1303
1514
|
i0.ɵɵproperty("ngIf", ctx.Messages && ctx.Messages.length > 0 && ctx.SelectedConversation && ctx.IsSkipProcessing(ctx.SelectedConversation));
|
|
1304
1515
|
i0.ɵɵadvance();
|
|
@@ -1306,19 +1517,21 @@ SkipChatComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SkipChatC
|
|
|
1306
1517
|
i0.ɵɵadvance(2);
|
|
1307
1518
|
i0.ɵɵproperty("ngIf", ctx._showScrollToBottomIcon && ctx.Messages && ctx.Messages.length > 0);
|
|
1308
1519
|
i0.ɵɵadvance(3);
|
|
1309
|
-
i0.ɵɵproperty("disabled", ctx.SelectedConversation && ctx.IsSkipProcessing(ctx.SelectedConversation));
|
|
1520
|
+
i0.ɵɵproperty("disabled", ctx.SelectedConversation && ctx.IsSkipProcessing(ctx.SelectedConversation))("placeholder", ctx._AskSkipTextboxPlaceholder);
|
|
1310
1521
|
i0.ɵɵadvance(2);
|
|
1311
|
-
i0.ɵɵconditional(ctx.ShowDataContextButton ?
|
|
1522
|
+
i0.ɵɵconditional(ctx.ShowDataContextButton ? 18 : -1);
|
|
1312
1523
|
i0.ɵɵadvance();
|
|
1313
1524
|
i0.ɵɵproperty("disabled", ctx.IsTextAreaEmpty() || ctx.SelectedConversation !== undefined && ctx.IsSkipProcessing(ctx.SelectedConversation));
|
|
1314
1525
|
i0.ɵɵadvance(2);
|
|
1315
1526
|
i0.ɵɵproperty("ngIf", ctx.isDataContextDialogVisible);
|
|
1316
1527
|
i0.ɵɵadvance();
|
|
1317
1528
|
i0.ɵɵproperty("ngIf", ctx.confirmDeleteConversationDialogOpen);
|
|
1318
|
-
|
|
1529
|
+
i0.ɵɵadvance();
|
|
1530
|
+
i0.ɵɵproperty("ngIf", ctx.confirmMessageEditOrDeleteDialogOpen);
|
|
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}"] });
|
|
1319
1532
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SkipChatComponent, [{
|
|
1320
1533
|
type: Component,
|
|
1321
|
-
args: [{ selector: 'skip-chat', template: "<div class = \"chat-container\" mjFillContainer #topLevelDiv [bottomMargin]=\"10\" [rightMargin]=\"10\">\n <kendo-splitter orientation=\"horizontal\">\n <kendo-splitter-pane *ngIf=\"ShowConversationList\" [collapsible]=\"true\" [scrollable]=\"false\" [resizable]=\"false\" size=\"272px\" (collapsedChange)=\"splitterCollapseStateChanged($event)\">\n <div class=\"conversation-history\" *ngIf=\"ShowConversationList\">\n <div class=\"new-chat-area\">\n <img [src]=\"SkipLogoURL\" class=\"avatar\" />\n <button kendoButton *ngIf=\"AllowNewConversations\" (click)=\"CreateNewConversation()\">+</button>\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]=\"20\"\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 </kendo-splitter-pane>\n <kendo-splitter-pane>\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=\"Ask Skip a question\"></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 </kendo-splitter-pane>\n </kendo-splitter>\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: [".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: 260px;\n min-width: 260px;\n height: 100%;\n overflow-y: auto; /* Add scroll if the content exceeds the height */\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}\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 "] }]
|
|
1322
1535
|
}], () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.Location }, { type: i0.ChangeDetectorRef }, { type: i3.MJNotificationService }], { AllowSend: [{
|
|
1323
1536
|
type: Input
|
|
1324
1537
|
}], Messages: [{
|
|
@@ -1353,10 +1566,18 @@ SkipChatComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SkipChatC
|
|
|
1353
1566
|
type: Input
|
|
1354
1567
|
}], UpdateAppRoute: [{
|
|
1355
1568
|
type: Input
|
|
1569
|
+
}], ShowSkipLogoInConversationList: [{
|
|
1570
|
+
type: Input
|
|
1571
|
+
}], DefaultTextboxPlaceholder: [{
|
|
1572
|
+
type: Input
|
|
1573
|
+
}], ProcessingTextBoxPlaceholder: [{
|
|
1574
|
+
type: Input
|
|
1356
1575
|
}], NavigateToMatchingReport: [{
|
|
1357
1576
|
type: Output
|
|
1358
1577
|
}], ConversationSelected: [{
|
|
1359
1578
|
type: Output
|
|
1579
|
+
}], NewReportCreated: [{
|
|
1580
|
+
type: Output
|
|
1360
1581
|
}], askSkip: [{
|
|
1361
1582
|
type: ViewChild,
|
|
1362
1583
|
args: [Container, { static: true }]
|