import { useState, useEffect, useCallback } from 'react'; import { api } from '../../api.js'; import Modal from '../../components/Modal.jsx'; import ConfirmModal from '../../components/ConfirmModal.jsx'; import ResultBanner from '../../components/ResultBanner.jsx'; /* Catalogue des espaces de travail (Administration > Espaces de travail). * CRUD sur la table `workspaces` — indépendant de l'octroi par utilisateur, * qui se fait via la modale "Gérer les droits" (UsersSection.jsx). Voir * project_workspaces_transformation.md (mémoire projet). */ function IconPlus() { return ; } function IconEdit() { return ; } function IconTrash() { return ; } function Toggle({ checked, onClick, title }) { return ( ); } const emptyForm = { slug: '', nom: '', libelleMenu: '', description: '', actifGlobal: true, ordre: 0 }; function WorkspaceFormModal({ open, onClose, onSaved, workspace }) { const isEdit = !!workspace; const [form, setForm] = useState(emptyForm); const [err, setErr] = useState(null); const [saving, setSaving] = useState(false); useEffect(() => { if (!open) return; setErr(null); setForm(workspace ? { slug: workspace.slug, nom: workspace.nom, libelleMenu: workspace.libelle_menu, description: workspace.description || '', actifGlobal: !!workspace.actif_global, ordre: workspace.ordre ?? 0, } : emptyForm); }, [open, workspace]); async function handleSubmit(e) { e.preventDefault(); setErr(null); if (!form.nom.trim() || !form.libelleMenu.trim() || (!isEdit && !form.slug.trim())) { setErr('Merci de renseigner les champs obligatoires (*)'); return; } setSaving(true); try { const payload = { nom: form.nom.trim(), libelleMenu: form.libelleMenu.trim(), description: form.description.trim(), actifGlobal: !!form.actifGlobal, ordre: Number(form.ordre) || 0, }; if (isEdit) { await api.put(`/admin/workspaces/${workspace.id}`, payload); } else { await api.post('/admin/workspaces', { ...payload, slug: form.slug.trim() }); } onSaved(); } catch (e2) { setErr(e2.message || 'Erreur lors de l\'enregistrement'); } finally { setSaving(false); } } return ( } >
setForm(f => ({ ...f, slug: e.target.value.toLowerCase().replace(/[^a-z0-9-]/g, '') }))} /> lettres minuscules, chiffres, tirets — non modifiable après création
setForm(f => ({ ...f, nom: e.target.value }))} />
setForm(f => ({ ...f, libelleMenu: e.target.value }))} /> Affiché dans la barre latérale lorsque cet espace est actif