Explorar el Código

🐛 fix(components): 修复城市选择器回调参数类型及表单设置逻辑

- 将城市选择器组件的回调函数参数类型从 `number` 扩展为 `number | undefined`,以支持清空操作
- 在地址编辑页面中,为表单设置值添加空值检查,仅在值不为 `undefined` 时才更新表单字段
- 从管理后台主布局中移除未使用的 `Input` 组件导入和 `setCollapsed` 状态设置器
- 从管理后台菜单配置中移除未使用的 `Megaphone` 图标导入,并明确用户菜单项的类型定义
yourname hace 2 semanas
padre
commit
74153d0773

+ 4 - 4
mini/src/components/ui/city-selector.tsx

@@ -15,10 +15,10 @@ interface CitySelectorProps {
   cityValue?: number
   districtValue?: number
   townValue?: number
-  onProvinceChange?: (value: number) => void
-  onCityChange?: (value: number) => void
-  onDistrictChange?: (value: number) => void
-  onTownChange?: (value: number) => void
+  onProvinceChange?: (value: number | undefined) => void
+  onCityChange?: (value: number | undefined) => void
+  onDistrictChange?: (value: number | undefined) => void
+  onTownChange?: (value: number | undefined) => void
   disabled?: boolean
   showLabels?: boolean
 }

+ 4 - 4
mini/src/pages/address-edit/index.tsx

@@ -189,10 +189,10 @@ export default function AddressEditPage() {
                       cityValue={form.watch('city')}
                       districtValue={form.watch('district')}
                       townValue={form.watch('town')}
-                      onProvinceChange={(value) => form.setValue('province', value)}
-                      onCityChange={(value) => form.setValue('city', value)}
-                      onDistrictChange={(value) => form.setValue('district', value)}
-                      onTownChange={(value) => form.setValue('town', value)}
+                      onProvinceChange={(value) => value !== undefined && form.setValue('province', value)}
+                      onCityChange={(value) => value !== undefined && form.setValue('city', value)}
+                      onDistrictChange={(value) => value !== undefined && form.setValue('district', value)}
+                      onTownChange={(value) => value !== undefined && form.setValue('town', value)}
                       showLabels={false}
                     />
                   </View>

+ 2 - 3
web/src/client/admin/layouts/MainLayout.tsx

@@ -13,7 +13,6 @@ import { useAuth } from '../hooks/AuthProvider';
 import { useMenu, type MenuItem } from '../menu';
 import { getGlobalConfig } from '@/client/utils/utils';
 import { Button } from '@/client/components/ui/button';
-import { Input } from '@/client/components/ui/input';
 import { Avatar, AvatarFallback, AvatarImage } from '@/client/components/ui/avatar';
 import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from '@/client/components/ui/dropdown-menu';
 import { Sheet, SheetContent, SheetHeader, SheetTitle } from '@/client/components/ui/sheet';
@@ -168,8 +167,8 @@ export const MainLayout = () => {
           <div className="flex items-center gap-2">
             <Button
               variant="ghost"
-              size="sm" 
-              onClick={() => setIsMobileMenuOpen(true)}
+              size="sm"
+              onClick={() => setCollapsed(!collapsed)}
               data-testid="mobile-menu-button"
             >
               <Menu className="h-4 w-4" />

+ 2 - 2
web/src/client/admin/menu.tsx

@@ -6,7 +6,6 @@ import {
   Settings,
   LogOut,
   File,
-  Megaphone,
   Package,
   Truck,
   TrendingUp,
@@ -21,6 +20,7 @@ export interface MenuItem {
   path?: string;
   permission?: string;
   onClick?: () => void;
+  type?: 'separator';
 }
 
 /**
@@ -263,7 +263,7 @@ export const useMenu = () => {
   ];
 
   // 用户菜单项
-  const userMenuItems = [
+  const userMenuItems: MenuItem[] = [
     // {
     //   key: 'profile',
     //   label: '个人资料',