Add ability to add suggestions to UI
This commit is contained in:
parent
350a30715a
commit
49409f84d2
@ -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")
|
||||||
|
117
js/components/NewSuggestion.js
Normal file
117
js/components/NewSuggestion.js
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -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")
|
||||||
|
Loading…
Reference in New Issue
Block a user