Skip to content

Commit 71537a6

Browse files
committed
chore: integrate tags functionality in node forms
1 parent 30a8434 commit 71537a6

File tree

6 files changed

+51
-8
lines changed

6 files changed

+51
-8
lines changed

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
"@monaco-editor/react": "^4.7.0",
6060
"@noble/post-quantum": "^0.5.2",
6161
"@paralleldrive/cuid2": "2.2.2",
62-
"@remnawave/backend-contract": "2.3.11",
62+
"@remnawave/backend-contract": "2.3.14",
6363
"@simplewebauthn/browser": "^13.2.2",
6464
"@stablelib/base64": "^2.0.1",
6565
"@stablelib/x25519": "^2.0.1",

src/pages/dashboard/nodes/ui/connectors/nodes.page.connector.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,13 @@ import {
55
useNodesStoreCreateModalIsOpen,
66
useNodesStoreEditModalIsOpen
77
} from '@entities/dashboard/nodes/nodes-store'
8-
import { nodesQueryKeys, QueryKeys, useGetConfigProfiles, useGetNodes } from '@shared/api/hooks'
8+
import {
9+
nodesQueryKeys,
10+
QueryKeys,
11+
useGetConfigProfiles,
12+
useGetNodes,
13+
useGetNodesTags
14+
} from '@shared/api/hooks'
915
import { queryClient } from '@shared/api'
1016

1117
import NodesPageComponent from '../components/nodes.page.component'
@@ -18,6 +24,7 @@ export function NodesPageConnector() {
1824

1925
const { data: nodes, isLoading } = useGetNodes()
2026
const { isLoading: isConfigProfilesLoading } = useGetConfigProfiles()
27+
useGetNodesTags()
2128

2229
useEffect(() => {
2330
;(async () => {

src/shared/api/hooks/nodes/nodes.query.hooks.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {
22
GetAllNodesCommand,
3+
GetAllNodesTagsCommand,
34
GetNodesRealtimeUsageCommand,
45
GetNodesUsageByRangeCommand,
56
GetNodeUserUsageByRangeCommand,
@@ -33,6 +34,9 @@ export const nodesQueryKeys = createQueryKeys('nodes', {
3334
}),
3435
getNodeUserUsageByRange: {
3536
queryKey: null
37+
},
38+
getAllTags: {
39+
queryKey: null
3640
}
3741
})
3842

@@ -107,3 +111,13 @@ export const useGetNodesRealtimeUsage = createGetQueryHook({
107111
},
108112
errorHandler: (error) => errorHandler(error, 'Get Nodes Realtime Usage')
109113
})
114+
115+
export const useGetNodesTags = createGetQueryHook({
116+
endpoint: GetAllNodesTagsCommand.TSQ_url,
117+
responseSchema: GetAllNodesTagsCommand.ResponseSchema,
118+
getQueryKey: () => nodesQueryKeys.getAllTags.queryKey,
119+
rQueryParams: {
120+
staleTime: 0
121+
},
122+
errorHandler: (error) => errorHandler(error, 'Get All Nodes Tags')
123+
})

src/shared/ui/forms/nodes/base-node-form/node-tracking-and-billing.card.tsx

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,19 @@ import {
88
rem,
99
Stack,
1010
Switch,
11+
TagsInput,
1112
Text,
1213
Title
1314
} from '@mantine/core'
1415
import { CreateNodeCommand, UpdateNodeCommand } from '@remnawave/backend-contract'
1516
import { ForwardRefComponent, HTMLMotionProps, Variants } from 'motion/react'
16-
import { PiCheckDuotone, PiXDuotone } from 'react-icons/pi'
17+
import { PiCheckDuotone, PiTagDuotone, PiXDuotone } from 'react-icons/pi'
1718
import { TbChartBar, TbChartLine } from 'react-icons/tb'
1819
import { UseFormReturnType } from '@mantine/form'
1920
import { useTranslation } from 'react-i18next'
2021

2122
import { SelectInfraProviderShared } from '@shared/ui/infra-billing/select-infra-provider/select-infra-provider.shared'
23+
import { useGetNodesTags } from '@shared/api/hooks'
2224

2325
interface IProps<T extends CreateNodeCommand.Request | UpdateNodeCommand.Request> {
2426
advancedOpened: boolean
@@ -34,6 +36,7 @@ export const NodeTrackingAndBillingCard = <
3436
props: IProps<T>
3537
) => {
3638
const { t } = useTranslation()
39+
const { data: nodesTags } = useGetNodesTags()
3740
const { cardVariants, form, motionWrapper, setAdvancedOpened, advancedOpened } = props
3841

3942
const MotionWrapper = motionWrapper
@@ -166,6 +169,24 @@ export const NodeTrackingAndBillingCard = <
166169
</Stack>
167170
</Collapse>
168171
</Stack>
172+
173+
<TagsInput
174+
clearable
175+
data={nodesTags?.tags || []}
176+
key={form.key('tags')}
177+
label="Tags"
178+
leftSection={<PiTagDuotone size="16px" />}
179+
maxTags={10}
180+
placeholder="Enter tags (comma, space, semicolon)"
181+
splitChars={[',', ' ', ';']}
182+
{...form.getInputProps('tags')}
183+
error={
184+
Object.keys(form.errors)
185+
.filter((key) => key.startsWith('tags.'))
186+
.map((key) => form.errors[key])
187+
.join(', ') || form.getInputProps('tags').error
188+
}
189+
/>
169190
</Stack>
170191
</Fieldset>
171192
</MotionWrapper>

src/widgets/dashboard/nodes/edit-node-modal/edit-node-modal.widget.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ export const EditNodeModalConnectorWidget = () => {
103103
node.configProfile.activeInbounds.map((inbound) => inbound.uuid) ?? []
104104
},
105105

106-
providerUuid: node.providerUuid ?? undefined
106+
providerUuid: node.providerUuid ?? undefined,
107+
tags: node.tags ?? []
107108
})
108109
}
109110
}, [node])

0 commit comments

Comments
 (0)