From 6f4e87ef6f0cfae0b6f6d07c524fe34d75c8d48c Mon Sep 17 00:00:00 2001 From: meskio <meskio@sindominio.net> Date: Tue, 16 Mar 2021 13:47:08 +0100 Subject: [PATCH] Create products in it's own page * Closes: #23 --- src/Head.js | 3 ++ src/Panel.js | 6 ++- src/ProductAdder.js | 66 -------------------------- src/inventary/CreateInventary.js | 2 +- src/order/OrderEditor.js | 2 +- src/product/CreateProduct.js | 75 ++++++++++++++++++++++++++++++ src/{ => product}/ProductList.js | 34 ++------------ src/{ => product}/ProductPicker.js | 6 +-- src/purchase/Purchase.js | 2 +- 9 files changed, 93 insertions(+), 103 deletions(-) delete mode 100644 src/ProductAdder.js create mode 100644 src/product/CreateProduct.js rename src/{ => product}/ProductList.js (83%) rename src/{ => product}/ProductPicker.js (97%) diff --git a/src/Head.js b/src/Head.js index cc55b70..9dfa636 100644 --- a/src/Head.js +++ b/src/Head.js @@ -43,6 +43,9 @@ function Head(props) { <LinkContainer to="/products"> <NavDropdown.Item>Productos</NavDropdown.Item> </LinkContainer> + <LinkContainer to="/product/add"> + <NavDropdown.Item>Alta codigos</NavDropdown.Item> + </LinkContainer> <LinkContainer to="/inventary"> <NavDropdown.Item>Inventario</NavDropdown.Item> </LinkContainer> diff --git a/src/Panel.js b/src/Panel.js index abd5ea8..ab0633f 100644 --- a/src/Panel.js +++ b/src/Panel.js @@ -4,7 +4,8 @@ import { Container, Row } from "react-bootstrap"; import MemberAdder from "./member/MemberAdder"; import MemberEditer from "./member/MemberEditer"; import MemberList from "./member/MemberList"; -import ProductList from "./ProductList"; +import ProductList from "./product/ProductList"; +import CreateProduct from "./product/CreateProduct"; import CreateInventary from "./inventary/CreateInventary"; import InventaryList from "./inventary/InventaryList"; import ShowInventary from "./inventary/ShowInventary"; @@ -53,6 +54,9 @@ function LogedPanel(props) { <Route path="/products"> <ProductList /> </Route> + <Route path="/product/add"> + <CreateProduct /> + </Route> <Route path="/inventary/add"> <CreateInventary /> </Route> diff --git a/src/ProductAdder.js b/src/ProductAdder.js deleted file mode 100644 index 186db84..0000000 --- a/src/ProductAdder.js +++ /dev/null @@ -1,66 +0,0 @@ -import React, { useState } from "react"; -import { Form, Button } from "react-bootstrap"; -import PriceEditor from "./PriceEditor"; - -function ProductAdder(props) { - const [code, setCode] = useState(""); - const [name, setName] = useState(""); - const [price, setPrice] = useState(0); - const [stock, setStock] = useState(0); - - const add = (e) => { - e.preventDefault(); - props.addProduct({ - code: parseInt(code), - price: price, - stock: parseInt(stock), - name, - }); - setCode(""); - setName(""); - setPrice(0); - setStock(""); - }; - - const disabled = isNaN(price) || isNaN(parseInt(code)) || !name; - - return ( - <Form onSubmit={add}> - <Form.Group> - <Form.Label>Codigo:</Form.Label> - <Form.Control - type="number" - placeholder="codigo" - value={code} - onChange={(e) => setCode(e.target.value)} - /> - </Form.Group> - <Form.Group> - <Form.Label>Nombre:</Form.Label> - <Form.Control - placeholder="nombre" - value={name} - onChange={(e) => setName(e.target.value)} - /> - </Form.Group> - <Form.Group> - <Form.Label>Precio:</Form.Label> - <PriceEditor value={price} onChange={setPrice} /> - </Form.Group> - <Form.Group> - <Form.Label>Cantidad:</Form.Label> - <Form.Control - type="number" - placeholder="cantidad" - value={stock} - onChange={(e) => setStock(e.target.value)} - /> - </Form.Group> - <Button disabled={disabled} type="submit"> - Añadir - </Button> - </Form> - ); -} - -export default ProductAdder; diff --git a/src/inventary/CreateInventary.js b/src/inventary/CreateInventary.js index 2c1674c..19364ff 100644 --- a/src/inventary/CreateInventary.js +++ b/src/inventary/CreateInventary.js @@ -1,7 +1,7 @@ import React, { useState } from "react"; import { Redirect } from "react-router-dom"; import { Form, Row, Col, Button } from "react-bootstrap"; -import ProductPicker from "../ProductPicker"; +import ProductPicker from "../product/ProductPicker"; import Fetcher from "../Fetcher"; import Sender from "../Sender"; diff --git a/src/order/OrderEditor.js b/src/order/OrderEditor.js index e7dc08e..66d263f 100644 --- a/src/order/OrderEditor.js +++ b/src/order/OrderEditor.js @@ -1,6 +1,6 @@ import React, { useState } from "react"; import { Form, Row, Col } from "react-bootstrap"; -import ProductPicker from "../ProductPicker"; +import ProductPicker from "../product/ProductPicker"; import Fetcher from "../Fetcher"; import { date2string, time2string, daysAfterNow } from "../util"; diff --git a/src/product/CreateProduct.js b/src/product/CreateProduct.js new file mode 100644 index 0000000..79c0a4f --- /dev/null +++ b/src/product/CreateProduct.js @@ -0,0 +1,75 @@ +import React, { useState } from "react"; +import { Redirect } from "react-router-dom"; +import { Col, Form, Button } from "react-bootstrap"; +import Sender from "../Sender"; +import PriceEditor from "../PriceEditor"; + +function CreateProduct() { + const [code, setCode] = useState(""); + const [name, setName] = useState(""); + const [price, setPrice] = useState(0); + const [stock, setStock] = useState(0); + const [redirect, setRedirect] = useState(null); + + if (redirect != null) { + return <Redirect to={"/product/" + redirect.code} />; + } + + const body = () => { + return { + code: parseInt(code), + price: price, + stock: parseInt(stock), + name, + }; + }; + + const disabled = isNaN(price) || isNaN(parseInt(code)) || !name; + + return ( + <div> + <h2>Crear un nuevo código de producto</h2> + <Sender url="/api/product" body={body} onSuccess={setRedirect}> + <Form.Row> + <Form.Group as={Col}> + <Form.Label>Codigo:</Form.Label> + <Form.Control + type="number" + placeholder="codigo" + value={code} + onChange={(e) => setCode(e.target.value)} + /> + </Form.Group> + <Form.Group as={Col} xs={12} sm={10}> + <Form.Label>Producto:</Form.Label> + <Form.Control + placeholder="nombre" + value={name} + onChange={(e) => setName(e.target.value)} + /> + </Form.Group> + </Form.Row> + <Form.Row> + <Form.Group as={Col}> + <Form.Label>Precio:</Form.Label> + <PriceEditor value={price} onChange={setPrice} /> + </Form.Group> + <Form.Group as={Col}> + <Form.Label>Cantidad:</Form.Label> + <Form.Control + type="number" + placeholder="cantidad" + value={stock} + onChange={(e) => setStock(e.target.value)} + /> + </Form.Group> + </Form.Row> + <Button variant="primary" disabled={disabled} type="submit"> + Añadir + </Button> + </Sender> + </div> + ); +} + +export default CreateProduct; diff --git a/src/ProductList.js b/src/product/ProductList.js similarity index 83% rename from src/ProductList.js rename to src/product/ProductList.js index ea872c3..d3a4ef7 100644 --- a/src/ProductList.js +++ b/src/product/ProductList.js @@ -1,10 +1,9 @@ import React from "react"; import { Table, Button, Alert, Modal } from "react-bootstrap"; -import Fetcher from "./Fetcher"; -import EditableCell from "./EditableCell"; -import ProductAdder from "./ProductAdder"; -import AuthContext from "./AuthContext"; -import { url } from "./util"; +import Fetcher from "../Fetcher"; +import EditableCell from "../EditableCell"; +import AuthContext from "../AuthContext"; +import { url } from "../util"; class ProductList extends React.Component { static contextType = AuthContext; @@ -75,25 +74,6 @@ class ProductList extends React.Component { }); } - addProduct(product) { - let products = this.state.products; - products.push(product); - this.setState({ products }); - - const body = JSON.stringify(product); - fetch(url("/api/product"), { - headers: { "x-authentication": this.context.token }, - method: "POST", - body, - }).then((response) => { - if (!response.ok) { - this.setState({ - error: response.status.toString() + " " + response.statusText, - }); - } - }); - } - modalClose() { this.setState({ delete: { name: null } }); } @@ -165,12 +145,6 @@ class ProductList extends React.Component { </thead> <tbody>{entries}</tbody> </Table> - {isAdmin && ( - <div> - <p>Añadir producto:</p> - <ProductAdder addProduct={(p) => this.addProduct(p)} /> - </div> - )} <Modal show={this.state.delete.name != null} onHide={this.modalClose}> <Modal.Header closeButton> diff --git a/src/ProductPicker.js b/src/product/ProductPicker.js similarity index 97% rename from src/ProductPicker.js rename to src/product/ProductPicker.js index bf57421..33ca161 100644 --- a/src/ProductPicker.js +++ b/src/product/ProductPicker.js @@ -1,9 +1,9 @@ import React from "react"; import { Form, Row, Col, Button } from "react-bootstrap"; import { Typeahead } from "react-bootstrap-typeahead"; -import Fetcher from "./Fetcher"; -import { printMoney } from "./util"; -import PriceEditor from "./PriceEditor"; +import Fetcher from "../Fetcher"; +import { printMoney } from "../util"; +import PriceEditor from "../PriceEditor"; class ProductPicker extends React.Component { constructor(props) { diff --git a/src/purchase/Purchase.js b/src/purchase/Purchase.js index be07694..a4ea428 100644 --- a/src/purchase/Purchase.js +++ b/src/purchase/Purchase.js @@ -1,7 +1,7 @@ import React, { useState } from "react"; import { Redirect } from "react-router-dom"; import { Row, Col, Button, Alert } from "react-bootstrap"; -import ProductPicker from "../ProductPicker"; +import ProductPicker from "../product/ProductPicker"; import MemberPicker from "../member/MemberPicker"; import Sender from "../Sender"; import { printMoney } from "../util"; -- GitLab