Skip to content

Commit

Permalink
- add an ability to create/update/delete persons
Browse files Browse the repository at this point in the history
- move persons list into separated component
  • Loading branch information
Valodya committed Mar 22, 2019
1 parent 1d9e139 commit a9f2548
Show file tree
Hide file tree
Showing 11 changed files with 341 additions and 85 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"dependencies": {
"backendless": "^5.2.8",
"react": "^16.8.4",
"react-bootstrap": "^1.0.0-beta.6",
"react-dom": "^16.8.4",
"react-redux": "^6.0.1",
"react-scripts": "2.1.8",
Expand Down
73 changes: 0 additions & 73 deletions src/App.js

This file was deleted.

9 changes: 0 additions & 9 deletions src/App.test.js

This file was deleted.

17 changes: 17 additions & 0 deletions src/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import React from 'react';

import Persons from './persons';

export default function App() {
return (
<div className="container">
<div className="header">
<h3>
Backendless React Addresses Book
</h3>
</div>

<Persons/>
</div>
);
}
2 changes: 1 addition & 1 deletion src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import ReactDOM from 'react-dom';
import { Provider } from 'react-redux'

import './index.css';
import App from './App';
import App from './app';
import * as serviceWorker from './serviceWorker';

import { createStore } from './store'
Expand Down
58 changes: 58 additions & 0 deletions src/persons/delete-confirmation.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import React, { Component } from 'react';
import { connect } from 'react-redux'
import Modal from 'react-bootstrap/Modal';
import Button from 'react-bootstrap/Button';

import { removePerson } from '../store';

class DeletePersonConfirmation extends Component {

state = {
removing: false,
};

close = () => {
this.setState({
removing: false,
});

this.props.onHide()
};

confirm = () => {
const { person } = this.props;

this.setState({ removing: true });

this.props.removePerson(person.objectId)
.then(() => this.close())
};

render() {
const { person, show } = this.props;
const { removing } = this.state;

return (
<Modal show={show} onHide={this.close}>
<Modal.Header className="bg-danger text-white" closeButton>
<Modal.Title>
Delete Person Confirmation
</Modal.Title>
</Modal.Header>

<Modal.Body>
<p>
Are you seriously want to delete "<b>{person && person.name}</b>"
</p>
</Modal.Body>

<Modal.Footer>
<Button variant="secondary" onClick={this.close} disabled={removing}>No</Button>
<Button variant="danger" onClick={this.confirm} disabled={removing}>Yes</Button>
</Modal.Footer>
</Modal>
);
}
}

export default connect(null, { removePerson })(DeletePersonConfirmation);
122 changes: 122 additions & 0 deletions src/persons/editor.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
import React, { Component } from 'react';
import { connect } from 'react-redux'
import Modal from 'react-bootstrap/Modal';
import Button from 'react-bootstrap/Button';
import Alert from 'react-bootstrap/Alert';

import { createPerson, updatePerson } from '../store';

class PersonEditor extends Component {

constructor(props) {
super(props);

this.state = {
person : props.person || {},
saving : false,
serverError: null,
}
}

componentWillReceiveProps(nextProps) {
const prevPerson = this.props.person || {};
const nextPerson = nextProps.person || {};

if (prevPerson.objectId !== nextPerson.objectId) {
this.setState({ person: nextPerson })
}
}

close = () => {
this.setState({
person : {},
saving : false,
serverError: null
});

this.props.onHide()
};

preparePerson() {
const { person } = this.state;

return {
...person,
name : (person.name || '').trim() || null,
address: (person.address || '').trim() || null,
}
}

save = () => {
const person = this.preparePerson();

const action = this.props.person
? this.props.updatePerson
: this.props.createPerson;

action(person)
.then(() => this.close())
.catch(e => this.setState({ serverError: e.message }));
};

onNameChange = e => this.setState({ person: { ...this.state.person, name: e.target.value } });
onAddressChange = e => this.setState({ person: { ...this.state.person, address: e.target.value } });

render() {
const { show } = this.props;
const { person, serverError, saving } = this.state;

const isNew = !this.props.person;

return (
<Modal show={show} onHide={this.close}>
<Modal.Header closeButton>
<Modal.Title>
{isNew ? 'Add' : 'Edit'} Person
</Modal.Title>
</Modal.Header>

<Modal.Body>
<form>
<div className="form-group">
<label>Name:</label>
<input
className="form-control"
placeholder="Input name"
value={person.name || ''}
onChange={this.onNameChange}
/>
</div>

<div className="form-group">
<label>Address:</label>
<input
className="form-control"
placeholder="Input address"
value={person.address || ''}
onChange={this.onAddressChange}
/>
</div>

{serverError && (
<Alert variant="danger">
{serverError}
</Alert>
)}
</form>
</Modal.Body>

<Modal.Footer>
<Button variant="secondary" onClick={this.close}>
Close
</Button>
<Button variant="primary" onClick={this.save} disabled={saving}>
{saving ? 'Saving...' : 'Save'}
</Button>
</Modal.Footer>
</Modal>
);
}
}

export default connect(null, { createPerson, updatePerson })(PersonEditor);
Loading

0 comments on commit a9f2548

Please sign in to comment.