/**
* File: tusa-chatbot.js
*/
jQuery(document).ready(function($) {
// Elementi UI
const $chatbotContainer = $('#tusa-chatbot-container');
const $messagesContainer = $('#tusa-chatbot-messages');
const $chatInput = $('#tusa-chatbot-input');
const $sendBtn = $('#tusa-chatbot-send');
const $toggleBtn = $('#tusa-chatbot-toggle');
// Verifica che gli elementi esistano nella pagina
console.log('ChatBot Init - Container exists:', $chatbotContainer.length > 0);
console.log('ChatBot Init - Messages container exists:', $messagesContainer.length > 0);
console.log('ChatBot Init - Input exists:', $chatInput.length > 0);
console.log('ChatBot Init - Send button exists:', $sendBtn.length > 0);
console.log('ChatBot Init - Toggle button exists:', $toggleBtn.length > 0);
// Toggle expanded/collapsed state del chatbot
$toggleBtn.on('click', function(e) {
e.preventDefault();
console.log('Toggle button clicked');
$chatbotContainer.toggleClass('collapsed');
// Cambia icona in base allo stato
if($chatbotContainer.hasClass('collapsed')) {
$toggleBtn.find('.dashicons').removeClass('dashicons-arrow-up-alt2').addClass('dashicons-arrow-down-alt2');
} else {
$toggleBtn.find('.dashicons').removeClass('dashicons-arrow-down-alt2').addClass('dashicons-arrow-up-alt2');
// Focus sull'input quando si espande
$chatInput.focus();
}
});
// Invia messaggio quando si preme INVIO
$chatInput.on('keypress', function(e) {
if(e.which === 13) { // Codice tasto INVIO
e.preventDefault();
console.log('Enter key pressed');
sendMessage();
}
});
// Invia messaggio quando si clicca sul pulsante
$sendBtn.on('click', function(e) {
e.preventDefault();
console.log('Send button clicked');
sendMessage();
});
/**
* Invia messaggio al chatbot
*/
function sendMessage() {
const message = $chatInput.val().trim();
console.log('Sending message:', message);
if(message === '') {
console.log('Message is empty, not sending');
return;
}
// Aggiungi messaggio dell'utente alla chat
addMessage('user', message);
// Pulisci input
$chatInput.val('').focus();
// Mostra indicatore "sta scrivendo..."
addTypingIndicator();
// Verifica i dati che stiamo inviando
console.log('AJAX data:', {
action: tusaChatbot.action,
nonce: tusaChatbot.nonce,
message: message
});
// Invia richiesta al server
$.ajax({
url: tusaChatbot.ajaxUrl,
type: 'POST',
dataType: 'json',
data: {
action: tusaChatbot.action,
nonce: tusaChatbot.nonce,
message: message
},
success: function(response) {
console.log('AJAX success:', response);
// Rimuovi indicatore "sta scrivendo..."
removeTypingIndicator();
if(response.success) {
// Aggiungi risposta del bot
addMessage('bot', response.data.botMessage);
// Aggiorna i select con i filtri trovati
updateFilters(response.data.filters);
// Aggiorna la tabella dei risultati
$('#tusa-results').html(response.data.tableHtml);
// Aggiorna le opzioni dei select con i nuovi valori distinti
updateDistinctValues(response.data.distinct);
// Scorri la chat all'ultimo messaggio
scrollToBottom();
} else {
// Mostra errore
const errorMsg = response.data || 'Errore sconosciuto';
console.error('AJAX error from server:', errorMsg);
addMessage('bot', 'Mi dispiace, si è verificato un errore: ' + errorMsg);
}
},
error: function(jqXHR, textStatus, errorThrown) {
console.error('AJAX error:', textStatus, errorThrown);
console.log('Response text:', jqXHR.responseText);
// Rimuovi indicatore "sta scrivendo..."
removeTypingIndicator();
// Mostra errore generico
addMessage('bot', 'Mi dispiace, si è verificato un errore di comunicazione. Riprova più tardi. (Errore: ' + textStatus + ')');
}
});
}
/**
* Aggiunge un messaggio alla chat
*/
function addMessage(type, content) {
console.log('Adding message:', type, content);
const avatar = type === 'user' ? '👤' : '🤖';
// Trasforma il contenuto per mostrare correttamente il json eventualmente contenuto
const formattedContent = formatMessageContent(content);
const $message = $(`
${avatar}
${formattedContent}
`);
$messagesContainer.append($message);
scrollToBottom();
}
/**
* Formatta il contenuto del messaggio
*/
function formatMessageContent(content) {
if (typeof content !== 'string') {
console.warn('Content is not a string:', content);
content = String(content || '');
}
// Rimuovi eventuali json dalla visualizzazione per l'utente
return content.replace(/\{.*?\}/gs, '');
}
/**
* Aggiunge indicatore "sta scrivendo..."
*/
function addTypingIndicator() {
console.log('Adding typing indicator');
const $indicator = $(`
`);
$messagesContainer.append($indicator);
scrollToBottom();
}
/**
* Rimuove indicatore "sta scrivendo..."
*/
function removeTypingIndicator() {
console.log('Removing typing indicator');
$messagesContainer.find('.typing-indicator').remove();
}
/**
* Scorre la chat all'ultimo messaggio
*/
function scrollToBottom() {
$messagesContainer.scrollTop($messagesContainer[0].scrollHeight);
}
/**
* Aggiorna i select con i filtri trovati dall'assistente
*/
function updateFilters(filters) {
console.log('Updating filters with:', filters);
if (!filters) {
console.warn('No filters provided to update');
return;
}
// Per ogni filtro nel json restituito, aggiorna il relativo select
Object.keys(filters).forEach(function(filterKey) {
const value = filters[filterKey];
const $select = $(`#tusa-${filterKey}`);
if (!$select.length) {
console.warn(`Select #tusa-${filterKey} not found`);
return;
}
if(value !== '') {
console.log(`Setting ${filterKey} to ${value}`);
$select.val(value).trigger('change');
}
});
}
/**
* Aggiorna le opzioni dei select con i nuovi valori distinti
* Funzione estratta da tusa-filter.js originale
*/
function updateDistinctValues(newDistinct) {
console.log('Updating distinct values with:', newDistinct);
if (!newDistinct) {
console.warn('No distinct values provided to update');
return;
}
function updateSelect($select, newValues, placeholder) {
if (!$select.length) {
console.warn(`Select for ${placeholder} not found`);
return;
}
// Valore attuale
let currentVal = $select.val() || '';
console.log(`Updating select ${$select.attr('id')}, current value: ${currentVal}`);
// Svuotiamo le opzioni (Select2 e DOM)
$select.html('');
// Aggiungiamo l'opzione placeholder
$select.append('' + placeholder + ' ');
// Aggiungiamo le nuove opzioni
if (Array.isArray(newValues)) {
newValues.forEach(function(val) {
$select.append('' + val + ' ');
});
// Se il currentVal rientra tra i newValues, lo reimpostiamo
if(currentVal && newValues.includes(currentVal)) {
$select.val(currentVal);
} else {
// Altrimenti rimane su "" (placeholder)
$select.val('');
}
} else {
console.warn(`New values for ${placeholder} is not an array:`, newValues);
}
// Aggiorna l'interfaccia Select2
if ($.fn.select2 && typeof $select.select2 === 'function') {
$select.trigger('change.select2');
} else {
console.warn('Select2 not available for', $select.attr('id'));
$select.trigger('change');
}
}
// Aggiorno d1..l3
updateSelect($('#tusa-d1'), newDistinct.d1, 'd1');
updateSelect($('#tusa-d2'), newDistinct.d2, 'd2');
updateSelect($('#tusa-d3'), newDistinct.d3, 'd3');
updateSelect($('#tusa-l1'), newDistinct.l1, 'l1');
updateSelect($('#tusa-l2'), newDistinct.l2, 'l2');
updateSelect($('#tusa-l3'), newDistinct.l3, 'l3');
}
// Inizializza il chatbot espanso
if($chatbotContainer.length) {
console.log('ChatBot initialized');
// Verifica se abbiamo tutte le dipendenze necessarie
console.log('jQuery version:', $.fn.jquery);
console.log('Select2 available:', typeof $.fn.select2 === 'function');
// Focus sull'input
$chatInput.focus();
} else {
console.warn('ChatBot container not found in the page');
}
});
MTB33 – MTB35 – MTB35/L – MTB40 – MTB41 | Spiralbohrer, Zentrierbohrer, Bohrer linksschneidend - Tusa Precision Tools
Wir verwenden Cookies, um sicherzustellen, dass Sie die bestmögliche Erfahrung auf unserer Website machen.
Welche Cookies wir verwenden oder wie Sie diese deaktivieren können, erfahren Sie in den Einstellungen unter setting .
Annehmen
Close GDPR Cookie Settings
Datenschutzübersicht
Diese Website verwendet Cookies, damit wir Ihnen die bestmögliche Erfahrung auf unserer Website bieten können. Cookies werden in Ihrem Browser gespeichert und haben die Funktion, Sie bei Ihrer Rückkehr zu unserer Website zu erkennen und unserem Team zu helfen, zu verstehen, welche Bereiche der Website Sie am interessantesten und nützlichsten finden.
Notwendige Cookies
Notwendige Cookies sollten jederzeit aktiviert sein, damit wir Ihre Einstellungen für die Cookies speichern können.
Wenn Sie dieses Cookie deaktivieren, können wir Ihre Einstellungen nicht speichern. Dies bedeutet, dass Sie bei jedem Besuch dieser Website die Cookies erneut aktivieren oder deaktivieren müssen.
Cookie Policy
More information about our Cookie Policy