diff --git a/Changelog.md b/Changelog.md index 215f341e2..7d1d35cb3 100644 --- a/Changelog.md +++ b/Changelog.md @@ -26,6 +26,7 @@ * Change minimal birth year for the birthday field to 1910 [#5083](https://github.com/diaspora/diaspora/pull/5083) * Add scrolling thumbnail switcher in the lightbox [#5102](https://github.com/diaspora/diaspora/pull/5102) * Add help section about keyboard shortcuts [#5100](https://github.com/diaspora/diaspora/pull/5100) +* Automatically add poll answers as needed [#5109](https://github.com/diaspora/diaspora/pull/5109) # 0.4.0.1 diff --git a/app/assets/javascripts/app/views/publisher/poll_creator_view.js b/app/assets/javascripts/app/views/publisher/poll_creator_view.js index 158512e4a..ebc6755aa 100644 --- a/app/assets/javascripts/app/views/publisher/poll_creator_view.js +++ b/app/assets/javascripts/app/views/publisher/poll_creator_view.js @@ -2,7 +2,7 @@ app.views.PublisherPollCreator = app.views.Base.extend({ templateName: "poll_creator", events: { - 'click .add-answer .button': 'clickAddAnswer', + 'keypress input:last': 'addAnswer', 'click .remove-answer': 'removeAnswer', 'blur input': 'validate', 'input input': 'validate' @@ -12,13 +12,13 @@ app.views.PublisherPollCreator = app.views.Base.extend({ this.$pollAnswers = this.$('.poll-answers'); this.inputCount = 2; this.trigger('change'); + this.bind('publisher:sync', this.render, this); }, - - clickAddAnswer: function(evt){ - evt.preventDefault(); - this.addAnswerInput(); - this.trigger('change'); + addAnswer: function(evt){ + if (!$(evt.target).val()) { + this.addAnswerInput(); + } }, addAnswerInput: function(){ @@ -26,11 +26,7 @@ app.views.PublisherPollCreator = app.views.Base.extend({ var input_wrapper = this.$('.poll-answer:first').clone(); var input = input_wrapper.find('input'); - var text = Diaspora.I18n.t('publisher.option', { - nr: this.inputCount - }); - - input.attr('placeholder', text); + input.attr('placeholder', Diaspora.I18n.t('publisher.add_option')); input.val(''); this.$pollAnswers.append(input_wrapper); this.toggleRemoveAnswer(); @@ -47,6 +43,13 @@ app.views.PublisherPollCreator = app.views.Base.extend({ this.toggleRemoveAnswer(); }, + removeLastAnswer: function (){ + var inputs = this.$pollAnswers.find('input'); + if(inputs.length > 2 && !inputs[inputs.length - 1].value) { + this.$el.find('.poll-answer:last').remove(); + } + }, + toggleRemoveAnswer: function(){ var inputs = this.$pollAnswers.find('input'); if(inputs.length < 3){ @@ -63,7 +66,7 @@ app.views.PublisherPollCreator = app.views.Base.extend({ validate: function(evt){ var input = $(evt.target); - this.validateInput(input); + this.validatePoll(); this.trigger('change'); }, @@ -87,18 +90,17 @@ app.views.PublisherPollCreator = app.views.Base.extend({ validatePoll: function() { var _this = this; - _.each(this.$('input:visible'), function(input){ - _this.validateInput($(input)); - }); - }, + var inputs = this.$('input:visible'); + var pollValid = true; - isValidPoll: function(){ - var _this = this; - - return _.every(this.$('input:visible'), function(input){ - if(_this.isValidInput($(input))) - return true; + _.each(inputs, function(input, i){ + // Validate the input unless it is the last one, or there are only the + // question field and two options + if( i !== inputs.length - 1 || inputs.length <= 3) { + if(_this.validateInput($(input)) == false) pollValid = false; + } }); + + return pollValid; } - }); diff --git a/app/assets/javascripts/app/views/publisher_view.js b/app/assets/javascripts/app/views/publisher_view.js index 6d983737d..a975522de 100644 --- a/app/assets/javascripts/app/views/publisher_view.js +++ b/app/assets/javascripts/app/views/publisher_view.js @@ -82,6 +82,11 @@ app.views.Publisher = Backbone.View.extend({ this.showSpinner(false); }); + // resetting the poll view + this.on('publisher:sync', function() { + this.view_poll_creator.render(); + }); + this.initSubviews(); return this; }, @@ -151,6 +156,11 @@ app.views.Publisher = Backbone.View.extend({ if(evt){ evt.preventDefault(); } + // Auto-adding a poll answer always leaves an empty box when the user starts + // typing in the last box. We'll delete the last one to avoid submitting an + // empty poll answer and failing validation. + this.view_poll_creator.removeLastAnswer(); + //add missing mentions at end of post: this.handleTextchange(); @@ -179,6 +189,7 @@ app.views.Publisher = Backbone.View.extend({ if( app.publisher ) { app.publisher.$el.trigger('ajax:success'); app.publisher.trigger('publisher:sync'); + self.view_poll_creator.trigger('publisher:sync'); } if(app.stream) app.stream.addNow(statusMessage.toJSON()); @@ -447,10 +458,7 @@ app.views.Publisher = Backbone.View.extend({ _submittable: function() { var onlyWhitespaces = ($.trim(this.el_input.val()) === ''), isPhotoAttached = (this.el_photozone.children().length > 0), - isValidPoll = this.view_poll_creator.isValidPoll(); - - // show poll errors - this.view_poll_creator.validatePoll(); + isValidPoll = this.view_poll_creator.validatePoll(); return (!onlyWhitespaces || isPhotoAttached) && isValidPoll && !this.disabled; }, diff --git a/app/assets/templates/poll_creator_tpl.jst.hbs b/app/assets/templates/poll_creator_tpl.jst.hbs index e8d50a84d..f71d46f01 100644 --- a/app/assets/templates/poll_creator_tpl.jst.hbs +++ b/app/assets/templates/poll_creator_tpl.jst.hbs @@ -6,19 +6,15 @@