void }) {
+export function ToastStack({ toasts, onClose }: { toasts: AdminToast[]; onClose: (id: string) => void }) {
if (!toasts.length) return null;
return (
-
+
{toasts.map((toast) => (
-
- {toast.tone === "success" ? : }
-
- {toast.title}
- {toast.message}
-
-
-
+
+ {toast.tone === "success" ? (
+
+ ) : (
+
+ )}
+
+ {toast.title}
+ {toast.message}
+
+ onClose(toast.id)} />
+
))}
-
+
);
}
diff --git a/WonderQ-Admin-UI/src/components/admin/WanfaRouteDetailFields.tsx b/WonderQ-Admin-UI/src/components/admin/WanfaRouteDetailFields.tsx
index 56ed514..a947239 100644
--- a/WonderQ-Admin-UI/src/components/admin/WanfaRouteDetailFields.tsx
+++ b/WonderQ-Admin-UI/src/components/admin/WanfaRouteDetailFields.tsx
@@ -1,5 +1,7 @@
import type { DetailCreate } from "@/api";
+import { ImageGalleryUploader } from "@/components/admin/ImageGalleryUploader";
import { Input } from "@/components/ui/input";
+import { Switch } from "@/components/ui/switch";
import { Textarea } from "@/components/ui/textarea";
const detailArrayFields = [
@@ -7,7 +9,6 @@ const detailArrayFields = [
["included", "费用包含", "每行填写一项包含内容"],
["excluded", "费用不含", "每行填写一项不包含内容"],
["notes", "注意事项", "每行填写一项注意事项"],
- ["gallery", "详情图片画廊", "每行填写一个 http(s) 图片地址"],
] as const;
type DetailArrayField = (typeof detailArrayFields)[number][0];
@@ -100,21 +101,39 @@ export function WanfaRouteDetailFields({
);
diff --git a/WonderQ-Admin-UI/src/components/ui/select.tsx b/WonderQ-Admin-UI/src/components/ui/select.tsx
index db56dd2..845088e 100644
--- a/WonderQ-Admin-UI/src/components/ui/select.tsx
+++ b/WonderQ-Admin-UI/src/components/ui/select.tsx
@@ -1,7 +1,129 @@
import * as React from "react";
+import * as SelectPrimitive from "@radix-ui/react-select";
+import { Check, ChevronDown, ChevronUp } from "lucide-react";
import { cn } from "@/lib/utils";
+const Select = SelectPrimitive.Root;
+const SelectGroup = SelectPrimitive.Group;
+const SelectValue = SelectPrimitive.Value;
+
+const SelectTrigger = React.forwardRef<
+ React.ElementRef