import React, { useCallback, useEffect, useState } from 'react'; import { backendApi } from '../../services/apiClient'; import { Position } from '../../types'; import { Briefcase, Loader2, Plus, Pencil, Trash2, X } from 'lucide-react'; export const PositionsSection: React.FC = () => { const [positions, setPositions] = useState([]); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [editingId, setEditingId] = useState(null); const [isCreateOpen, setIsCreateOpen] = useState(false); const [createName, setCreateName] = useState(''); const [createIsManagerial, setCreateIsManagerial] = useState(false); const [editName, setEditName] = useState(''); const [editIsManagerial, setEditIsManagerial] = useState(false); const [deleteConfirmId, setDeleteConfirmId] = useState(null); const load = useCallback(async () => { try { setLoading(true); const list = await backendApi.getPositions(); setPositions(list); } catch (err) { console.error('Error loading positions:', err); setPositions([]); } finally { setLoading(false); } }, []); useEffect(() => { load(); }, [load]); const handleCreate = async (e: React.FormEvent) => { e.preventDefault(); if (!createName.trim()) return; try { setSaving(true); await backendApi.createPosition({ name: createName.trim(), isManagerial: createIsManagerial }); setIsCreateOpen(false); setCreateName(''); setCreateIsManagerial(false); await load(); } catch (err: any) { console.error(err); alert(err?.message || 'Ошибка создания должности'); } finally { setSaving(false); } }; const startEdit = (p: Position) => { setEditingId(p.id); setEditName(p.name); setEditIsManagerial(p.isManagerial ?? false); }; const cancelEdit = () => { setEditingId(null); }; const handleUpdate = async (id: string) => { if (!editName.trim()) return; try { setSaving(true); await backendApi.updatePosition(id, { name: editName.trim(), isManagerial: editIsManagerial }); setEditingId(null); await load(); } catch (err: any) { console.error(err); alert(err?.message || 'Ошибка сохранения'); } finally { setSaving(false); } }; const handleDelete = async (id: string) => { try { setSaving(true); await backendApi.deletePosition(id); setDeleteConfirmId(null); await load(); } catch (err: any) { console.error(err); alert(err?.message || 'Ошибка удаления'); } finally { setSaving(false); } }; if (loading) { return (
); } return (

Справочник должностей

Должности для назначения сотрудникам. Отметьте «Руководящая должность» для должностей руководителей (мастер, начальник участка и т.д.)

{isCreateOpen && (
setCreateName(e.target.value)} placeholder="Например: Мастер участка" className="w-full p-2.5 border border-slate-200 rounded-xl text-sm" required />
)}
{positions.length === 0 ? ( ) : ( positions.map((p) => ( )) )}
Должность Руководящая должность Действия
Нет должностей. Добавьте первую.
{editingId === p.id ? ( setEditName(e.target.value)} className="w-full p-2 border border-slate-200 rounded-lg text-sm" autoFocus /> ) : ( {p.name} )} {editingId === p.id ? ( ) : ( {p.isManagerial ? 'Да' : 'Нет'} )} {editingId === p.id ? (
) : deleteConfirmId === p.id ? (
Удалить?
) : (
)}
); };