@@ -3,7 +3,7 @@ import type { AllClubs } from '@@/types/api/user/all_clubs'
33import { Button } from ' @/components/ui/button'
44import { Calendar } from ' @/components/ui/calendar'
55import { Card , CardContent , CardDescription , CardHeader , CardTitle } from ' @/components/ui/card'
6- import { Multiselect } from ' @/components/ui/multiselect '
6+ import { Checkbox } from ' @/components/ui/checkbox '
77import {
88 NumberField ,
99 NumberFieldContent ,
@@ -39,12 +39,12 @@ const formSchema = toTypedSchema(z.object({
3939 club: z .string (),
4040 date: z
4141 .string ()
42- .refine (v => v , { message: ' A date of birth is required. ' }),
43- text: z .string ().min (10 ).max (300 ),
42+ .refine (v => v , { message: ' 日期为必填项 ' }),
43+ text: z .string ().min (10 , " 字数不得少于 10 字符 " ).max (300 , " 字数不得大于 300 字符 " ),
4444 members: z .array (z .string ().uuid ()),
45- cTime: z .number ().min (0 ).max (5 ),
46- aTime: z .number ().min (0 ).max (5 ),
47- sTime: z .number ().min (0 ).max (5 ),
45+ cTime: z .number ().min (0 ).max (5 , " 时长不得大于 5 小时 " ),
46+ aTime: z .number ().min (0 ).max (5 , " 时长不得大于 5 小时 " ),
47+ sTime: z .number ().min (0 ).max (5 , " 时长不得大于 5 小时 " ),
4848}))
4949
5050const { data, suspense } = useQuery <AllClubs >({
@@ -68,6 +68,17 @@ const { handleSubmit, resetForm, setFieldValue, values } = useForm({
6868 },
6969})
7070
71+ const selectedMembers = ref <string []>([])
72+
73+ const handleCheckboxChange = (memberId : string , checked : boolean ) => {
74+ if (checked ) {
75+ selectedMembers .value .push (memberId )
76+ } else {
77+ selectedMembers .value = selectedMembers .value .filter (id => id !== memberId )
78+ }
79+ setFieldValue (' members' , selectedMembers .value )
80+ }
81+
7182const calendarPlaceholder = ref ()
7283const calendarValue = computed ({
7384 get : () => values .date ? parseDate (values .date ) : undefined ,
@@ -148,7 +159,7 @@ const onSubmit = handleSubmit(async (values) => {
148159 !calendarValue && 'text-muted-foreground',
149160 )"
150161 >
151- <span >{{ calendarValue ? df.format(toDate(calendarValue)) : "Pick a date " }}</span >
162+ <span >{{ calendarValue ? df.format(toDate(calendarValue)) : "请选择日期... " }}</span >
152163 <CalendarIcon class =" ms-auto h-4 w-4 opacity-50" />
153164 </Button >
154165 <input hidden >
@@ -212,13 +223,16 @@ const onSubmit = handleSubmit(async (values) => {
212223 </FormField >
213224 </div >
214225
215- <FormField v-slot =" { componentField }" name =" text" >
226+ <FormField v-slot =" { componentField, value }" name =" text" >
216227 <FormItem >
217- <FormLabel >活动概要</FormLabel >
228+ <div class =" flex items-center justify-between" >
229+ <FormLabel >活动概要</FormLabel >
230+ <span class =" text-sm text-muted-foreground" >{{ value?.length || 0 }}/300</span >
231+ </div >
218232 <FormControl >
219233 <Textarea
220234 class =" resize-none"
221- placeholder =" 详细记录,最多一百字 ..."
235+ placeholder =" 详细记录,最多三百字 ..."
222236 v-bind =" componentField"
223237 :disabled =" isLoading"
224238 />
@@ -229,24 +243,30 @@ const onSubmit = handleSubmit(async (values) => {
229243
230244 <FormField v-slot =" { componentField }" name =" members" >
231245 <FormItem >
232- <FormLabel >参与者</FormLabel >
246+ <div class =" flex items-center justify-between" >
247+ <FormLabel >参与者 <span class =" text-sm text-muted-foreground" >({{ selectedMembers.length }}/{{ (([...data.president, ...data.vice].find(club => club.id === Number(selectedClub))?.memberships) ?? []).length }})</span ></FormLabel >
248+ </div >
233249 <FormControl >
234- <Multiselect
235- v-if =" data"
236- :options =" ((
237- [...data.president, ...data.vice].find(
238- (club) => club.id === Number(selectedClub),
239- )
240- )?.memberships)?.map((membership) => ({
241- label: membership.name,
242- value: membership.id,
243- })) ?? []"
244- placeholder =" Select options"
245- variant =" inverted"
246- v-bind =" componentField"
247- :animation =" 2"
248- :max-count =" 3"
249- />
250+ <div class =" flex flex-wrap gap-x-2 gap-y-2" >
251+ <div
252+ v-for =" member in (
253+ [...data.president, ...data.vice].find(
254+ club => club.id === Number(selectedClub)
255+ )?.memberships
256+ ) ?? []"
257+ :key =" member.id"
258+ class =" flex items-center space-x-1"
259+ >
260+ <Checkbox
261+ :id =" member.id"
262+ :value =" member.id"
263+ :checked =" selectedMembers.includes(member.id)"
264+ @update:checked =" (checked) => handleCheckboxChange(member.id, checked)"
265+ class =" w-3.5 h-3.5"
266+ />
267+ <Label :for =" member.id" >{{ member.name }}</Label >
268+ </div >
269+ </div >
250270 </FormControl >
251271 <FormMessage />
252272 </FormItem >
@@ -260,4 +280,4 @@ const onSubmit = handleSubmit(async (values) => {
260280 </CardContent >
261281 </Card >
262282 <Toaster />
263- </template >
283+ </template >
0 commit comments