1- import { Controller , type UseFormReturn } from "react-hook-form" ;
1+ import { Controller , type UseFormReturn , useWatch } from "react-hook-form" ;
22import { useTranslation } from "react-i18next" ;
3- import { Field , FieldLabel } from "@/components/ui/field" ;
3+ import {
4+ Field ,
5+ FieldContent ,
6+ FieldError ,
7+ FieldLabel ,
8+ } from "@/components/ui/field" ;
9+ import { Input } from "@/components/ui/input" ;
410import {
511 Select ,
612 SelectContent ,
713 SelectItem ,
814 SelectTrigger ,
915 SelectValue ,
1016} from "@/components/ui/select" ;
17+ import { cn , notNeedUrlPattern } from "@/lib/utils" ;
1118import type { MemShellFormSchema } from "@/types/schema" ;
1219
1320export function ShellTypeFormField ( {
@@ -18,39 +25,118 @@ export function ShellTypeFormField({
1825 shellTypes : Array < string > ;
1926} > ) {
2027 const { t } = useTranslation ( [ "memshell" , "common" ] ) ;
28+ const shellType = useWatch ( { control : form . control , name : "shellType" } ) ;
29+ const server = useWatch ( { control : form . control , name : "server" } ) ;
30+ const needSelectServerVersion =
31+ ( server === "TongWeb" && shellType . endsWith ( "Valve" ) ) ||
32+ ( server === "Jetty" &&
33+ ( shellType === "Handler" || shellType === "JakartaHandler" ) ) ;
34+ const needUrlPattern = ! notNeedUrlPattern ( shellType ) ;
35+ const serverVersionOptions = getServerVersionOptions ( server ) ;
2136 return (
22- < Controller
23- control = { form . control }
24- name = "shellType"
25- render = { ( { field } ) => (
26- < Field className = "gap-1" >
27- < FieldLabel > { t ( "mainConfig.shellMountType" ) } </ FieldLabel >
28- < Select
29- onValueChange = { ( e ) => {
30- form . resetField ( "urlPattern" ) ;
31- field . onChange ( e ) ;
32- } }
33- value = { field . value }
34- >
35- < SelectTrigger >
36- < SelectValue data-placeholder = { t ( "common:placeholders.select" ) } />
37- </ SelectTrigger >
38- < SelectContent key = { shellTypes ?. join ( "," ) } >
39- { shellTypes ?. length ? (
40- shellTypes . map ( ( v ) => (
41- < SelectItem key = { v } value = { v } >
42- { v }
37+ < div className = "grid grid-cols-1 md:grid-cols-2 gap-2" >
38+ < Controller
39+ control = { form . control }
40+ name = "shellType"
41+ render = { ( { field } ) => (
42+ < Field className = "gap-1" >
43+ < FieldLabel > { t ( "mainConfig.shellMountType" ) } </ FieldLabel >
44+ < Select
45+ onValueChange = { ( e ) => {
46+ form . resetField ( "urlPattern" ) ;
47+ field . onChange ( e ) ;
48+ } }
49+ value = { field . value }
50+ >
51+ < SelectTrigger >
52+ < SelectValue
53+ data-placeholder = { t ( "common:placeholders.select" ) }
54+ />
55+ </ SelectTrigger >
56+ < SelectContent key = { shellTypes ?. join ( "," ) } >
57+ { shellTypes ?. length ? (
58+ shellTypes . map ( ( v ) => (
59+ < SelectItem key = { v } value = { v } >
60+ { v }
61+ </ SelectItem >
62+ ) )
63+ ) : (
64+ < SelectItem value = " " >
65+ { t ( "tips.shellToolNotSelected" ) }
4366 </ SelectItem >
44- ) )
45- ) : (
46- < SelectItem value = " " >
47- { t ( "tips.shellToolNotSelected" ) }
48- </ SelectItem >
49- ) }
50- </ SelectContent >
51- </ Select >
52- </ Field >
53- ) }
54- />
67+ ) }
68+ </ SelectContent >
69+ </ Select >
70+ </ Field >
71+ ) }
72+ />
73+ < Controller
74+ control = { form . control }
75+ name = "urlPattern"
76+ render = { ( { field, fieldState } ) => (
77+ < Field
78+ className = { cn ( "gap-1" , needUrlPattern ? "grid" : "hidden" ) }
79+ data-invalid = { fieldState . invalid }
80+ >
81+ < FieldLabel > { t ( "common:urlPattern" ) } </ FieldLabel >
82+ < Input { ...field } placeholder = { t ( "common:placeholders.input" ) } />
83+ { fieldState . error && < FieldError errors = { [ fieldState . error ] } /> }
84+ </ Field >
85+ ) }
86+ />
87+ < Controller
88+ control = { form . control }
89+ name = "serverVersion"
90+ render = { ( { field, fieldState } ) => (
91+ < Field
92+ className = { cn ( "gap-1" , needSelectServerVersion ? "grid" : "hidden" ) }
93+ orientation = "vertical"
94+ data-invalid = { fieldState . invalid }
95+ >
96+ < FieldContent >
97+ < FieldLabel htmlFor = "serverVersion" >
98+ { t ( "common:serverVersion" ) }
99+ </ FieldLabel >
100+ < Select onValueChange = { field . onChange } value = { field . value } >
101+ < SelectTrigger
102+ id = "serverVersion"
103+ aria-invalid = { fieldState . invalid }
104+ >
105+ < SelectValue
106+ data-placeholder = { t ( "common:placeholders.select" ) }
107+ />
108+ </ SelectTrigger >
109+ < SelectContent >
110+ { serverVersionOptions . map ( ( v ) => (
111+ < SelectItem key = { v . value } value = { v . value } >
112+ { v . name }
113+ </ SelectItem >
114+ ) ) }
115+ </ SelectContent >
116+ </ Select >
117+ { fieldState . error && < FieldError errors = { [ fieldState . error ] } /> }
118+ </ FieldContent >
119+ </ Field >
120+ ) }
121+ />
122+ </ div >
55123 ) ;
56124}
125+
126+ function getServerVersionOptions ( server : string ) {
127+ let serverVersionOptions = [ ] as { name : string ; value : string } [ ] ;
128+ if ( server === "TongWeb" ) {
129+ serverVersionOptions = [
130+ { name : "6" , value : "6" } ,
131+ { name : "7" , value : "7" } ,
132+ { name : "8" , value : "8" } ,
133+ ] ;
134+ } else if ( server === "Jetty" ) {
135+ serverVersionOptions = [
136+ { name : "6" , value : "6" } ,
137+ { name : "7+" , value : "7+" } ,
138+ { name : "12" , value : "12" } ,
139+ ] ;
140+ }
141+ return serverVersionOptions ;
142+ }
0 commit comments