From 00f1adc8b2958339efd42fa233de533596da8503 Mon Sep 17 00:00:00 2001 From: Dennis Collinson Date: Thu, 17 May 2012 13:24:21 -0700 Subject: [PATCH] Going back to the composer from the framer is happy via button --- .../javascripts/app/forms/picture_form.js | 2 +- app/assets/javascripts/app/forms/post_form.js | 2 +- app/assets/javascripts/app/pages/composer.js | 25 +-- app/assets/javascripts/app/pages/framer.js | 15 +- .../app/views/aspects_dropdown_view.js | 79 ++++---- .../app/views/services_selector_view.js | 11 +- .../app/views/template_picker_view.js | 2 +- .../stylesheets/new_styles/_composer.scss | 10 +- app/assets/templates/aspects-dropdown.jst.hbs | 19 +- app/assets/templates/framer-controls.jst.hbs | 5 +- app/assets/templates/post-form.jst.hbs | 2 +- .../templates/services-selector.jst.hbs | 11 +- features/step_definitions/trumpeter_steps.rb | 6 +- features/trumpeter.feature | 17 +- .../app/forms/picture_form_spec.js | 2 +- spec/javascripts/app/pages/composer_spec.js | 21 +- .../app/views/aspects_dropdown_view_spec.js | 179 +++++++++--------- .../app/views/services_selector_view_spec.js | 6 +- .../app/views/template_picker_view_spec.js | 3 +- 19 files changed, 225 insertions(+), 192 deletions(-) diff --git a/app/assets/javascripts/app/forms/picture_form.js b/app/assets/javascripts/app/forms/picture_form.js index 21f3ba64c..6fc4a19be 100644 --- a/app/assets/javascripts/app/forms/picture_form.js +++ b/app/assets/javascripts/app/forms/picture_form.js @@ -31,7 +31,7 @@ app.forms.Picture = app.forms.PictureBase.extend({ templateName : "picture-form", initialize : function() { - this.photos = new Backbone.Collection() + this.photos = this.model.photos || new Backbone.Collection() this.photos.bind("add", this.render, this) }, diff --git a/app/assets/javascripts/app/forms/post_form.js b/app/assets/javascripts/app/forms/post_form.js index 0d454847f..944cdd9a8 100644 --- a/app/assets/javascripts/app/forms/post_form.js +++ b/app/assets/javascripts/app/forms/post_form.js @@ -7,7 +7,7 @@ app.forms.Post = app.views.Base.extend({ }, initialize : function() { - this.pictureForm = new app.forms.Picture(); + this.pictureForm = new app.forms.Picture({model: this.model}); }, postRenderTemplate : function() { diff --git a/app/assets/javascripts/app/pages/composer.js b/app/assets/javascripts/app/pages/composer.js index d8b47789e..1eaea7105 100644 --- a/app/assets/javascripts/app/pages/composer.js +++ b/app/assets/javascripts/app/pages/composer.js @@ -12,16 +12,21 @@ app.pages.Composer = app.views.Base.extend({ formAttrs : { "textarea#text_with_markup" : "text", - "input.aspect_ids" : "aspect_ids", - "input.service:checked" : "services" + "input.aspect_ids" : "aspect_ids[]", + "input.services" : "services[]" }, initialize : function(){ - app.frame = this.model = new app.models.StatusMessage(); + app.frame = this.model = this.model || new app.models.StatusMessage(); this.postForm = new app.forms.Post({model : this.model}); this.composerControls = new app.views.ComposerControls({model : this.model}); }, + unbind : function(){ + this.model.off() + this.model.photos.off() + }, + navigateNext : function(){ var self = this, textArea = this.$("form textarea.text") @@ -46,14 +51,12 @@ app.pages.Composer = app.views.Base.extend({ this.model.set({"photos": this.model.photos.toJSON() }) this.model.set(overrides) + function setValueFromField(memo, attribute, selector){ - var selectors = form.find(selector); - if(selectors.length > 1) { - memo[attribute] = _.map(selectors, function(selector){ - return this.$(selector).val() - }) + if(attribute.slice("-2") === "[]") { + memo[attribute.slice(0, attribute.length - 2)] = _.pluck(form.find(selector).serializeArray(), "value") } else { - memo[attribute] = selectors.val(); + memo[attribute] = form.find(selector).val(); } return memo } @@ -69,7 +72,7 @@ app.views.ComposerControls = app.views.Base.extend({ }, initialize : function() { - this.aspectsDropdown = new app.views.AspectsDropdown(); - this.servicesSelector = new app.views.ServicesSelector(); + this.aspectsDropdown = new app.views.AspectsDropdown({model : this.model}); + this.servicesSelector = new app.views.ServicesSelector({model : this.model}); } }) diff --git a/app/assets/javascripts/app/pages/framer.js b/app/assets/javascripts/app/pages/framer.js index 7f3c9d4dd..9a85a7887 100644 --- a/app/assets/javascripts/app/pages/framer.js +++ b/app/assets/javascripts/app/pages/framer.js @@ -18,6 +18,10 @@ app.pages.Framer = app.views.Base.extend({ this.framerControls = new app.views.framerControls({model : this.model}) }, + unbind : function(){ + this.model.off() + }, + postView : function(){ return new app.views.SmallFrame({model : this.model}) }, @@ -45,7 +49,8 @@ app.views.framerControls = app.views.Base.extend({ templateName : 'framer-controls', events : { - "click button.done" : "saveFrame" + "click button.done" : "saveFrame", + "click button.back" : "editFrame" }, subviews : { @@ -57,8 +62,12 @@ app.views.framerControls = app.views.Base.extend({ }, saveFrame : function(){ - this.$('button').prop('disabled', 'disabled') - .addClass('disabled') + this.$('button').prop('disabled', 'disabled').addClass('disabled') this.model.save() + }, + + editFrame : function(){ + app.router.renderPage(function(){return new app.pages.Composer({model : app.frame})}) + app.router.navigate("/posts/new") } }); diff --git a/app/assets/javascripts/app/views/aspects_dropdown_view.js b/app/assets/javascripts/app/views/aspects_dropdown_view.js index e02fed8ef..5925b0ea2 100644 --- a/app/assets/javascripts/app/views/aspects_dropdown_view.js +++ b/app/assets/javascripts/app/views/aspects_dropdown_view.js @@ -1,55 +1,60 @@ app.views.AspectsDropdown = app.views.Base.extend({ templateName : "aspects-dropdown", events : { - "click .dropdown-menu a" : "setVisibility" + "change .dropdown-menu input" : "setVisibility" + }, + + presenter : function(){ + var selectedAspects = this.model.get("aspect_ids") + , parsedIds = _.map(selectedAspects, parseInt) + + return { + aspects : _.map(app.currentUser.get('aspects'), function(aspect){ + return _.extend({}, aspect, {checked :_.include(parsedIds, aspect.id) }) + }), + + public :_.include(selectedAspects, "public"), + 'all-aspects' :_.include(selectedAspects, "all_aspects") + } }, postRenderTemplate : function(){ - this.setVisibility({target : this.$("a[data-visibility='public']").first()}) + if(this.model.get("aspect_ids")) { + this.setDropdownText() + } else { + this.setVisibility({target : this.$("input[value='public']").first()}) + } }, setVisibility : function(evt){ - var self = this - , link = $(evt.target).closest("a") + var input = $(evt.target).closest("input") - if(_.include(['public', 'all-aspects'], link.data('visibility'))) { - deselectAll() - link.parents("li").addClass("selected") - self.setDropdownText(link.text()) + if(_.include(['public', 'all_aspects'], input.val())) { + this.$("input").attr("checked", false) + input.attr("checked", "checked") } else { - deselectOverrides() - link.parents("li").toggleClass("selected") - evt.stopImmediatePropagation(); //stop dropdown from going awaay - - var selectedAspects = this.$("li.selected") - if(selectedAspects.length > 1) { - self.setDropdownText("In " + this.$("li.selected").length + " aspects") - } else { - self.setDropdownText(selectedAspects.text() || "Private") - } + this.$("input.public, input.all_aspects").attr("checked", false) } - this.setAspectIds() - - function deselectOverrides() { - self.$("a.public, a.all-aspects").parent().removeClass("selected") - } - - function deselectAll() { - self.$("li.selected").removeClass("selected") - } + this.setDropdownText() }, - setDropdownText : function(text){ + setDropdownText : function(){ + var selected = this.$("input").serializeArray() + , text; + + switch (selected.length) { + case 0: + text = "Private" + break + case 1: + text = selected[0].name + break + default: + text = ["In", selected.length, "aspects"].join(" ") + break + } + $.trim(this.$(".dropdown-toggle .text").text(text)) - }, - - setAspectIds : function(){ - var selectedAspects = this.$("li.selected a") - var aspectIds = _.map(selectedAspects, function(aspect){ - return $(aspect).data("aspect-id")} - ) - - this.$("input.aspect_ids").val(aspectIds) } }) diff --git a/app/assets/javascripts/app/views/services_selector_view.js b/app/assets/javascripts/app/views/services_selector_view.js index a6ceef3c2..43cb65328 100644 --- a/app/assets/javascripts/app/views/services_selector_view.js +++ b/app/assets/javascripts/app/views/services_selector_view.js @@ -15,7 +15,16 @@ app.views.ServicesSelector = app.views.Base.extend({ ], presenter : function() { - return _.extend(this.defaultPresenter(), {services : this.services}) + var selectedServices = this.model.get('services'); + + return _.extend(this.defaultPresenter(), { + services :_.map(this.services, function(service){ + return { + name : service, + checked :_.include(selectedServices, service) + } + }) + }) }, askForAuth : function(evt){ diff --git a/app/assets/javascripts/app/views/template_picker_view.js b/app/assets/javascripts/app/views/template_picker_view.js index 9293073a5..c2f768071 100644 --- a/app/assets/javascripts/app/views/template_picker_view.js +++ b/app/assets/javascripts/app/views/template_picker_view.js @@ -6,7 +6,7 @@ app.views.TemplatePicker = app.views.Base.extend({ }, initialize : function(){ - this.model.setFrameName() + if(!this.model.get('frame_name')) this.model.setFrameName() }, postRenderTemplate : function(){ diff --git a/app/assets/stylesheets/new_styles/_composer.scss b/app/assets/stylesheets/new_styles/_composer.scss index dd5f2980f..5799e6675 100644 --- a/app/assets/stylesheets/new_styles/_composer.scss +++ b/app/assets/stylesheets/new_styles/_composer.scss @@ -53,22 +53,20 @@ .aspect-selector { float: left; - i { + i, input { display: none; } - .selected i { + input:checked + label i { display: inline-block; position: absolute; left : 3px; margin-top : 1px; } - a { - display : block; - + label { span:not(.caret) { - padding-left: 5px; + padding-left: 21px; } } } diff --git a/app/assets/templates/aspects-dropdown.jst.hbs b/app/assets/templates/aspects-dropdown.jst.hbs index a89c087f9..d5d74a482 100644 --- a/app/assets/templates/aspects-dropdown.jst.hbs +++ b/app/assets/templates/aspects-dropdown.jst.hbs @@ -3,14 +3,23 @@ diff --git a/app/assets/templates/framer-controls.jst.hbs b/app/assets/templates/framer-controls.jst.hbs index 2d824cd27..a4c59b94f 100644 --- a/app/assets/templates/framer-controls.jst.hbs +++ b/app/assets/templates/framer-controls.jst.hbs @@ -1,4 +1,5 @@
-
- +
+ +
\ No newline at end of file diff --git a/app/assets/templates/post-form.jst.hbs b/app/assets/templates/post-form.jst.hbs index b1d1d1571..aa0857dcf 100644 --- a/app/assets/templates/post-form.jst.hbs +++ b/app/assets/templates/post-form.jst.hbs @@ -4,7 +4,7 @@ Make Something! -