Advertisement
Guest User

Untitled

a guest
Mar 27th, 2017
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // @flow
  2.  
  3. import React from 'react';
  4. import { render } from 'react-dom'
  5. import { Router, Route, hashHistory } from 'react-router'
  6.  
  7. class Menu extends React.Component {
  8.   render() {
  9.     return <div><a href="/#/">Customers</a><a href="/#/about">About</a></div>;
  10.   }
  11. }
  12.  
  13. class About extends React.Component {
  14.   render() {
  15.     return <div><p>Dette er en liten webapp som kan legge til, endre og fjerne customers</p></div>;
  16.   }
  17. }
  18.  
  19. class CustomerService {
  20.   static instance=null;
  21.   lastId=0;
  22.   customers=[];
  23.  
  24.   // Return singleton
  25.   static get() {
  26.     if(!this.instance)
  27.       this.instance=new CustomerService();
  28.     return this.instance;
  29.   }
  30.  
  31.   constructor() {
  32.     this.customers.push({id: ++this.lastId, name: "Ola", city: "Trondheim"});
  33.     this.customers.push({id: ++this.lastId, name: "Kari", city: "Oslo"});
  34.     this.customers.push({id: ++this.lastId, name: "Per", city: "Tromsø"});
  35.   }
  36.  
  37.   // Returns a manually created promise since we are later going to use fetch(),
  38.   // which also returns a promise, to perform an http request.
  39.   getCustomers() {
  40.     return new Promise((resolve, reject)=>{
  41.       var customer_id_and_names=[];
  42.       for(var c=0;c<this.customers.length;c++) {
  43.         customer_id_and_names.push({id: this.customers[c].id, name: this.customers[c].name});
  44.       }
  45.       resolve(customer_id_and_names);
  46.     });
  47.   }
  48.  
  49.   getCustomer(customerId) {
  50.     return new Promise((resolve, reject)=>{
  51.       for(var c=0;c<this.customers.length;c++) {
  52.         if(this.customers[c].id==customerId) {
  53.           resolve(this.customers[c]);
  54.           return;
  55.         }
  56.       }
  57.       reject("Customer not found");
  58.     });
  59.   }
  60.  
  61.   addCustomer(name, city) {
  62.     return new Promise((resolve, reject)=>{
  63.       if(name && city) {
  64.         this.customers.push({id: ++this.lastId, name: name, city: city});
  65.         resolve(this.lastId);
  66.         return;
  67.       }
  68.       reject("name or city empty");
  69.     });
  70.   }
  71.  
  72.   editCustomer(id, name, city) {
  73.     return new Promise((resolve, reject)=>{
  74.       if(id && name && city) {
  75.         for(var c=0;c<this.customers.length;c++) {
  76.           if (this.customers[c].id==id){
  77.             this.customers[c].name = name;
  78.             this.customers[c].city = city;
  79.             resolve(id);
  80.             return;
  81.           }
  82.         }
  83.       }
  84.       reject("Coudn't edit customer");
  85.     });
  86.   }
  87.  
  88.   removeCustomer(customerName) {
  89.     return new Promise((resolve, reject)=>{
  90.       for(var c=0;c<this.customers.length;c++) {
  91.         if(this.customers[c].name.toLowerCase()==customerName.toLowerCase()) {
  92.           this.customers.splice(c,1);
  93.           resolve(c);
  94.           return;
  95.         }
  96.       }
  97.       reject("Customer not found");
  98.     });
  99.   }
  100. }
  101.  
  102. class CustomerListComponent extends React.Component {
  103.   state={status: "", customers: [], newCustomerName: "", newCustomerCity: ""}
  104.  
  105.   constructor() {
  106.     super();
  107.  
  108.     CustomerService.get().getCustomers().then((result)=>{
  109.       this.setState({status: "successfully loaded customer list", customers: result});
  110.     }).catch((reason)=>{
  111.       this.setState({status: "error: "+reason});
  112.     });
  113.   }
  114.  
  115.   // Event methods, which are called in render(), are declared as properties:
  116.   onNewCustomerFormChanged = (event) => {
  117.     this.setState({[event.target.name]: event.target.value});
  118.   }
  119.  
  120.   // Event methods, which are called in render(), are declared as properties:
  121.   onNewCustomer = (event) => {
  122.     event.preventDefault();
  123.     var name=this.state.newCustomerName;
  124.     var city=this.state.newCustomerCity;
  125.     CustomerService.get().addCustomer(name, city).then((result)=>{
  126.       this.state.customers.push({id: result, name: name, city});
  127.       this.setState({status: "successfully added new customer", customers: this.state.customers, newCustomerName: "", newCustomerCity: ""});
  128.     }).catch((reason)=>{
  129.       this.setState({status: "error: "+reason});
  130.     });
  131.   }
  132.  
  133.   onDeleteCustomerFormChanged = (event) => {
  134.     this.setState({[event.target.name]: event.target.value});
  135.   }
  136.  
  137.   onDeleteCustomer = (event) => {
  138.       event.preventDefault();
  139.       var name=this.state.removeCustomerName;
  140.       CustomerService.get().removeCustomer(name).then((result)=>{
  141.         this.state.customers.splice(result,1);
  142.         this.setState({status: "successfully removed customer", customers: this.state.customers, newCustomerName: "", newCustomerCity: ""});
  143.       }).catch((reason)=>{
  144.         this.setState({status: "error: "+reason});
  145.       })
  146.   }
  147.  
  148.   render() {
  149.     var listItems = this.state.customers.map((customer) =>
  150.       <li key={customer.id}><a href={"/#/customer/"+customer.id}>{customer.name}</a></li>
  151.     );
  152.     return <div><p className={'status'} >status: {this.state.status}</p><ul>{listItems}</ul>
  153.         <form onSubmit={this.onNewCustomer} onChange={this.onNewCustomerFormChanged}>
  154.           <label>Name:<input type="text" name="newCustomerName" value={this.state.newCustomerName} /></label>
  155.           <label>City:<input type="text" name="newCustomerCity" value={this.state.newCustomerCity} /></label>
  156.           <input type="submit" value="New Customer"/>
  157.         </form>
  158.         <form onSubmit={this.onDeleteCustomer} onChange={this.onDeleteCustomerFormChanged}>
  159.           <label>Name:<input type="text" name="removeCustomerName" value={this.state.removeCustomerName} /></label>
  160.           <input type="submit" value="Remove Customer"/>
  161.         </form>
  162.       </div>
  163.   }
  164. }
  165.  
  166. class CustomerDetailsComponent extends React.Component {
  167.   state={status: "", customer: {}}
  168.  
  169.   constructor(props) {
  170.     super(props);
  171.  
  172.     CustomerService.get().getCustomer(props.params.customerId).then((result)=>{
  173.       this.setState({status: "successfully loaded customer details", customer: result});
  174.       var name = this.state.customer.name;
  175.       var city = this.state.customer.city;
  176.       this.setState({status: "successfully populated input field", editCustomerName: name, editCustomerCity: city});
  177.     }).catch((reason)=>{
  178.       this.setState({status: "error: "+reason});
  179.     });
  180.   }
  181.  
  182.   onUpdateCustomer = (event)=>{
  183.     event.preventDefault();
  184.     var id=this.state.customer.id;
  185.     var name=this.state.editCustomerName;
  186.     var city=this.state.editCustomerCity;
  187.     CustomerService.get().editCustomer(id, name, city).then((result)=>{
  188.       this.setState({status: "successfully loaded customer details", customer: result});
  189.     }).catch((reason)=>{
  190.       this.setState({status: "error: "+reason});
  191.     });
  192.   }
  193.  
  194.   onEditCustomerNameChange(e) {
  195.     this.setState({ editCustomerName: e.target.value });
  196.   }
  197.  
  198.   onEditCustomerCityChange(e) {
  199.     this.setState({ editCustomerCity: e.target.value });
  200.   }
  201.  
  202.   render() {
  203.     return <div>status: {this.state.status}<br/>
  204.       <form onSubmit={this.onUpdateCustomer}>
  205.         <label>Name:<input type="text" name="editCustomerName" value={this.state.editCustomerName} onChange={ this.onEditCustomerNameChange.bind(this) } /></label>
  206.         <label>City:<input type="text" name="editCustomerCity" value={this.state.editCustomerCity} onChange={ this.onEditCustomerCityChange.bind(this) }/></label>
  207.         <input type="submit" value="Edit Customer"/>
  208.       </form>
  209.     </div>
  210.   }
  211. }
  212.  
  213. class Routes extends React.Component {
  214.   render() {
  215.     return <Router history={hashHistory}>
  216.       <Route exact path="/" component={CustomerListComponent}/>
  217.       <Route path="/customer/:customerId" component={CustomerDetailsComponent}/>
  218.       <Route path="/about" component={About}/>
  219.     </Router>;
  220.   }
  221. }
  222.  
  223. render(<div>
  224.   <Menu/>
  225.   <Routes/>
  226. </div>, document.getElementById('root'));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement