Files
ludikevent_crm/assets/libs/DevisManager.js
Serreau Jovann 5d6c0fdde7 ```
 feat(Product.php): Ajoute relation DevisLine et méthodes associées en français.
 feat(DevisLine.php): Ajoute propriétés et relations pour ligne de devis en français.
 feat(DevisController.php): Intègre génération PDF et ajout de lignes de devis en français.
🎨 style: Améliore la mise en page et l'esthétique de l'interface admin en français.
 feat: Initialise TomSelect et gère les adresses client dans DevisManager en français.
🐛 fix: Corrige l'initialisation de TomSelect et la gestion des lignes répétées en français.
 test: Ajoute génération du bon pour accord et signature en français.
```
2026-01-19 17:56:57 +01:00

70 lines
2.6 KiB
JavaScript

export class DevisManager extends HTMLDivElement {
connectedCallback() {
this.customerSelect = this.querySelector('select');
this.billAddress = this.parentElement.parentElement.querySelector('#billAddress');
this.shipAddress = this.parentElement.parentElement.querySelector('#shipAddress');
// Initialisation du message par défaut au chargement
this.setAddressPlaceholder("Sélectionnez un client...");
if (this.customerSelect) {
this.customerSelect.addEventListener('change', (e) => this.updateCustomerInfo(e.target.value));
}
}
/**
* Met à jour le texte d'aide dans les champs TomSelect
*/
setAddressPlaceholder(text) {
[this.billAddress, this.shipAddress].forEach(el => {
if (el && el.tomselect) {
el.tomselect.settings.placeholder = text;
el.tomselect.inputState(); // Force la mise à jour visuelle
}
});
}
async updateCustomerInfo(customerId) {
// Purge et message d'attente
[this.billAddress, this.shipAddress].forEach(el => {
if (el.tomselect) {
el.tomselect.clear();
el.tomselect.clearOptions();
}
});
if (!customerId) {
this.setAddressPlaceholder("Sélectionnez un client...");
return;
}
// Pendant le chargement
this.setAddressPlaceholder("Chargement des adresses...");
try {
const resp = await fetch("/crm/customer/address/" + customerId);
const data = await resp.json();
if (data.addressList && data.addressList.length > 0) {
this.setAddressPlaceholder("Choisir une adresse...");
data.addressList.forEach(itemList => {
const option = { value: itemList.id, text: itemList.label };
if (this.billAddress.tomselect) this.billAddress.tomselect.addOption(option);
if (this.shipAddress.tomselect) this.shipAddress.tomselect.addOption(option);
});
// Optionnel : Sélectionner la première adresse par défaut
this.billAddress.tomselect.setValue(data.addressList[0].id);
this.shipAddress.tomselect.setValue(data.addressList[0].id);
} else {
this.setAddressPlaceholder("Aucune adresse trouvée");
}
} catch (error) {
console.error("Erreur adresses:", error);
this.setAddressPlaceholder("Erreur de chargement");
}
}
}