import { useState, useEffect } from 'react' import { Settings, Plus, Edit2, Trash2, Loader2, X, Save } from 'lucide-react' import api from '../services/api' import Modal from '../components/Modal' type Tab = 'categorias' | 'centros_custo' | 'subcategorias' | 'locais' const tabs: { key: Tab; label: string }[] = [ { key: 'categorias', label: 'Categorias' }, { key: 'centros_custo', label: 'Centros de Custo' }, { key: 'subcategorias', label: 'Subcategorias' }, { key: 'locais', label: 'Locais' }, ] export default function Configuracao() { const [activeTab, setActiveTab] = useState('categorias') const [loading, setLoading] = useState(true) const [items, setItems] = useState([]) const [showModal, setShowModal] = useState(false) const [editId, setEditId] = useState(null) const [form, setForm] = useState({}) const [saving, setSaving] = useState(false) // For subcategorias const [categorias, setCategorias] = useState([]) const endpoints: Record = { categorias: '/categorias', centros_custo: '/centros-custo', subcategorias: '/subcategorias', locais: '/locais', } useEffect(() => { fetchItems(); fetchCategorias() }, [activeTab]) const fetchItems = async () => { setLoading(true) try { const { data } = await api.get(endpoints[activeTab]) setItems(data) } catch { setItems([]) } finally { setLoading(false) } } const fetchCategorias = async () => { try { const { data } = await api.get('/categorias') setCategorias(data) } catch {} } const getEmptyForm = (): any => { switch (activeTab) { case 'categorias': return { nome: '', criticidade_padrao: 'media', sla_dias: 30, tipo_investimento: '', tipo_manutencao: '', impacto_ambiental_esperado: '', potencial_geracao_residuos: '' } case 'centros_custo': return { codigo: '', nome: '' } case 'subcategorias': return { nome: '', categoria_id: '' } case 'locais': return { nome: '', endereco: '', tipo_operacao_local: '', classificacao_impacto_ambiental: '', praticas_sustentaveis: [] } } } const openNew = () => { setEditId(null); setForm(getEmptyForm()); setShowModal(true) } const openEdit = (item: any) => { setEditId(item.id) switch (activeTab) { case 'categorias': setForm({ nome: item.nome, criticidade_padrao: item.criticidade_padrao || 'media', sla_dias: item.sla_dias || 30, tipo_investimento: item.tipo_investimento || '', tipo_manutencao: item.tipo_manutencao || '', impacto_ambiental_esperado: item.impacto_ambiental_esperado || '', potencial_geracao_residuos: item.potencial_geracao_residuos || '' }) break case 'centros_custo': setForm({ codigo: item.codigo || '', nome: item.nome }) break case 'subcategorias': setForm({ nome: item.nome, categoria_id: item.categoria_id || '' }) break case 'locais': setForm({ nome: item.nome, endereco: item.endereco || '', tipo_operacao_local: item.tipo_operacao_local || '', classificacao_impacto_ambiental: item.classificacao_impacto_ambiental || '', praticas_sustentaveis: item.praticas_sustentaveis || [] }) break } setShowModal(true) } const handleSubmit = async () => { setSaving(true) try { if (editId) { await api.patch(`${endpoints[activeTab]}/${editId}`, form) } else { await api.post(endpoints[activeTab], form) } setShowModal(false) fetchItems() } catch (err) { alert('Erro ao salvar') } finally { setSaving(false) } } const handleDelete = async (id: string) => { if (!confirm('Tem certeza que deseja excluir?')) return try { await api.delete(`${endpoints[activeTab]}/${id}`) fetchItems() } catch { alert('Erro ao excluir') } } const catMap: Record = {} categorias.forEach(c => { catMap[c.id] = c.nome }) const renderFormFields = () => { switch (activeTab) { case 'categorias': return ( <>
setForm({ ...form, nome: e.target.value })} className="input-field" required />
setForm({ ...form, sla_dias: Number(e.target.value) })} className="input-field" />

🌿 Campos ESG

) case 'centros_custo': return ( <>
setForm({ ...form, codigo: e.target.value })} className="input-field" required />
setForm({ ...form, nome: e.target.value })} className="input-field" required />
) case 'subcategorias': return ( <>
setForm({ ...form, nome: e.target.value })} className="input-field" required />
) case 'locais': return ( <>
setForm({ ...form, nome: e.target.value })} className="input-field" required />
setForm({ ...form, endereco: e.target.value })} className="input-field" />

🌿 Campos ESG

{['Coleta Seletiva', 'Reuso de Água', 'Energia Renovável', 'Compostagem', 'Redução de Plástico'].map(p => ( ))}
) } } const renderColumns = () => { switch (activeTab) { case 'categorias': return ( <> Nome Tipo Invest. Criticidade SLA Manutenção Impacto Amb. Ações ) case 'centros_custo': return ( <> Código Nome Ações ) case 'subcategorias': return ( <> Nome Categoria Ações ) case 'locais': return ( <> Nome Endereço Operação Impacto Amb. Ações ) } } const renderRow = (item: any) => { switch (activeTab) { case 'categorias': return ( <> {item.nome} {item.tipo_investimento ? ( {item.tipo_investimento === 'capex' ? 'Capex' : 'Opex'} ) : '-'} {item.criticidade_padrao || '-'} {item.sla_dias} dias {item.tipo_manutencao ? ( {item.tipo_manutencao} ) : '-'} {item.impacto_ambiental_esperado ? ( {item.impacto_ambiental_esperado} ) : '-'} ) case 'centros_custo': return ( <> {item.codigo} {item.nome} ) case 'subcategorias': return ( <> {item.nome} {catMap[item.categoria_id] || '-'} ) case 'locais': return ( <> {item.nome} {item.endereco || '-'} {item.tipo_operacao_local || '-'} {item.classificacao_impacto_ambiental ? ( {item.classificacao_impacto_ambiental} ) : '-'} ) } } return (

Configuração

Gerencie as tabelas de apoio do sistema

{/* Tabs */}
{tabs.map(tab => ( ))}
{/* Table */} {loading ? (
) : (
{renderColumns()} {items.map(item => ( {renderRow(item)} ))}
{items.length === 0 && (

Nenhum registro encontrado

)}
)} {/* Create/Edit Modal */} setShowModal(false)} title={editId ? 'Editar' : 'Novo Registro'} onSubmit={handleSubmit} submitLabel={editId ? 'Salvar' : 'Criar'} loading={saving}> {renderFormFields()}
) }