/** * RECHERCHE OPTIONS DEVIS */ export class SearchOptionsDevis extends HTMLButtonElement { constructor() { super(); this.allOptions = []; } connectedCallback() { this.addEventListener('click', (e) => { e.preventDefault(); this.openModal(); }); } async openModal() { let modal = document.getElementById('modal-search-options'); if (!modal) { modal = this.createModalStructure(); document.body.appendChild(modal); this.setupSearchEvent(modal); } modal.classList.remove('hidden'); const container = modal.querySelector('#results-container-options'); const searchInput = modal.querySelector('#modal-search-input-options'); searchInput.value = ''; container.innerHTML = `

Chargement des options...

`; try { const response = await fetch('/crm/options/json'); this.allOptions = await response.json(); this.renderOptions(this.allOptions, container, modal); setTimeout(() => searchInput.focus(), 100); } catch (error) { container.innerHTML = '
Erreur de liaison catalogue options.
'; } } createModalStructure() { const div = document.createElement('div'); div.id = 'modal-search-options'; div.className = 'fixed inset-0 z-[100] flex items-center justify-center p-4 bg-[#0f172a]/90 backdrop-blur-md hidden animate-in fade-in duration-300'; div.innerHTML = `

Sélection Option

Appuyez sur Échap pour annuler

`; div.querySelector('.cvr').addEventListener('click',rvt=>{ rvt.preventDefault(); div.classList.add('hidden'); }) return div; } setupSearchEvent(modal) { const input = modal.querySelector('#modal-search-input-options'); const container = modal.querySelector('#results-container-options'); input.oninput = () => { const query = input.value.toLowerCase().trim(); const filtered = this.allOptions.filter(o => o.name.toLowerCase().includes(query)); this.renderOptions(filtered, container, modal); }; window.addEventListener('keydown', (e) => { if (e.key === 'Escape') modal.classList.add('hidden'); }); } renderOptions(options, container, modal) { container.innerHTML = ''; if (options.length === 0) { container.innerHTML = '
Aucune option trouvée
'; return; } options.forEach(option => { const card = document.createElement('div'); card.className = 'flex items-center gap-5 p-4 bg-white/5 border border-white/5 rounded-2xl hover:bg-blue-600/10 hover:border-blue-500/40 transition-all cursor-pointer group animate-in slide-in-from-bottom-2'; const imgHtml = option.image ? `` : `
OPT
`; card.innerHTML = ` ${imgHtml}
${option.name}
PRIX HT: ${option.price}€
`; card.onclick = () => { this.fillOptionLine(option); modal.classList.add('hidden'); }; container.appendChild(card); }); } fillOptionLine(option) { let row = this.parentElement.parentElement.parentElement.parentElement.parentElement if (row) { const nameInput = row.querySelector('input[name*="[product]"]'); const priceInput = row.querySelector('input[name*="[price_ht]"]'); if(nameInput) nameInput.value = option.name; if(priceInput) priceInput.value = option.price; const fieldset = row.querySelector('fieldset'); if (fieldset) { fieldset.classList.add('border-blue-500/50', 'bg-blue-600/5'); setTimeout(() => fieldset.classList.remove('border-blue-500/50', 'bg-blue-600/5'), 800); } } } } /** * RECHERCHE PRODUITS DEVIS */ export class SearchProductDevis extends HTMLButtonElement { constructor() { super(); this.allProducts = []; } connectedCallback() { this.addEventListener('click', (e) => { e.preventDefault(); this.openModal(); }); } async openModal() { let modal = document.getElementById('modal-search-product'); if (!modal) { modal = this.createModalStructure(); document.body.appendChild(modal); this.setupSearchEvent(modal); } modal.classList.remove('hidden'); const container = modal.querySelector('#results-container'); const searchInput = modal.querySelector('#modal-search-input'); searchInput.value = ''; container.innerHTML = `

Synchronisation catalogue...

`; try { const response = await fetch('/crm/products/json'); this.allProducts = await response.json(); this.renderProducts(this.allProducts, container, modal); setTimeout(() => searchInput.focus(), 100); } catch (error) { container.innerHTML = '
Erreur de liaison catalogue produits.
'; } } createModalStructure() { const div = document.createElement('div'); div.id = 'modal-search-product'; div.className = 'fixed inset-0 z-[100] flex items-center justify-center p-4 bg-[#0f172a]/90 backdrop-blur-md hidden animate-in fade-in duration-300'; div.innerHTML = `

Sélection Produit

Appuyez sur Échap pour annuler

`; div.querySelector('.cvr').addEventListener('click',rvt=>{ rvt.preventDefault(); div.classList.add('hidden'); }) return div; } setupSearchEvent(modal) { const input = modal.querySelector('#modal-search-input'); const container = modal.querySelector('#results-container'); input.oninput = () => { const query = input.value.toLowerCase().trim(); const filtered = this.allProducts.filter(p => p.name.toLowerCase().includes(query)); this.renderProducts(filtered, container, modal); }; window.addEventListener('keydown', (e) => { if (e.key === 'Escape') modal.classList.add('hidden'); }); } renderProducts(products, container, modal) { container.innerHTML = ''; if (products.length === 0) { container.innerHTML = '
Aucun produit trouvé
'; return; } products.forEach(product => { const card = document.createElement('div'); card.className = 'flex items-center gap-5 p-4 bg-white/5 border border-white/5 rounded-2xl hover:bg-purple-600/10 hover:border-purple-500/40 transition-all cursor-pointer group animate-in slide-in-from-bottom-2'; const imgHtml = product.image ? `` : `
IMG
`; card.innerHTML = ` ${imgHtml}
${product.name}
1J: ${product.price1day}€ SUP: ${product.priceSup}€
`; card.onclick = () => { this.fillFormLine(product); modal.classList.add('hidden'); }; container.appendChild(card); }); } fillFormLine(product) { let row = this.parentElement.parentElement.parentElement.parentElement.parentElement if (row) { const nameInput = row.querySelector('input[name*="[product]"]'); const priceInput = row.querySelector('input[name*="[price_ht]"]'); const priceSupInput = row.querySelector('input[name*="[price_sup_ht]"]'); if(nameInput) nameInput.value = product.name; if(priceInput) priceInput.value = product.price1day; if(priceSupInput) priceSupInput.value = product.priceSup; const fieldset = row.querySelector('fieldset'); if (fieldset) { fieldset.classList.add('border-purple-500/50', 'bg-purple-600/5'); setTimeout(() => fieldset.classList.remove('border-purple-500/50', 'bg-purple-600/5'), 800); } } } }