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 (
Chargement…
; return (Catalogue des espaces de travail proposés par l'application (Crowdlending, futurs modules…). L'attribution à un utilisateur se fait depuis sa fiche, onglet « Gérer les droits ».
Aucun espace de travail défini.
) : (| Nom | Libellé menu | Slug | Disponible | Ordre | Utilisateurs | |
|---|---|---|---|---|---|---|
| {w.nom} | {w.libelle_menu} | {w.slug} | {w.actif_global ? Oui : Non} | {w.ordre} | {w.nb_utilisateurs} |
|