diff --git a/public/javascripts/app/models/status_message.js b/public/javascripts/app/models/status_message.js index 6359af3998d06817f8fa16b41c28d816fa1a01d5..8152db67ff9c8e1ceb3a4cf95c7af729d1f0709f 100644 --- a/public/javascripts/app/models/status_message.js +++ b/public/javascripts/app/models/status_message.js @@ -6,16 +6,12 @@ app.models.StatusMessage = app.models.Post.extend({ mungeAndSave : function(){ var mungedAttrs = { status_message : _.clone(this.attributes), - aspect_ids : mungeAspects(this.get("aspect_ids")), + 'aspect_ids[]' : this.get("aspect_ids"), services : mungeServices(this.get("services")) } this.save(mungedAttrs) - function mungeAspects (value){ - return [value] - } - function mungeServices (values) { if(!values) { return; } return values.length > 1 ? values : [values] diff --git a/public/javascripts/app/templates/aspects-dropdown.handlebars b/public/javascripts/app/templates/aspects-dropdown.handlebars index de4452e15295422d96ee24024d7bbc2e4e81d702..aca5b30d726fa5079c1e83919f8eb432e6c936eb 100644 --- a/public/javascripts/app/templates/aspects-dropdown.handlebars +++ b/public/javascripts/app/templates/aspects-dropdown.handlebars @@ -3,12 +3,12 @@ <span class="text"></span> <span class="caret"></span> </a> <ul class="dropdown-menu"> - <li><a href="#" class="public" data-visibility="public">Public</a></li> - <li><a href="#" class="all-aspects" data-visibility="all-aspects">All Aspects</a></li> + <li><i class='icon-ok'/><a href="#" class="public" data-aspect-id="public" data-visibility="public">Public</a></li> + <li><i class='icon-ok'/><a href="#" class="all-aspects" data-aspect-id="all_aspects" data-visibility="all-aspects">All Aspects</a></li> <li class="divider"></li> {{#each current_user.aspects}} - <li><a href="#" data-aspect-id="{{id}}" data-visibility="custom">{{name}}</a></li> + <li><i class='icon-ok'/><a href="#" data-aspect-id="{{id}}" data-visibility="custom">{{name}}</a></li> {{/each}} </ul> diff --git a/public/javascripts/app/views/aspects_dropdown_view.js b/public/javascripts/app/views/aspects_dropdown_view.js index b5da17fd201ed62c5e930c1f90fb6b14664697a8..a6085263f2bf68714eee56e92612143f06bf0d39 100644 --- a/public/javascripts/app/views/aspects_dropdown_view.js +++ b/public/javascripts/app/views/aspects_dropdown_view.js @@ -9,28 +9,47 @@ app.views.AspectsDropdown = app.views.Base.extend({ }, setVisibility : function(evt){ - var link = $(evt.target) + var self = this + , link = $(evt.target).closest("a") , visibilityCallbacks = { 'public' : setPublic, 'all-aspects' : setPrivate, 'custom' : setCustom } - visibilityCallbacks[link.data("visibility")].call(this) + visibilityCallbacks[link.data("visibility")]() + + this.setAspectIds() function setPublic (){ - this.setAspectIds("public") - this.setDropdownText(link.text()) + deselectAll() + selectAspect() + self.setDropdownText(link.text()) } function setPrivate (){ - this.setAspectIds("all_aspects") - this.setDropdownText(link.text()) + deselectAll() + selectAspect() + self.setDropdownText(link.text()) } function setCustom (){ - this.setAspectIds(link.data("aspect-id")) - this.setDropdownText(link.text()) + deselectOverrides() + link.parents("li").toggleClass("selected") + self.setDropdownText(link.text()) + evt.stopImmediatePropagation(); + } + + function selectAspect() { + link.parents("li").addClass("selected") + } + + function deselectOverrides() { + self.$("a.public, a.all-aspects").parent().removeClass("selected") + } + + function deselectAll() { + self.$("li.selected").removeClass("selected") } }, @@ -38,7 +57,12 @@ app.views.AspectsDropdown = app.views.Base.extend({ $.trim(this.$(".dropdown-toggle .text").text(text)) }, - setAspectIds : function(val){ - this.$("input.aspect_ids").val(val) + 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/public/stylesheets/sass/new-templates.scss b/public/stylesheets/sass/new-templates.scss index 094627e99f6300e3d6419335f9403a5564e748a8..6edb196b2f9aa0f4c5aaca605f11b791e5bae78b 100644 --- a/public/stylesheets/sass/new-templates.scss +++ b/public/stylesheets/sass/new-templates.scss @@ -764,3 +764,17 @@ text-rendering: optimizelegibility; right: 8px; top: 8px; } + +.aspects_dropdown { + i { + display: none; + } + + .selected i { + display: inline-block; + } + + a { + display : inline-block; + } +} diff --git a/spec/javascripts/app/views/aspects_dropdown_view_spec.js b/spec/javascripts/app/views/aspects_dropdown_view_spec.js index eb34414f799a47aa4621f9faac9fb4ddb811f1de..b5a47604d642849ec231c1452d7a9bb1ba5d2378 100644 --- a/spec/javascripts/app/views/aspects_dropdown_view_spec.js +++ b/spec/javascripts/app/views/aspects_dropdown_view_spec.js @@ -23,7 +23,8 @@ describe("app.views.AspectsDropdown", function(){ describe("selecting Public", function(){ beforeEach(function(){ - this.view.$("a[data-visibility='public']").click() + this.link = this.view.$("a[data-visibility='public']") + this.link.click() }) it("calls set aspect_ids to 'public'", function(){ @@ -33,11 +34,16 @@ describe("app.views.AspectsDropdown", function(){ it("sets the dropdown title to 'public'", function(){ expect(this.view.$(".dropdown-toggle .text").text()).toBe("Public") }) + + it("adds the selected class to the link", function(){ + expect(this.link.parent().hasClass("selected")).toBeTruthy(); + }) }) describe("selecting All Aspects", function(){ beforeEach(function(){ - this.view.$("a[data-visibility='all-aspects']").click() + this.link = this.view.$("a[data-visibility='all-aspects']") + this.link.click() }) it("calls set aspect_ids to 'all'", function(){ @@ -47,20 +53,61 @@ describe("app.views.AspectsDropdown", function(){ it("sets the dropdown title to 'public'", function(){ expect($.trim(this.view.$(".dropdown-toggle .text").text())).toBe("All Aspects") }) + + it("adds the selected class to the link", function(){ + expect(this.link.parent().hasClass("selected")).toBeTruthy(); + }) }) describe("selecting An Aspect", function(){ beforeEach(function(){ - this.view.$("a:contains('lovers')").click() + this.link = this.view.$("a:contains('lovers')") + this.link.click() + }) + + it("sets the dropdown title to the aspect title", function(){ + expect($.trim(this.view.$(".dropdown-toggle .text").text())).toBe("lovers") }) - it("calls set aspect_ids to to the aspect id", function(){ + it("adds the selected class to the link", function(){ + expect(this.link.parent().hasClass("selected")).toBeTruthy(); + }) + + it("sets aspect_ids to to the aspect id", function(){ expect(this.view.$("input.aspect_ids").val()).toBe("7") }) - it("sets the dropdown title to the aspect title", function(){ - expect($.trim(this.view.$(".dropdown-toggle .text").text())).toBe("lovers") + describe("selecting another aspect", function(){ + beforeEach(function(){ + this.view.$("a:contains('sauce')").click() + }) + + it("sets aspect_ids to the selected aspects", function(){ + expect(this.view.$("input.aspect_ids").val()).toBe("3,7") + }) + + describe("deselecting another aspect", function(){ + it("removes the clicked aspect", function(){ + expect(this.view.$("input.aspect_ids").val()).toBe("3,7") + this.view.$("a:contains('lovers')").click() + expect(this.view.$("input.aspect_ids").val()).toBe("3") + }) + }) + + describe("selecting all_aspects", function(){ + it("sets aspect_ids to all_aspects", function(){ + this.view.$("a[data-visibility='all-aspects']").click() + expect(this.view.$("input.aspect_ids").val()).toBe("all_aspects") + }) + }) + + describe("selecting public", function(){ + it("sets aspect_ids to public", function(){ + this.view.$("a[data-visibility='public']").click() + expect(this.view.$("input.aspect_ids").val()).toBe("public") + }) + }) }) }) })