✨ 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. ```
70 lines
2.6 KiB
JavaScript
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");
|
|
}
|
|
}
|
|
}
|