@crestapps/ai-chat-ui 1.0.0-rc.7 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai-chat-widget.js +158 -8
- package/dist/ai-chat-widget.js.map +1 -1
- package/dist/ai-chat-widget.min.js +1 -1
- package/dist/ai-chat-widget.min.js.map +1 -1
- package/dist/ai-chat.css +49 -17
- package/dist/ai-chat.css.map +1 -1
- package/dist/ai-chat.js +471 -169
- package/dist/ai-chat.js.map +1 -1
- package/dist/ai-chat.min.css +1 -1
- package/dist/ai-chat.min.js +1 -1
- package/dist/ai-chat.min.js.map +1 -1
- package/dist/chat-interaction-settings.js +63 -0
- package/dist/chat-interaction-settings.js.map +1 -1
- package/dist/chat-interaction-settings.min.js +1 -1
- package/dist/chat-interaction-settings.min.js.map +1 -1
- package/dist/chat-interaction.js +424 -163
- 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 +86 -35
- package/dist/chat-widget.css.map +1 -1
- package/dist/chat-widget.min.css +1 -1
- package/dist/document-drop-zone.css +10 -10
- package/dist/document-drop-zone.css.map +1 -1
- package/dist/document-drop-zone.js +92 -14
- package/dist/document-drop-zone.js.map +1 -1
- package/dist/document-drop-zone.min.css +1 -1
- package/dist/document-drop-zone.min.js +1 -1
- package/dist/document-drop-zone.min.js.map +1 -1
- package/package.json +1 -1
|
@@ -230,5 +230,68 @@
|
|
|
230
230
|
collectSettings: collectSettings
|
|
231
231
|
};
|
|
232
232
|
};
|
|
233
|
+
function parseJsonAttribute(element, attributeName) {
|
|
234
|
+
var rawValue = element.getAttribute(attributeName);
|
|
235
|
+
if (!rawValue) {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
try {
|
|
239
|
+
return JSON.parse(rawValue);
|
|
240
|
+
} catch (error) {
|
|
241
|
+
console.error('Failed to parse chat interaction settings config JSON.', error);
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
function initializeFromElement(element) {
|
|
246
|
+
if (!element || element.dataset.chatInteractionSettingsInitialized === 'true') {
|
|
247
|
+
return element ? element.__chatInteractionSettingsState || null : null;
|
|
248
|
+
}
|
|
249
|
+
var config = parseJsonAttribute(element, 'data-chat-interaction-settings-config');
|
|
250
|
+
if (!config) {
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
var state = window.initializeChatInteractionSettings(config);
|
|
254
|
+
if (!state) {
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
element.dataset.chatInteractionSettingsInitialized = 'true';
|
|
258
|
+
element.__chatInteractionSettingsState = state;
|
|
259
|
+
return state;
|
|
260
|
+
}
|
|
261
|
+
function scanForAutoInitialization(root) {
|
|
262
|
+
if (!root || typeof root.querySelectorAll !== 'function') {
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
if (typeof root.matches === 'function' && root.matches('[data-chat-interaction-settings-config]')) {
|
|
266
|
+
initializeFromElement(root);
|
|
267
|
+
}
|
|
268
|
+
root.querySelectorAll('[data-chat-interaction-settings-config]').forEach(initializeFromElement);
|
|
269
|
+
}
|
|
270
|
+
function startAutoInitialization() {
|
|
271
|
+
scanForAutoInitialization(document);
|
|
272
|
+
if (typeof MutationObserver === 'undefined') {
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
var observer = new MutationObserver(function (mutations) {
|
|
276
|
+
mutations.forEach(function (mutation) {
|
|
277
|
+
mutation.addedNodes.forEach(function (node) {
|
|
278
|
+
if (node && node.nodeType === 1) {
|
|
279
|
+
scanForAutoInitialization(node);
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
observer.observe(document.body, {
|
|
285
|
+
childList: true,
|
|
286
|
+
subtree: true
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
if (document.readyState === 'loading') {
|
|
290
|
+
document.addEventListener('DOMContentLoaded', startAutoInitialization, {
|
|
291
|
+
once: true
|
|
292
|
+
});
|
|
293
|
+
} else {
|
|
294
|
+
startAutoInitialization();
|
|
295
|
+
}
|
|
233
296
|
})();
|
|
234
297
|
//# sourceMappingURL=chat-interaction-settings.js.map
|
|
@@ -1 +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"]}
|
|
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","parseJsonAttribute","attributeName","rawValue","JSON","parse","initializeFromElement","chatInteractionSettingsInitialized","__chatInteractionSettingsState","scanForAutoInitialization","root","matches","startAutoInitialization","MutationObserver","observer","mutations","mutation","addedNodes","node","nodeType","observe","body","childList","subtree","readyState","once"],"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 function parseJsonAttribute(element, attributeName) {\n var rawValue = element.getAttribute(attributeName);\n if (!rawValue) {\n return null;\n }\n\n try {\n return JSON.parse(rawValue);\n }\n catch (error) {\n console.error('Failed to parse chat interaction settings config JSON.', error);\n return null;\n }\n }\n\n function initializeFromElement(element) {\n if (!element || element.dataset.chatInteractionSettingsInitialized === 'true') {\n return element ? element.__chatInteractionSettingsState || null : null;\n }\n\n var config = parseJsonAttribute(element, 'data-chat-interaction-settings-config');\n if (!config) {\n return null;\n }\n\n var state = window.initializeChatInteractionSettings(config);\n if (!state) {\n return null;\n }\n\n element.dataset.chatInteractionSettingsInitialized = 'true';\n element.__chatInteractionSettingsState = state;\n\n return state;\n }\n\n function scanForAutoInitialization(root) {\n if (!root || typeof root.querySelectorAll !== 'function') {\n return;\n }\n\n if (typeof root.matches === 'function' && root.matches('[data-chat-interaction-settings-config]')) {\n initializeFromElement(root);\n }\n\n root.querySelectorAll('[data-chat-interaction-settings-config]').forEach(initializeFromElement);\n }\n\n function startAutoInitialization() {\n scanForAutoInitialization(document);\n\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n\n var observer = new MutationObserver(function (mutations) {\n mutations.forEach(function (mutation) {\n mutation.addedNodes.forEach(function (node) {\n if (node && node.nodeType === 1) {\n scanForAutoInitialization(node);\n }\n });\n });\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', startAutoInitialization, { once: true });\n } else {\n startAutoInitialization();\n }\n})();\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(){"use strict";function
|
|
1
|
+
!function(){"use strict";function t(t,e,n){if(t){t.classList.remove.apply(t.classList,["text-success","text-warning","text-danger","text-bg-light","text-bg-success","text-bg-warning","text-bg-danger"]),n&&t.classList.add(n),t.textContent=e}}function e(t){var e=function(t){if(!t||"number"!==t.type)return null;var e=(t.value||"").trim();if(""===e)return null;var n=Number(e);if(Number.isNaN(n))return"Enter a valid number.";var a=t.getAttribute("min");if(null!==a&&""!==a&&n<Number(a))return"Value must be at least "+a+".";var r=t.getAttribute("max");return null!==r&&""!==r&&n>Number(r)?"Value must be no more than "+r+".":null}(t),n=function(t){var e=t.parentElement.querySelector(".invalid-feedback[data-setting-validation]");return e||((e=document.createElement("div")).className="invalid-feedback",e.dataset.settingValidation="true",t.parentElement.appendChild(e)),e}(t),a=!e;return t.classList.toggle("is-invalid",!a),n.textContent=e||"",n.style.display=a?"none":"block",a}function n(){var t={};document.querySelectorAll(".setting-input").forEach(function(e){var n=e.dataset.setting;if(n)if("checkbox"!==e.type){var a=(e.value||"").trim();"number"===e.type?t[n]=""===a?null:parseFloat(a):t[n]=a||null}else t[n]=e.checked});var e={};for(var n in document.querySelectorAll(".capability-checkbox").forEach(function(t){var n=t.dataset.group;n&&(e[n]||(e[n]=[]),t.checked&&e[n].push(t.value))}),e)t[n]=e[n];var a=[];return document.querySelectorAll(".prompt-template-card").forEach(function(t){var e=t.querySelector(".prompt-template-id-input"),n=t.querySelector(".prompt-template-parameters-input"),r=e?e.value:t.dataset.templateId||"";r&&a.push({templateId:r,promptParameters:n?(n.value||"").trim():""})}),a.length>0&&(t.promptTemplateIds=a.map(function(t){return t.templateId}),t.promptTemplates=a),t}function a(t){if(!t||"true"===t.dataset.chatInteractionSettingsInitialized)return t&&t.__chatInteractionSettingsState||null;var e=function(t,e){var n=t.getAttribute(e);if(!n)return null;try{return JSON.parse(n)}catch(t){return console.error("Failed to parse chat interaction settings config JSON.",t),null}}(t,"data-chat-interaction-settings-config");if(!e)return null;var n=window.initializeChatInteractionSettings(e);return n?(t.dataset.chatInteractionSettingsInitialized="true",t.__chatInteractionSettingsState=n,n):null}function r(t){t&&"function"==typeof t.querySelectorAll&&("function"==typeof t.matches&&t.matches("[data-chat-interaction-settings-config]")&&a(t),t.querySelectorAll("[data-chat-interaction-settings-config]").forEach(a))}function i(){(r(document),"undefined"!=typeof MutationObserver)&&new MutationObserver(function(t){t.forEach(function(t){t.addedNodes.forEach(function(t){t&&1===t.nodeType&&r(t)})})}).observe(document.body,{childList:!0,subtree:!0})}window.initializeChatInteractionSettings=function(a){var r=(a=a||{}).itemId;if(r){if("undefined"!=typeof signalR){var i,o=a.hubUrl||"/hubs/chat-interaction",c=(i=a.statusElementId||"chat-settings-save-status")?document.getElementById(i):null,u=a.dataSourceSelectId?document.getElementById(a.dataSourceSelectId):document.querySelector('.setting-input[data-setting="dataSourceId"]');u&&u.addEventListener("change",f),f();var l=(new signalR.HubConnectionBuilder).withUrl(o).withAutomaticReconnect().build(),s=null;l.on("SettingsSaved",function(e){e===r&&t(c,"Saved ✓","text-success")}),l.on("ReceiveError",function(e){console.error("Chat interaction error:",e),t(c,"Save failed","text-danger")}),m().catch(function(){t(c,"Offline","text-danger")});var d=null;return document.querySelectorAll(".setting-input").forEach(function(t){"number"===t.type&&e(t),t.addEventListener("input",g),t.addEventListener("change",g),t.addEventListener("blur",g)}),document.querySelectorAll(".capability-checkbox").forEach(function(t){t.addEventListener("change",g)}),{scheduleSave:g,collectSettings:n}}console.warn("initializeChatInteractionSettings: SignalR client is not loaded.")}else console.warn("initializeChatInteractionSettings: itemId is required.");function f(){var t=!(!u||!u.value||""===u.value.trim());document.querySelectorAll(".rag-data-source-filter-dependent").forEach(function(e){e.classList.toggle("d-none",!t)})}function m(){return l.state===signalR.HubConnectionState.Connected?Promise.resolve():(s||(s=l.start().catch(function(t){throw console.error("SignalR connection error:",t),t}).finally(function(){s=null})),s)}function g(){var a;(clearTimeout(d),a=!0,document.querySelectorAll('.setting-input[type="number"]').forEach(function(t){e(t)||(a=!1)}),a)?(t(c,"Saving…","text-warning"),d=setTimeout(function(){var e=n();m().then(function(){return l.invoke("SaveSettings",r,e)}).catch(function(e){console.error("Failed to save chat interaction settings:",e),t(c,"Save failed","text-danger")})},500)):t(c,"Fix errors","text-danger")}},"loading"===document.readyState?document.addEventListener("DOMContentLoaded",i,{once:!0}):i()}();
|
|
2
2
|
//# sourceMappingURL=chat-interaction-settings.min.js.map
|
|
@@ -1 +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"]}
|
|
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","initializeFromElement","element","chatInteractionSettingsInitialized","__chatInteractionSettingsState","config","attributeName","rawValue","JSON","parse","error","console","parseJsonAttribute","state","window","initializeChatInteractionSettings","scanForAutoInitialization","root","matches","startAutoInitialization","MutationObserver","mutations","mutation","addedNodes","node","nodeType","observe","body","childList","subtree","itemId","signalR","id","hubUrl","statusElementId","getElementById","dataSourceSelect","dataSourceSelectId","addEventListener","toggleDataSourceDependentFields","connection","HubConnectionBuilder","withUrl","withAutomaticReconnect","build","connectionStartPromise","on","savedItemId","ensureConnectionStarted","debounceTimer","debounceSave","scheduleSave","warn","hasDataSource","HubConnectionState","Connected","Promise","resolve","start","err","clearTimeout","setTimeout","then","invoke","readyState","once"],"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 function parseJsonAttribute(element, attributeName) {\n var rawValue = element.getAttribute(attributeName);\n if (!rawValue) {\n return null;\n }\n\n try {\n return JSON.parse(rawValue);\n }\n catch (error) {\n console.error('Failed to parse chat interaction settings config JSON.', error);\n return null;\n }\n }\n\n function initializeFromElement(element) {\n if (!element || element.dataset.chatInteractionSettingsInitialized === 'true') {\n return element ? element.__chatInteractionSettingsState || null : null;\n }\n\n var config = parseJsonAttribute(element, 'data-chat-interaction-settings-config');\n if (!config) {\n return null;\n }\n\n var state = window.initializeChatInteractionSettings(config);\n if (!state) {\n return null;\n }\n\n element.dataset.chatInteractionSettingsInitialized = 'true';\n element.__chatInteractionSettingsState = state;\n\n return state;\n }\n\n function scanForAutoInitialization(root) {\n if (!root || typeof root.querySelectorAll !== 'function') {\n return;\n }\n\n if (typeof root.matches === 'function' && root.matches('[data-chat-interaction-settings-config]')) {\n initializeFromElement(root);\n }\n\n root.querySelectorAll('[data-chat-interaction-settings-config]').forEach(initializeFromElement);\n }\n\n function startAutoInitialization() {\n scanForAutoInitialization(document);\n\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n\n var observer = new MutationObserver(function (mutations) {\n mutations.forEach(function (mutation) {\n mutation.addedNodes.forEach(function (node) {\n if (node && node.nodeType === 1) {\n scanForAutoInitialization(node);\n }\n });\n });\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', startAutoInitialization, { once: true });\n } else {\n startAutoInitialization();\n }\n})();\n"]}
|