added search
This commit is contained in:
parent
7f1ee881cb
commit
1f3b0d8c29
5
.babelrc
5
.babelrc
@ -2,5 +2,8 @@
|
|||||||
"presets": [
|
"presets": [
|
||||||
"@babel/preset-env",
|
"@babel/preset-env",
|
||||||
"@babel/preset-react"
|
"@babel/preset-react"
|
||||||
|
],
|
||||||
|
"plugins": [
|
||||||
|
"@babel/plugin-proposal-class-properties"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
42
package-lock.json
generated
42
package-lock.json
generated
@ -99,6 +99,20 @@
|
|||||||
"@babel/types": "^7.4.0"
|
"@babel/types": "^7.4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@babel/helper-create-class-features-plugin": {
|
||||||
|
"version": "7.4.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.3.tgz",
|
||||||
|
"integrity": "sha512-UMl3TSpX11PuODYdWGrUeW6zFkdYhDn7wRLrOuNVM6f9L+S9CzmDXYyrp3MTHcwWjnzur1f/Op8A7iYZWya2Yg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/helper-function-name": "^7.1.0",
|
||||||
|
"@babel/helper-member-expression-to-functions": "^7.0.0",
|
||||||
|
"@babel/helper-optimise-call-expression": "^7.0.0",
|
||||||
|
"@babel/helper-plugin-utils": "^7.0.0",
|
||||||
|
"@babel/helper-replace-supers": "^7.4.0",
|
||||||
|
"@babel/helper-split-export-declaration": "^7.4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@babel/helper-define-map": {
|
"@babel/helper-define-map": {
|
||||||
"version": "7.4.0",
|
"version": "7.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.0.tgz",
|
||||||
@ -300,6 +314,16 @@
|
|||||||
"@babel/plugin-syntax-async-generators": "^7.2.0"
|
"@babel/plugin-syntax-async-generators": "^7.2.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@babel/plugin-proposal-class-properties": {
|
||||||
|
"version": "7.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.0.tgz",
|
||||||
|
"integrity": "sha512-t2ECPNOXsIeK1JxJNKmgbzQtoG27KIlVE61vTqX0DKR9E9sZlVVxWUtEW9D5FlZ8b8j7SBNCHY47GgPKCKlpPg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/helper-create-class-features-plugin": "^7.4.0",
|
||||||
|
"@babel/helper-plugin-utils": "^7.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@babel/plugin-proposal-json-strings": {
|
"@babel/plugin-proposal-json-strings": {
|
||||||
"version": "7.2.0",
|
"version": "7.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz",
|
||||||
@ -3029,8 +3053,7 @@
|
|||||||
"ansi-regex": {
|
"ansi-regex": {
|
||||||
"version": "2.1.1",
|
"version": "2.1.1",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true,
|
"dev": true
|
||||||
"optional": true
|
|
||||||
},
|
},
|
||||||
"aproba": {
|
"aproba": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
@ -3071,8 +3094,7 @@
|
|||||||
"code-point-at": {
|
"code-point-at": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true,
|
"dev": true
|
||||||
"optional": true
|
|
||||||
},
|
},
|
||||||
"concat-map": {
|
"concat-map": {
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
@ -3082,8 +3104,7 @@
|
|||||||
"console-control-strings": {
|
"console-control-strings": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true,
|
"dev": true
|
||||||
"optional": true
|
|
||||||
},
|
},
|
||||||
"core-util-is": {
|
"core-util-is": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
@ -3200,8 +3221,7 @@
|
|||||||
"inherits": {
|
"inherits": {
|
||||||
"version": "2.0.3",
|
"version": "2.0.3",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true,
|
"dev": true
|
||||||
"optional": true
|
|
||||||
},
|
},
|
||||||
"ini": {
|
"ini": {
|
||||||
"version": "1.3.5",
|
"version": "1.3.5",
|
||||||
@ -3213,7 +3233,6 @@
|
|||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"number-is-nan": "^1.0.0"
|
"number-is-nan": "^1.0.0"
|
||||||
}
|
}
|
||||||
@ -3339,8 +3358,7 @@
|
|||||||
"number-is-nan": {
|
"number-is-nan": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true,
|
"dev": true
|
||||||
"optional": true
|
|
||||||
},
|
},
|
||||||
"object-assign": {
|
"object-assign": {
|
||||||
"version": "4.1.1",
|
"version": "4.1.1",
|
||||||
@ -3473,7 +3491,6 @@
|
|||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"code-point-at": "^1.0.0",
|
"code-point-at": "^1.0.0",
|
||||||
"is-fullwidth-code-point": "^1.0.0",
|
"is-fullwidth-code-point": "^1.0.0",
|
||||||
@ -3493,7 +3510,6 @@
|
|||||||
"version": "3.0.1",
|
"version": "3.0.1",
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"optional": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"ansi-regex": "^2.0.0"
|
"ansi-regex": "^2.0.0"
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.3.3",
|
"@babel/core": "^7.3.3",
|
||||||
|
"@babel/plugin-proposal-class-properties": "^7.4.0",
|
||||||
"@babel/polyfill": "^7.2.5",
|
"@babel/polyfill": "^7.2.5",
|
||||||
"@babel/preset-env": "^7.3.1",
|
"@babel/preset-env": "^7.3.1",
|
||||||
"@babel/preset-react": "^7.0.0",
|
"@babel/preset-react": "^7.0.0",
|
||||||
|
@ -5,7 +5,7 @@ const ItemForm = props => {
|
|||||||
console.log(props)
|
console.log(props)
|
||||||
return (
|
return (
|
||||||
<Form onSubmit={props.handleSubmit}>
|
<Form onSubmit={props.handleSubmit}>
|
||||||
<Form.Group controlId="formBasicEmail">
|
<Form.Group controlId="item">
|
||||||
<Form.Label>Enter Item Here</Form.Label>
|
<Form.Label>Enter Item Here</Form.Label>
|
||||||
<Form.Control value={props.itemText} onChange={props.updateItemText} />
|
<Form.Control value={props.itemText} onChange={props.updateItemText} />
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
|
15
src/components/items/ItemSearch.js
Normal file
15
src/components/items/ItemSearch.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import {Form, Button} from 'react-bootstrap'
|
||||||
|
|
||||||
|
const ItemSearch = props => {
|
||||||
|
return (
|
||||||
|
<Form className = "mt-5" onSubmit={props.handleRead}>
|
||||||
|
<Form.Group controlId="search">
|
||||||
|
<Form.Control type="text" placeholder="Search" />
|
||||||
|
</Form.Group>
|
||||||
|
<Button variant="dark" type="submit">Search</Button>
|
||||||
|
</Form>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ItemSearch
|
26
src/components/items/ItemSearchResult.js
Normal file
26
src/components/items/ItemSearchResult.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import {Form, Row, Col, Button} from 'react-bootstrap'
|
||||||
|
|
||||||
|
const ItemSearch = props => {
|
||||||
|
const {item, handleUpdate, updateItemText} = props
|
||||||
|
const {id, name} = item
|
||||||
|
return (
|
||||||
|
<Form className = "mt-5" onSubmit={handleUpdate}>
|
||||||
|
Search Results
|
||||||
|
<Form.Group as={Row} controlId="searchResult">
|
||||||
|
<Form.Label column sm="2">ID:</Form.Label>
|
||||||
|
<Col sm="10">
|
||||||
|
<Form.Control plaintext readOnly defaultValue={id} />
|
||||||
|
</Col>
|
||||||
|
<Form.Control
|
||||||
|
name="name"
|
||||||
|
type="text"
|
||||||
|
onChange={updateItemText}
|
||||||
|
value={name} />
|
||||||
|
</Form.Group>
|
||||||
|
<Button variant="dark" type="submit">Update</Button>
|
||||||
|
</Form>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ItemSearch
|
@ -1,6 +1,6 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import ItemList from './ItemList'
|
import ItemList from './ItemList'
|
||||||
import {Table, Row, Col} from 'react-bootstrap'
|
import {Table} from 'react-bootstrap'
|
||||||
|
|
||||||
const Items = props => {
|
const Items = props => {
|
||||||
const { items } = props
|
const { items } = props
|
||||||
|
@ -2,3 +2,5 @@ export { default as Items } from './Items'
|
|||||||
export { default as ItemList } from './ItemList'
|
export { default as ItemList } from './ItemList'
|
||||||
export { default as ItemRow } from './ItemRow'
|
export { default as ItemRow } from './ItemRow'
|
||||||
export { default as ItemForm } from './ItemForm'
|
export { default as ItemForm } from './ItemForm'
|
||||||
|
export { default as ItemSearch } from './ItemSearch'
|
||||||
|
export { default as ItemSearchResult } from './ItemSearchResult'
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import React, { Component } from 'react'
|
import React, { Component } from 'react'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
import { Items, ItemForm } from './items'
|
import { Items, ItemForm, ItemSearch, ItemSearchResult } from './items'
|
||||||
import {Container, Row, Col} from 'react-bootstrap'
|
import {Container, Row, Col} from 'react-bootstrap'
|
||||||
|
|
||||||
const Error = () => {
|
const Error = () => {
|
||||||
@ -18,19 +18,22 @@ class App extends Component {
|
|||||||
super()
|
super()
|
||||||
this.state = { loading: true, items: [], itemText: '' }
|
this.state = { loading: true, items: [], itemText: '' }
|
||||||
this.updateItemText = this.updateItemText.bind(this)
|
this.updateItemText = this.updateItemText.bind(this)
|
||||||
this.handleSubmit = this.handleSubmit .bind(this)
|
this.handleCreate = this.handleCreate.bind(this)
|
||||||
|
this.handleRead = this.handleRead.bind(this)
|
||||||
|
this.handleUpdate = this.handleUpdate.bind(this)
|
||||||
|
this.handleDelete = this.handleDelete.bind(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount = () => this.fetchApi()
|
||||||
this.fetchApi()
|
|
||||||
}
|
clearItemText = () => this.setState({itemText: ''})
|
||||||
|
|
||||||
async fetchApi() {
|
async fetchApi() {
|
||||||
try {
|
try {
|
||||||
const { data } = await axios.get('/api/items')
|
const { data } = await axios.get('/api/items')
|
||||||
this.setState({ loading: false, items: data })
|
this.setState({ loading: false, items: data })
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log(e)
|
console.log('The api is not available.')
|
||||||
this.setState({loading: false, apiNotFound: true})
|
this.setState({loading: false, apiNotFound: true})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -41,17 +44,59 @@ class App extends Component {
|
|||||||
this.setState({itemText: e.target.value})
|
this.setState({itemText: e.target.value})
|
||||||
}
|
}
|
||||||
|
|
||||||
handleSubmit(e) {
|
async handleCreate(e) {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
console.log(e.target.value)
|
const name = e.target.item.value
|
||||||
|
const id = this.state.items.length
|
||||||
|
try{
|
||||||
|
const res = await axios.post('api/items', {name})
|
||||||
|
await this.setState({itemText: '', items: this.state.items.concat(res.data)})
|
||||||
|
} catch(e) {
|
||||||
|
console.log(e)
|
||||||
|
await this.setState({itemText: '', items: this.state.items.concat({id, name})})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async handleRead(e) {
|
||||||
|
e.preventDefault()
|
||||||
|
const id = e.target.search.value
|
||||||
|
try{
|
||||||
|
const res = await axios.get(`api/items/${id}`)
|
||||||
|
this.setState({searchItem: res.data, searchText: res.data.name, itemText: ''})
|
||||||
|
}
|
||||||
|
catch(e) {
|
||||||
|
console.log(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async handleUpdate(e) {
|
||||||
|
e.preventDefault()
|
||||||
|
console.log(e.target.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
async handleDelete(e) {
|
||||||
|
e.preventDefault()
|
||||||
|
console.log(e.target)
|
||||||
|
}
|
||||||
renderData() {
|
renderData() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Container fluid className="mt-5">
|
<Container fluid className="mt-5">
|
||||||
<Row><Col sm={3}>
|
<Row><Col sm={3}>
|
||||||
<ItemForm itemText={this.state.itemText} handleSubmit={this.handleSubmit} updateItemText={this.updateItemText}/>
|
<ItemForm
|
||||||
|
itemText={this.state.itemText}
|
||||||
|
handleSubmit={this.handleCreate}
|
||||||
|
updateItemText={this.updateItemText}/>
|
||||||
|
<ItemSearch
|
||||||
|
searchText={this.state.searchText}
|
||||||
|
handleRead={this.handleRead} />
|
||||||
|
{this.state.searchItem ?
|
||||||
|
<ItemSearchResult
|
||||||
|
item={this.state.searchItem}
|
||||||
|
searchText={this.state.searchText}
|
||||||
|
updateItemText={this.updateItemText}
|
||||||
|
handleUpdate={this.handleUpdate}/> :
|
||||||
|
<div/>}
|
||||||
<div className="mt-5">{this.state.apiNotFound ? <Error/> : ''}</div>
|
<div className="mt-5">{this.state.apiNotFound ? <Error/> : ''}</div>
|
||||||
</Col><Col sm={8}><h3>Items</h3><Items {...this.state} /></Col></Row>
|
</Col><Col sm={8}><h3>Items</h3><Items {...this.state} /></Col></Row>
|
||||||
</Container>
|
</Container>
|
||||||
|
@ -1,10 +1,7 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import {
|
import {
|
||||||
Navbar,
|
Navbar,
|
||||||
Nav,
|
Nav,
|
||||||
FormControl,
|
|
||||||
Form,
|
|
||||||
Button
|
|
||||||
} from 'react-bootstrap'
|
} from 'react-bootstrap'
|
||||||
|
|
||||||
const MainNav = () => {
|
const MainNav = () => {
|
||||||
@ -16,10 +13,7 @@ const MainNav = () => {
|
|||||||
<Nav className="mr-auto">
|
<Nav className="mr-auto">
|
||||||
<Nav.Link href="/">Home</Nav.Link>
|
<Nav.Link href="/">Home</Nav.Link>
|
||||||
</Nav>
|
</Nav>
|
||||||
<Form inline>
|
|
||||||
<FormControl type="text" placeholder="Search" className="mr-sm-2" />
|
|
||||||
<Button variant="outline-success">Search</Button>
|
|
||||||
</Form>
|
|
||||||
</Navbar.Collapse>
|
</Navbar.Collapse>
|
||||||
</Navbar>
|
</Navbar>
|
||||||
)
|
)
|
||||||
|
@ -30,6 +30,7 @@ module.exports = {
|
|||||||
historyApiFallback: true,
|
historyApiFallback: true,
|
||||||
allowedHosts: [
|
allowedHosts: [
|
||||||
'localhost',
|
'localhost',
|
||||||
|
'opsqtua3b5dpg6zy.onion',
|
||||||
],
|
],
|
||||||
proxy: {
|
proxy: {
|
||||||
'/api': 'http://localhost:1337',
|
'/api': 'http://localhost:1337',
|
||||||
|
Loading…
Reference in New Issue
Block a user