/** * ========================================================================= * PLATEFORME ECO-PANNEAU.FR - VERSION 1.0.0 * Socle Éditeur (1/4) - Onglet Informations Générales * ========================================================================= */ window.pano_PanneauEditorInfos = ({ panneau, setPanneau, lockedFields = [], validationErrors = [], uiMode, settings }) => { // 1. RÉCUPÉRATION DES COMPOSANTS ET ICÔNES GLOBAUX const AlertBox = window.pano_AlertBox || (() => null); const Button = window.pano_Button || (() => null); const { InfoIcon, LockIcon, MapPinIcon, CalendarIcon, UploadCloudIcon, CheckCircleIcon, Trash2Icon, PlusIcon } = window.pano_getIcons(); // 2. LOGIQUE D'AFFICHAGE (Mode simplifié vs pro) const isAdvanced = uiMode === 'professionnel'; const showDesc = isAdvanced || settings?.simp_opt_description === '1'; const showImage = isAdvanced || settings?.simp_opt_image === '1'; const showLink = isAdvanced || settings?.simp_opt_link === '1'; const showEmergency = isAdvanced || settings?.simp_opt_emergency === '1'; const showSchedule = isAdvanced || settings?.simp_opt_schedule === '1'; const showPractical = showLink || showEmergency || showSchedule; const isFieldLocked = (fieldId) => lockedFields.includes(fieldId); const displayOptions = panneau.displayOptions || { hideLots: false, hideIntervenants: false, hideLegal: false, customColor: '#059669', phone: '', hours: '', link: '' }; // 3. HANDLERS SPÉCIFIQUES À CE COMPOSANT const updateDisplayOption = (key, value) => { setPanneau({ ...panneau, displayOptions: { ...displayOptions, [key]: value } }); }; const handleFileUpload = async (e, type) => { const file = e.target.files[0]; if (!file) return; if (type === 'image') { const reader = new FileReader(); reader.onload = async (event) => { const base64Url = event.target.result; setPanneau(prev => ({ ...prev, imageUrl: base64Url })); try { const fileId = await window.pano_uploadFile(file, 'image', null, false, false, panneau.client_uid, panneau.id); setPanneau(prev => ({ ...prev, imageId: fileId })); } catch (err) { if (window.pano_showToast) window.pano_showToast(err, "error"); setPanneau(prev => ({ ...prev, imageUrl: '' })); } }; reader.readAsDataURL(file); } else if (type === 'pdf') { try { const fileId = await window.pano_uploadFile(file, 'pdf', null, false, false, panneau.client_uid, panneau.id); setPanneau(prev => ({ ...prev, pdfId: fileId })); } catch (err) { if (window.pano_showToast) window.pano_showToast(err, "error"); } } }; const addModifiedPermit = () => { if (isFieldLocked('permitNumber')) return; const currentArr = panneau.modifiedPermits || []; const newId = 'mod_' + Date.now() + '_' + Math.floor(Math.random() * 1000); setPanneau({ ...panneau, modifiedPermits: [...currentArr, { number: '', date: '', id: newId }] }); }; const updateModifiedPermit = (id, field, value) => { if (isFieldLocked('permitNumber')) return; const newArr = (panneau.modifiedPermits || []).map(p => p.id === id ? { ...p, [field]: value } : p); setPanneau({ ...panneau, modifiedPermits: newArr }); }; const removeModifiedPermit = (id) => { if (isFieldLocked('permitNumber')) return; const newArr = (panneau.modifiedPermits || []).filter(p => p.id !== id); setPanneau({ ...panneau, modifiedPermits: newArr }); }; // 4. RENDU return (
Renseignez les mentions légales affichées publiquement. Les champs marqués d'un * sont obligatoires pour la publication. {lockedFields.length > 0 && Certains champs ont été verrouillés par le propriétaire du projet.} {/* SECTION 1 : LE PROJET */}

1. Le projet

setPanneau({...panneau, name: e.target.value})} placeholder="Ex: Construction de 12 logements collectifs" className={`w-full border-2 rounded-xl p-3 outline-none transition font-bold ${isFieldLocked('name') ? 'bg-slate-50 border-slate-200 text-slate-500 cursor-not-allowed' : (validationErrors.some(e => e.includes('nom du chantier')) ? 'border-red-300 focus:border-red-500 bg-red-50' : 'border-slate-200 focus:border-emerald-500')}`} />
{showDesc && (
)}
setPanneau({...panneau, location: e.target.value})} placeholder="Numéro, Rue, Code Postal, Ville" className={`w-full border-2 rounded-xl p-3 pl-10 outline-none transition font-bold ${isFieldLocked('location') ? 'bg-slate-50 border-slate-200 text-slate-500 cursor-not-allowed' : (validationErrors.some(e => e.includes('adresse du panneau')) ? 'border-red-300 focus:border-red-500 bg-red-50' : 'border-slate-200 focus:border-emerald-500')}`} />
{showPractical && (
{showSchedule && (
{isFieldLocked('noiseSchedule') && } updateDisplayOption('hours', e.target.value)} placeholder="Horaires bruyants (Ex: Lun-Ven 8h-17h)" className={`w-full border-2 rounded-xl p-3 outline-none transition font-bold text-sm ${isFieldLocked('noiseSchedule') ? 'bg-slate-50 border-slate-200 text-slate-500 cursor-not-allowed' : 'border-slate-200 focus:border-emerald-500'}`} />
)} {showEmergency && (
{isFieldLocked('emergencyPhone') && } updateDisplayOption('phone', e.target.value)} placeholder="Téléphone d'urgence (24/7)" className={`w-full border-2 rounded-xl p-3 outline-none transition font-bold text-sm ${isFieldLocked('emergencyPhone') ? 'bg-slate-50 border-slate-200 text-slate-500 cursor-not-allowed' : 'border-slate-200 focus:border-emerald-500'}`} />
)} {showLink && (
{isFieldLocked('promoterLink') && } updateDisplayOption('link', e.target.value)} placeholder="Lien vers le site du promoteur (https://...)" className={`w-full border-2 rounded-xl p-3 outline-none transition font-bold text-sm ${isFieldLocked('promoterLink') ? 'bg-slate-50 border-slate-200 text-slate-500 cursor-not-allowed' : 'border-slate-200 focus:border-emerald-500'}`} />
)}
)} {showImage && (
{(panneau.imageUrl || panneau.imageId) && (
Aperçu
{ e.preventDefault(); if (panneau.imageId) { window.pano_apiFetch('file/delete', { body: { id: panneau.imageId } }); } setPanneau({...panneau, imageUrl: '', imageId: ''}); }} className="absolute top-2 right-2 bg-red-600/90 hover:bg-red-600 text-white p-1.5 rounded-full opacity-0 group-hover:opacity-100 transition-all cursor-pointer shadow-md" title="Supprimer la vue" >
)}
)}
{/* SECTION 2 : AUTORISATION */}

