feat(node): Add tags

This commit is contained in:
web@ppanel
2025-01-13 21:37:56 +07:00
parent f26f1c24ae
commit f408fdffae
28 changed files with 132 additions and 14 deletions
@@ -91,6 +91,7 @@ const protocolConfigSchema = z.discriminatedUnion('protocol', [
const baseFormSchema = z.object({
name: z.string(),
tags: z.array(z.string()).nullish().default([]),
server_addr: z.string(),
speed_limit: z.number().nullish(),
traffic_ratio: z.number().default(1),
@@ -35,6 +35,7 @@ import { Tabs, TabsList, TabsTrigger } from '@workspace/ui/components/tabs';
import { Combobox } from '@workspace/ui/custom-components/combobox';
import { ArrayInput } from '@workspace/ui/custom-components/dynamic-Inputs';
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
import TagInput from '@workspace/ui/custom-components/tag-input';
import { cn } from '@workspace/ui/lib/utils';
import { unitConversion } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl';
@@ -63,6 +64,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
const form = useForm({
resolver: zodResolver(formSchema),
defaultValues: {
tags: [],
traffic_ratio: 1,
protocol: 'shadowsocks',
...initialValues,
@@ -158,6 +160,23 @@ export default function NodeForm<T extends { [x: string]: any }>({
)}
/>
</div>
<FormField
control={form.control}
name='tags'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.tags')}</FormLabel>
<FormControl>
<TagInput
placeholder={t('form.tagsPlaceholder')}
value={field.value || []}
onChange={(value) => form.setValue(field.name, value)}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<div className='grid grid-cols-3 gap-2'>
<FormField
control={form.control}
+25 -7
View File
@@ -116,13 +116,6 @@ export default function NodeTable() {
);
},
},
{
accessorKey: 'status',
header: t('status'),
cell: ({ row }) => {
return <NodeStatusCell status={row.original?.status} />;
},
},
{
accessorKey: 'name',
header: t('name'),
@@ -131,6 +124,13 @@ export default function NodeTable() {
accessorKey: 'server_addr',
header: t('serverAddr'),
},
{
accessorKey: 'status',
header: t('status'),
cell: ({ row }) => {
return <NodeStatusCell status={row.original?.status} />;
},
},
{
accessorKey: 'speed_limit',
header: t('speedLimit'),
@@ -152,6 +152,24 @@ export default function NodeTable() {
return name ? <Badge variant='outline'>{name}</Badge> : '--';
},
},
{
accessorKey: 'tags',
header: t('tags'),
cell: ({ row }) => {
const tags = (row.getValue('tags') as string[]) || [];
return tags.length > 0 ? (
<div className='flex gap-1'>
{tags.map((tag) => (
<Badge key={tag} variant='outline'>
{tag}
</Badge>
))}
</div>
) : (
'--'
);
},
},
]}
params={[
{