import { useEffect, useState } from 'react'; import { Alert, Button, Field, Input, Select, Textarea } from '../components/ui.jsx'; import { Icon, PageTitle, Toolbar, Panel, ApiNotice, PageLoadingDialog, Modal, ConfirmDialog, SimpleTable } from '../components/layout.jsx'; import { enStatus, formatDate, zhStatus } from '../utils/formatters.js'; import { api, explainApiError } from '../api.js'; const emptyBusinessPrefixForm = { prefix: '', name: '', description: '', priority: 100, status: 'ENABLED' }; function normalizeBusinessPrefix(item) { return { id: item.id, prefix: item.prefix, name: item.name, description: item.description || '-', priority: item.priority ?? 100, status: zhStatus(item.status), gatewayCount: item.gatewayCount ?? 0, createdAt: formatDate(item.createdAt), }; } export function BusinessPrefixesPage({ can = () => true }) { const [rows, setRows] = useState([]); const [filters, setFilters] = useState({ keyword: '', status: 'all' }); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const [message, setMessage] = useState(''); const [editingPrefix, setEditingPrefix] = useState(undefined); const [prefixForm, setPrefixForm] = useState(emptyBusinessPrefixForm); const [statusTarget, setStatusTarget] = useState(null); const [deleteTarget, setDeleteTarget] = useState(null); const [submitting, setSubmitting] = useState(false); const canManage = can('customer_gateways.manage'); const loadPrefixes = async () => { setLoading(true); setError(''); try { const payload = await api.businessPrefixes(filters); setRows((Array.isArray(payload) ? payload : []).map(normalizeBusinessPrefix)); } catch (loadError) { setError(explainApiError(loadError)); } finally { setLoading(false); } }; useEffect(() => { void loadPrefixes(); }, []); const openCreate = () => { setEditingPrefix(null); setPrefixForm(emptyBusinessPrefixForm); setError(''); setMessage(''); }; const openEdit = (row) => { setEditingPrefix(row); setPrefixForm({ prefix: row.prefix, name: row.name, description: row.description === '-' ? '' : row.description, priority: row.priority, status: enStatus(row.status), }); setError(''); setMessage(''); }; const closeForm = () => { setEditingPrefix(undefined); setPrefixForm(emptyBusinessPrefixForm); setSubmitting(false); }; const submitPrefix = async (event) => { event.preventDefault(); setSubmitting(true); setError(''); try { const body = { prefix: prefixForm.prefix.trim(), name: prefixForm.name.trim(), description: prefixForm.description.trim() || null, priority: Number(prefixForm.priority), status: prefixForm.status, }; if (editingPrefix) { await api.updateBusinessPrefix(editingPrefix.id, body); setMessage(`业务前缀「${body.prefix}」已更新。`); } else { await api.createBusinessPrefix(body); setMessage(`业务前缀「${body.prefix}」已创建。`); } closeForm(); await loadPrefixes(); } catch (submitError) { setError(explainApiError(submitError)); } finally { setSubmitting(false); } }; const toggleStatus = async (row) => { setSubmitting(true); setError(''); try { if (row.status === '启用') { await api.disableBusinessPrefix(row.id); } else { await api.enableBusinessPrefix(row.id); } setStatusTarget(null); await loadPrefixes(); } catch (toggleError) { setError(explainApiError(toggleError)); } finally { setSubmitting(false); } }; const deletePrefix = async (row) => { setSubmitting(true); setError(''); try { await api.deleteBusinessPrefix(row.id); setDeleteTarget(null); await loadPrefixes(); } catch (deleteError) { setError(explainApiError(deleteError)); } finally { setSubmitting(false); } }; const formOpen = editingPrefix !== undefined; return ( <> } onClick={openCreate}>新增业务前缀 : null} /> {message ? {message} : null} } onClick={loadPrefixes}>刷新} > setFilters({ ...filters, keyword: event.target.value })} placeholder="前缀或名称" /> (
{canManage ? : null} {canManage ? : null} {canManage ? : '-'}
), }, ]} />
{formOpen ? ( {} : closeForm} size="sm">
业务前缀 *}> setPrefixForm({ ...prefixForm, prefix: event.target.value })} placeholder="如 671" required /> 名称 *}> setPrefixForm({ ...prefixForm, name: event.target.value })} placeholder="如 国内移动业务" required /> setPrefixForm({ ...prefixForm, priority: event.target.value })} />