Skip to content
Snippets Groups Projects
ProductPicker.js 4.32 KiB
Newer Older
  • Learn to ignore specific revisions
  • meskio's avatar
    meskio committed
    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";
    
    meskio's avatar
    meskio committed
    
    class ProductPicker extends React.Component {
    
    meskio's avatar
    meskio committed
      constructor(props) {
        super(props);
        this.state = {
          code: "",
          products: [],
        };
      }
    
    meskio's avatar
    meskio committed
    
    
    meskio's avatar
    meskio committed
      delPick(index) {
    
        let picks = [...this.props.picks];
    
    meskio's avatar
    meskio committed
        picks.splice(index, 1);
        this.props.setPicks(picks);
      }
    
    meskio's avatar
    meskio committed
    
    
    meskio's avatar
    meskio committed
      setAmount(index, amount) {
    
        let picks = [...this.props.picks];
    
    meskio's avatar
    meskio committed
        picks[index].amount = parseInt(amount);
        this.props.setPicks(picks);
    
    meskio's avatar
    meskio committed
        // trick it to redraw on each change
        this.setState({ code: this.state.code });
    
    meskio's avatar
    meskio committed
      }
    
    meskio's avatar
    meskio committed
    
    
    meskio's avatar
    meskio committed
      setPrice(index, price) {
    
        let picks = [...this.props.picks];
    
    meskio's avatar
    meskio committed
        picks[index].price = price;
        this.props.setPicks(picks);
      }
    
    
    meskio's avatar
    meskio committed
      setCode(codeStr) {
        const code = parseInt(codeStr);
        const product = this.state.products.find((p) => p.code === code);
        if (product === undefined) {
          this.setState({ code: codeStr });
        } else {
          this.pickProduct(product);
    
    meskio's avatar
    meskio committed
        }
    
    meskio's avatar
    meskio committed
      }
    
    meskio's avatar
    meskio committed
    
    
    meskio's avatar
    meskio committed
      pickProduct(product) {
    
        let picks = [...this.props.picks];
    
        if (picks.find((p) => product.code === p.code)) {
          return;
        }
    
    
    meskio's avatar
    meskio committed
        let amount = 0;
        if (this.props.amount) {
          amount = 1;
        }
    
    meskio's avatar
    meskio committed
        picks.push({
          code: product.code,
          name: product.name,
    
    meskio's avatar
    meskio committed
          origPrice: product.price,
    
    meskio's avatar
    meskio committed
          price: product.price,
    
    meskio's avatar
    meskio committed
          stock: product.stock,
    
    meskio's avatar
    meskio committed
          amount,
    
    meskio's avatar
    meskio committed
        });
        this.props.setPicks(picks);
        this.setState({ code: "" });
      }
    
    meskio's avatar
    meskio committed
    
    
    meskio's avatar
    meskio committed
      setProducts(products) {
        if (this.props.amount) {
          products = products.filter((p) => p.stock > 0);
        }
        this.setState({ products });
      }
    
    
    meskio's avatar
    meskio committed
      render() {
        const rows = this.props.picks.map((p, i) => {
    
    meskio's avatar
    meskio committed
          let price;
          if (!this.props.noPrice) {
            price = (
    
    meskio's avatar
    meskio committed
              <Col>
                {this.props.price ? (
                  <PriceEditor
                    value={p.price}
                    onChange={(price) => this.setPrice(i, price)}
                  />
                ) : (
                  printMoney(p.price) + ""
                )}
              </Col>
    
    meskio's avatar
    meskio committed
            );
          }
          return (
            <Form.Group key={p.code} as={Row}>
              <Col>
                <p>{p.code}</p>
              </Col>
              <Col xs={4}>
                <p>{p.name}</p>
              </Col>
              {price}
    
    meskio's avatar
    meskio committed
              {(this.props.amount || this.props.stock) && (
    
    meskio's avatar
    meskio committed
                <Col>
                  <Form.Control
                    type="number"
    
    meskio's avatar
    meskio committed
                    min={this.props.amount ? "1" : Number.MIN_SAFE_INTEGER}
                    max={this.props.amount ? p.stock : Number.MAX_SAFE_INTEGER}
    
    meskio's avatar
    meskio committed
                    placeholder="cantidad"
                    value={p.amount}
                    onChange={(e) => this.setAmount(i, e.target.value)}
                  />
                </Col>
              )}
    
              <Col xs={1}>
    
    meskio's avatar
    meskio committed
                <Button variant="danger" onClick={() => this.delPick(i)}>
                  -
                </Button>
              </Col>
            </Form.Group>
          );
        });
    
    meskio's avatar
    meskio committed
        return (
    
    meskio's avatar
    meskio committed
          <Fetcher url="/api/product" onFetch={(p) => this.setProducts(p)}>
    
    meskio's avatar
    meskio committed
            <Row>
              <Col>
                <h6>Código</h6>
              </Col>
    
              <Col xs={4}>
    
    meskio's avatar
    meskio committed
                <h6>Nombre</h6>
              </Col>
    
    meskio's avatar
    meskio committed
              {!this.props.noPrice && (
                <Col>
                  <h6>Precio</h6>
                </Col>
              )}
    
    meskio's avatar
    meskio committed
              {(this.props.amount || this.props.stock) && (
    
    meskio's avatar
    meskio committed
                <Col>
                  <h6>Cantidad</h6>
                </Col>
              )}
    
              <Col xs={1}></Col>
    
    meskio's avatar
    meskio committed
            </Row>
            {rows}
            <Form.Group as={Row}>
              <Col>
                <Form.Control
                  placeholder="codigo"
                  value={this.state.code}
                  onChange={(e) => this.setCode(e.target.value)}
                />
              </Col>
    
              <Col xs={12} sm={4}>
    
    meskio's avatar
    meskio committed
                <Typeahead
                  id="product-name"
    
                  placeholder="nombre"
    
    meskio's avatar
    meskio committed
                  labelKey="name"
                  options={this.state.products}
                  onChange={(name) => this.pickProduct(name[0])}
                  selected={[]}
                />
              </Col>
    
    meskio's avatar
    meskio committed
              {!this.props.noPrice && <Col xs={false} sm></Col>}
    
    meskio's avatar
    meskio committed
              {(this.props.amount || this.props.stock) && <Col xs={false} sm></Col>}
    
              <Col xs={false} sm={1}></Col>
    
    meskio's avatar
    meskio committed
            </Form.Group>
          </Fetcher>
        );
      }
    
    meskio's avatar
    meskio committed
    }
    
    export default ProductPicker;