diff --git a/apps/admin/app/dashboard/nodes/node-form.tsx b/apps/admin/app/dashboard/nodes/node-form.tsx
index 527890a..07805c3 100644
--- a/apps/admin/app/dashboard/nodes/node-form.tsx
+++ b/apps/admin/app/dashboard/nodes/node-form.tsx
@@ -1,6 +1,6 @@
'use client';
-import { filterServerList } from '@/services/admin/server';
+import { filterServerList, queryNodeTag } from '@/services/admin/server';
import { zodResolver } from '@hookform/resolvers/zod';
import { useQuery } from '@tanstack/react-query';
import { Button } from '@workspace/ui/components/button';
@@ -98,6 +98,15 @@ export default function NodeForm(props: {
});
const servers: ServerRow[] = data as ServerRow[];
+ const { data: tagsData } = useQuery({
+ queryKey: ['queryNodeTag'],
+ queryFn: async () => {
+ const { data } = await queryNodeTag();
+ return data?.data?.tags || [];
+ },
+ });
+ const existingTags: string[] = tagsData as string[];
+
const currentServer = useMemo(() => servers?.find((s) => s.id === serverId), [servers, serverId]);
const availableProtocols = useMemo(() => {
@@ -298,6 +307,7 @@ export default function NodeForm(props: {
placeholder={t('tags_placeholder')}
value={field.value || []}
onChange={(v) => form.setValue(field.name, v)}
+ options={existingTags}
/>
{t('tags_description')}
diff --git a/apps/admin/app/dashboard/product/subscribe-form.tsx b/apps/admin/app/dashboard/product/subscribe-form.tsx
index f7c2f12..c51d1d3 100644
--- a/apps/admin/app/dashboard/product/subscribe-form.tsx
+++ b/apps/admin/app/dashboard/product/subscribe-form.tsx
@@ -1,6 +1,6 @@
'use client';
-import { filterNodeList } from '@/services/admin/server';
+import { filterNodeList, queryNodeTag } from '@/services/admin/server';
import { getSubscribeGroupList } from '@/services/admin/subscribe';
import { zodResolver } from '@hookform/resolvers/zod';
import { useQuery } from '@tanstack/react-query';
@@ -245,7 +245,16 @@ export default function SubscribeForm>({
return (data.data?.list || []) as API.Node[];
},
});
- const tagGroups = Array.from(
+
+ const { data: allTagsData } = useQuery({
+ queryKey: ['queryNodeTag'],
+ queryFn: async () => {
+ const { data } = await queryNodeTag();
+ return data?.data?.tags || [];
+ },
+ });
+
+ const nodeExtractedTags = Array.from(
new Set(
((nodes as API.Node[]) || [])
.flatMap((n) => (Array.isArray(n.tags) ? n.tags : []))
@@ -253,6 +262,12 @@ export default function SubscribeForm>({
),
) as string[];
+ const allAvailableTags = (allTagsData as string[]) || [];
+
+ const tagGroups = Array.from(new Set([...allAvailableTags, ...nodeExtractedTags])).filter(
+ Boolean,
+ );
+
const unit_time = form.watch('unit_time');
return (
@@ -271,7 +286,7 @@ export default function SubscribeForm>({
{title}
-
+