From 806c8c1242cf33568e65e964593e0945defe7c56 Mon Sep 17 00:00:00 2001 From: "kelvin.yau" Date: Fri, 13 Mar 2026 15:17:34 +0800 Subject: [PATCH] A4 printer routing and register, see backend --- src/app/api/settings/printer/actions.ts | 1 + src/app/api/settings/printer/index.ts | 2 + .../CreatePrinter/CreatePrinter.tsx | 46 ++++++++++++++++ src/components/EditPrinter/EditPrinter.tsx | 54 ++++++++++++++++++- .../PrinterSearch/PrinterSearch.tsx | 16 ++++++ src/i18n/zh/common.json | 3 +- 6 files changed, 120 insertions(+), 2 deletions(-) diff --git a/src/app/api/settings/printer/actions.ts b/src/app/api/settings/printer/actions.ts index 21ceb3a..5ed68e0 100644 --- a/src/app/api/settings/printer/actions.ts +++ b/src/app/api/settings/printer/actions.ts @@ -12,6 +12,7 @@ export interface PrinterInputs { name?: string; code?: string; type?: string; + brand?: string; description?: string; ip?: string; port?: number; diff --git a/src/app/api/settings/printer/index.ts b/src/app/api/settings/printer/index.ts index a4c4117..3173551 100644 --- a/src/app/api/settings/printer/index.ts +++ b/src/app/api/settings/printer/index.ts @@ -10,6 +10,7 @@ export interface PrinterCombo { code?: string; name?: string; type?: string; + brand?: string; description?: string; ip?: string; port?: number; @@ -21,6 +22,7 @@ export interface PrinterResult { name?: string; code?: string; type?: string; + brand?: string; description?: string; ip?: string; port?: number; diff --git a/src/components/CreatePrinter/CreatePrinter.tsx b/src/components/CreatePrinter/CreatePrinter.tsx index b72de16..07542ec 100644 --- a/src/components/CreatePrinter/CreatePrinter.tsx +++ b/src/components/CreatePrinter/CreatePrinter.tsx @@ -30,6 +30,7 @@ const CreatePrinter: React.FC = () => { ip: "", port: undefined, type: "A4", + brand: "Canon", dpi: undefined, description: "", }); @@ -50,6 +51,18 @@ const CreatePrinter: React.FC = () => { if (formData.type !== "Label") { setFormData((prev) => ({ ...prev, dpi: undefined })); } + if (formData.type === "A4") { + // A4: allow Canon/Brother (keep whatever is selected, default Canon from initial state) + if (!formData.brand) { + setFormData((prev) => ({ ...prev, brand: "Canon" })); + } + } else if (formData.type === "Label") { + // Label: preview Zebra + setFormData((prev) => ({ ...prev, brand: "Zebra" })); + } else { + // Other types (if any): no brand + setFormData((prev) => ({ ...prev, brand: undefined })); + } }, [formData.type]); const handleChange = useCallback((field: keyof PrinterInputs) => { @@ -74,6 +87,13 @@ const CreatePrinter: React.FC = () => { })); }, []); + const handleBrandChange = useCallback((e: SelectChangeEvent) => { + setFormData((prev) => ({ + ...prev, + brand: e.target.value, + })); + }, []); + const handleDescriptionChange = useCallback((_e: any, newValue: string | null) => { setFormData((prev) => ({ ...prev, @@ -155,6 +175,32 @@ const CreatePrinter: React.FC = () => { + {formData.type === "A4" && ( + + + {t("Brand")} + + + + )} + + {formData.type === "Label" && ( + + + + )} = ({ printer }) => { ip: printer.ip || "", port: printer.port || undefined, type: printer.type || "", + brand: printer.brand ?? "Canon", dpi: printer.dpi || undefined, + description: printer.description || "", }); useEffect(() => { if (formData.type !== "Label") { setFormData((prev) => ({ ...prev, dpi: undefined })); } + if (formData.type === "A4") { + if (!formData.brand) { + setFormData((prev) => ({ ...prev, brand: "Canon" })); + } + } else if (formData.type === "Label") { + setFormData((prev) => ({ ...prev, brand: "Zebra" })); + } else { + setFormData((prev) => ({ ...prev, brand: undefined })); + } }, [formData.type]); const handleChange = useCallback((field: keyof PrinterInputs) => { @@ -63,6 +73,14 @@ const EditPrinter: React.FC = ({ printer }) => { })); }, []); + const handleBrandChange = useCallback((e: SelectChangeEvent) => { + const value = e.target.value; + setFormData((prev) => ({ + ...prev, + brand: value, + })); + }, []); + const handleSubmit = useCallback(async () => { setIsSubmitting(true); try { @@ -123,6 +141,31 @@ const EditPrinter: React.FC = ({ printer }) => { + {formData.type === "A4" && ( + + + {t("Brand")} + + + + )} + {formData.type === "Label" && ( + + + + )} = ({ printer }) => { disabled={formData.type !== "Label"} /> + + +