'use client'; import { ProTable, ProTableActions } from '@/components/pro-table'; import { createRuleGroup, deleteRuleGroup, getRuleGroupList, updateRuleGroup, } from '@/services/admin/server'; import { Badge } from '@workspace/ui/components/badge'; import { Button } from '@workspace/ui/components/button'; import { Switch } from '@workspace/ui/components/switch'; import { ConfirmButton } from '@workspace/ui/custom-components/confirm-button'; import { formatDate } from '@workspace/ui/utils'; import { useTranslations } from 'next-intl'; import Image from 'next/legacy/image'; import Link from 'next/link'; import { useRef, useState } from 'react'; import { toast } from 'sonner'; import ImportYamlRules from './import-yaml-rules'; import RuleForm from './rule-form'; export default function Page() { const t = useTranslations('rules'); const [loading, setLoading] = useState(false); const ref = useRef(null); return ( action={ref} header={{ toolbar: (
ref.current?.refresh()} /> trigger={t('create')} title={t('createRule')} loading={loading} onSubmit={async (values) => { setLoading(true); try { await createRuleGroup({ name: values.name, rules: values.rules || '', enable: false, tags: values.tags || [], icon: values.icon || '', type: values.type || 'default', default: false, }); toast.success(t('createSuccess')); ref.current?.refresh(); setLoading(false); return true; } catch (error) { setLoading(false); return false; } }} />
), }} params={[ { key: 'search', placeholder: t('searchRule'), }, ]} request={async (pagination, filters) => { const { data } = await getRuleGroupList({ ...pagination, ...filters, }); return { list: data.data?.list || [], total: data.data?.total || 0, }; }} columns={[ { accessorKey: 'enable', header: t('enable'), cell: ({ row }) => { return ( { await updateRuleGroup({ ...row.original, enable: checked, } as API.UpdateRuleGroupRequest); ref.current?.refresh(); }} /> ); }, }, { accessorKey: 'default', header: t('defaultRule'), cell: ({ row }) => ( { await updateRuleGroup({ ...row.original, default: checked, } as API.UpdateRuleGroupRequest); ref.current?.refresh(); }} /> ), }, { accessorKey: 'type', header: t('type'), cell: ({ row }) => { const type = row.original.type || 'default'; if (type === 'default') { return {t('default')}; } if (type === 'reject') { return {t('reject')}; } if (type === 'direct') { return {t('direct')}; } return {t('default')}; }, }, { accessorKey: 'name', header: t('name'), cell: ({ row }) => (
{row.original.icon && ( {row.original.name} )} {row.original.name}
), }, { accessorKey: 'tags', header: t('tags'), cell: ({ row }) => { const tags = row.original.tags.filter((item) => item) || []; if (!tags.length) return '--'; return ( <> {tags.map((tag) => ( {tag} ))} ); }, }, { accessorKey: 'created_at', header: t('createdAt'), cell: ({ row }) => formatDate(row.original.created_at), }, ]} actions={{ render: (row) => [ key='edit' trigger={t('edit')} title={t('editRule')} loading={loading} initialValues={row} onSubmit={async (values) => { setLoading(true); try { await updateRuleGroup({ id: row.id, name: values.name, tags: values.tags, rules: values.rules, enable: row.enable, icon: values.icon, type: values.type, default: row.default, }); toast.success(t('updateSuccess')); ref.current?.refresh(); setLoading(false); return true; } catch (error) { setLoading(false); return false; } }} />, {t('delete')}} title={t('confirmDelete')} description={t('deleteWarning')} onConfirm={async () => { await deleteRuleGroup({ id: row.id }); toast.success(t('deleteSuccess')); ref.current?.refresh(); }} cancelText={t('cancel')} confirmText={t('confirm')} />, ], batchRender: (rows) => [ {t('delete')}} title={t('confirmDelete')} description={t('deleteWarning')} onConfirm={async () => { for (const row of rows) { await deleteRuleGroup({ id: row.id }); } toast.success(t('deleteSuccess')); ref.current?.reset(); ref.current?.refresh(); }} cancelText={t('cancel')} confirmText={t('confirm')} />, ], }} /> ); }