| @@ -52,11 +52,15 @@ const style = { | |||
| left: "50%", | |||
| transform: "translate(-50%, -50%)", | |||
| bgcolor: "background.paper", | |||
| pt: 5, | |||
| px: 5, | |||
| pb: 5, | |||
| // width: "auto", | |||
| width: { xs: "90%", sm: "90%", md: "90%" }, | |||
| pt: { xs: 0.5, sm: 1, md: 1.5 }, | |||
| px: { xs: 1, sm: 1.5, md: 2 }, | |||
| pb: { xs: 0.5, sm: 1, md: 1.5 }, | |||
| width: { xs: "95%", sm: "85%", md: "75%", lg: "70%" }, | |||
| maxWidth: "900px", | |||
| maxHeight: { xs: "98vh", sm: "95vh", md: "90vh" }, | |||
| overflow: "hidden", | |||
| display: "flex", | |||
| flexDirection: "column", | |||
| }; | |||
| const scannerStyle = { | |||
| @@ -65,11 +69,11 @@ const scannerStyle = { | |||
| left: "50%", | |||
| transform: "translate(-50%, -50%)", | |||
| bgcolor: "background.paper", | |||
| pt: 5, | |||
| px: 5, | |||
| pb: 10, | |||
| // width: "auto", | |||
| width: { xs: "60%", sm: "60%", md: "60%" }, | |||
| pt: { xs: 2, sm: 3, md: 4 }, | |||
| px: { xs: 2, sm: 3, md: 4 }, | |||
| pb: { xs: 6, sm: 7, md: 8 }, | |||
| width: { xs: "85%", sm: "70%", md: "60%" }, | |||
| maxWidth: "600px", | |||
| }; | |||
| const PutAwayModal: React.FC<Props> = ({ open, onClose, warehouse, stockInLineId, warehouseId, scanner, addPutAwayHistory }) => { | |||
| @@ -334,191 +338,249 @@ const PutAwayModal: React.FC<Props> = ({ open, onClose, warehouse, stockInLineId | |||
| component="form" | |||
| onSubmit={formProps.handleSubmit(onSubmit)} | |||
| > | |||
| <Grid container xs={12}> | |||
| <Grid item xs={12}> | |||
| {itemDetail != undefined ? ( | |||
| <> | |||
| <Stack direction="column" justifyContent="flex-end" gap={1}> | |||
| <Typography variant="h4"> | |||
| 處理上架 | |||
| </Typography> | |||
| <Grid item xs={12}> | |||
| {itemDetail.jobOrderId ? ( | |||
| <FgStockInForm itemDetail={itemDetail} disabled={true} putawayMode={true}/> | |||
| ) : ( | |||
| <StockInForm itemDetail={itemDetail} disabled={true} putawayMode={true}/> | |||
| )} | |||
| </Grid> | |||
| <Paper sx={{ mt: 2, padding: 2, width: "100%", backgroundColor: verified ? '#bceb19' : '#FCD34D' }}> | |||
| <Grid | |||
| container | |||
| spacing={2} | |||
| direction="row" | |||
| justifyContent="space-between" | |||
| alignItems="strecth" | |||
| sx={{ width: '100%' }} | |||
| > | |||
| <Grid item xs={5}> | |||
| <Box sx={{ | |||
| mb: 2, p: 2, backgroundColor: verified ? '#bceb19' : '#FCD34D', borderRadius: 0, | |||
| display: 'flex', flexDirection: 'row', gap: 1, flexWrap: 'wrap' }} | |||
| > | |||
| <Grid container> | |||
| {verified? ( | |||
| <> | |||
| <CheckCircle sx={{color:"green", fontSize: "35px", mr: 1}}/> | |||
| <Typography variant="h5" component="h2" sx={{ fontWeight: 'bold', color: 'black' }} noWrap> | |||
| 掃瞄完成 | |||
| </Typography> | |||
| </> | |||
| ) : ( | |||
| <> | |||
| <ErrorOutline sx={{color:"red", fontSize: "35px", mr: 1}}/> | |||
| <Typography variant="h5" component="h2" sx={{ fontWeight: 'bold', color: 'black' }} noWrap> | |||
| 請掃瞄倉庫二維碼 | |||
| </Typography> | |||
| </> | |||
| ) | |||
| } | |||
| <QrCode sx={{fontSize: "35px"}}/> | |||
| </Grid> | |||
| <Grid container> | |||
| <Typography variant="h4" sx={{ fontWeight: 'bold', color: 'black' }} noWrap> | |||
| {warehouseDisplay} <span style={{fontSize: "45px", color: "black"}}>{verified ? "" : `(建議)`}</span> | |||
| </Typography> | |||
| </Grid> | |||
| </Box> | |||
| <Box sx={{ overflow: "hidden", flex: 1, display: "flex", flexDirection: "column" }}> | |||
| <Grid container xs={12}> | |||
| <Grid item xs={12}> | |||
| {itemDetail != undefined ? ( | |||
| <> | |||
| <Stack direction="column" justifyContent="flex-end" gap={0.25} sx={{ mb: 0.5 }}> | |||
| <Typography variant="h4" sx={{ fontSize: { xs: "0.95rem", sm: "1.1rem", md: "1.3rem" }, mb: 0.25, lineHeight: 1.2 }}> | |||
| 處理上架 | |||
| </Typography> | |||
| <Box sx={{ "& .MuiFormControl-root": { mb: 0.5 }, "& .MuiTextField-root": { mb: 0.5 }, "& .MuiGrid-item": { mb: 0.25 } }}> | |||
| <Grid item xs={12}> | |||
| {itemDetail.jobOrderId ? ( | |||
| <FgStockInForm itemDetail={itemDetail} disabled={true} putawayMode={true}/> | |||
| ) : ( | |||
| <StockInForm itemDetail={itemDetail} disabled={true} putawayMode={true}/> | |||
| )} | |||
| </Grid> | |||
| <Grid item xs={3}> | |||
| <Box sx={{ height: '100%', p: 2, textAlign: 'center', display: "flex", | |||
| flexDirection: "column", justifyContent: "center", }}> | |||
| <TextField | |||
| type="number" | |||
| label={t("putQty")} | |||
| fullWidth | |||
| sx={{ | |||
| flex: 1, | |||
| "& .MuiInputBase-input": { | |||
| padding: "20px 14px 5px", | |||
| fontSize: "50px", | |||
| fontWeight: "bold", | |||
| }, | |||
| "& .MuiInputBase-root": { | |||
| height: "100%", | |||
| borderColor: "black", | |||
| }, | |||
| "& .MuiInputLabel-root": { | |||
| fontSize: 30, | |||
| top: "-5px", | |||
| color: "black", | |||
| }, | |||
| "& .MuiFormHelperText-root": { | |||
| fontSize: "20px", | |||
| marginTop: "8px", | |||
| lineHeight: "1.2", | |||
| }, | |||
| </Box> | |||
| <Paper sx={{ mt: 0.5, padding: { xs: 0.5, sm: 0.75, md: 1 }, width: "100%", backgroundColor: verified ? '#bceb19' : '#FCD34D' }}> | |||
| <Grid | |||
| container | |||
| spacing={{ xs: 0.5, sm: 0.75, md: 1 }} | |||
| direction="row" | |||
| justifyContent="space-between" | |||
| alignItems="stretch" | |||
| sx={{ width: '100%' }} | |||
| > | |||
| <Grid item xs={12} sm={5}> | |||
| <Box sx={{ | |||
| mb: { xs: 0.25, md: 0.5 }, | |||
| p: { xs: 0.5, sm: 0.75, md: 1 }, | |||
| backgroundColor: verified ? '#bceb19' : '#FCD34D', | |||
| borderRadius: 0, | |||
| display: 'flex', | |||
| flexDirection: 'row', | |||
| gap: 0.25, | |||
| flexWrap: 'wrap' | |||
| }} | |||
| defaultValue={itemDetail?.demandQty!! - totalPutAwayQty} | |||
| // defaultValue={itemDetail.demandQty} | |||
| onChange={(e) => { | |||
| const value = e.target.value; | |||
| validateQty(Number(value)); | |||
| setPutQty(Number(value)); | |||
| }} | |||
| onKeyDown={(e) => { | |||
| // Prevent non-numeric characters | |||
| if (["e", "E", "+", "-", "."].includes(e.key)) { | |||
| e.preventDefault(); | |||
| > | |||
| <Grid container> | |||
| {verified? ( | |||
| <> | |||
| <CheckCircle sx={{ | |||
| color:"green", | |||
| fontSize: { xs: "16px", sm: "20px", md: "24px" }, | |||
| mr: 0.25 | |||
| }}/> | |||
| <Typography | |||
| variant="h5" | |||
| component="h2" | |||
| sx={{ | |||
| fontWeight: 'bold', | |||
| color: 'black', | |||
| fontSize: { xs: "0.75rem", sm: "0.9rem", md: "1rem" }, | |||
| lineHeight: 1.2 | |||
| }} | |||
| noWrap | |||
| > | |||
| 掃瞄完成 | |||
| </Typography> | |||
| </> | |||
| ) : ( | |||
| <> | |||
| <ErrorOutline sx={{ | |||
| color:"red", | |||
| fontSize: { xs: "16px", sm: "20px", md: "24px" }, | |||
| mr: 0.25 | |||
| }}/> | |||
| <Typography | |||
| variant="h5" | |||
| component="h2" | |||
| sx={{ | |||
| fontWeight: 'bold', | |||
| color: 'black', | |||
| fontSize: { xs: "0.75rem", sm: "0.9rem", md: "1rem" }, | |||
| lineHeight: 1.2 | |||
| }} | |||
| noWrap | |||
| > | |||
| 請掃瞄倉庫二維碼 | |||
| </Typography> | |||
| </> | |||
| ) | |||
| } | |||
| }} | |||
| // onBlur={(e) => { | |||
| // const value = e.target.value; | |||
| // setPutQty(Number(value)); | |||
| // validateQty(Number(value)); | |||
| // }} | |||
| // disabled={true} | |||
| // {...register("acceptedQty", { | |||
| // required: "acceptedQty required!", | |||
| // })} | |||
| error={qtyError !== ""} | |||
| helperText={qtyError} | |||
| /> | |||
| </Box> | |||
| </Grid> | |||
| <Grid item xs={4}> | |||
| <Box | |||
| sx={{ | |||
| p: 1, | |||
| textAlign: 'center', | |||
| height: '100%', // Ensure D stretches to full height | |||
| display: 'flex', | |||
| alignItems: 'center', | |||
| justifyContent: 'center', | |||
| <QrCode sx={{ fontSize: { xs: "16px", sm: "20px", md: "24px" } }}/> | |||
| </Grid> | |||
| <Grid container> | |||
| <Typography | |||
| variant="h4" | |||
| sx={{ | |||
| fontWeight: 'bold', | |||
| color: 'black', | |||
| fontSize: { xs: "0.85rem", sm: "1rem", md: "1.25rem" }, | |||
| lineHeight: 1.2 | |||
| }} | |||
| noWrap | |||
| > | |||
| {warehouseDisplay} <Box component="span" sx={{ fontSize: { xs: "0.95rem", sm: "1.2rem", md: "1.5rem" }, color: "black" }}>{verified ? "" : `(建議)`}</Box> | |||
| </Typography> | |||
| </Grid> | |||
| </Box> | |||
| </Grid> | |||
| <Grid item xs={12} sm={3}> | |||
| <Box sx={{ | |||
| height: '100%', | |||
| p: { xs: 0.25, sm: 0.5, md: 0.75 }, | |||
| textAlign: 'center', | |||
| display: "flex", | |||
| flexDirection: "column", | |||
| justifyContent: "center", | |||
| }}> | |||
| <Button | |||
| id="putawaySubmit" | |||
| type="submit" | |||
| <TextField | |||
| type="number" | |||
| label={t("putQty")} | |||
| fullWidth | |||
| size="small" | |||
| sx={{ | |||
| flex: 1, | |||
| "& .MuiInputBase-input": { | |||
| padding: { xs: "6px 6px 1px", sm: "8px 8px 2px", md: "10px 10px 3px" }, | |||
| fontSize: { xs: "16px", sm: "22px", md: "32px" }, | |||
| fontWeight: "bold", | |||
| height: { xs: "32px", sm: "40px", md: "48px" }, | |||
| }, | |||
| "& .MuiInputBase-root": { | |||
| height: "100%", | |||
| borderColor: "black", | |||
| }, | |||
| "& .MuiInputLabel-root": { | |||
| fontSize: { xs: "10px", sm: "12px", md: "18px" }, | |||
| top: "-2px", | |||
| color: "black", | |||
| }, | |||
| "& .MuiFormHelperText-root": { | |||
| fontSize: { xs: "9px", sm: "10px", md: "14px" }, | |||
| marginTop: "2px", | |||
| lineHeight: "1.1", | |||
| }, | |||
| }} | |||
| defaultValue={itemDetail?.demandQty!! - totalPutAwayQty} | |||
| // defaultValue={itemDetail.demandQty} | |||
| onChange={(e) => { | |||
| const value = e.target.value; | |||
| validateQty(Number(value)); | |||
| setPutQty(Number(value)); | |||
| }} | |||
| onKeyDown={(e) => { | |||
| // Prevent non-numeric characters | |||
| if (["e", "E", "+", "-", "."].includes(e.key)) { | |||
| e.preventDefault(); | |||
| } | |||
| }} | |||
| // onBlur={(e) => { | |||
| // const value = e.target.value; | |||
| // setPutQty(Number(value)); | |||
| // validateQty(Number(value)); | |||
| // }} | |||
| // disabled={true} | |||
| // {...register("acceptedQty", { | |||
| // required: "acceptedQty required!", | |||
| // })} | |||
| error={qtyError !== ""} | |||
| helperText={qtyError} | |||
| /> | |||
| </Box> | |||
| </Grid> | |||
| <Grid item xs={12} sm={4}> | |||
| <Box | |||
| sx={{ | |||
| p: { xs: 0.25, sm: 0.5, md: 0.75 }, | |||
| textAlign: 'center', | |||
| height: '100%', // Ensure D stretches to full height | |||
| display: 'flex', | |||
| alignItems: 'center', | |||
| justifyContent: 'center', | |||
| }}> | |||
| <Button | |||
| id="putawaySubmit" | |||
| type="submit" | |||
| variant="contained" | |||
| startIcon={<Check sx={{ fontSize: { xs: "14px", sm: "16px", md: "20px" } }} />} | |||
| color="secondary" | |||
| size="small" | |||
| sx={{ | |||
| height: "100%", | |||
| flex: "0 0 auto", | |||
| padding: { xs: "3px 6px", sm: "4px 8px", md: "6px 12px" }, | |||
| fontSize: { xs: "9px", sm: "11px", md: "18px" }, | |||
| whiteSpace: "nowrap", | |||
| textAlign: "center", | |||
| border: "1.5px solid", // Add outline | |||
| borderColor: "blue", | |||
| minHeight: { xs: "32px", sm: "36px", md: "40px" }, | |||
| "&:hover": { | |||
| borderColor: "grey.200", // Slightly different color on hover | |||
| backgroundColor: "secondary.dark", // Darker background on hover | |||
| }, | |||
| "&:disabled": { | |||
| borderColor: "grey.400", // Visible outline even when disabled | |||
| opacity: 0.7, // Slightly faded but still visible | |||
| }, | |||
| }} | |||
| // onClick={formProps.handleSubmit()} | |||
| disabled={!verified || qtyError != ""} | |||
| > | |||
| {t("confirm putaway")} | |||
| </Button> | |||
| </Box> | |||
| {/* <Button | |||
| id="scanWarehouse" | |||
| variant="contained" | |||
| startIcon={<Check />} | |||
| color="secondary" | |||
| startIcon={<QrCode />} | |||
| color="primary" | |||
| // sx={{ mx: 3, minWidth : "120px", height: "80px", | |||
| // padding: "12px 12px", fontSize: "24px"}} | |||
| sx={{ | |||
| height: "100%", | |||
| flex: "0 0 auto", | |||
| padding: "8px 16px", | |||
| fontSize: { xs: "20px", sm: "24px", md: "30px" }, | |||
| fontSize: { xs: "16px", sm: "20px", md: "24px" }, | |||
| whiteSpace: "nowrap", | |||
| textAlign: "center", | |||
| border: "3px solid", // Add outline | |||
| borderColor: "blue", | |||
| "&:hover": { | |||
| borderColor: "grey.200", // Slightly different color on hover | |||
| backgroundColor: "secondary.dark", // Darker background on hover | |||
| }, | |||
| "&:disabled": { | |||
| borderColor: "grey.400", // Visible outline even when disabled | |||
| opacity: 0.7, // Slightly faded but still visible | |||
| }, | |||
| }} | |||
| // onClick={formProps.handleSubmit()} | |||
| disabled={!verified || qtyError != ""} | |||
| > | |||
| {t("confirm putaway")} | |||
| </Button> | |||
| </Box> | |||
| {/* <Button | |||
| id="scanWarehouse" | |||
| variant="contained" | |||
| startIcon={<QrCode />} | |||
| color="primary" | |||
| // sx={{ mx: 3, minWidth : "120px", height: "80px", | |||
| // padding: "12px 12px", fontSize: "24px"}} | |||
| sx={{ | |||
| flex: "0 0 auto", | |||
| padding: "8px 16px", | |||
| fontSize: { xs: "16px", sm: "20px", md: "24px" }, | |||
| whiteSpace: "nowrap", | |||
| textAlign: "center",}} | |||
| onClick={openScanner}> | |||
| textAlign: "center",}} | |||
| onClick={openScanner}> | |||
| {t("scan warehouse")} | |||
| </Button> */} | |||
| {t("scan warehouse")} | |||
| </Button> */} | |||
| </Grid> | |||
| </Grid> | |||
| </Grid> | |||
| </Paper> | |||
| </Stack> | |||
| </> | |||
| ) : ( | |||
| // <ReactQrCodeScanner scannerConfig={scannerConfig} /> | |||
| <> | |||
| <Typography variant="h4"> | |||
| {t("scan loading")} | |||
| </Typography> | |||
| <LoadingComponent/> | |||
| </> | |||
| )} | |||
| </Paper> | |||
| </Stack> | |||
| </> | |||
| ) : ( | |||
| // <ReactQrCodeScanner scannerConfig={scannerConfig} /> | |||
| <> | |||
| <Typography variant="h4" sx={{ fontSize: { xs: "0.95rem", sm: "1.1rem", md: "1.3rem" } }}> | |||
| {t("scan loading")} | |||
| </Typography> | |||
| <LoadingComponent/> | |||
| </> | |||
| )} | |||
| </Grid> | |||
| </Grid> | |||
| </Grid> | |||
| </Box> | |||
| <Modal open={isOpenScanner} onClose={scannerCloseHandler}> | |||
| <Box sx={scannerStyle}> | |||
| <Typography variant="h4" sx={{ | |||
| @@ -527,7 +589,9 @@ const PutAwayModal: React.FC<Props> = ({ open, onClose, warehouse, stockInLineId | |||
| justifyContent: 'center', | |||
| margin: 0, | |||
| alignItems: 'center', | |||
| textAlign: 'center',}} | |||
| textAlign: 'center', | |||
| fontSize: { xs: "0.95rem", sm: "1.1rem", md: "1.3rem" } | |||
| }} | |||
| > | |||
| {t("Please scan warehouse qr code")} | |||
| </Typography> | |||
| @@ -541,4 +605,4 @@ const PutAwayModal: React.FC<Props> = ({ open, onClose, warehouse, stockInLineId | |||
| ); | |||
| }; | |||
| export default PutAwayModal; | |||
| export default PutAwayModal; | |||