Add ability to add suggestions to UI

This commit is contained in:
Aaron Lindsay 2016-12-29 20:15:39 -05:00
parent 350a30715a
commit 49409f84d2
4 changed files with 160 additions and 9 deletions

View File

@ -140,6 +140,8 @@ func DeleteAttendee(a *Attendee) error {
return err return err
} }
// TODO ensure attendee isn't used in any suggestions
count, err := transaction.Delete(a) count, err := transaction.Delete(a)
if err != nil { if err != nil {
transaction.Rollback() transaction.Rollback()
@ -166,7 +168,7 @@ func AttendeeHandler(w http.ResponseWriter, r *http.Request) {
return return
} }
today := time.Now().Truncate(time.Hour * 24) today := time.Now().UTC().Truncate(time.Hour * 24)
if r.Method == "POST" { if r.Method == "POST" {
attendee_json := r.PostFormValue("attendee") attendee_json := r.PostFormValue("attendee")

View File

@ -0,0 +1,117 @@
var React = require('react');
var ReactBootstrap = require('react-bootstrap');
var Grid = ReactBootstrap.Grid;
var Row = ReactBootstrap.Row;
var Col = ReactBootstrap.Col;
var ControlLabel = ReactBootstrap.ControlLabel;
var Button = ReactBootstrap.Button;
var Combobox = require('react-widgets').Combobox;
var models = require('../models');
var Suggestion = models.Suggestion;
module.exports = React.createClass({
displayName: "NewSuggestion",
getInitialState: function() {
return {
attendee: null,
suggestion: null
};
},
componentWillMount: function() {
this.setState({
attendee: null,
suggestion: null
});
this.pickNewAttendee(this.props);
},
componentWillReceiveProps: function(newProps) {
this.pickNewAttendee(newProps);
},
pickNewAttendee: function(props) {
// Pick a new attendee if the current one can't be valid *and* we have
// a list of valid possibilities
if (this.state.attendee == null ||
!props.attendees.hasOwnProperty(this.state.attendee.AttendeeId)) {
if (Object.keys(props.attendees).length >= 1) {
this.setState({
attendee: props.attendees[Object.keys(props.attendees)[0]]
});
} else {
this.setState({
attendee: null
});
}
}
},
getAttendeeList: function() {
var attendeeList = [];
for (var attendeeId in this.props.attendees) {
attendeeList.push(this.props.attendees[attendeeId]);
}
return attendeeList;
},
getLastSuggestion: function() {
var lastSuggestion = -1;
for (var suggestionId in this.props.suggestions) {
if (suggestionId > lastSuggestion)
lastSuggestion = suggestionId;
}
return lastSuggestion;
},
onChangeAttendee: function(attendee) {
if (attendee.hasOwnProperty("AttendeeId")) {
this.setState({
attendee: attendee
});
}
},
onChangeSuggestion: function(suggestion) {
var suggestionString = suggestion;
if (suggestion.hasOwnProperty('RestaurantName'))
suggestionString = suggestion.RestaurantName;
this.setState({
suggestion: suggestionString
});
},
onAddSuggestion: function() {
var suggestion = new Suggestion();
suggestion.AttendeeId = this.state.attendee.AttendeeId;
suggestion.RestaurantName = this.state.suggestion;
suggestion.VetoingId = this.getLastSuggestion();
this.props.createSuggestion(suggestion);
},
render: function() {
var attendeeList = this.getAttendeeList();
var buttonDisabled = this.state.attendee == null || !this.state.suggestion;
return (
<Grid><Row>
<Col xs={4}>
<Combobox
value={this.state.attendee}
data={attendeeList}
valueField='AttendeeId'
textField='Name'
onChange={this.onChangeAttendee} />
</Col>
<Col xs={1}>
</Col>
<Col xs={4}>
<Combobox
value={this.state.suggestion}
data={this.props.popularSuggestions}
valueField='RestaurantName'
textField='RestaurantName'
onChange={this.onChangeSuggestion} />
</Col>
<Col xs={1}>
</Col>
<Col xs={2}>
<Button bsStyle="success" disabled={buttonDisabled} onClick={this.onAddSuggestion}>Add Suggestion/Veto</Button>
</Col>
</Row></Grid>
);
}
});

View File

@ -3,18 +3,19 @@ var React = require('react');
var ReactBootstrap = require('react-bootstrap'); var ReactBootstrap = require('react-bootstrap');
var FormGroup = ReactBootstrap.FormGroup; var FormGroup = ReactBootstrap.FormGroup;
var ControlLabel = ReactBootstrap.ControlLabel; var ControlLabel = ReactBootstrap.ControlLabel;
var Grid = ReactBootstrap.Grid;
var Row = ReactBootstrap.Row;
var Col = ReactBootstrap.Col;
var Multiselect = require('react-widgets').Multiselect; var Multiselect = require('react-widgets').Multiselect;
var models = require('../models') var models = require('../models');
var Attendee = models.Attendee var Attendee = models.Attendee;
var NewSuggestion = require('./NewSuggestion');
module.exports = React.createClass({ module.exports = React.createClass({
displayName: "RecordLunch", displayName: "RecordLunch",
getInitialState: function() {
return {
};
},
getAttendeeList: function() { getAttendeeList: function() {
var attendeeList = []; var attendeeList = [];
for (var attendeeId in this.props.attendees) { for (var attendeeId in this.props.attendees) {
@ -52,9 +53,25 @@ module.exports = React.createClass({
}, },
render: function() { render: function() {
var attendeeList = this.getAttendeeList(); var attendeeList = this.getAttendeeList();
var suggestionIds = Object.keys(this.props.suggestions);
suggestionIds.sort();
var suggestions = [];
for (var i in suggestionIds) {
var suggestion = this.props.suggestions[suggestionIds[i]];
suggestions.push((
<Row key={suggestion.SuggestionId}>
<Col xs={4}>{this.props.attendees[suggestion.AttendeeId].Name}</Col>
<Col xs={1}></Col>
<Col xs={4}>{suggestion.RestaurantName}</Col>
</Row>
));
}
return ( return (
<div><form> <div><form>
<FormGroup> <Grid><Row><Col xs={12}>
<FormGroup controlId="attendees">
<ControlLabel>Attendees</ControlLabel> <ControlLabel>Attendees</ControlLabel>
<Multiselect <Multiselect
value={attendeeList} value={attendeeList}
@ -65,6 +82,21 @@ module.exports = React.createClass({
onChange={this.onChangeAttendees} onChange={this.onChangeAttendees}
onCreate={this.onCreateAttendee} /> onCreate={this.onCreateAttendee} />
</FormGroup> </FormGroup>
</Col></Row>
<Row>
<Col xs={4}><ControlLabel>Suggested By:</ControlLabel></Col>
<Col xs={1}></Col>
<Col xs={4}><ControlLabel>Restaurant Name:</ControlLabel></Col>
</Row>
{suggestions}
</Grid>
<FormGroup controlId="newsuggestion">
<NewSuggestion
createSuggestion={this.props.createSuggestion}
attendees={this.props.attendees}
suggestions={this.props.suggestions}
popularSuggestions={this.props.popularSuggestions} />
</FormGroup>
</form></div> </form></div>
); );
} }

View File

@ -131,7 +131,7 @@ func SuggestionHandler(w http.ResponseWriter, r *http.Request) {
return return
} }
today := time.Now().Truncate(time.Hour * 24) today := time.Now().UTC().Truncate(time.Hour * 24)
if r.Method == "POST" { if r.Method == "POST" {
suggestion_json := r.PostFormValue("suggestion") suggestion_json := r.PostFormValue("suggestion")