Skip to content

Commit 85b159e

Browse files
authored
Video-35-Edit-Product-UI (basir#35)
1 parent 7168758 commit 85b159e

File tree

7 files changed

+113
-26
lines changed

7 files changed

+113
-26
lines changed

README.md

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -284,16 +284,16 @@ JS AMAZONA
284284
3. create product function in api.js
285285
4. call create product function in ProductListScreen
286286
5. redirect to edit product
287-
35. Edit and Delete Product
288-
1. update parseUrlRequest to get action
287+
35. Edit Product UI
289288
2. create ProductEditScreen.js
290289
3. load product data from backend
291290
4. handle form submit
292291
5. save product in backend
293-
6. update ProductListScreen.js
294-
7. handle delete button
295-
8. rerender after deletion
296-
36. Upload Product Image
292+
36. Delete Product
293+
3. update ProductListScreen.js
294+
4. handle delete button
295+
5. rerender after deletion
296+
37. Upload Product Image
297297
1. npm install multer
298298
2. create routes/uploadRoute.js
299299
3. import express and multer
@@ -310,43 +310,43 @@ JS AMAZONA
310310
14. call uploadProductImage()
311311
15. create uploadProductImage in api.js
312312
16. update server.js
313-
37. Build Project
313+
38. Build Project
314314
1. create build script for frontend
315315
2. create build script for backend
316316
3. update sever.js to serve frontend build folder and uploads folder
317317
4. stop running frontend
318318
5. npm run build
319319
6. check localhost:5000 for running website and showing images
320-
38. Show Categories In Sidebar Menu
320+
39. Show Categories In Sidebar Menu
321321
1. update ProductListScreen.js
322322
2. handle delete button
323323
3. rerender after deletion
324-
39. Admin Orders
324+
40. Admin Orders
325325
1. create Admin Order menu in header
326326
2. create AdminOrder.js
327327
3. load orders from backend
328328
4. list them in the screen
329329
5. show delete and edit button
330330
6. redirect to order details on edit action
331-
40. Edit Order
331+
41. Edit Order
332332
1. if order is payed show deliver button for admin
333333
2. handle click on deliver button
334334
3. set state to delivered
335-
41. Delete Order
335+
42. Delete Order
336336
1. update OrderListScreen.js
337337
2. handle delete button
338338
3. rerender after deletion
339-
42. Show Summary Report in Dashboard
339+
43. Show Summary Report in Dashboard
340340
1. create summary section
341341
2. style summary
342342
3. create summary backend
343343
4. create getSummary in api.js
344344
5. load data in dashboard screen
345345
6. show 3 boxes for Users, Orders and Sales
346-
43. Show Chart in Dashboard
346+
44. Show Chart in Dashboard
347347
1. import chartist
348348
2. add chartist css to index.html
349349
3. create linear chart for daily sales
350350
4. create pie chart for product categories
351-
44. Publish heroku
351+
45. Publish heroku
352352
1. publish steps

backend/routers/productRouter.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,21 @@ import { isAuth, isAdmin } from '../utils';
44
import Product from '../models/productModel';
55

66
const productRouter = express.Router();
7+
productRouter.get(
8+
'/',
9+
expressAysncHandler(async (req, res) => {
10+
const products = await Product.find({});
11+
res.send(products);
12+
})
13+
);
14+
productRouter.get(
15+
'/:id',
16+
expressAysncHandler(async (req, res) => {
17+
const product = await Product.findById(req.params.id);
18+
res.send(product);
19+
})
20+
);
21+
722
productRouter.post(
823
'/',
924
isAuth,

backend/server.js

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,7 @@ app.use('/api/orders', orderRouter);
2929
app.get('/api/paypal/clientId', (req, res) => {
3030
res.send({ clientId: config.PAYPAL_CLIENT_ID });
3131
});
32-
app.get('/api/products', (req, res) => {
33-
res.send(data.products);
34-
});
35-
app.get('/api/products/:id', (req, res) => {
36-
const product = data.products.find((x) => x._id === req.params.id);
37-
if (product) {
38-
res.send(product);
39-
} else {
40-
res.status(404).send({ message: 'Product Not Found!' });
41-
}
42-
});
32+
4333
app.use((err, req, res, next) => {
4434
const status = err.name && err.name === 'ValidationError' ? 400 : 500;
4535
res.status(status).send({ message: err.message });

frontend/src/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@ import PlaceOrderScreen from './srceens/PlaceOrderScreen';
1313
import OrderScreen from './srceens/OrderScreen';
1414
import DashboardScreen from './srceens/DashboardScreen';
1515
import ProductListScreen from './srceens/ProductListScreen';
16+
import ProductEditScreen from './srceens/ProductEditScreen';
1617

1718
const routes = {
1819
'/': HomeScreen,
20+
'/product/:id/edit': ProductEditScreen,
1921
'/product/:id': ProductScreen,
2022
'/order/:id': OrderScreen,
2123
'/cart/:id': CartScreen,
@@ -36,6 +38,7 @@ const router = async () => {
3638
(request.resource ? `/${request.resource}` : '/') +
3739
(request.id ? '/:id' : '') +
3840
(request.verb ? `/${request.verb}` : '');
41+
console.log(request);
3942
const screen = routes[parseUrl] ? routes[parseUrl] : Error404Screen;
4043
const header = document.getElementById('header-container');
4144
header.innerHTML = await Header.render();
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import { parseRequestUrl } from '../utils';
2+
import { getProduct } from '../api';
3+
4+
const ProductEditScreen = {
5+
after_render: () => {},
6+
render: async () => {
7+
const request = parseRequestUrl();
8+
const product = await getProduct(request.id);
9+
return `
10+
<div class="content">
11+
<div>
12+
<a href="/#/productlist">Back to products</a>
13+
</div>
14+
<div class="form-container">
15+
<form id="edit-product-form">
16+
<ul class="form-items">
17+
<li>
18+
<h1>Edit Product ${product._id.substring(0, 8)}</h1>
19+
</li>
20+
<li>
21+
<label for="name">Name</label>
22+
<input type="text" name="name" value="${
23+
product.name
24+
}" id="name" />
25+
</li>
26+
<li>
27+
<label for="price">Price</label>
28+
<input type="number" name="price" value="${
29+
product.price
30+
}" id="price" />
31+
</li>
32+
<li>
33+
<label for="image">Image (680 x 830)</label>
34+
<input type="text" name="image" value="${
35+
product.image
36+
}" id="image" />
37+
</li>
38+
<li>
39+
<label for="brand">Brand</label>
40+
<input type="text" name="brand" value="${
41+
product.brand
42+
}" id="brand" />
43+
</li>
44+
<li>
45+
<label for="countInStock">Count In Stock</label>
46+
<input type="text" name="countInStock" value="${
47+
product.countInStock
48+
}" id="countInStock" />
49+
</li>
50+
<li>
51+
<label for="category">Category</label>
52+
<input type="text" name="category" value="${
53+
product.category
54+
}" id="category" />
55+
</li>
56+
<li>
57+
<label for="description">Description</label>
58+
<input type="text" name="description" value="${
59+
product.description
60+
}" id="description" />
61+
</li>
62+
<li>
63+
<button type="submit" class="primary">Update</button>
64+
</li>
65+
</ul>
66+
</form>
67+
</div>
68+
69+
</div>
70+
`;
71+
},
72+
};
73+
export default ProductEditScreen;

frontend/src/srceens/ProductListScreen.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ const ProductListScreen = {
99
const data = await createProduct();
1010
document.location.hash = `/product/${data.product._id}/edit`;
1111
});
12+
const editButtons = document.getElementsByClassName('edit-button');
13+
Array.from(editButtons).forEach((editButton) => {
14+
editButton.addEventListener('click', () => {
15+
document.location.hash = `/product/${editButton.id}/edit`;
16+
});
17+
});
1218
},
1319
render: async () => {
1420
const products = await getProducts();

frontend/src/utils.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export const parseRequestUrl = () => {
66
return {
77
resource: request[1],
88
id: request[2],
9-
action: request[3],
9+
verb: request[3],
1010
};
1111
};
1212
export const rerender = async (component) => {

0 commit comments

Comments
 (0)