172 lines
4.8 KiB
JavaScript
172 lines
4.8 KiB
JavaScript
var React = require('react');
|
|
|
|
var ReactBootstrap = require('react-bootstrap');
|
|
var Grid = ReactBootstrap.Grid;
|
|
var Row = ReactBootstrap.Row;
|
|
var Col = ReactBootstrap.Col;
|
|
var FormGroup = ReactBootstrap.FormGroup;
|
|
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
|
|
|
|
// Find the last suggestion, if possible
|
|
var lastSuggestion = null;
|
|
var lastSuggestionId = this.getLastSuggestion(props);
|
|
if (props.suggestions.hasOwnProperty(lastSuggestionId))
|
|
lastSuggestion = props.suggestions[lastSuggestionId];
|
|
|
|
if (this.state.attendee == null ||
|
|
!props.attendees.hasOwnProperty(this.state.attendee.AttendeeId) ||
|
|
(lastSuggestion && lastSuggestion.AttendeeId == this.state.attendee.AttendeeId)) {
|
|
var attendeeList = this.getAttendeeList(props);
|
|
if (attendeeList.length >= 1) {
|
|
this.setState({
|
|
attendee: attendeeList[0]
|
|
});
|
|
} else {
|
|
this.setState({
|
|
attendee: null
|
|
});
|
|
}
|
|
}
|
|
},
|
|
getAttendeeList: function(props) {
|
|
if (!props)
|
|
props = this.props;
|
|
|
|
var attendeeList = [];
|
|
var lastSuggestion = null;
|
|
|
|
var lastSuggestionId = this.getLastSuggestion(props);
|
|
if (props.suggestions.hasOwnProperty(lastSuggestionId))
|
|
lastSuggestion = props.suggestions[lastSuggestionId];
|
|
|
|
for (var attendeeId in props.attendees) {
|
|
if (!lastSuggestion || lastSuggestion.AttendeeId != parseInt(attendeeId, 10))
|
|
attendeeList.push(props.attendees[attendeeId]);
|
|
}
|
|
return attendeeList;
|
|
},
|
|
getLastSuggestion: function(props) {
|
|
if (!props)
|
|
props = this.props;
|
|
|
|
var lastSuggestion = -1;
|
|
for (var suggestionId in 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;
|
|
var lastSuggestionIndex = this.getLastSuggestion();
|
|
if (lastSuggestionIndex > -1)
|
|
suggestion.VetoingId = this.props.suggestions[lastSuggestionIndex].SuggestionId;
|
|
else
|
|
suggestion.VetoingId = -1;
|
|
this.props.createSuggestion(suggestion);
|
|
this.setState({
|
|
attendee: null,
|
|
suggestion: null
|
|
});
|
|
},
|
|
unusedPopularSuggestions: function() {
|
|
var props = this.props;
|
|
return props.popularSuggestions.filter(
|
|
function(suggestion){
|
|
for (var suggestionId in props.suggestions) {
|
|
if (props.suggestions[suggestionId].RestaurantName == suggestion.RestaurantName)
|
|
return false;
|
|
}
|
|
return true;
|
|
});
|
|
},
|
|
render: function() {
|
|
var attendeeList = this.getAttendeeList();
|
|
var buttonDisabled = this.state.attendee == null || !this.state.suggestion;
|
|
var suggestionLabel = "Add Suggestion To:";
|
|
var byLabel = "Suggested By:"
|
|
if (Object.keys(this.props.suggestions).length > 0) {
|
|
suggestionLabel = "Veto With:";
|
|
byLabel = "Vetoed By:"
|
|
}
|
|
return (
|
|
<Row>
|
|
<Col xs={4}>
|
|
<FormGroup controlId="newsuggestionrestaurantname">
|
|
<ControlLabel>{suggestionLabel}</ControlLabel>
|
|
<Combobox
|
|
value={this.state.suggestion}
|
|
data={this.unusedPopularSuggestions()}
|
|
valueField='RestaurantName'
|
|
textField='RestaurantName'
|
|
onChange={this.onChangeSuggestion} />
|
|
</FormGroup>
|
|
</Col>
|
|
<Col xs={1}></Col>
|
|
<Col xs={4}>
|
|
<FormGroup controlId="newsuggestionby">
|
|
<ControlLabel>{byLabel}</ControlLabel>
|
|
<Combobox
|
|
value={this.state.attendee}
|
|
data={attendeeList}
|
|
valueField='AttendeeId'
|
|
textField='Name'
|
|
onChange={this.onChangeAttendee} />
|
|
</FormGroup>
|
|
</Col>
|
|
<Col xs={1}></Col>
|
|
<Col xs={2}>
|
|
<FormGroup controlId="addnewsuggestionbutton">
|
|
<Button bsClass="addsuggestionbutton btn" bsStyle="success" disabled={buttonDisabled} onClick={this.onAddSuggestion}>Add</Button>
|
|
</FormGroup>
|
|
</Col>
|
|
</Row>
|
|
);
|
|
}
|
|
});
|