From 26aace39554a9a7f7837291f36527a4c2ad9c04e Mon Sep 17 00:00:00 2001 From: meskio <meskio@sindominio.net> Date: Wed, 4 Nov 2020 19:12:44 +0100 Subject: [PATCH] Admin purchases --- src/App.js | 3 ++ src/Head.js | 1 + src/MemberPicker.js | 63 ++++++++++++++++++++++++++++++++++++++++ src/purchase/Purchase.js | 20 ++++++++++++- 4 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 src/MemberPicker.js diff --git a/src/App.js b/src/App.js index bb92433..ccc5fa0 100644 --- a/src/App.js +++ b/src/App.js @@ -23,6 +23,9 @@ function Panel(props) { <Route path="/members/add"> <MemberAdder /> </Route> + <Route path="/members/purchase"> + <Purchase member /> + </Route> <Route path="/members"> <MemberList /> </Route> diff --git a/src/Head.js b/src/Head.js index 181d558..ae436ea 100644 --- a/src/Head.js +++ b/src/Head.js @@ -12,6 +12,7 @@ function Head(props) { if (auth.role === "admin") { adminNav = ( <NavDropdown title="Admin" id="admin"> + <Nav.Link href="/members/purchase">Compra</Nav.Link> <Nav.Link href="/members">Socias</Nav.Link> <Nav.Link href="/topup">Recarga</Nav.Link> <Nav.Link href="/members/add">Nueva socia</Nav.Link> diff --git a/src/MemberPicker.js b/src/MemberPicker.js new file mode 100644 index 0000000..54c03a8 --- /dev/null +++ b/src/MemberPicker.js @@ -0,0 +1,63 @@ +import React, { useState } from "react"; +import { Form, Col } from "react-bootstrap"; +import { Typeahead } from "react-bootstrap-typeahead"; +import Fetcher from "./Fetcher"; + +function MemberPicker(props) { + const [members, setStateMembers] = useState([]); + const selected = props.member ? [props.member] : []; + + const setMembers = (members) => { + const newMembers = members.map((m) => { + m.numStr = m.num.toString(); + return m; + }); + setStateMembers(newMembers); + }; + + return ( + <Fetcher url="/api/member" onFetch={setMembers}> + <Form> + <Form.Row> + <Col sm={4}> + <br /> + <h4 className="text-right">Socia:</h4> + </Col> + <Form.Group as={Col} sm={2}> + <Form.Label>Num</Form.Label> + <Typeahead + id="member-num" + labelKey="numStr" + options={members} + onChange={(m) => props.onChange(m[0])} + selected={selected} + /> + </Form.Group> + <Form.Group as={Col}> + <Form.Label>Login</Form.Label> + <Typeahead + id="member-login" + labelKey="login" + options={members} + onChange={(m) => props.onChange(m[0])} + selected={selected} + /> + </Form.Group> + <Form.Group as={Col}> + <Form.Label>Nombre</Form.Label> + <Typeahead + id="member-name" + labelKey="name" + options={members} + onChange={(m) => props.onChange(m[0])} + selected={selected} + /> + </Form.Group> + </Form.Row> + </Form> + <hr /> + </Fetcher> + ); +} + +export default MemberPicker; diff --git a/src/purchase/Purchase.js b/src/purchase/Purchase.js index 24b5981..4238167 100644 --- a/src/purchase/Purchase.js +++ b/src/purchase/Purchase.js @@ -2,6 +2,7 @@ import React from "react"; import { Redirect } from "react-router-dom"; import { Container, Row, Col, Button, Alert, Spinner } from "react-bootstrap"; import ProductPicker from "../ProductPicker"; +import MemberPicker from "../MemberPicker"; import AuthContext from "../AuthContext"; import { printMoney } from "../util"; @@ -12,6 +13,7 @@ class Purchase extends React.Component { super(props); this.state = { purchase: [], + member: null, total: 0, transactionId: null, isLoading: false, @@ -27,6 +29,15 @@ class Purchase extends React.Component { } send() { + if (this.props.member && !this.state.member) { + this.setState({ error: "Falta seleccionar una socia" }); + return; + } + + const url = this.props.member + ? "/api/member/" + this.state.member.num + "/purchase" + : "/api/purchase"; + this.setState({ isLoading: true, error: null, noMoney: false }); const body = JSON.stringify( this.state.purchase.map((p) => { @@ -36,7 +47,7 @@ class Purchase extends React.Component { }; }) ); - fetch("/api/purchase", { + fetch(url, { headers: { "x-authentication": this.context.token }, method: "POST", body, @@ -91,6 +102,13 @@ class Purchase extends React.Component { return ( <Container> {alert} + {this.props.member && ( + <MemberPicker + member={this.state.member} + onChange={(member) => this.setState({ member })} + /> + )} + <ProductPicker amount picks={this.state.purchase} -- GitLab