2. L'autorisation

setPanneau({...panneau, permitNumber: e.target.value})} placeholder="PC 000 000 00 00000" className={`w-full border-2 rounded-xl p-3 outline-none transition font-bold uppercase ${isFieldLocked('permitNumber') ? 'bg-slate-50 border-slate-200 text-slate-500 cursor-not-allowed' : 'border-slate-200 focus:border-emerald-500'}`} />
setPanneau({...panneau, permitDate: e.target.value})} className={`w-full border-2 rounded-xl p-3 pl-10 outline-none transition font-bold ${isFieldLocked('permitNumber') ? 'bg-slate-50 border-slate-200 text-slate-500 cursor-not-allowed' : 'border-slate-200 focus:border-emerald-500'}`} />
setPanneau({...panneau, mairie: e.target.value})} placeholder="Mairie de..." className={`w-full border-2 rounded-xl p-3 outline-none transition font-bold ${isFieldLocked('permitNumber') ? 'bg-slate-50 border-slate-200 text-slate-500 cursor-not-allowed' : 'border-slate-200 focus:border-emerald-500'}`} />
{panneau.pdfId && (
PDF uploadé
{!isFieldLocked('pdfId') && (
)}
{!isFieldLocked('permitNumber') && ( )}
{(panneau.modifiedPermits || []).map((mod) => (
updateModifiedPermit(mod.id, 'number', e.target.value)} className={`flex-1 border border-slate-200 rounded-lg p-2 text-sm outline-none transition font-bold ${isFieldLocked('permitNumber') ? 'bg-slate-100 text-slate-500 cursor-not-allowed' : 'focus:border-emerald-500'}`} /> updateModifiedPermit(mod.id, 'date', e.target.value)} className={`w-36 border border-slate-200 rounded-lg p-2 text-sm outline-none transition font-bold ${isFieldLocked('permitNumber') ? 'bg-slate-100 text-slate-500 cursor-not-allowed' : 'focus:border-emerald-500'}`} /> {!isFieldLocked('permitNumber') && (
))}
{/* SECTION 3 : ACTEURS */}

3. Acteurs principaux

setPanneau({...panneau, maitreOuvrage: e.target.value})} placeholder="Nom ou Société du bénéficiaire" className={`w-full border-2 rounded-xl p-3 outline-none transition font-bold ${isFieldLocked('maitreOuvrage') ? 'bg-slate-50 border-slate-200 text-slate-500 cursor-not-allowed' : 'border-slate-200 focus:border-emerald-500'}`} />
setPanneau({...panneau, architecte: e.target.value})} placeholder="Nom de l'architecte" className="w-full border-2 border-slate-200 rounded-xl p-3 focus:border-emerald-500 outline-none transition font-bold" />
{/* SECTION 4 : DIMENSIONS */}

4. Surfaces et dimensions

setPanneau({...panneau, superficieTerrain: e.target.value})} className="w-full border-2 border-slate-200 rounded-xl p-2.5 pr-8 focus:border-emerald-500 outline-none transition font-bold text-sm" />
setPanneau({...panneau, surfacePlancher: e.target.value})} className="w-full border-2 border-slate-200 rounded-xl p-2.5 pr-8 focus:border-emerald-500 outline-none transition font-bold text-sm" />
setPanneau({...panneau, hauteur: e.target.value})} className="w-full border-2 border-slate-200 rounded-xl p-2.5 pr-8 focus:border-emerald-500 outline-none transition font-bold text-sm" /> m
setPanneau({...panneau, surfaceDemolir: e.target.value})} className="w-full border-2 border-slate-200 rounded-xl p-2.5 pr-8 focus:border-emerald-500 outline-none transition font-bold text-sm" />
); }; /* EOF ========== [_react/_socle_editeur_infos.jsx] */