Commit 68d3275f authored by John Lam's avatar John Lam

Merge branch 'AFP-14' into 'dev'

Afp 14: update product form (frontend)

See merge request !7
parents 775cec94 126ba0b9
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { useHistory, useParams } from "react-router"; import { useHistory, useParams } from "react-router";
import Config from "../config"; import emptyProduct from "../emptProduct";
const emptyForm = { const emptyForm = {
sku: "", ...emptyProduct,
upc: "", imageFile: "",
productName: "",
brand: "",
category: "",
price: 0.0,
availableStock: 0,
productDescription: "",
productImageUrl: "",
productImage: "",
}; };
ProductForm.defaultProps = { ProductForm.defaultProps = {
...@@ -21,27 +13,33 @@ ProductForm.defaultProps = { ...@@ -21,27 +13,33 @@ ProductForm.defaultProps = {
export default function ProductForm(props) { export default function ProductForm(props) {
const { method } = props; const { method } = props;
const [form, setForm] = useState(emptyForm); const [form, setForm] = useState({ ...emptyForm });
const [imageMode, setImageMode] = useState("url");
const [errors, setErrors] = useState([]); const [errors, setErrors] = useState([]);
const history = useHistory(); const history = useHistory();
const { sku } = useParams(); const { productId } = useParams("productId");
useEffect(() => { useEffect(() => {
fetch(`${Config.inventoryUrl}/${sku}`).then((res) => { fetch(`http://localhost:8080/api/products/${productId}/`).then((res) => {
if (res.ok) { if (res.ok) {
res console.log(res);
.json() res.json().then((data) => {
.then((data) => Object.keys(data).forEach((key) => {
setForm({ ...data, availableStock: data.stock, productImage: "" }) if (data[key] === null) {
); data[key] = "";
} }
}); });
}, [sku]); console.log(data);
setForm({ ...data, availableStock: data.stock });
});
}
});
}, [productId]);
const validate = () => { const validate = () => {
setErrors([]); setErrors([]);
const errs = []; const errs = [];
console.log(form)
if (form.sku.length < 3) { if (form.sku.length < 3) {
errs.push("SKU must be at least 3 characters"); errs.push("SKU must be at least 3 characters");
} }
...@@ -70,6 +68,11 @@ export default function ProductForm(props) { ...@@ -70,6 +68,11 @@ export default function ProductForm(props) {
const onSubmit = (e) => { const onSubmit = (e) => {
e.preventDefault(); e.preventDefault();
validate(); validate();
if (imageMode === "url") {
delete form.imageFile;
} else {
delete form.prodImgUrl;
}
if (errors.length === 0) { if (errors.length === 0) {
// console.log(form); // console.log(form);
...@@ -124,6 +127,7 @@ export default function ProductForm(props) { ...@@ -124,6 +127,7 @@ export default function ProductForm(props) {
type="text" type="text"
className="form-control" className="form-control"
id="productSku" id="productSku"
disabled={method === "PUT" ? true : false}
value={form.sku} value={form.sku}
onChange={(e) => setForm({ ...form, sku: e.target.value })} onChange={(e) => setForm({ ...form, sku: e.target.value })}
/> />
...@@ -191,12 +195,12 @@ export default function ProductForm(props) { ...@@ -191,12 +195,12 @@ export default function ProductForm(props) {
</div> </div>
</div> </div>
<div className="col-6"> <div className="col-6">
<label htmlFor="productDescription" className="form-label"> <label htmlFor="productDesc" className="form-label">
Description Description
</label> </label>
<textarea <textarea
name="productDescription" name="productDesciption"
id="productDescription" id="productDesc"
cols="40" cols="40"
rows="7" rows="7"
className="form-control" className="form-control"
...@@ -229,51 +233,70 @@ export default function ProductForm(props) { ...@@ -229,51 +233,70 @@ export default function ProductForm(props) {
<input <input
disabled={method === "PUT" ? true : false} disabled={method === "PUT" ? true : false}
required required
name="stock" name="availableStock"
type="number" type="number"
className="form-control" className="form-control"
id="stock" id="stock"
value={form.availableStock} value={form.availableStock}
onChange={(e) => onChange={(e) => setForm({ ...form, availableStock: e.target.value })}
setForm({ ...form, availableStock: e.target.value })
}
/> />
</div> </div>
</div> </div>
{imageMode === "upload" ? (
<div className="row mt-3"> <div className="row mt-3">
<div>
<label htmlFor="productImage" className="form-label"> <label htmlFor="productImage" className="form-label">
Product Image Image File
</label> </label>
<input <input
id="productImageUrl" id="productImage"
name="productImageUrl" name="imageFile"
className="form-control form-control-lg" className="form-control form-control-lg"
type="url" type="file"
placeholder="Enter image URL here or upload image below..." value={form.imageFile}
value={form.productImageUrl}
onChange={(e) => onChange={(e) =>
setForm({ setForm({ ...form, imageFile: e.target.value })
...form,
productImageUrl: e.target.value,
productImage: "",
})
} }
></input> ></input>
<button
type="button"
className="btn btn-outline-primary mt-3"
onClick={() => {
setForm({ ...form, imageFile: "" });
setImageMode("url");
}}
>
Specify Image URL
</button>
</div>
</div>
) : null}
{imageMode === "url" ? (
<div className="row mt-3">
<div>
<label htmlFor="prodImgUrl" className="form-label">
Image URL
</label>
<input <input
id="productImage" name="productImageUrl"
name="productImage" type="text"
className="form-control form-control-lg" className="form-control"
type="file" id="prodImgUrl"
value={form.productImage} value={form.productImageUrl}
onChange={(e) => onChange={(e) =>
setForm({ setForm({ ...form, productImageUrl: e.target.value })
...form,
productImage: e.target.value,
productImageUrl: "",
})
} }
></input> />
<button
type="button"
className="btn btn-outline-primary mt-3"
onClick={() => setImageMode("upload")}
>
Upload Image
</button>
</div> </div>
</div>
) : null}
<div className="row mt-3"> <div className="row mt-3">
<div className="col-12"> <div className="col-12">
......
const emptyProduct = {
sku: "",
upc: "",
productName: "",
brand: "",
category: "",
price: 0.0,
availableStock: 0,
productDesciption: "",
productImageUrl: "",
};
export default emptyProduct;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment