Skip to content
Snippets Groups Projects
ProductList.js 4.15 KiB
Newer Older
  • Learn to ignore specific revisions
  • meskio's avatar
    meskio committed
    import React from "react";
    
    meskio's avatar
    meskio committed
    import { Table, Button, Alert } from "react-bootstrap";
    
    meskio's avatar
    meskio committed
    import Fetcher from "./Fetcher";
    
    meskio's avatar
    meskio committed
    import EditableCell from "./EditableCell";
    
    meskio's avatar
    meskio committed
    import ProductAdder from "./ProductAdder";
    
    meskio's avatar
    meskio committed
    import AuthContext from "./AuthContext";
    
    meskio's avatar
    meskio committed
    import { printMoney, url } from "./util";
    
    meskio's avatar
    meskio committed
    
    class ProductList extends React.Component {
    
    meskio's avatar
    meskio committed
      static contextType = AuthContext;
    
    
    meskio's avatar
    meskio committed
      constructor(props) {
        super(props);
        this.state = {
          products: [],
    
    meskio's avatar
    meskio committed
          error: null,
    
    meskio's avatar
    meskio committed
        };
      }
    
    meskio's avatar
    meskio committed
    
    
    meskio's avatar
    meskio committed
      update(row, key, value) {
        this.setState({ error: null });
    
        let products = this.state.products;
        const code = products[row].code;
    
        switch (key) {
          case "code":
          case "stock":
            value = parseInt(value);
            break;
          case "price":
            value = value * 100;
            break;
    
    meskio's avatar
    meskio committed
          default:
            break;
    
    meskio's avatar
    meskio committed
        }
        products[row][key] = value;
        this.setState({ products });
    
        const body = JSON.stringify(products[row]);
    
    
    meskio's avatar
    meskio committed
        fetch(url("/api/product/" + code), {
    
    meskio's avatar
    meskio committed
          headers: { "x-authentication": this.context.token },
          method: "PUT",
          body,
        }).then((response) => {
          if (!response.ok) {
            this.setState({
              error: response.status.toString() + " " + response.statusText,
            });
          }
        });
      }
    
    
    meskio's avatar
    meskio committed
      delProduct(code) {
        let products = this.state.products;
        const index = products.findIndex((p) => p.code === code);
        products.splice(index, 1);
        this.setState({ products });
    
    
    meskio's avatar
    meskio committed
        fetch(url("/api/product/" + code), {
    
    meskio's avatar
    meskio committed
          headers: { "x-authentication": this.context.token },
          method: "DELETE",
        }).then((response) => {
          if (!response.ok) {
            this.setState({
              error: response.status.toString() + " " + response.statusText,
            });
          }
        });
      }
    
    
    meskio's avatar
    meskio committed
      addProduct(product) {
        let products = this.state.products;
        products.push(product);
        this.setState({ products });
    
        const body = JSON.stringify(product);
    
    meskio's avatar
    meskio committed
        fetch(url("/api/product"), {
    
    meskio's avatar
    meskio committed
          headers: { "x-authentication": this.context.token },
          method: "POST",
          body,
        }).then((response) => {
          if (!response.ok) {
            this.setState({
              error: response.status.toString() + " " + response.statusText,
            });
          }
        });
      }
    
    
    meskio's avatar
    meskio committed
      render() {
    
    meskio's avatar
    meskio committed
        let alert = null;
        if (this.state.error !== null) {
          alert = (
            <Alert variant="danger">
              Ha ocurrido un error enviando cambios: {this.state.error}
            </Alert>
          );
        }
    
    
    meskio's avatar
    meskio committed
        const isAdmin = this.context.role === "admin";
    
    meskio's avatar
    meskio committed
        const entries = this.state.products.map((product, row) => {
    
    meskio's avatar
    meskio committed
          return (
            <tr key={product.code}>
    
    meskio's avatar
    meskio committed
              <EditableCell
                onChange={(v) => this.update(row, "code", v)}
                value={product.code}
    
    meskio's avatar
    meskio committed
                ro={!isAdmin}
    
    meskio's avatar
    meskio committed
              />
              <EditableCell
                onChange={(v) => this.update(row, "name", v)}
                value={product.name}
    
    meskio's avatar
    meskio committed
                ro={!isAdmin}
    
    meskio's avatar
    meskio committed
              />
              <EditableCell
                onChange={(v) => this.update(row, "price", v)}
                value={printMoney(product.price)}
    
    meskio's avatar
    meskio committed
                ro={!isAdmin}
    
    meskio's avatar
    meskio committed
              />
              <EditableCell
                onChange={(v) => this.update(row, "stock", v)}
                value={product.stock}
    
    meskio's avatar
    meskio committed
                ro={!isAdmin}
    
    meskio's avatar
    meskio committed
              />
    
    meskio's avatar
    meskio committed
              {isAdmin && (
                <td sm={1}>
                  <Button
                    variant="danger"
                    onClick={() => this.delProduct(product.code)}
                  >
                    -
                  </Button>
                </td>
              )}
    
    meskio's avatar
    meskio committed
            </tr>
          );
        });
    
    meskio's avatar
    meskio committed
    
    
    meskio's avatar
    meskio committed
        return (
          <Fetcher
            url="/api/product"
            onFetch={(products) => this.setState({ products })}
          >
    
    meskio's avatar
    meskio committed
            {alert}
    
            <Table striped bordered hover responsive>
    
    meskio's avatar
    meskio committed
              <thead>
                <tr>
                  <th>codigo</th>
                  <th>Nombre</th>
                  <th>Precio</th>
                  <th>Existencias</th>
    
    meskio's avatar
    meskio committed
                  {isAdmin && <th sm={1}></th>}
    
    meskio's avatar
    meskio committed
                </tr>
              </thead>
              <tbody>{entries}</tbody>
            </Table>
    
    meskio's avatar
    meskio committed
            {isAdmin && (
              <div>
                <p>Añadir producto:</p>
                <ProductAdder addProduct={(p) => this.addProduct(p)} />
              </div>
            )}
    
    meskio's avatar
    meskio committed
          </Fetcher>
        );
      }
    
    meskio's avatar
    meskio committed
    }
    
    export default ProductList;