Skip to content
This repository was archived by the owner on Sep 20, 2025. It is now read-only.

Commit 3cc47f0

Browse files
committed
Load data into edit product screen
1 parent 0980391 commit 3cc47f0

File tree

8 files changed

+167
-15
lines changed

8 files changed

+167
-15
lines changed

frontend/src/components/pages/adminDashboard/products/EditProductComponent.jsx

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import Error from "../../../layouts/Error"
88
import { getAdminCategories, } from "../../../../redux/actions/adminCategoriesActions"
99
import { getAdminManufacturers, } from "../../../../redux/actions/adminManufacturersActions"
1010
// import { newProduct, } from "../../../../redux/actions/createAdminProductActions"
11-
import { getAdminProduct, } from "../../../../redux/actions/adminProductActions"
11+
import { getAdminProductEdit, } from "../../../../redux/actions/adminProductEditActions"
1212

1313
import "./EditProductComponent.scss"
1414

@@ -29,7 +29,7 @@ export default function EditProductComponent() {
2929
adminAuth: state.adminAuth,
3030
adminCategories: state.adminCategories,
3131
adminManufacturers: state.adminManufacturers,
32-
adminProduct: state.adminProduct,
32+
adminProductEdit: state.adminProductEdit,
3333
}))
3434
// At least one image is required.
3535
const [image, setImage] = useState(defaultImageState)
@@ -61,26 +61,34 @@ export default function EditProductComponent() {
6161
) {
6262
dispatch(getAdminCategories())
6363
dispatch(getAdminManufacturers())
64-
dispatch(getAdminProduct(productSlug))
64+
dispatch(getAdminProductEdit(productSlug))
6565
}
6666
}, [state.adminAuth])
6767

6868
useEffect(() => {
6969
if (
70-
false === state.adminProduct.loading
70+
false === state.adminProductEdit.loading
7171
) {
7272
if (
73-
null !== state.adminProduct.data
73+
null !== state.adminProductEdit.data
7474
) {
7575
// TODO: set loaded product data into state.
76+
setName(state.adminProductEdit.data.name)
77+
setUnits(state.adminProductEdit.data.units)
78+
setWeight(state.adminProductEdit.data.weight)
79+
setPrice(state.adminProductEdit.data.price)
80+
setDescription(state.adminProductEdit.data.description)
81+
setCategory(state.adminProductEdit.data.category.id)
82+
setManufacturer(state.adminProductEdit.data.manufacturer.id)
83+
setIsLive(state.adminProductEdit.data.isLive ? "1" : "0")
7684
}
7785
if (
78-
null !== state.adminProduct.error
86+
null !== state.adminProductEdit.error
7987
) {
8088
navigate("/admin/404-not-found")
8189
}
8290
}
83-
}, [state.adminProduct])
91+
}, [state.adminProductEdit])
8492

