+ items={filteredUser}
+ columns={columns}
+ pagingController={pagingController}
+ setPagingController={setPagingController}
+ totalCount={filteredUser.length}
+ isAutoPaging={true}
+ />
+
+
+
+
+
+
+
+
+
+ 已選擇用戶 ({selectedUsers.length})
+
+
+
+
+
+
+
+
+
+
+
+
+ {t("Username")}
+
+
+ {t("staffNo")}
+
+
+
+
+ {selectedUsers.length === 0 ? (
+
+
+ 沒有選擇的用戶
+
+
+ ) : (
+ selectedUsers.map((user) => (
+
+ {user.username || '-'}
+ {user.staffNo || '-'}
+
+ ))
+ )}
+
+
+
+
+
+
+
+
+ options={filteredPrinters}
+ value={selectedPrinter ?? null}
+ onChange={(event, value) => {
+ setSelectedPrinter(value ?? undefined);
+ }}
+ getOptionLabel={(option) => option.name || option.label || option.code || String(option.id)}
+ renderInput={(params) => (
+
+ )}
+ />
+ {
+ const value = parseInt(e.target.value) || 1;
+ setPrintQty(Math.max(1, value));
+ }}
+ inputProps={{ min: 1 }}
+ sx={{ width: 120 }}
+ />
+ }
+ onClick={handlePrint}
+ disabled={checkboxIds.length === 0 || filteredPrinters.length === 0}
+ color="primary"
+ >
+ 列印
+
+ }
+ onClick={() => handleDownloadQrCode(checkboxIds)}
+ disabled={checkboxIds.length === 0}
+ color="primary"
+ >
+ 下載QR碼
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {previewUrl && (
+
+ )}
+
+
+
+ >
+ );
+};
+
+export default QrCodeHandleSearch;
\ No newline at end of file
diff --git a/src/components/qrCodeHandles/qrCodeHandleSearchLoading.tsx b/src/components/qrCodeHandles/qrCodeHandleSearchLoading.tsx
new file mode 100644
index 0000000..fa580af
--- /dev/null
+++ b/src/components/qrCodeHandles/qrCodeHandleSearchLoading.tsx
@@ -0,0 +1,40 @@
+import Card from "@mui/material/Card";
+import CardContent from "@mui/material/CardContent";
+import Skeleton from "@mui/material/Skeleton";
+import Stack from "@mui/material/Stack";
+import React from "react";
+
+// Can make this nicer
+export const qrCodeHandleSearchLoading: React.FC = () => {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+};
+
+export default qrCodeHandleSearchLoading;
diff --git a/src/components/qrCodeHandles/qrCodeHandleSearchWrapper.tsx b/src/components/qrCodeHandles/qrCodeHandleSearchWrapper.tsx
new file mode 100644
index 0000000..e884c01
--- /dev/null
+++ b/src/components/qrCodeHandles/qrCodeHandleSearchWrapper.tsx
@@ -0,0 +1,21 @@
+import React from "react";
+import QrCodeHandleSearch from "./qrCodeHandleSearch";
+import QrCodeHandleSearchLoading from "./qrCodeHandleSearchLoading";
+import { fetchUser } from "@/app/api/user";
+import { fetchPrinterCombo } from "@/app/api/settings/printer";
+
+interface SubComponents {
+ Loading: typeof QrCodeHandleSearchLoading;
+}
+
+const QrCodeHandleSearchWrapper: React.FC & SubComponents = async () => {
+ const [users, printerCombo] = await Promise.all([
+ fetchUser(),
+ fetchPrinterCombo(),
+ ]);
+ return ;
+};
+
+QrCodeHandleSearchWrapper.Loading = QrCodeHandleSearchLoading;
+
+export default QrCodeHandleSearchWrapper;
\ No newline at end of file
diff --git a/src/components/qrCodeHandles/qrCodeHandleTabs.tsx b/src/components/qrCodeHandles/qrCodeHandleTabs.tsx
new file mode 100644
index 0000000..1e56940
--- /dev/null
+++ b/src/components/qrCodeHandles/qrCodeHandleTabs.tsx
@@ -0,0 +1,66 @@
+"use client";
+
+import { useState, ReactNode } from "react";
+import { Box, Tabs, Tab } from "@mui/material";
+import { useTranslation } from "react-i18next";
+
+interface TabPanelProps {
+ children?: ReactNode;
+ index: number;
+ value: number;
+}
+
+function TabPanel(props: TabPanelProps) {
+ const { children, value, index, ...other } = props;
+
+ return (
+
+ {value === index && {children}}
+
+ );
+}
+
+interface QrCodeHandleTabsProps {
+ userTabContent: ReactNode;
+ equipmentTabContent: ReactNode;
+}
+
+const QrCodeHandleTabs: React.FC = ({
+ userTabContent,
+ equipmentTabContent,
+}) => {
+ const { t } = useTranslation("common");
+ const { t: tUser } = useTranslation("user");
+ const [currentTab, setCurrentTab] = useState(0);
+
+ const handleTabChange = (event: React.SyntheticEvent, newValue: number) => {
+ setCurrentTab(newValue);
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+ {userTabContent}
+
+
+
+ {equipmentTabContent}
+
+
+ );
+};
+
+export default QrCodeHandleTabs;
\ No newline at end of file
diff --git a/src/i18n/zh/common.json b/src/i18n/zh/common.json
index 579f64f..05d0f9e 100644
--- a/src/i18n/zh/common.json
+++ b/src/i18n/zh/common.json
@@ -101,6 +101,23 @@
"QC Check Template": "QC檢查模板",
"Mail": "郵件",
"Import Testing": "匯入測試",
+ "FG":"成品",
+ "Qty":"數量",
+ "FG & Material Demand Forecast Detail":"成品及材料需求預測詳情",
+ "View item In-out And inventory Ledger":"查看物料出入庫及庫存日誌",
+ "Delivery Order":"送貨訂單",
+ "Detail Scheduling":"詳細排程",
+ "Customer":"客戶",
+ "qcItem":"品檢項目",
+ "Item":"物料",
+ "Production Date":"生產日期",
+ "QC Check Item":"QC品檢項目",
+ "QC Category":"QC品檢模板",
+ "qcCategory":"品檢模板",
+ "QC Check Template":"QC檢查模板",
+ "QR Code Handle":"二維碼列印及下載",
+ "Mail":"郵件",
+ "Import Testing":"匯入測試",
"Overview": "總覽",
"Projects": "專案",
"Create Project": "新增專案",
@@ -112,12 +129,24 @@
"scheduling": "排程",
"settings": "設定",
"items": "物料",
+ "edit":"編輯",
+ "Edit Equipment Type":"設備類型詳情",
+ "Edit Equipment":"設備詳情",
+ "equipmentType":"設備種類",
+ "Description":"描述",
"edit": "編輯",
"Edit Equipment Type": "設備類型詳情",
"Edit Equipment": "設備詳情",
"equipmentType": "設備類型",
"Description": "描述",
"Details": "詳情",
+ "Equipment Type Details":"設備類型詳情",
+ "Equipment Type":"設備類型",
+ "Save":"儲存",
+ "Cancel":"取消",
+ "Equipment Details":"設備詳情",
+ "Exclude Date":"排除日期",
+ "Finished Goods Name":"成品名稱",
"Equipment Type Details": "設備類型詳情",
"Save": "儲存",
"Cancel": "取消",
diff --git a/src/i18n/zh/jo.json b/src/i18n/zh/jo.json
index fa10abf..0048d23 100644
--- a/src/i18n/zh/jo.json
+++ b/src/i18n/zh/jo.json
@@ -461,6 +461,7 @@
"QC Category":"QC品檢模板",
"qcCategory":"品檢模板",
"QC Check Template":"QC檢查模板",
+ "QR Code Handle":"二維碼列印及下載",
"Mail":"郵件",
"Import Testing":"匯入測試",
"Overview": "總覽",
diff --git a/src/i18n/zh/user.json b/src/i18n/zh/user.json
index 22c76a3..796605b 100644
--- a/src/i18n/zh/user.json
+++ b/src/i18n/zh/user.json
@@ -1,5 +1,6 @@
{
"Create User": "新增用戶",
+ "Edit User": "編輯用戶資料",
"User Detail": "用戶詳細資料",
"User Authority": "用戶權限",
"Authority Pool": "權限池",
@@ -24,5 +25,8 @@
"Search by Authority or description or position.": "搜尋權限、描述或職位。",
"Remove": "移除",
"User": "用戶",
- "user": "用戶"
+ "user": "用戶",
+ "qrcode": "二維碼",
+ "staffNo": "員工編號",
+ "Rows per page": "每頁行數"
}
\ No newline at end of file
diff --git a/src/main/java/com/ffii/fpsms/modules/user/req/UpdateUserReq.java b/src/main/java/com/ffii/fpsms/modules/user/req/UpdateUserReq.java
new file mode 100644
index 0000000..b28b04f
--- /dev/null
+++ b/src/main/java/com/ffii/fpsms/modules/user/req/UpdateUserReq.java
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/main/java/com/ffii/fpsms/modules/user/web/UserController.java b/src/main/java/com/ffii/fpsms/modules/user/web/UserController.java
new file mode 100644
index 0000000..b28b04f
--- /dev/null
+++ b/src/main/java/com/ffii/fpsms/modules/user/web/UserController.java
@@ -0,0 +1,3 @@
+
+
+