This commit is contained in:
menxipeng
2025-10-24 23:16:19 +08:00
parent 0d32f2d187
commit f63bd1f626
9 changed files with 270 additions and 263 deletions

View File

@@ -380,7 +380,7 @@ export default function EquipmentPage() {
<Filter className="h-4 w-4 mr-2" />
<SelectValue placeholder="筛选状态" />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
<SelectItem value="all"></SelectItem>
<SelectItem value="1"></SelectItem>
<SelectItem value="2"></SelectItem>
@@ -420,10 +420,10 @@ export default function EquipmentPage() {
onValueChange={(value) => setNewEquipment({ ...newEquipment, type: value })}
disabled={loadingEquipmentTypes}
>
<SelectTrigger>
<SelectTrigger className="w-full">
<SelectValue placeholder={loadingEquipmentTypes ? "加载中..." : "选择设备类型"} />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
{Object.entries(equipmentTypes).map(([key, value]) => (
<SelectItem key={key} value={key}>
{value}
@@ -462,7 +462,7 @@ export default function EquipmentPage() {
: "选择商户"
} />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px] overflow-y-auto">
{merchants.length === 0 && !loadingMerchants ? (
<SelectItem value="no-data" disabled>
@@ -501,10 +501,10 @@ export default function EquipmentPage() {
value={newEquipment.status}
onValueChange={(value) => setNewEquipment({ ...newEquipment, status: value })}
>
<SelectTrigger>
<SelectTrigger className="w-full">
<SelectValue placeholder="选择设备状态" />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
<SelectItem value="normal"></SelectItem>
<SelectItem value="expiring"></SelectItem>
<SelectItem value="expired"></SelectItem>
@@ -564,10 +564,10 @@ export default function EquipmentPage() {
onValueChange={(value) => setEditEquipment({ ...editEquipment, type: value })}
disabled={loadingEquipmentTypes}
>
<SelectTrigger>
<SelectTrigger className="w-full">
<SelectValue placeholder={loadingEquipmentTypes ? "加载中..." : "选择设备类型"} />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
{Object.entries(equipmentTypes).map(([key, value]) => (
<SelectItem key={key} value={key}>
{value}
@@ -592,10 +592,10 @@ export default function EquipmentPage() {
onValueChange={(value) => setEditEquipment({ ...editEquipment, merchantId: value })}
disabled={loadingMerchants}
>
<SelectTrigger>
<SelectTrigger className="w-full">
<SelectValue placeholder={loadingMerchants ? "加载中..." : "选择商户"} />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
{merchants.map((merchant) => (
<SelectItem key={merchant.id} value={merchant.merchantsId || merchant.id}>
{merchant.merchantName}
@@ -628,10 +628,10 @@ export default function EquipmentPage() {
value={editEquipment.status}
onValueChange={(value) => setEditEquipment({ ...editEquipment, status: value })}
>
<SelectTrigger>
<SelectTrigger className="w-full">
<SelectValue placeholder="选择设备状态" />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
<SelectItem value="normal"></SelectItem>
<SelectItem value="expiring"></SelectItem>
<SelectItem value="expired"></SelectItem>
@@ -745,7 +745,7 @@ export default function EquipmentPage() {
<div className="space-y-1">
<div className="flex items-center space-x-2">
<Shield className="h-4 w-4 text-blue-600" />
<span className="font-medium text-blue-600">{item.equId}</span>
<span className="font-medium text-blue-600">{item.equipmentId}</span>
</div>
<div className="text-sm font-medium">{item.equipmentName}</div>
<div className="text-xs text-gray-500">: {equipmentTypeDisplay}</div>

View File

@@ -416,10 +416,10 @@ export default function MallsPage() {
onValueChange={(value) => setNewMall({ ...newMall, provinceCode: value })}
disabled={loading}
>
<SelectTrigger>
<SelectTrigger className="w-full">
<SelectValue placeholder="请选择省份" />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
{provinces.map((province) => (
<SelectItem key={province.code} value={province.code}>
{province.name}
@@ -435,7 +435,7 @@ export default function MallsPage() {
onValueChange={(value) => setNewMall({ ...newMall, mallUserId: value })}
disabled={loading || !newMall.provinceCode}
>
<SelectTrigger>
<SelectTrigger className="w-full">
<SelectValue placeholder={
!newMall.provinceCode
? "请先选择省份"
@@ -444,7 +444,7 @@ export default function MallsPage() {
: "请选择商场"
} />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
{mallUsers.map((mallUser) => (
<SelectItem key={mallUser.userId} value={mallUser.userId}>
<div className="flex flex-col items-start">

View File

@@ -676,7 +676,7 @@ export default function MerchantsPage() {
{merchant.mallLocation || "无"}
</div>
</TableCell>
<TableCell>{merchant.dealerId || "无"}</TableCell>
<TableCell>{merchant.dealerName || "无"}</TableCell>
<TableCell>
<div className="flex items-start">
<MapPin className="h-4 w-4 mr-1 text-gray-400 mt-0.5 flex-shrink-0" />
@@ -774,11 +774,12 @@ export default function MerchantsPage() {
</Card>
<Dialog open={isAddMerchantOpen} onOpenChange={setIsAddMerchantOpen}>
<DialogContent className="max-w-2xl">
<DialogHeader>
<DialogContent className="max-w-2xl max-h-[90vh] flex flex-col">
<DialogHeader className="flex-shrink-0">
<DialogTitle></DialogTitle>
<DialogDescription></DialogDescription>
</DialogHeader>
<div className="flex-1 overflow-y-auto pr-2">
<div className="grid grid-cols-2 gap-4">
<div className="space-y-2">
<Label htmlFor="province"></Label>
@@ -792,10 +793,10 @@ export default function MerchantsPage() {
}
}}
>
<SelectTrigger>
<SelectTrigger className="w-full">
<SelectValue placeholder={loadingProvinces ? "加载中..." : "选择省份"} />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
{provinces.length === 0 && !loadingProvinces ? (
<SelectItem value="no-data" disabled>
@@ -824,7 +825,7 @@ export default function MerchantsPage() {
}}
disabled={loadingMalls || !newMerchant.province}
>
<SelectTrigger>
<SelectTrigger className="w-full">
<SelectValue placeholder={
!newMerchant.province
? "请先选择省份"
@@ -833,7 +834,7 @@ export default function MerchantsPage() {
: "选择商场(可选)"
} />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
{malls.map((mall) => (
<SelectItem key={mall.mallUser || mall.id} value={mall.mallUser}>
{mall.mallName}
@@ -882,10 +883,10 @@ export default function MerchantsPage() {
}
}}
>
<SelectTrigger>
<SelectTrigger className="w-full">
<SelectValue placeholder={loadingTotalMerchants ? "加载中..." : "选择总商户(可选)"} />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
{totalMerchants.map((merchant) => (
<SelectItem key={merchant.userId} value={merchant.userId}>
{merchant.nickName}
@@ -906,7 +907,8 @@ export default function MerchantsPage() {
/>
</div>
</div>
<div className="flex justify-end space-x-2 mt-6">
</div>
<div className="flex justify-end space-x-2 mt-6 flex-shrink-0 pt-4 border-t">
<Button
variant="outline"
onClick={() => setIsAddMerchantOpen(false)}
@@ -946,10 +948,10 @@ export default function MerchantsPage() {
value={newEquipment.type}
onValueChange={(value) => setNewEquipment({ ...newEquipment, type: value })}
>
<SelectTrigger>
<SelectTrigger className="w-full">
<SelectValue placeholder="选择设备类型" />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
<SelectItem value="干粉灭火器"></SelectItem>
<SelectItem value="烟雾探测器"></SelectItem>
<SelectItem value="自动喷淋"></SelectItem>
@@ -1016,11 +1018,12 @@ export default function MerchantsPage() {
{/* 编辑商户对话框 */}
<Dialog open={isEditMerchantOpen} onOpenChange={setIsEditMerchantOpen}>
<DialogContent className="max-w-2xl">
<DialogHeader>
<DialogContent className="max-w-2xl max-h-[90vh] flex flex-col">
<DialogHeader className="flex-shrink-0">
<DialogTitle></DialogTitle>
<DialogDescription></DialogDescription>
</DialogHeader>
<div className="flex-1 overflow-y-auto pr-2">
<div className="grid grid-cols-2 gap-4">
<div className="space-y-2">
<Label htmlFor="edit-province"></Label>
@@ -1029,10 +1032,10 @@ export default function MerchantsPage() {
onValueChange={handleEditProvinceChange}
disabled={loadingProvinces}
>
<SelectTrigger>
<SelectTrigger className="w-full">
<SelectValue placeholder={loadingProvinces ? "加载中..." : "选择省份"} />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
{provinces.map((province) => (
<SelectItem key={province.code} value={province.code}>
{province.name}
@@ -1055,7 +1058,7 @@ export default function MerchantsPage() {
}}
disabled={loadingMalls || !editMerchant.province}
>
<SelectTrigger>
<SelectTrigger className="w-full">
<SelectValue placeholder={
!editMerchant.province
? "请先选择省份"
@@ -1064,7 +1067,7 @@ export default function MerchantsPage() {
: "选择商场(可选)"
} />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
{malls.map((mall) => (
<SelectItem key={mall.mallUser || mall.id} value={mall.mallUser}>
{mall.mallName}
@@ -1113,10 +1116,10 @@ export default function MerchantsPage() {
}
}}
>
<SelectTrigger>
<SelectTrigger className="w-full">
<SelectValue placeholder={loadingTotalMerchants ? "加载中..." : "选择总商户(可选)"} />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
{totalMerchants.map((merchant) => (
<SelectItem key={merchant.userId} value={merchant.userId}>
{merchant.nickName}
@@ -1137,7 +1140,8 @@ export default function MerchantsPage() {
/>
</div>
</div>
<div className="flex justify-end space-x-2 mt-6">
</div>
<div className="flex justify-end space-x-2 mt-6 flex-shrink-0 pt-4 border-t">
<Button
variant="outline"
onClick={() => setIsEditMerchantOpen(false)}

View File

@@ -298,7 +298,7 @@ export default function WorkOrdersPage() {
</Button>
</DialogTrigger>
<DialogContent className="max-w-2xl">
<DialogContent className="max-w-2xl max-h-[90vh] overflow-y-auto">
<DialogHeader>
<DialogTitle></DialogTitle>
<DialogDescription></DialogDescription>
@@ -394,7 +394,7 @@ export default function WorkOrdersPage() {
<SelectTrigger className="w-full sm:w-32">
<SelectValue placeholder="状态" />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
<SelectItem value="all"></SelectItem>
<SelectItem value="1"></SelectItem>
<SelectItem value="2"></SelectItem>
@@ -410,7 +410,7 @@ export default function WorkOrdersPage() {
<SelectTrigger className="w-full sm:w-32">
<SelectValue placeholder="工人" />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
<SelectItem value="all"></SelectItem>
{uniqueWorkers.map((worker) => (
<SelectItem key={worker} value={worker}>
@@ -723,10 +723,10 @@ function CreateWorkOrderForm({ onClose }: { onClose: () => void }) {
<SelectTrigger>
<SelectValue placeholder={loadingMerchants ? "加载中..." : "请先选择商户"} />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px] overflow-y-auto">
{merchants.map((merchant) => (
<SelectItem key={merchant.id} value={merchant.id}>
{merchant.merchantName} - {merchant.mallLocation || "无商场"}
{merchant.merchantName} - {merchant.contactPerson} - {merchant.mallLocation || "无商场"}
</SelectItem>
))}
</SelectContent>
@@ -751,7 +751,7 @@ function CreateWorkOrderForm({ onClose }: { onClose: () => void }) {
: "选择设备"
} />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px] overflow-y-auto">
{availableEquipment.map((equipment) => (
<SelectItem key={equipment.id} value={equipment.equipmentId}>
{equipment.equipmentName} ({equipment.equipmentType})
@@ -764,10 +764,10 @@ function CreateWorkOrderForm({ onClose }: { onClose: () => void }) {
<div className="space-y-2">
<Label htmlFor="type"></Label>
<Select value={formData.type} onValueChange={(value) => setFormData({ ...formData, type: value })}>
<SelectTrigger>
<SelectTrigger className="w-full">
<SelectValue placeholder="选择类型" />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
<SelectItem value="设备检测"></SelectItem>
<SelectItem value="故障维修"></SelectItem>
<SelectItem value="设备安装"></SelectItem>
@@ -790,7 +790,7 @@ function CreateWorkOrderForm({ onClose }: { onClose: () => void }) {
<SelectTrigger>
<SelectValue placeholder={loadingWorkers ? "加载中..." : "选择维修工人"} />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px] overflow-y-auto">
{workers.map((worker) => (
<SelectItem key={worker.id} value={worker.id}>
{worker.name} - {worker.province} ({worker.phone})

View File

@@ -622,7 +622,7 @@ export default function WorkersPage() {
<SelectTrigger>
<SelectValue placeholder="选择省份" />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
{provinces.map((province) => (
<SelectItem key={province.code} value={province.code}>
{province.name}
@@ -640,7 +640,7 @@ export default function WorkersPage() {
<SelectTrigger>
<SelectValue placeholder="选择经销商" />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
{dealers.map((dealer) => (
<SelectItem key={dealer.userId} value={dealer.userId}>
{dealer.userName}
@@ -708,7 +708,7 @@ export default function WorkersPage() {
<SelectTrigger>
<SelectValue placeholder="选择省份" />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
{provinces.map((province) => (
<SelectItem key={province.code} value={province.code}>
{province.name}
@@ -726,7 +726,7 @@ export default function WorkersPage() {
<SelectTrigger>
<SelectValue placeholder="选择经销商" />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
{dealers.map((dealer) => (
<SelectItem key={dealer.userId} value={dealer.userId}>
{dealer.userName}
@@ -889,7 +889,7 @@ export default function WorkersPage() {
<SelectTrigger className="w-32">
<SelectValue placeholder="省份" />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
<SelectItem value="all"></SelectItem>
{provinces.map((province) => (
<SelectItem key={province.code} value={province.code}>
@@ -902,7 +902,7 @@ export default function WorkersPage() {
<SelectTrigger className="w-32">
<SelectValue placeholder="技能等级" />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
<SelectItem value="all"></SelectItem>
<SelectItem value="高级技师"></SelectItem>
<SelectItem value="中级技师"></SelectItem>
@@ -913,7 +913,7 @@ export default function WorkersPage() {
<SelectTrigger className="w-64">
<SelectValue placeholder="选择工单" />
</SelectTrigger>
<SelectContent>
<SelectContent className="max-h-[300px]">
<SelectItem value="all"></SelectItem>
{workOrders.map((order) => (
<SelectItem key={order.value} value={order.value}>

View File

@@ -61,7 +61,7 @@ function SelectContent({
<SelectPrimitive.Content
data-slot="select-content"
className={cn(
"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md",
"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-[300px] min-w-[8rem] overflow-hidden rounded-md border shadow-md",
position === "popper" &&
"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
className
@@ -72,9 +72,9 @@ function SelectContent({
<SelectScrollUpButton />
<SelectPrimitive.Viewport
className={cn(
"p-1",
"p-1 max-h-[280px] overflow-y-auto",
position === "popper" &&
"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"
"w-full min-w-[var(--radix-select-trigger-width)]"
)}
>
{children}

View File

@@ -47,3 +47,4 @@ export async function deleteService(id: string): Promise<ServiceResponse> {
}
}

View File

@@ -10,3 +10,4 @@ export async function getUserByRoleKey(roleKey: string): Promise<UserByRoleRespo
}
}

View File

@@ -42,3 +42,4 @@ export interface UserByRoleResponse {
data: User[]
}