/** * 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(''); // Aggiungiamo le nuove opzioni if (Array.isArray(newValues)) { newValues.forEach(function(val) { $select.append(''); }); // 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'); } }); Regrinding - Tusa Precision Tools

Tusa Precision Tools

Regrinding service

With the continued rise in raw material prices, and the long procurement times of raw material, a tool regeneration process becomes increasingly attractive to customers. The incidence of the cost of the material on the price of the tools is considerable and can in some cases even exceed 60%. Why not take advantage of this opportunity?
The Tusa Precision Tools company, thanks to its decades of experience and the professionalism of its team, is able to regenerate its tools in the highest quality even several times, ensuring the initial performance of its products and reducing the costs of use.
We can guarantee personalized services and in case of urgent fast service channels, saving time and money. Contact our technical department and discuss the best solution for your company.

Advantages of regrinding from the original manufacturer:
• The tools will be re-sharpened with the original geometries
• Tools will be re-sharpened on machines with original grinding wheels and programs
• If coated, they will be executed with the original coating

So you have a regenerated tool with the same characteristics and performance as a new one.

Upon receipt of the tools, TUSA PRECISION TOOLS SA will carefully check the condition and the wear condition, discarding those that no longer have the conditions to be regenerated. Obviously the discarded and unprocessed tools will not be invoiced.

The tools that will pass this first selection will be regenerated with original geometries and possibly covered with original coating. Before being shipped, all the regenerated tools will be checked again with the usual quality process.