Sfoglia il codice sorgente

qcstockin ui update

reset-do-picking-order
Tommy\2Fi-Staff 2 settimane fa
parent
commit
f3c480b983
5 ha cambiato i file con 73 aggiunte e 51 eliminazioni
  1. +2
    -2
      src/components/Qc/QcStockInModal.tsx
  2. +12
    -10
      src/components/StockIn/CalculateExpiryDateModal.tsx
  3. +28
    -18
      src/components/StockIn/FgStockInForm.tsx
  4. +4
    -4
      src/components/StockIn/ShelfLifeInput.tsx
  5. +27
    -17
      src/components/StockIn/StockInForm.tsx

+ 2
- 2
src/components/Qc/QcStockInModal.tsx Vedi File

@@ -710,9 +710,9 @@ const printQrcode = useCallback(
</Typography> </Typography>
</Grid> </Grid>
{stockInLineInfo.jobOrderId ? ( {stockInLineInfo.jobOrderId ? (
<FgStockInForm itemDetail={stockInLineInfo} disabled={viewOnly || showPutaway} />
<FgStockInForm itemDetail={stockInLineInfo} disabled={viewOnly || showPutaway} compactFields />
) : ( ) : (
<StockInForm itemDetail={stockInLineInfo} disabled={viewOnly || showPutaway} />
<StockInForm itemDetail={stockInLineInfo} disabled={viewOnly || showPutaway} compactFields />
) )
} }
{skipQc === false && ( {skipQc === false && (


+ 12
- 10
src/components/StockIn/CalculateExpiryDateModal.tsx Vedi File

@@ -161,7 +161,7 @@ const CalculateExpiryDateModal: React.FC<Props> = ({
style={{ style={{
flex: 10, flex: 10,
marginBottom: "20px", marginBottom: "20px",
width: "80%",
width: "70%",
// height: "80%", // height: "80%",
position: "fixed", position: "fixed",
top: "50%", top: "50%",
@@ -191,8 +191,8 @@ const CalculateExpiryDateModal: React.FC<Props> = ({
adapterLocale={`${language}-hk`} adapterLocale={`${language}-hk`}
> >
<Stack sx={{mb: 1}}> <Stack sx={{mb: 1}}>
<Typography variant="h4" component="h2" sx={{ fontWeight: 'bold', mb: 2 }}>
{t("Fill in Expiry Date")}
<Typography variant="h6" component="h2" sx={{ fontWeight: 'bold', mb: 2 }}>
{t("Fill in Expiry Date")}
</Typography> </Typography>
</Stack> </Stack>
<Stack> <Stack>
@@ -228,12 +228,13 @@ const CalculateExpiryDateModal: React.FC<Props> = ({
display: 'flex', display: 'flex',
justifyContent: 'center', justifyContent: 'center',
alignItems: 'center', alignItems: 'center',
height: '100%',
alignSelf: 'flex-start',
mt: '8px', // align icon with vertical center of MUI outlined input
height: 56,
}}> }}>
<Add sx={{ <Add sx={{
fontSize: '60px', color:'secondary.main',
transform: 'translate(10%, 15%)',
}}/>
fontSize: '1.25rem', color:'secondary.main',
}}/>
</Grid> </Grid>
<Grid item xs={4}> <Grid item xs={4}>
<ShelfLifeInput <ShelfLifeInput
@@ -252,9 +253,11 @@ const CalculateExpiryDateModal: React.FC<Props> = ({
display: 'flex', display: 'flex',
justifyContent: 'center', justifyContent: 'center',
alignItems: 'center', alignItems: 'center',
height: '100%',
alignSelf: 'flex-start',
mt: '8px',
height: 56,
}}> }}>
<SwapHoriz sx={{fontSize: '80px', color:'secondary.main'}}/>
<SwapHoriz sx={{fontSize: '1.25rem', color:'secondary.main'}}/>
</Grid> </Grid>
<Grid item xs={4}> <Grid item xs={4}>
<DatePicker <DatePicker
@@ -291,7 +294,6 @@ const CalculateExpiryDateModal: React.FC<Props> = ({
name="submit" name="submit"
variant="contained" variant="contained"
startIcon={<Check />} startIcon={<Check />}
sx={{fontSize: '24px'}}
disabled={expiryDate === undefined || hasError} disabled={expiryDate === undefined || hasError}
onClick={handleSubmit} onClick={handleSubmit}
> >


+ 28
- 18
src/components/StockIn/FgStockInForm.tsx Vedi File

@@ -47,6 +47,8 @@ interface Props {
// qc: QcItemWithChecks[]; // qc: QcItemWithChecks[];
disabled: boolean; disabled: boolean;
putawayMode?: boolean; putawayMode?: boolean;
/** When true, use compact field sizing to match Putaway Detail (上架詳情) section. */
compactFields?: boolean;
} }
type EntryError = type EntryError =
| { | {
@@ -90,6 +92,7 @@ const FgStockInForm: React.FC<Props> = ({
itemDetail, itemDetail,
disabled, disabled,
putawayMode = false, putawayMode = false,
compactFields = false,
}) => { }) => {
const { const {
t, t,
@@ -186,7 +189,7 @@ return (
{...register("productLotNo", { {...register("productLotNo", {
// required: "productLotNo required!", // required: "productLotNo required!",
})} })}
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={true} disabled={true}
/> />
</Grid> </Grid>
@@ -199,7 +202,7 @@ return (
{...register("itemName", { {...register("itemName", {
// required: "productLotNo required!", // required: "productLotNo required!",
})} })}
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={true} disabled={true}
// error={Boolean(errors.productLotNo)} // error={Boolean(errors.productLotNo)}
// helperText={errors.productLotNo?.message} // helperText={errors.productLotNo?.message}
@@ -221,7 +224,7 @@ return (
> >
<DatePicker <DatePicker
{...field} {...field}
sx={textfieldSx}
sx={compactFields ? { width: '100%' } : textfieldSx}
label={t("receiptDate")} label={t("receiptDate")}
value={dayjs(watch("receiptDate"))} value={dayjs(watch("receiptDate"))}
format={OUTPUT_DATE_FORMAT} format={OUTPUT_DATE_FORMAT}
@@ -234,6 +237,7 @@ return (
inputRef={field.ref} inputRef={field.ref}
slotProps={{ slotProps={{
textField: { textField: {
fullWidth: true,
// required: true, // required: true,
error: Boolean(errors.receiptDate?.message), error: Boolean(errors.receiptDate?.message),
helperText: errors.receiptDate?.message, helperText: errors.receiptDate?.message,
@@ -255,7 +259,7 @@ return (
{...register("lotNo", { {...register("lotNo", {
// required: "productLotNo required!", // required: "productLotNo required!",
})} })}
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={true} disabled={true}
error={Boolean(errors.productLotNo)} error={Boolean(errors.productLotNo)}
helperText={errors.productLotNo?.message} helperText={errors.productLotNo?.message}
@@ -267,7 +271,7 @@ return (
{...register("productLotNo", { {...register("productLotNo", {
// required: "productLotNo required!", // required: "productLotNo required!",
})} })}
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={true} disabled={true}
error={Boolean(errors.productLotNo)} error={Boolean(errors.productLotNo)}
helperText={errors.productLotNo?.message} helperText={errors.productLotNo?.message}
@@ -286,7 +290,7 @@ return (
> >
<DatePicker <DatePicker
{...field} {...field}
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
label={t("productionDate")} label={t("productionDate")}
value={productionDate ? dayjs(productionDate) : undefined} value={productionDate ? dayjs(productionDate) : undefined}
format={OUTPUT_DATE_FORMAT} format={OUTPUT_DATE_FORMAT}
@@ -326,7 +330,7 @@ return (
> >
<DatePicker <DatePicker
{...field} {...field}
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
label={t("productionDate")} label={t("productionDate")}
value={productionDate ? dayjs(productionDate) : undefined} value={productionDate ? dayjs(productionDate) : undefined}
disabled={disabled} disabled={disabled}
@@ -359,7 +363,7 @@ return (
{...register("qty", { {...register("qty", {
required: "qty required!", required: "qty required!",
})} })}
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={true} disabled={true}
/> />
</Grid></> </Grid></>
@@ -377,7 +381,7 @@ return (
> >
<DatePicker <DatePicker
{...field} {...field}
sx={textfieldSx}
sx={compactFields ? { width: '100%' } : textfieldSx}
label={t("expiryDate")} label={t("expiryDate")}
value={expiryDateValue ? dayjs(expiryDateValue) : null} // Use null instead of undefined value={expiryDateValue ? dayjs(expiryDateValue) : null} // Use null instead of undefined
format={OUTPUT_DATE_FORMAT} format={OUTPUT_DATE_FORMAT}
@@ -395,15 +399,21 @@ return (
onClose={() => setOpenExpDatePicker(false)} onClose={() => setOpenExpDatePicker(false)}
slotProps={{ slotProps={{
textField: { textField: {
fullWidth: true,
InputProps: { InputProps: {
...(!disabled && { ...(!disabled && {
endAdornment: ( endAdornment: (
<InputAdornment position='end'>
<InputAdornment position="end">
<Button <Button
type="button" type="button"
variant="contained" variant="contained"
color="primary" color="primary"
sx={{ fontSize: '24px' }}
size="small"
sx={{
fontSize: compactFields ? '0.875rem' : '24px',
whiteSpace: 'nowrap',
flexShrink: 0,
}}
onClick={handleOpenModal} onClick={handleOpenModal}
> >
{t("Calculate Expiry Date")} {t("Calculate Expiry Date")}
@@ -428,7 +438,7 @@ return (
<TextField <TextField
label={t("acceptedQty")} label={t("acceptedQty")}
fullWidth fullWidth
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={true} disabled={true}
value={itemDetail.acceptedQty} value={itemDetail.acceptedQty}
// disabled={true} // disabled={true}
@@ -443,7 +453,7 @@ return (
{...register("receivedQty", { {...register("receivedQty", {
required: "receivedQty required!", required: "receivedQty required!",
})} })}
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={true} disabled={true}
/> />
)} )}
@@ -456,7 +466,7 @@ return (
required: "uom required!", required: "uom required!",
})} })}
// value={uom?.code} // value={uom?.code}
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={true} disabled={true}
/> />
</Grid> </Grid>
@@ -465,7 +475,7 @@ return (
<TextField <TextField
label={t("processedQty")} label={t("processedQty")}
fullWidth fullWidth
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={true} disabled={true}
value={itemDetail.putAwayLines?.reduce((sum, p) => sum + p.qty, 0) ?? 0} value={itemDetail.putAwayLines?.reduce((sum, p) => sum + p.qty, 0) ?? 0}
/> />
@@ -474,7 +484,7 @@ return (
<TextField <TextField
label={t("acceptedQty")} label={t("acceptedQty")}
fullWidth fullWidth
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={true} disabled={true}
{...register("acceptedQty", { {...register("acceptedQty", {
required: "acceptedQty required!", required: "acceptedQty required!",
@@ -486,7 +496,7 @@ return (
<TextField <TextField
label={t("acceptedQty")} label={t("acceptedQty")}
fullWidth fullWidth
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={true} disabled={true}
{...register("acceptedQty", { {...register("acceptedQty", {
required: "acceptedQty required!", required: "acceptedQty required!",
@@ -529,7 +539,7 @@ return (
open={openModal} open={openModal}
onClose={handleOnModalClose} onClose={handleOnModalClose}
onSubmit={handleReturnExpiryDate} onSubmit={handleReturnExpiryDate}
textfieldSx={textfieldSx}
textfieldSx={compactFields ? undefined : textfieldSx}
/> />
</> </>
); );


+ 4
- 4
src/components/StockIn/ShelfLifeInput.tsx Vedi File

@@ -114,7 +114,7 @@ const ShelfLifeInput: React.FC<ShelfLifeInputProps> = ({ value = 0, onChange = (
inputMode: 'numeric', inputMode: 'numeric',
pattern: '[0-9]*', pattern: '[0-9]*',
}} }}
size="small"
size="medium"
/> />
<TextField <TextField
label="月" label="月"
@@ -126,7 +126,7 @@ const ShelfLifeInput: React.FC<ShelfLifeInputProps> = ({ value = 0, onChange = (
inputMode: 'numeric', inputMode: 'numeric',
pattern: '[0-9]*', pattern: '[0-9]*',
}} }}
size="small"
size="medium"
/> />
<TextField <TextField
label="日" label="日"
@@ -138,11 +138,11 @@ const ShelfLifeInput: React.FC<ShelfLifeInputProps> = ({ value = 0, onChange = (
inputMode: 'numeric', inputMode: 'numeric',
pattern: '[0-9]*', pattern: '[0-9]*',
}} }}
size="small"
size="medium"
/> />
</ShelfLifeContainer> </ShelfLifeContainer>
{showHelperText && ( {showHelperText && (
<FormHelperText sx={{ fontSize: '2rem', mt: 1 }}>
<FormHelperText sx={{ fontSize: '0.875rem', mt: 1 }}>
{label}: <span style={{ color: totalDays < 1 ? 'red':'inherit' }}> {label}: <span style={{ color: totalDays < 1 ? 'red':'inherit' }}>
{/* {formatDuration(duration.years, duration.months, duration.days)} */} {/* {formatDuration(duration.years, duration.months, duration.days)} */}
{totalDays} 日 {totalDays} 日


+ 27
- 17
src/components/StockIn/StockInForm.tsx Vedi File

@@ -34,6 +34,8 @@ interface Props {
// qc: QcItemWithChecks[]; // qc: QcItemWithChecks[];
disabled: boolean; disabled: boolean;
putawayMode?: boolean; putawayMode?: boolean;
/** When true, use compact field sizing to match Putaway Detail (上架詳情) section. */
compactFields?: boolean;
} }
type EntryError = type EntryError =
| { | {
@@ -77,6 +79,7 @@ const StockInForm: React.FC<Props> = ({
itemDetail, itemDetail,
disabled, disabled,
putawayMode = false, putawayMode = false,
compactFields = false,
}) => { }) => {
const { const {
t, t,
@@ -169,7 +172,7 @@ const StockInForm: React.FC<Props> = ({
{...register("dnNo", { {...register("dnNo", {
// required: "productLotNo required!", // required: "productLotNo required!",
})} })}
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={disabled} disabled={disabled}
// error={Boolean(errors.productLotNo)} // error={Boolean(errors.productLotNo)}
// helperText={errors.productLotNo?.message} // helperText={errors.productLotNo?.message}
@@ -182,7 +185,7 @@ const StockInForm: React.FC<Props> = ({
{...register("itemName", { {...register("itemName", {
// required: "productLotNo required!", // required: "productLotNo required!",
})} })}
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={true} disabled={true}
// error={Boolean(errors.productLotNo)} // error={Boolean(errors.productLotNo)}
// helperText={errors.productLotNo?.message} // helperText={errors.productLotNo?.message}
@@ -195,7 +198,7 @@ const StockInForm: React.FC<Props> = ({
{...register("poCode", { {...register("poCode", {
// required: "productLotNo required!", // required: "productLotNo required!",
})} })}
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={true} disabled={true}
// error={Boolean(errors.productLotNo)} // error={Boolean(errors.productLotNo)}
// helperText={errors.productLotNo?.message} // helperText={errors.productLotNo?.message}
@@ -216,7 +219,7 @@ const StockInForm: React.FC<Props> = ({
> >
<DatePicker <DatePicker
{...field} {...field}
sx={textfieldSx}
sx={compactFields ? { width: '100%' } : textfieldSx}
label={t("receiptDate")} label={t("receiptDate")}
value={dayjs(watch("receiptDate"))} value={dayjs(watch("receiptDate"))}
format={OUTPUT_DATE_FORMAT} format={OUTPUT_DATE_FORMAT}
@@ -229,6 +232,7 @@ const StockInForm: React.FC<Props> = ({
inputRef={field.ref} inputRef={field.ref}
slotProps={{ slotProps={{
textField: { textField: {
fullWidth: true,
// required: true, // required: true,
error: Boolean(errors.receiptDate?.message), error: Boolean(errors.receiptDate?.message),
helperText: errors.receiptDate?.message, helperText: errors.receiptDate?.message,
@@ -247,7 +251,7 @@ const StockInForm: React.FC<Props> = ({
{...register("supplier", { {...register("supplier", {
// required: "productLotNo required!", // required: "productLotNo required!",
})} })}
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={true} disabled={true}
/> />
</Grid> </Grid>
@@ -261,7 +265,7 @@ const StockInForm: React.FC<Props> = ({
{...register("lotNo", { {...register("lotNo", {
// required: "productLotNo required!", // required: "productLotNo required!",
})} })}
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={disabled} disabled={disabled}
error={Boolean(errors.productLotNo)} error={Boolean(errors.productLotNo)}
helperText={errors.productLotNo?.message} helperText={errors.productLotNo?.message}
@@ -273,7 +277,7 @@ const StockInForm: React.FC<Props> = ({
{...register("productLotNo", { {...register("productLotNo", {
// required: "productLotNo required!", // required: "productLotNo required!",
})} })}
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={disabled} disabled={disabled}
error={Boolean(errors.productLotNo)} error={Boolean(errors.productLotNo)}
helperText={errors.productLotNo?.message} helperText={errors.productLotNo?.message}
@@ -292,7 +296,7 @@ const StockInForm: React.FC<Props> = ({
> >
<DatePicker <DatePicker
{...field} {...field}
sx={textfieldSx}
sx={compactFields ? { width: '100%' } : textfieldSx}
label={t("expiryDate")} label={t("expiryDate")}
value={expiryDate ? dayjs(expiryDate) : undefined} value={expiryDate ? dayjs(expiryDate) : undefined}
format={OUTPUT_DATE_FORMAT} format={OUTPUT_DATE_FORMAT}
@@ -309,14 +313,20 @@ const StockInForm: React.FC<Props> = ({
onClose={() => setOpenExpDatePicker(false)} onClose={() => setOpenExpDatePicker(false)}
slotProps={{ slotProps={{
textField: { textField: {
fullWidth: true,
InputProps: { InputProps: {
...(!disabled && {endAdornment: ( ...(!disabled && {endAdornment: (
<InputAdornment position='end'>
<InputAdornment position="end">
<Button <Button
type="button" type="button"
variant="contained" variant="contained"
color="primary" color="primary"
sx={{ fontSize: '24px' }}
size="small"
sx={{
fontSize: compactFields ? '0.875rem' : '24px',
whiteSpace: 'nowrap',
flexShrink: 0,
}}
onClick={handleOpenModal} onClick={handleOpenModal}
> >
{t("Calculate Expiry Date")} {t("Calculate Expiry Date")}
@@ -344,7 +354,7 @@ const StockInForm: React.FC<Props> = ({
{...register("receivedQty", { {...register("receivedQty", {
required: "receivedQty required!", required: "receivedQty required!",
})} })}
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={true} disabled={true}
/> />
</Grid> </Grid>
@@ -355,7 +365,7 @@ const StockInForm: React.FC<Props> = ({
{...register("qty", { {...register("qty", {
required: "qty required!", required: "qty required!",
})} })}
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={true} disabled={true}
/> />
</Grid></> </Grid></>
@@ -365,7 +375,7 @@ const StockInForm: React.FC<Props> = ({
<TextField <TextField
label={t("acceptedQty")} label={t("acceptedQty")}
fullWidth fullWidth
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={true} disabled={true}
value={itemDetail.acceptedQty} value={itemDetail.acceptedQty}
// disabled={true} // disabled={true}
@@ -383,7 +393,7 @@ const StockInForm: React.FC<Props> = ({
required: "uom required!", required: "uom required!",
})} })}
// value={uom?.code} // value={uom?.code}
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={true} disabled={true}
/> />
</Grid> </Grid>
@@ -392,7 +402,7 @@ const StockInForm: React.FC<Props> = ({
<TextField <TextField
label={t("processedQty")} label={t("processedQty")}
fullWidth fullWidth
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={true} disabled={true}
value={itemDetail.putAwayLines?.reduce((sum, p) => sum + p.qty, 0) ?? 0} value={itemDetail.putAwayLines?.reduce((sum, p) => sum + p.qty, 0) ?? 0}
// disabled={true} // disabled={true}
@@ -404,7 +414,7 @@ const StockInForm: React.FC<Props> = ({
<TextField <TextField
label={t("acceptedQty")} label={t("acceptedQty")}
fullWidth fullWidth
sx={textfieldSx}
sx={compactFields ? undefined : textfieldSx}
disabled={true} disabled={true}
{...register("acceptedQty", { {...register("acceptedQty", {
required: "acceptedQty required!", required: "acceptedQty required!",
@@ -452,7 +462,7 @@ const StockInForm: React.FC<Props> = ({
open={openModal} open={openModal}
onClose={handleOnModalClose} onClose={handleOnModalClose}
onSubmit={handleReturnExpiryDate} onSubmit={handleReturnExpiryDate}
textfieldSx={textfieldSx}
textfieldSx={compactFields ? undefined : textfieldSx}
/> />
</> </>
); );


Caricamento…
Annulla
Salva