8593
const handleSetImage = e => {
8694
if (1 !== e.target.files.length || false !== imageError(e.target.files[0].type)) {
@@ -289,7 +297,7 @@ export default function EditProductComponent() {
289297
state.adminAuth.loading ||
290298
state.adminCategories.loading ||
291299
state.adminManufacturers.loading ||
292-
state.adminProduct.loading
300+
state.adminProductEdit.loading
293301
) {
294302
return (
295303
<div className="container dashboard-edit-product-container text-center">
@@ -307,18 +315,18 @@ export default function EditProductComponent() {
307315
>
308316
<Helmet>
309317
<title>
310-
Edit {state.adminProduct.data.name} - {adminDashboardTitle}
318+
Edit {state.adminProductEdit.data.name} - {adminDashboardTitle}
311319
</title>
312-
<meta name="title" content={`Edit ${state.adminProduct.data.name} - ${adminDashboardTitle}`}/>
320+
<meta name="title" content={`Edit ${state.adminProductEdit.data.name} - ${adminDashboardTitle}`}/>
313321
</Helmet>
314322
<div className="d-sm-flex align-items-center justify-content-between mb-4">
315323
<h1 className="h3 mb-0 text-gray-800">
316324
<a href="/admin/products" className="breadcrumb-link">
317325
View Products
318326
</a>
319327
&nbsp;&#x2022;&nbsp;
320-
<a href={`/admin/products/${state.adminProduct.data.slug}`} className="breadcrumb-link">
321-
{state.adminProduct.data.name}
328+
<a href={`/admin/products/${state.adminProductEdit.data.slug}`} className="breadcrumb-link">
329+
{state.adminProductEdit.data.name}
322330
</a>
323331
&nbsp;&#x2022; Edit Product
324332
</h1>
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
2+
import HttpService from "../../services/HttpService"
3+
import { adminProductEdit, } from "../types"
4+
5+
export const getAdminProductEdit = slug => {
6+
return async dispatch => {
7+
const http = new HttpService()
8+
9+
dispatch({ type: adminProductEdit.GET_ADMIN_PRODUCT_EDIT_PENDING, })
10+
11+
const tokenId = "admin-user-token"
12+
const path = "/admin/products/"+slug+"/edit"
13+
await http.getData(path, tokenId)
14+
.then(res => {
15+
dispatch({
16+
type: adminProductEdit.GET_ADMIN_PRODUCT_EDIT_SUCCESS,
17+
payload: res.data.data,
18+
})
19+
}).catch(error => {
20+
let message
21+
if ("ERR_NETWORK" === error.code) {
22+
message = "Server unavailable."
23+
} else if (
24+
error.response &&
25+
error.response.data &&
26+
error.response.data.error
27+
) {
28+
message = error.response.data.error
29+
} else {
30+
message = "Something went wrong. Please come back later."
31+
}
32+
dispatch({
33+
type: adminProductEdit.GET_ADMIN_PRODUCT_EDIT_ERROR,
34+
payload: message,
35+
})
36+
})
37+
}
38+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { adminProductEdit, } from "../types"
2+
3+
const initState = {
4+
data: null,
5+
error: null,
6+
loading: true,
7+
}
8+
9+
export default function adminEditProductReducer (state = initState, action) {
10+
switch (action.type) {
11+
12+
case adminProductEdit.GET_ADMIN_PRODUCT_EDIT_ERROR:
13+
return {
14+
...state,
15+
error: action.payload,
16+
loading: false,
17+
}
18+
19+
case adminProductEdit.GET_ADMIN_PRODUCT_EDIT_PENDING:
20+
return {
21+
...state,
22+
loading: true,
23+
}
24+
25+
case adminProductEdit.GET_ADMIN_PRODUCT_EDIT_SUCCESS:
26+
return {
27+
...state,
28+
data: action.payload,
29+
loading: false,
30+
error: null,
31+
}
32+
33+
default:
34+
return state
35+
}
36+
}

frontend/src/redux/reducers/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import adminManufacturersReducer from "./adminManufacturersReducer"
1515
import createAdminProductReducer from "./createAdminProductReducer"
1616
import productsReducer from "./productsReducer"
1717
import productReducer from "./productReducer"
18+
import adminProductEditReducer from "./adminProductEditReducer"
1819

1920
export default combineReducers({
2021
auth: authReducer,
@@ -33,4 +34,5 @@ export default combineReducers({
3334
createAdminProduct: createAdminProductReducer,
3435
products: productsReducer,
3536
product: productReducer,
37+
adminProductEdit: adminProductEditReducer,
3638
})

frontend/src/redux/types.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,4 +108,10 @@ export const product = {
108108
GET_PRODUCT_SUCCESS: "GET_PRODUCT_SUCCESS",
109109
GET_PRODUCT_ERROR: "GET_PRODUCT_ERROR",
110110
GET_PRODUCT_PENDING: "GET_PRODUCT_PENDING",
111+
}
112+
113+
export const adminProductEdit = {
114+
GET_ADMIN_PRODUCT_EDIT_SUCCESS: "GET_ADMIN_PRODUCT_EDIT_SUCCESS",
115+
GET_ADMIN_PRODUCT_EDIT_ERROR: "GET_ADMIN_PRODUCT_EDIT_ERROR",
116+
GET_ADMIN_PRODUCT_EDIT_PENDING: "GET_ADMIN_PRODUCT_EDIT_PENDING",
111117
}

grocery-store-management-system.postman_collection.json

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,36 @@
470470
},
471471
"response": []
472472
},
473+
{
474+
"name": "Get Product Edit",
475+
"request": {
476+
"auth": {
477+
"type": "bearer",
478+
"bearer": [
479+
{
480+
"key": "token",
481+
"value": "{{token}}",
482+
"type": "string"
483+
}
484+
]
485+
},
486+
"method": "GET",
487+
"header": [],
488+
"url": {
489+
"raw": "{{web}}/admin/products/SpongeBob/edit",
490+
"host": [
491+
"{{web}}"
492+
],
493+
"path": [
494+
"admin",
495+
"products",
496+
"SpongeBob",
497+
"edit"
498+
]
499+
}
500+
},
501+
"response": []
502+
},
473503
{
474504
"name": "New Product",
475505
"request": {
@@ -523,14 +553,14 @@
523553
"method": "DELETE",
524554
"header": [],
525555
"url": {
526-
"raw": "{{web}}/admin/products/Bespoke-Bamboo-Hat",
556+
"raw": "{{web}}/admin/products/SpongeBob",
527557
"host": [
528558
"{{web}}"
529559
],
530560
"path": [
531561
"admin",
532562
"products",
533-
"Bespoke-Bamboo-Hat"
563+
"SpongeBob"
534564
]
535565
}
536566
},

src/models/v1/product.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,7 @@ module.exports = (sequelize, DataTypes) => {
395395
* @param {boolean} [options.getCategory=false] options.getCategory
396396
* @param {boolean} [options.getManufacturer=false] options.getManufacturer
397397
* @param {boolean} [options.singlePhoto=false] options.singlePhoto
398+
* @param {boolean} [options.unformatted=false] options.unformatted
398399
* @returns {array}
399400
*/
400401
static async getFormattedProductData(
@@ -440,6 +441,13 @@ module.exports = (sequelize, DataTypes) => {
440441
result.photos = [photo];
441442
}
442443
}
444+
if (true === options.unformatted) {
445+
result.price = product.price;
446+
result.weight = product.weight.slice(
447+
0,
448+
product.weight.indexOf(" kg"),
449+
);
450+
}
443451
}
444452
return result;
445453
}
@@ -481,9 +489,10 @@ module.exports = (sequelize, DataTypes) => {
481489

482490
/**
483491
* @param {string} slug
492+
* @param {boolean} [options.unformatted=false] options.unformatted
484493
* @returns {object|false}
485494
*/
486-
static async getAdminProductBySlug(slug) {
495+
static async getAdminProductBySlug(slug, options) {
487496
try {
488497
const result = await sequelize.query(
489498
`SELECT *
@@ -504,6 +513,7 @@ module.exports = (sequelize, DataTypes) => {
504513
{
505514
getCategory: true,
506515
getManufacturer: true,
516+
unformatted: options && true === options.unformatted,
507517
}
508518
);
509519
} catch(err) {

src/routes/api/v1/web/admin/products/product.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,28 @@ router.get("/", adminAuthenticate, async (req, res) => {
3131
return res.json({ data: product, });
3232
});
3333

34+
router.get("/edit", adminAuthenticate, async (req, res) => {
35+
const product = await db.sequelize.models
36+
.product
37+
.getAdminProductBySlug(
38+
req.paramString("productSlug"),
39+
{ unformatted: true },
40+
);
41+
if (false === product) {
42+
res.status(status.NOT_FOUND);
43+
return res.json({ error: message404, });
44+
}
45+
const photos = await db.sequelize.models
46+
.productPhoto
47+
.getProductPhotos(product.id);
48+
if (false === photos) {
49+
product.photos = null;
50+
} else {
51+
product.photos = photos;
52+
}
53+
return res.json({ data: product, });
54+
});
55+
3456
router.delete("/", adminAuthenticate, async (req, res) => {
3557
const product = await db.sequelize.models
3658
.product

0 commit comments

Comments
 (0)