@crestapps/ai-chat-ui 1.0.0-preview.7 → 1.0.0-preview.73
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/ai-chat-widget.js +814 -0
- package/dist/ai-chat-widget.js.map +1 -0
- package/dist/ai-chat-widget.min.js +2 -0
- package/dist/ai-chat-widget.min.js.map +1 -0
- package/dist/ai-chat.css +380 -0
- package/dist/ai-chat.css.map +1 -0
- package/dist/ai-chat.js +861 -966
- package/dist/ai-chat.js.map +1 -1
- package/dist/ai-chat.min.css +1 -0
- package/dist/ai-chat.min.js +1 -1
- package/dist/ai-chat.min.js.map +1 -1
- package/dist/chat-interaction-settings.js +234 -0
- package/dist/chat-interaction-settings.js.map +1 -0
- package/dist/chat-interaction-settings.min.js +2 -0
- package/dist/chat-interaction-settings.min.js.map +1 -0
- package/dist/chat-interaction.js +951 -313
- package/dist/chat-interaction.js.map +1 -1
- package/dist/chat-interaction.min.js +1 -1
- package/dist/chat-interaction.min.js.map +1 -1
- package/dist/chat-widget.css +106 -3
- package/dist/chat-widget.css.map +1 -1
- package/dist/chat-widget.min.css +1 -1
- package/dist/technical-name-generator.js +36 -8
- package/dist/technical-name-generator.js.map +1 -1
- package/dist/technical-name-generator.min.js +1 -1
- package/dist/technical-name-generator.min.js.map +1 -1
- package/package.json +12 -1
- package/README.md +0 -145
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/*
|
|
2
|
+
** NOTE: This file is generated by Gulp and should not be edited directly!
|
|
3
|
+
** Any changes made directly to this file will be overwritten next time its asset group is processed by Gulp.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// Autosave + UI plumbing for the Chat Interaction "Interaction Settings" pane.
|
|
7
|
+
// This is the source-of-truth shared between Mvc.Web and Blazor.Web so both
|
|
8
|
+
// UIs behave identically.
|
|
9
|
+
//
|
|
10
|
+
// Usage:
|
|
11
|
+
// window.initializeChatInteractionSettings({
|
|
12
|
+
// itemId: 'abc123',
|
|
13
|
+
// hubUrl: '/hubs/chat-interaction',
|
|
14
|
+
// statusElementId: 'chat-settings-save-status',
|
|
15
|
+
// dataSourceSelectId: 'chat-setting-data-source',
|
|
16
|
+
// });
|
|
17
|
+
|
|
18
|
+
(function () {
|
|
19
|
+
'use strict';
|
|
20
|
+
|
|
21
|
+
function getStatusElement(id) {
|
|
22
|
+
return id ? document.getElementById(id) : null;
|
|
23
|
+
}
|
|
24
|
+
function showSaveIndicator(statusEl, text, cssClass) {
|
|
25
|
+
if (!statusEl) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
var statusClasses = ['text-success', 'text-warning', 'text-danger', 'text-bg-light', 'text-bg-success', 'text-bg-warning', 'text-bg-danger'];
|
|
29
|
+
statusEl.classList.remove.apply(statusEl.classList, statusClasses);
|
|
30
|
+
if (cssClass) {
|
|
31
|
+
statusEl.classList.add(cssClass);
|
|
32
|
+
}
|
|
33
|
+
statusEl.textContent = text;
|
|
34
|
+
}
|
|
35
|
+
function getValidationMessage(input) {
|
|
36
|
+
if (!input || input.type !== 'number') {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
var value = (input.value || '').trim();
|
|
40
|
+
if (value === '') {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
var numericValue = Number(value);
|
|
44
|
+
if (Number.isNaN(numericValue)) {
|
|
45
|
+
return 'Enter a valid number.';
|
|
46
|
+
}
|
|
47
|
+
var min = input.getAttribute('min');
|
|
48
|
+
if (min !== null && min !== '' && numericValue < Number(min)) {
|
|
49
|
+
return 'Value must be at least ' + min + '.';
|
|
50
|
+
}
|
|
51
|
+
var max = input.getAttribute('max');
|
|
52
|
+
if (max !== null && max !== '' && numericValue > Number(max)) {
|
|
53
|
+
return 'Value must be no more than ' + max + '.';
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
function getOrCreateValidationMessage(input) {
|
|
58
|
+
var message = input.parentElement.querySelector('.invalid-feedback[data-setting-validation]');
|
|
59
|
+
if (!message) {
|
|
60
|
+
message = document.createElement('div');
|
|
61
|
+
message.className = 'invalid-feedback';
|
|
62
|
+
message.dataset.settingValidation = 'true';
|
|
63
|
+
input.parentElement.appendChild(message);
|
|
64
|
+
}
|
|
65
|
+
return message;
|
|
66
|
+
}
|
|
67
|
+
function validateSettingInput(input) {
|
|
68
|
+
var message = getValidationMessage(input);
|
|
69
|
+
var validation = getOrCreateValidationMessage(input);
|
|
70
|
+
var isValid = !message;
|
|
71
|
+
input.classList.toggle('is-invalid', !isValid);
|
|
72
|
+
validation.textContent = message || '';
|
|
73
|
+
validation.style.display = isValid ? 'none' : 'block';
|
|
74
|
+
return isValid;
|
|
75
|
+
}
|
|
76
|
+
function hasInvalidSettings() {
|
|
77
|
+
var isValid = true;
|
|
78
|
+
document.querySelectorAll('.setting-input[type="number"]').forEach(function (input) {
|
|
79
|
+
if (!validateSettingInput(input)) {
|
|
80
|
+
isValid = false;
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
return !isValid;
|
|
84
|
+
}
|
|
85
|
+
function collectSettings() {
|
|
86
|
+
var settings = {};
|
|
87
|
+
document.querySelectorAll('.setting-input').forEach(function (el) {
|
|
88
|
+
var key = el.dataset.setting;
|
|
89
|
+
if (!key) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (el.type === 'checkbox') {
|
|
93
|
+
settings[key] = el.checked;
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
var val = (el.value || '').trim();
|
|
97
|
+
if (el.type === 'number') {
|
|
98
|
+
settings[key] = val === '' ? null : parseFloat(val);
|
|
99
|
+
} else {
|
|
100
|
+
settings[key] = val || null;
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
var groups = {};
|
|
104
|
+
document.querySelectorAll('.capability-checkbox').forEach(function (cb) {
|
|
105
|
+
var group = cb.dataset.group;
|
|
106
|
+
if (!group) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (!groups[group]) {
|
|
110
|
+
groups[group] = [];
|
|
111
|
+
}
|
|
112
|
+
if (cb.checked) {
|
|
113
|
+
groups[group].push(cb.value);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
for (var g in groups) {
|
|
117
|
+
settings[g] = groups[g];
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Prompt template cards
|
|
121
|
+
var promptTemplates = [];
|
|
122
|
+
document.querySelectorAll('.prompt-template-card').forEach(function (card) {
|
|
123
|
+
var idEl = card.querySelector('.prompt-template-id-input');
|
|
124
|
+
var paramsEl = card.querySelector('.prompt-template-parameters-input');
|
|
125
|
+
var tid = idEl ? idEl.value : card.dataset.templateId || '';
|
|
126
|
+
if (!tid) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
promptTemplates.push({
|
|
130
|
+
templateId: tid,
|
|
131
|
+
promptParameters: paramsEl ? (paramsEl.value || '').trim() : ''
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
if (promptTemplates.length > 0) {
|
|
135
|
+
settings.promptTemplateIds = promptTemplates.map(function (t) {
|
|
136
|
+
return t.templateId;
|
|
137
|
+
});
|
|
138
|
+
settings.promptTemplates = promptTemplates;
|
|
139
|
+
}
|
|
140
|
+
return settings;
|
|
141
|
+
}
|
|
142
|
+
window.initializeChatInteractionSettings = function (config) {
|
|
143
|
+
config = config || {};
|
|
144
|
+
var itemId = config.itemId;
|
|
145
|
+
if (!itemId) {
|
|
146
|
+
console.warn('initializeChatInteractionSettings: itemId is required.');
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (typeof signalR === 'undefined') {
|
|
150
|
+
console.warn('initializeChatInteractionSettings: SignalR client is not loaded.');
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
var hubUrl = config.hubUrl || '/hubs/chat-interaction';
|
|
154
|
+
var statusEl = getStatusElement(config.statusElementId || 'chat-settings-save-status');
|
|
155
|
+
var dataSourceSelect = config.dataSourceSelectId ? document.getElementById(config.dataSourceSelectId) : document.querySelector('.setting-input[data-setting="dataSourceId"]');
|
|
156
|
+
|
|
157
|
+
// Source-dependent visibility (Filter field shows only when a data source is selected).
|
|
158
|
+
function toggleDataSourceDependentFields() {
|
|
159
|
+
var hasDataSource = !!(dataSourceSelect && dataSourceSelect.value && dataSourceSelect.value.trim() !== '');
|
|
160
|
+
document.querySelectorAll('.rag-data-source-filter-dependent').forEach(function (element) {
|
|
161
|
+
element.classList.toggle('d-none', !hasDataSource);
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
if (dataSourceSelect) {
|
|
165
|
+
dataSourceSelect.addEventListener('change', toggleDataSourceDependentFields);
|
|
166
|
+
}
|
|
167
|
+
toggleDataSourceDependentFields();
|
|
168
|
+
var connection = new signalR.HubConnectionBuilder().withUrl(hubUrl).withAutomaticReconnect().build();
|
|
169
|
+
var connectionStartPromise = null;
|
|
170
|
+
function ensureConnectionStarted() {
|
|
171
|
+
if (connection.state === signalR.HubConnectionState.Connected) {
|
|
172
|
+
return Promise.resolve();
|
|
173
|
+
}
|
|
174
|
+
if (!connectionStartPromise) {
|
|
175
|
+
connectionStartPromise = connection.start()["catch"](function (err) {
|
|
176
|
+
console.error('SignalR connection error:', err);
|
|
177
|
+
throw err;
|
|
178
|
+
})["finally"](function () {
|
|
179
|
+
connectionStartPromise = null;
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
return connectionStartPromise;
|
|
183
|
+
}
|
|
184
|
+
connection.on('SettingsSaved', function (savedItemId) {
|
|
185
|
+
if (savedItemId !== itemId) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
showSaveIndicator(statusEl, "Saved \u2713", 'text-success');
|
|
189
|
+
});
|
|
190
|
+
connection.on('ReceiveError', function (message) {
|
|
191
|
+
console.error('Chat interaction error:', message);
|
|
192
|
+
showSaveIndicator(statusEl, 'Save failed', 'text-danger');
|
|
193
|
+
});
|
|
194
|
+
ensureConnectionStarted()["catch"](function () {
|
|
195
|
+
showSaveIndicator(statusEl, 'Offline', 'text-danger');
|
|
196
|
+
});
|
|
197
|
+
var debounceTimer = null;
|
|
198
|
+
function debounceSave() {
|
|
199
|
+
clearTimeout(debounceTimer);
|
|
200
|
+
if (hasInvalidSettings()) {
|
|
201
|
+
showSaveIndicator(statusEl, 'Fix errors', 'text-danger');
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
showSaveIndicator(statusEl, "Saving\u2026", 'text-warning');
|
|
205
|
+
debounceTimer = setTimeout(function () {
|
|
206
|
+
var settings = collectSettings();
|
|
207
|
+
ensureConnectionStarted().then(function () {
|
|
208
|
+
return connection.invoke('SaveSettings', itemId, settings);
|
|
209
|
+
})["catch"](function (err) {
|
|
210
|
+
console.error('Failed to save chat interaction settings:', err);
|
|
211
|
+
showSaveIndicator(statusEl, 'Save failed', 'text-danger');
|
|
212
|
+
});
|
|
213
|
+
}, 500);
|
|
214
|
+
}
|
|
215
|
+
document.querySelectorAll('.setting-input').forEach(function (el) {
|
|
216
|
+
if (el.type === 'number') {
|
|
217
|
+
validateSettingInput(el);
|
|
218
|
+
}
|
|
219
|
+
el.addEventListener('input', debounceSave);
|
|
220
|
+
el.addEventListener('change', debounceSave);
|
|
221
|
+
el.addEventListener('blur', debounceSave);
|
|
222
|
+
});
|
|
223
|
+
document.querySelectorAll('.capability-checkbox').forEach(function (cb) {
|
|
224
|
+
cb.addEventListener('change', debounceSave);
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
// Expose helpers for callers that add/remove rows dynamically (e.g. prompt templates).
|
|
228
|
+
return {
|
|
229
|
+
scheduleSave: debounceSave,
|
|
230
|
+
collectSettings: collectSettings
|
|
231
|
+
};
|
|
232
|
+
};
|
|
233
|
+
})();
|
|
234
|
+
//# sourceMappingURL=chat-interaction-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["chat-interaction-settings.js"],"names":["getStatusElement","id","document","getElementById","showSaveIndicator","statusEl","text","cssClass","statusClasses","classList","remove","apply","add","textContent","getValidationMessage","input","type","value","trim","numericValue","Number","isNaN","min","getAttribute","max","getOrCreateValidationMessage","message","parentElement","querySelector","createElement","className","dataset","settingValidation","appendChild","validateSettingInput","validation","isValid","toggle","style","display","hasInvalidSettings","querySelectorAll","forEach","collectSettings","settings","el","key","setting","checked","val","parseFloat","groups","cb","group","push","g","promptTemplates","card","idEl","paramsEl","tid","templateId","promptParameters","length","promptTemplateIds","map","t","window","initializeChatInteractionSettings","config","itemId","console","warn","signalR","hubUrl","statusElementId","dataSourceSelect","dataSourceSelectId","toggleDataSourceDependentFields","hasDataSource","element","addEventListener","connection","HubConnectionBuilder","withUrl","withAutomaticReconnect","build","connectionStartPromise","ensureConnectionStarted","state","HubConnectionState","Connected","Promise","resolve","start","err","error","on","savedItemId","debounceTimer","debounceSave","clearTimeout","setTimeout","then","invoke","scheduleSave"],"mappings":"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","file":"chat-interaction-settings.js","sourcesContent":["// Autosave + UI plumbing for the Chat Interaction \"Interaction Settings\" pane.\n// This is the source-of-truth shared between Mvc.Web and Blazor.Web so both\n// UIs behave identically.\n//\n// Usage:\n// window.initializeChatInteractionSettings({\n// itemId: 'abc123',\n// hubUrl: '/hubs/chat-interaction',\n// statusElementId: 'chat-settings-save-status',\n// dataSourceSelectId: 'chat-setting-data-source',\n// });\n\n(function () {\n 'use strict';\n\n function getStatusElement(id) {\n return id ? document.getElementById(id) : null;\n }\n\n function showSaveIndicator(statusEl, text, cssClass) {\n if (!statusEl) {\n return;\n }\n\n var statusClasses = ['text-success', 'text-warning', 'text-danger', 'text-bg-light', 'text-bg-success', 'text-bg-warning', 'text-bg-danger'];\n statusEl.classList.remove.apply(statusEl.classList, statusClasses);\n if (cssClass) {\n statusEl.classList.add(cssClass);\n }\n\n statusEl.textContent = text;\n }\n\n function getValidationMessage(input) {\n if (!input || input.type !== 'number') {\n return null;\n }\n\n var value = (input.value || '').trim();\n if (value === '') {\n return null;\n }\n\n var numericValue = Number(value);\n if (Number.isNaN(numericValue)) {\n return 'Enter a valid number.';\n }\n\n var min = input.getAttribute('min');\n if (min !== null && min !== '' && numericValue < Number(min)) {\n return 'Value must be at least ' + min + '.';\n }\n\n var max = input.getAttribute('max');\n if (max !== null && max !== '' && numericValue > Number(max)) {\n return 'Value must be no more than ' + max + '.';\n }\n\n return null;\n }\n\n function getOrCreateValidationMessage(input) {\n var message = input.parentElement.querySelector('.invalid-feedback[data-setting-validation]');\n if (!message) {\n message = document.createElement('div');\n message.className = 'invalid-feedback';\n message.dataset.settingValidation = 'true';\n input.parentElement.appendChild(message);\n }\n\n return message;\n }\n\n function validateSettingInput(input) {\n var message = getValidationMessage(input);\n var validation = getOrCreateValidationMessage(input);\n var isValid = !message;\n\n input.classList.toggle('is-invalid', !isValid);\n validation.textContent = message || '';\n validation.style.display = isValid ? 'none' : 'block';\n\n return isValid;\n }\n\n function hasInvalidSettings() {\n var isValid = true;\n document.querySelectorAll('.setting-input[type=\"number\"]').forEach(function (input) {\n if (!validateSettingInput(input)) {\n isValid = false;\n }\n });\n\n return !isValid;\n }\n\n function collectSettings() {\n var settings = {};\n\n document.querySelectorAll('.setting-input').forEach(function (el) {\n var key = el.dataset.setting;\n if (!key) {\n return;\n }\n\n if (el.type === 'checkbox') {\n settings[key] = el.checked;\n return;\n }\n\n var val = (el.value || '').trim();\n if (el.type === 'number') {\n settings[key] = val === '' ? null : parseFloat(val);\n } else {\n settings[key] = val || null;\n }\n });\n\n var groups = {};\n document.querySelectorAll('.capability-checkbox').forEach(function (cb) {\n var group = cb.dataset.group;\n if (!group) {\n return;\n }\n\n if (!groups[group]) {\n groups[group] = [];\n }\n\n if (cb.checked) {\n groups[group].push(cb.value);\n }\n });\n\n for (var g in groups) {\n settings[g] = groups[g];\n }\n\n // Prompt template cards\n var promptTemplates = [];\n document.querySelectorAll('.prompt-template-card').forEach(function (card) {\n var idEl = card.querySelector('.prompt-template-id-input');\n var paramsEl = card.querySelector('.prompt-template-parameters-input');\n var tid = idEl ? idEl.value : (card.dataset.templateId || '');\n if (!tid) {\n return;\n }\n\n promptTemplates.push({\n templateId: tid,\n promptParameters: paramsEl ? (paramsEl.value || '').trim() : '',\n });\n });\n\n if (promptTemplates.length > 0) {\n settings.promptTemplateIds = promptTemplates.map(function (t) { return t.templateId; });\n settings.promptTemplates = promptTemplates;\n }\n\n return settings;\n }\n\n window.initializeChatInteractionSettings = function (config) {\n config = config || {};\n\n var itemId = config.itemId;\n if (!itemId) {\n console.warn('initializeChatInteractionSettings: itemId is required.');\n return;\n }\n\n if (typeof signalR === 'undefined') {\n console.warn('initializeChatInteractionSettings: SignalR client is not loaded.');\n return;\n }\n\n var hubUrl = config.hubUrl || '/hubs/chat-interaction';\n var statusEl = getStatusElement(config.statusElementId || 'chat-settings-save-status');\n var dataSourceSelect = config.dataSourceSelectId\n ? document.getElementById(config.dataSourceSelectId)\n : document.querySelector('.setting-input[data-setting=\"dataSourceId\"]');\n\n // Source-dependent visibility (Filter field shows only when a data source is selected).\n function toggleDataSourceDependentFields() {\n var hasDataSource = !!(dataSourceSelect && dataSourceSelect.value && dataSourceSelect.value.trim() !== '');\n document.querySelectorAll('.rag-data-source-filter-dependent').forEach(function (element) {\n element.classList.toggle('d-none', !hasDataSource);\n });\n }\n\n if (dataSourceSelect) {\n dataSourceSelect.addEventListener('change', toggleDataSourceDependentFields);\n }\n\n toggleDataSourceDependentFields();\n\n var connection = new signalR.HubConnectionBuilder()\n .withUrl(hubUrl)\n .withAutomaticReconnect()\n .build();\n\n var connectionStartPromise = null;\n\n function ensureConnectionStarted() {\n if (connection.state === signalR.HubConnectionState.Connected) {\n return Promise.resolve();\n }\n\n if (!connectionStartPromise) {\n connectionStartPromise = connection.start()\n .catch(function (err) {\n console.error('SignalR connection error:', err);\n throw err;\n })\n .finally(function () {\n connectionStartPromise = null;\n });\n }\n\n return connectionStartPromise;\n }\n\n connection.on('SettingsSaved', function (savedItemId) {\n if (savedItemId !== itemId) {\n return;\n }\n\n showSaveIndicator(statusEl, 'Saved \\u2713', 'text-success');\n });\n\n connection.on('ReceiveError', function (message) {\n console.error('Chat interaction error:', message);\n showSaveIndicator(statusEl, 'Save failed', 'text-danger');\n });\n\n ensureConnectionStarted().catch(function () {\n showSaveIndicator(statusEl, 'Offline', 'text-danger');\n });\n\n var debounceTimer = null;\n\n function debounceSave() {\n clearTimeout(debounceTimer);\n if (hasInvalidSettings()) {\n showSaveIndicator(statusEl, 'Fix errors', 'text-danger');\n return;\n }\n\n showSaveIndicator(statusEl, 'Saving\\u2026', 'text-warning');\n debounceTimer = setTimeout(function () {\n var settings = collectSettings();\n ensureConnectionStarted()\n .then(function () {\n return connection.invoke('SaveSettings', itemId, settings);\n })\n .catch(function (err) {\n console.error('Failed to save chat interaction settings:', err);\n showSaveIndicator(statusEl, 'Save failed', 'text-danger');\n });\n }, 500);\n }\n\n document.querySelectorAll('.setting-input').forEach(function (el) {\n if (el.type === 'number') {\n validateSettingInput(el);\n }\n\n el.addEventListener('input', debounceSave);\n el.addEventListener('change', debounceSave);\n el.addEventListener('blur', debounceSave);\n });\n\n document.querySelectorAll('.capability-checkbox').forEach(function (cb) {\n cb.addEventListener('change', debounceSave);\n });\n\n // Expose helpers for callers that add/remove rows dynamically (e.g. prompt templates).\n return {\n scheduleSave: debounceSave,\n collectSettings: collectSettings,\n };\n };\n})();\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(){"use strict";function e(e,t,n){if(e){e.classList.remove.apply(e.classList,["text-success","text-warning","text-danger","text-bg-light","text-bg-success","text-bg-warning","text-bg-danger"]),n&&e.classList.add(n),e.textContent=t}}function t(e){var t=function(e){if(!e||"number"!==e.type)return null;var t=(e.value||"").trim();if(""===t)return null;var n=Number(t);if(Number.isNaN(n))return"Enter a valid number.";var a=e.getAttribute("min");if(null!==a&&""!==a&&n<Number(a))return"Value must be at least "+a+".";var r=e.getAttribute("max");return null!==r&&""!==r&&n>Number(r)?"Value must be no more than "+r+".":null}(e),n=function(e){var t=e.parentElement.querySelector(".invalid-feedback[data-setting-validation]");return t||((t=document.createElement("div")).className="invalid-feedback",t.dataset.settingValidation="true",e.parentElement.appendChild(t)),t}(e),a=!t;return e.classList.toggle("is-invalid",!a),n.textContent=t||"",n.style.display=a?"none":"block",a}function n(){var e={};document.querySelectorAll(".setting-input").forEach(function(t){var n=t.dataset.setting;if(n)if("checkbox"!==t.type){var a=(t.value||"").trim();"number"===t.type?e[n]=""===a?null:parseFloat(a):e[n]=a||null}else e[n]=t.checked});var t={};for(var n in document.querySelectorAll(".capability-checkbox").forEach(function(e){var n=e.dataset.group;n&&(t[n]||(t[n]=[]),e.checked&&t[n].push(e.value))}),t)e[n]=t[n];var a=[];return document.querySelectorAll(".prompt-template-card").forEach(function(e){var t=e.querySelector(".prompt-template-id-input"),n=e.querySelector(".prompt-template-parameters-input"),r=t?t.value:e.dataset.templateId||"";r&&a.push({templateId:r,promptParameters:n?(n.value||"").trim():""})}),a.length>0&&(e.promptTemplateIds=a.map(function(e){return e.templateId}),e.promptTemplates=a),e}window.initializeChatInteractionSettings=function(a){var r=(a=a||{}).itemId;if(r){if("undefined"!=typeof signalR){var i,l=a.hubUrl||"/hubs/chat-interaction",o=(i=a.statusElementId||"chat-settings-save-status")?document.getElementById(i):null,c=a.dataSourceSelectId?document.getElementById(a.dataSourceSelectId):document.querySelector('.setting-input[data-setting="dataSourceId"]');c&&c.addEventListener("change",m),m();var u=(new signalR.HubConnectionBuilder).withUrl(l).withAutomaticReconnect().build(),s=null;u.on("SettingsSaved",function(t){t===r&&e(o,"Saved ✓","text-success")}),u.on("ReceiveError",function(t){console.error("Chat interaction error:",t),e(o,"Save failed","text-danger")}),f().catch(function(){e(o,"Offline","text-danger")});var d=null;return document.querySelectorAll(".setting-input").forEach(function(e){"number"===e.type&&t(e),e.addEventListener("input",v),e.addEventListener("change",v),e.addEventListener("blur",v)}),document.querySelectorAll(".capability-checkbox").forEach(function(e){e.addEventListener("change",v)}),{scheduleSave:v,collectSettings:n}}console.warn("initializeChatInteractionSettings: SignalR client is not loaded.")}else console.warn("initializeChatInteractionSettings: itemId is required.");function m(){var e=!(!c||!c.value||""===c.value.trim());document.querySelectorAll(".rag-data-source-filter-dependent").forEach(function(t){t.classList.toggle("d-none",!e)})}function f(){return u.state===signalR.HubConnectionState.Connected?Promise.resolve():(s||(s=u.start().catch(function(e){throw console.error("SignalR connection error:",e),e}).finally(function(){s=null})),s)}function v(){var a;(clearTimeout(d),a=!0,document.querySelectorAll('.setting-input[type="number"]').forEach(function(e){t(e)||(a=!1)}),a)?(e(o,"Saving…","text-warning"),d=setTimeout(function(){var t=n();f().then(function(){return u.invoke("SaveSettings",r,t)}).catch(function(t){console.error("Failed to save chat interaction settings:",t),e(o,"Save failed","text-danger")})},500)):e(o,"Fix errors","text-danger")}}}();
|
|
2
|
+
//# sourceMappingURL=chat-interaction-settings.min.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["chat-interaction-settings.js"],"names":["showSaveIndicator","statusEl","text","cssClass","classList","remove","apply","add","textContent","validateSettingInput","input","message","type","value","trim","numericValue","Number","isNaN","min","getAttribute","max","getValidationMessage","validation","parentElement","querySelector","document","createElement","className","dataset","settingValidation","appendChild","getOrCreateValidationMessage","isValid","toggle","style","display","collectSettings","settings","querySelectorAll","forEach","el","key","setting","val","parseFloat","checked","groups","g","cb","group","push","promptTemplates","card","idEl","paramsEl","tid","templateId","promptParameters","length","promptTemplateIds","map","t","window","initializeChatInteractionSettings","config","itemId","signalR","id","hubUrl","statusElementId","getElementById","dataSourceSelect","dataSourceSelectId","addEventListener","toggleDataSourceDependentFields","connection","HubConnectionBuilder","withUrl","withAutomaticReconnect","build","connectionStartPromise","on","savedItemId","console","error","ensureConnectionStarted","debounceTimer","debounceSave","scheduleSave","warn","hasDataSource","element","state","HubConnectionState","Connected","Promise","resolve","start","err","clearTimeout","setTimeout","then","invoke"],"mappings":"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","file":"chat-interaction-settings.min.js","sourcesContent":["// Autosave + UI plumbing for the Chat Interaction \"Interaction Settings\" pane.\n// This is the source-of-truth shared between Mvc.Web and Blazor.Web so both\n// UIs behave identically.\n//\n// Usage:\n// window.initializeChatInteractionSettings({\n// itemId: 'abc123',\n// hubUrl: '/hubs/chat-interaction',\n// statusElementId: 'chat-settings-save-status',\n// dataSourceSelectId: 'chat-setting-data-source',\n// });\n\n(function () {\n 'use strict';\n\n function getStatusElement(id) {\n return id ? document.getElementById(id) : null;\n }\n\n function showSaveIndicator(statusEl, text, cssClass) {\n if (!statusEl) {\n return;\n }\n\n var statusClasses = ['text-success', 'text-warning', 'text-danger', 'text-bg-light', 'text-bg-success', 'text-bg-warning', 'text-bg-danger'];\n statusEl.classList.remove.apply(statusEl.classList, statusClasses);\n if (cssClass) {\n statusEl.classList.add(cssClass);\n }\n\n statusEl.textContent = text;\n }\n\n function getValidationMessage(input) {\n if (!input || input.type !== 'number') {\n return null;\n }\n\n var value = (input.value || '').trim();\n if (value === '') {\n return null;\n }\n\n var numericValue = Number(value);\n if (Number.isNaN(numericValue)) {\n return 'Enter a valid number.';\n }\n\n var min = input.getAttribute('min');\n if (min !== null && min !== '' && numericValue < Number(min)) {\n return 'Value must be at least ' + min + '.';\n }\n\n var max = input.getAttribute('max');\n if (max !== null && max !== '' && numericValue > Number(max)) {\n return 'Value must be no more than ' + max + '.';\n }\n\n return null;\n }\n\n function getOrCreateValidationMessage(input) {\n var message = input.parentElement.querySelector('.invalid-feedback[data-setting-validation]');\n if (!message) {\n message = document.createElement('div');\n message.className = 'invalid-feedback';\n message.dataset.settingValidation = 'true';\n input.parentElement.appendChild(message);\n }\n\n return message;\n }\n\n function validateSettingInput(input) {\n var message = getValidationMessage(input);\n var validation = getOrCreateValidationMessage(input);\n var isValid = !message;\n\n input.classList.toggle('is-invalid', !isValid);\n validation.textContent = message || '';\n validation.style.display = isValid ? 'none' : 'block';\n\n return isValid;\n }\n\n function hasInvalidSettings() {\n var isValid = true;\n document.querySelectorAll('.setting-input[type=\"number\"]').forEach(function (input) {\n if (!validateSettingInput(input)) {\n isValid = false;\n }\n });\n\n return !isValid;\n }\n\n function collectSettings() {\n var settings = {};\n\n document.querySelectorAll('.setting-input').forEach(function (el) {\n var key = el.dataset.setting;\n if (!key) {\n return;\n }\n\n if (el.type === 'checkbox') {\n settings[key] = el.checked;\n return;\n }\n\n var val = (el.value || '').trim();\n if (el.type === 'number') {\n settings[key] = val === '' ? null : parseFloat(val);\n } else {\n settings[key] = val || null;\n }\n });\n\n var groups = {};\n document.querySelectorAll('.capability-checkbox').forEach(function (cb) {\n var group = cb.dataset.group;\n if (!group) {\n return;\n }\n\n if (!groups[group]) {\n groups[group] = [];\n }\n\n if (cb.checked) {\n groups[group].push(cb.value);\n }\n });\n\n for (var g in groups) {\n settings[g] = groups[g];\n }\n\n // Prompt template cards\n var promptTemplates = [];\n document.querySelectorAll('.prompt-template-card').forEach(function (card) {\n var idEl = card.querySelector('.prompt-template-id-input');\n var paramsEl = card.querySelector('.prompt-template-parameters-input');\n var tid = idEl ? idEl.value : (card.dataset.templateId || '');\n if (!tid) {\n return;\n }\n\n promptTemplates.push({\n templateId: tid,\n promptParameters: paramsEl ? (paramsEl.value || '').trim() : '',\n });\n });\n\n if (promptTemplates.length > 0) {\n settings.promptTemplateIds = promptTemplates.map(function (t) { return t.templateId; });\n settings.promptTemplates = promptTemplates;\n }\n\n return settings;\n }\n\n window.initializeChatInteractionSettings = function (config) {\n config = config || {};\n\n var itemId = config.itemId;\n if (!itemId) {\n console.warn('initializeChatInteractionSettings: itemId is required.');\n return;\n }\n\n if (typeof signalR === 'undefined') {\n console.warn('initializeChatInteractionSettings: SignalR client is not loaded.');\n return;\n }\n\n var hubUrl = config.hubUrl || '/hubs/chat-interaction';\n var statusEl = getStatusElement(config.statusElementId || 'chat-settings-save-status');\n var dataSourceSelect = config.dataSourceSelectId\n ? document.getElementById(config.dataSourceSelectId)\n : document.querySelector('.setting-input[data-setting=\"dataSourceId\"]');\n\n // Source-dependent visibility (Filter field shows only when a data source is selected).\n function toggleDataSourceDependentFields() {\n var hasDataSource = !!(dataSourceSelect && dataSourceSelect.value && dataSourceSelect.value.trim() !== '');\n document.querySelectorAll('.rag-data-source-filter-dependent').forEach(function (element) {\n element.classList.toggle('d-none', !hasDataSource);\n });\n }\n\n if (dataSourceSelect) {\n dataSourceSelect.addEventListener('change', toggleDataSourceDependentFields);\n }\n\n toggleDataSourceDependentFields();\n\n var connection = new signalR.HubConnectionBuilder()\n .withUrl(hubUrl)\n .withAutomaticReconnect()\n .build();\n\n var connectionStartPromise = null;\n\n function ensureConnectionStarted() {\n if (connection.state === signalR.HubConnectionState.Connected) {\n return Promise.resolve();\n }\n\n if (!connectionStartPromise) {\n connectionStartPromise = connection.start()\n .catch(function (err) {\n console.error('SignalR connection error:', err);\n throw err;\n })\n .finally(function () {\n connectionStartPromise = null;\n });\n }\n\n return connectionStartPromise;\n }\n\n connection.on('SettingsSaved', function (savedItemId) {\n if (savedItemId !== itemId) {\n return;\n }\n\n showSaveIndicator(statusEl, 'Saved \\u2713', 'text-success');\n });\n\n connection.on('ReceiveError', function (message) {\n console.error('Chat interaction error:', message);\n showSaveIndicator(statusEl, 'Save failed', 'text-danger');\n });\n\n ensureConnectionStarted().catch(function () {\n showSaveIndicator(statusEl, 'Offline', 'text-danger');\n });\n\n var debounceTimer = null;\n\n function debounceSave() {\n clearTimeout(debounceTimer);\n if (hasInvalidSettings()) {\n showSaveIndicator(statusEl, 'Fix errors', 'text-danger');\n return;\n }\n\n showSaveIndicator(statusEl, 'Saving\\u2026', 'text-warning');\n debounceTimer = setTimeout(function () {\n var settings = collectSettings();\n ensureConnectionStarted()\n .then(function () {\n return connection.invoke('SaveSettings', itemId, settings);\n })\n .catch(function (err) {\n console.error('Failed to save chat interaction settings:', err);\n showSaveIndicator(statusEl, 'Save failed', 'text-danger');\n });\n }, 500);\n }\n\n document.querySelectorAll('.setting-input').forEach(function (el) {\n if (el.type === 'number') {\n validateSettingInput(el);\n }\n\n el.addEventListener('input', debounceSave);\n el.addEventListener('change', debounceSave);\n el.addEventListener('blur', debounceSave);\n });\n\n document.querySelectorAll('.capability-checkbox').forEach(function (cb) {\n cb.addEventListener('change', debounceSave);\n });\n\n // Expose helpers for callers that add/remove rows dynamically (e.g. prompt templates).\n return {\n scheduleSave: debounceSave,\n collectSettings: collectSettings,\n };\n };\n})();\n"]}
|