1
0
mirror of https://github.com/ascribe/onion.git synced 2024-12-23 18:13:49 +01:00
onion/js/mixins/form_mixin.js

109 lines
2.7 KiB
JavaScript
Raw Normal View History

'use strict';
import requests from '../utils/requests';
import React from 'react';
import AlertDismissable from '../components/ascribe_forms/alert';
import { getLangText } from '../utils/lang_utils.js';
export const FormMixin = {
propTypes: {
editions: React.PropTypes.array,
currentUser: React.PropTypes.object
},
getInitialState() {
return {
2015-06-03 11:49:39 +02:00
submitted: false,
errors: []
};
},
2015-06-01 18:00:34 +02:00
submit(e) {
2015-06-09 13:29:22 +02:00
if (e) {
e.preventDefault();
}
this.setState({submitted: true});
2015-06-02 18:43:37 +02:00
this.clearErrors();
2015-06-10 15:49:46 +02:00
let action = (this.httpVerb && this.httpVerb()) || 'post';
this[action](e);
2015-06-10 15:49:46 +02:00
},
post(e){
requests
.post(this.url(e), { body: this.getFormData() })
.then(this.handleSuccess)
2015-06-01 17:43:38 +02:00
.catch(this.handleError);
},
2015-06-10 15:49:46 +02:00
delete(e){
requests
.delete(this.url(e))
2015-06-10 15:49:46 +02:00
.then(this.handleSuccess)
.catch(this.handleError);
},
2015-06-08 13:55:55 +02:00
2015-06-02 18:43:37 +02:00
clearErrors(){
for (var ref in this.refs){
2015-06-09 13:29:22 +02:00
if ('clearAlerts' in this.refs[ref]){
this.refs[ref].clearAlerts();
}
2015-06-02 18:43:37 +02:00
}
2015-06-08 13:55:55 +02:00
this.setState({errors: []});
2015-06-02 18:43:37 +02:00
},
handleSuccess(response){
2015-06-09 13:29:22 +02:00
if ('handleSuccess' in this.props){
this.props.handleSuccess(response);
2015-06-09 13:29:22 +02:00
}
2015-06-08 13:55:55 +02:00
2015-06-09 13:29:22 +02:00
},
2015-06-01 17:43:38 +02:00
handleError(err){
if (err.json) {
2015-06-02 18:16:18 +02:00
for (var input in err.json.errors){
2015-06-01 17:43:38 +02:00
if (this.refs && this.refs[input] && this.refs[input].state) {
2015-06-02 18:16:18 +02:00
this.refs[input].setAlerts( err.json.errors[input]);
2015-06-02 17:32:38 +02:00
} else {
2015-06-02 18:16:18 +02:00
this.setState({errors: this.state.errors.concat(err.json.errors[input])});
2015-06-01 17:43:38 +02:00
}
}
}
2015-06-08 13:55:55 +02:00
else {
2015-07-03 19:08:56 +02:00
// TODO translate?
2015-06-08 13:55:55 +02:00
this.setState({errors: ['Something went wrong, please try again later']});
2015-06-02 18:16:18 +02:00
}
this.setState({submitted: false});
},
2015-06-01 18:00:34 +02:00
2015-06-02 11:38:18 +02:00
getBitcoinIds(){
return this.props.editions.map(function(edition){
return edition.bitcoin_id;
});
2015-06-02 11:38:18 +02:00
},
2015-06-02 17:32:38 +02:00
2015-06-02 11:38:18 +02:00
getTitlesString(){
return this.props.editions.map(function(edition){
2015-07-03 19:08:56 +02:00
return '- \"' + edition.title + ', ' + getLangText('edition') + ' ' + edition.edition_number + '\"\n';
});
2015-06-02 11:38:18 +02:00
},
2015-06-02 17:32:38 +02:00
render(){
let alert = null;
if (this.state.errors.length > 0){
alert = this.state.errors.map((error) => {
return <AlertDismissable error={error} key={error}/>;
});
}
2015-06-05 11:40:49 +02:00
return (
<div>
{alert}
{this.renderForm()}
</div>
);
}
};
export default FormMixin;