@@ -3,7 +3,7 @@ import type { AllClubs } from '@@/types/api/user/all_clubs'
3
3
import { Button } from ' @/components/ui/button'
4
4
import { Calendar } from ' @/components/ui/calendar'
5
5
import { Card , CardContent , CardDescription , CardHeader , CardTitle } from ' @/components/ui/card'
6
- import { Multiselect } from ' @/components/ui/multiselect '
6
+ import { Checkbox } from ' @/components/ui/checkbox '
7
7
import {
8
8
NumberField ,
9
9
NumberFieldContent ,
@@ -39,12 +39,12 @@ const formSchema = toTypedSchema(z.object({
39
39
club: z .string (),
40
40
date: z
41
41
.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 字符 " ),
44
44
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 小时 " ),
48
48
}))
49
49
50
50
const { data, suspense } = useQuery <AllClubs >({
@@ -68,6 +68,17 @@ const { handleSubmit, resetForm, setFieldValue, values } = useForm({
68
68
},
69
69
})
70
70
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
+
71
82
const calendarPlaceholder = ref ()
72
83
const calendarValue = computed ({
73
84
get : () => values .date ? parseDate (values .date ) : undefined ,
@@ -148,7 +159,7 @@ const onSubmit = handleSubmit(async (values) => {
148
159
!calendarValue && 'text-muted-foreground',
149
160
)"
150
161
>
151
- <span >{{ calendarValue ? df.format(toDate(calendarValue)) : "Pick a date " }}</span >
162
+ <span >{{ calendarValue ? df.format(toDate(calendarValue)) : "请选择日期... " }}</span >
152
163
<CalendarIcon class =" ms-auto h-4 w-4 opacity-50" />
153
164
</Button >
154
165
<input hidden >
@@ -212,13 +223,16 @@ const onSubmit = handleSubmit(async (values) => {
212
223
</FormField >
213
224
</div >
214
225
215
- <FormField v-slot =" { componentField }" name =" text" >
226
+ <FormField v-slot =" { componentField, value }" name =" text" >
216
227
<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 >
218
232
<FormControl >
219
233
<Textarea
220
234
class =" resize-none"
221
- placeholder =" 详细记录,最多一百字 ..."
235
+ placeholder =" 详细记录,最多三百字 ..."
222
236
v-bind =" componentField"
223
237
:disabled =" isLoading"
224
238
/>
@@ -229,24 +243,30 @@ const onSubmit = handleSubmit(async (values) => {
229
243
230
244
<FormField v-slot =" { componentField }" name =" members" >
231
245
<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 >
233
249
<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 >
250
270
</FormControl >
251
271
<FormMessage />
252
272
</FormItem >
@@ -260,4 +280,4 @@ const onSubmit = handleSubmit(async (values) => {
260
280
</CardContent >
261
281
</Card >
262
282
<Toaster />
263
- </template >
283
+ </template >
0 commit comments