From 67e56dce2ca721f48b12eb1c52ca1ecd964a349c Mon Sep 17 00:00:00 2001 From: danielgrippi <danielgrippi@gmail.com> Date: Fri, 16 Dec 2011 18:41:07 -0800 Subject: [PATCH] backbone view for header; moved user dropdown logic in there; moved jasmine specs over; removed old widget --- app/views/layouts/application.html.haml | 5 +- app/views/templates/_templates.haml | 4 + app/views/templates/header.ujs | 86 +++++++++++++++++++ public/javascripts/app/app.js | 6 ++ public/javascripts/app/views/header_view.js | 39 +++++++++ public/javascripts/diaspora.js | 2 +- public/javascripts/widgets/header.js | 7 +- public/javascripts/widgets/user-dropdown.js | 34 -------- .../javascripts/app/views/header_view_spec.js | 32 +++++++ .../javascripts/app/views/stream_view_spec.js | 2 +- .../javascripts/widgets/user-dropdown-spec.js | 25 ------ 11 files changed, 175 insertions(+), 67 deletions(-) create mode 100644 app/views/templates/header.ujs create mode 100644 public/javascripts/app/views/header_view.js delete mode 100644 public/javascripts/widgets/user-dropdown.js create mode 100644 spec/javascripts/app/views/header_view_spec.js delete mode 100644 spec/javascripts/widgets/user-dropdown-spec.js diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 2c4d516205..d164220ee7 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -71,8 +71,9 @@ #notifications - %header{:class=>('landing' unless current_user)} - = render 'layouts/header' + - unless user_signed_in? + %header{:class=>('landing')} + = render 'layouts/header' = render 'templates/templates' diff --git a/app/views/templates/_templates.haml b/app/views/templates/_templates.haml index 6dd5ea81b7..3c2f9e3a21 100644 --- a/app/views/templates/_templates.haml +++ b/app/views/templates/_templates.haml @@ -2,6 +2,9 @@ -# licensed under the Affero General Public License version 3 or later. See -# the COPYRIGHT file. +%script{:id => "header-template", :type => 'text/template'} + != File.read("#{Rails.root}/app/views/templates/header.ujs") + %script{:id => "stream-element-template", :type => 'text/template'} != File.read("#{Rails.root}/app/views/templates/stream_element.ujs") @@ -19,3 +22,4 @@ %script{:id => "activity-streams-photo-template", :type => 'text/template'} != File.read("#{Rails.root}/app/views/templates/activity-streams-photo.ujs") + diff --git a/app/views/templates/header.ujs b/app/views/templates/header.ujs new file mode 100644 index 0000000000..828557d9af --- /dev/null +++ b/app/views/templates/header.ujs @@ -0,0 +1,86 @@ +<header> +<div class="container" style="position:relative;"> + <a href="/stream"><img alt="Logo_small" class="diaspora_header_logo" height="16px" src="/images/logo_small.png?1322618579" width="161px"></a> + <div id="global_search"> + <form accept-charset="UTF-8" action="/people" class="search_form" method="get"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓"></div> + <input id="q" name="q" placeholder="Find people or #tags" results="5" type="search" autocomplete="off" class="ac_input"> + </form> + </div> + <div id="nav_badges"> + <div class="badge" id="home_badge"> + <a href="/stream" title="Home"><img alt="Home" src="/images/icons/home_grey.png"> + </a> + </div> + <div class="badge" id="notification_badge"> + <a href="/notifications" title="No new notifications"> + <img alt="No new notifications" id="notification-flag" src="/images/icons/notifications_grey.png"> + <div class="badge_count hidden"> + 0 + </div> + </a> + </div> + <div class="badge" id="message_inbox_badge"> + <a href="/conversations" title="No new messages"><img alt="No new messages" src="/images/icons/mail_grey.png"> + <div class="badge_count hidden"> + 0 + </div> + </a> + </div> + </div> + <div id="notification_dropdown"> + <div class="header"> + <div class="right"> + <a href="/notifications/read_all">Mark All as Read</a> + | + <a href="/notifications" id="view_all_notifications">View all</a> + </div> + <h4> + Recent notifications + </h4> + </div> + <div class="notifications"> + <div class="ajax_loader"> + <img alt="Ajax-loader" src="/images/ajax-loader.gif"> + </div> + </div> + </div> + <div id="hovercard_container"> + <div id="hovercard"> + <img class="avatar"> + <h4> + <a class="person"></a> + </h4> + <p class="handle"></p> + <div id="hovercard_dropdown_container"></div> + <div class="hovercard_footer"> + <div class="footer_container"> + <div class="hashtags"></div> + </div> + </div> + </div> + </div> + <ul class="dropdown" id="user_menu"> + <li> + <div class="right"> + ▼ + </div> + <div class="avatar"> + <img alt="<%= current_user.name %>" class="avatar" data-person_id="<%= current_user.id %>" src="<%= current_user.avatar.small %>" title="Bob Grimm"> + </div> + <a href="#" title="bob@localhost:3000">Bob Grimm</a> + </li> + <li><a href="/people/<%= current_user.id %>">Profile</a></li> + <li><a href="/contacts">Contacts</a></li> + <li><a href="/user/edit">Settings</a></li> + <li><a href="/users/sign_out">Log out</a></li> + </ul> + <div id="lightbox"> + <div id="lightbox-content"> + <a href="#" id="lightbox-close-link">[x] close</a> + <img id="lightbox-image"> + <div id="lightbox-imageset"></div> + </div> + </div> + <div id="lightbox-backdrop"></div> +</div> +</header> diff --git a/public/javascripts/app/app.js b/public/javascripts/app/app.js index 38c7b96f57..d21aa6c69a 100644 --- a/public/javascripts/app/app.js +++ b/public/javascripts/app/app.js @@ -12,6 +12,12 @@ var App = { initialize: function() { App.router = new App.Router; + if(this._user){ + App.header = new App.Views.Header; + $("body").prepend(App.header.el); + App.header.render(); + } + Backbone.history.start({pushState: true}); } }; diff --git a/public/javascripts/app/views/header_view.js b/public/javascripts/app/views/header_view.js new file mode 100644 index 0000000000..d054dcba0f --- /dev/null +++ b/public/javascripts/app/views/header_view.js @@ -0,0 +1,39 @@ +App.Views.Header = Backbone.View.extend({ + + events : { + "click ul.dropdown li:first-child" : "toggleDropdown" + }, + + initialize : function(options) { + this.menuElement = this.$("ul.dropdown"); + + _.bindAll(this, "toggleDropdown", "hideDropdown"); + this.menuElement.find("li a").slice(1).click(function(evt) { evt.stopPropagation(); }); + $(document.body).click(this.hideDropdown); + + return this; + }, + + render : function(){ + this.template = _.template($("#header-template").html()); + $(this.el).html(this.template(App.user())); + return this; + }, + + toggleDropdown : function(evt) { + evt.preventDefault(); + evt.stopPropagation(); + + this.$("ul.dropdown").toggleClass("active"); + + if ( $.browser.msie ) { + this.$('header').toggleClass('ie-user-menu-active'); + } + }, + + hideDropdown : function(evt) { + if(this.$("ul.dropdown").hasClass("active") && !$(evt.target).parents("#user_menu").length) { + this.$("ul.dropdown").removeClass("active"); + } + } +}); diff --git a/public/javascripts/diaspora.js b/public/javascripts/diaspora.js index c2414d2392..1159836fa4 100644 --- a/public/javascripts/diaspora.js +++ b/public/javascripts/diaspora.js @@ -49,7 +49,7 @@ globalSubscribe: function(eventName, callback, context) { Diaspora.page.subscribe(eventName, callback, context); - }, + }, globalPublish: function(eventName, args) { Diaspora.page.publish(eventName, args); diff --git a/public/javascripts/widgets/header.js b/public/javascripts/widgets/header.js index 3dfe648287..208c5cd844 100644 --- a/public/javascripts/widgets/header.js +++ b/public/javascripts/widgets/header.js @@ -1,22 +1,21 @@ (function() { var Header = function() { var self = this; - + this.subscribe("widget/ready", function(evt, header) { self.notifications = self.instantiate("Notifications", header.find("#notifications"), header.find("#notification_badge .badge_count") ); - + self.notificationsDropdown = self.instantiate("NotificationsDropdown", header.find("#notification_badge"), header.find("#notification_dropdown") ); self.search = self.instantiate("Search", header.find(".search_form")); - self.menuElement = self.instantiate("UserDropdown", header.find("#user_menu")); }); }; Diaspora.Widgets.Header = Header; -})(); \ No newline at end of file +})(); diff --git a/public/javascripts/widgets/user-dropdown.js b/public/javascripts/widgets/user-dropdown.js deleted file mode 100644 index 92e12369ab..0000000000 --- a/public/javascripts/widgets/user-dropdown.js +++ /dev/null @@ -1,34 +0,0 @@ -(function() { - var UserDropdown = function() { - var self = this; - - this.subscribe("widget/ready", function(evt, menuElement) { - $.extend(self, { - menuElement: menuElement - }); - - self.menuElement.click(self.toggleDropdown); - self.menuElement.find("li a").slice(1).click(function(evt) { evt.stopPropagation(); }); - $(document.body).click(self.hideDropdown); - }); - - this.toggleDropdown = function(evt) { - evt.preventDefault(); - evt.stopPropagation(); - - self.menuElement.toggleClass("active"); - - if ( $.browser.msie ) { - $('header').toggleClass('ie-user-menu-active'); - } - }; - - this.hideDropdown = function() { - if(self.menuElement.hasClass("active") && !$(this).parents("#user_menu").length) { - self.menuElement.removeClass("active"); - } - }; - }; - - Diaspora.Widgets.UserDropdown = UserDropdown; -})(); diff --git a/spec/javascripts/app/views/header_view_spec.js b/spec/javascripts/app/views/header_view_spec.js new file mode 100644 index 0000000000..70509b4894 --- /dev/null +++ b/spec/javascripts/app/views/header_view_spec.js @@ -0,0 +1,32 @@ +describe("App.Views.Header", function() { + beforeEach(function() { + // should be jasmine helper + + window.current_user = App.user({name: "alice", avatar : {small : "http://avatar.com/photo.jpg"}}); + + spec.loadFixture("aspects_index"); + + this.view = new App.Views.Header().render(); + + console.log(this.view); + + }); + + describe("#toggleDropdown", function() { + it("adds the class 'active'", function() { + expect(this.view.$(".dropdown")).not.toHaveClass("active"); + this.view.toggleDropdown($.Event()); + expect(this.view.$(".dropdown")).toHaveClass("active"); + }); + }); + + describe("#hideDropdown", function() { + it("removes the class 'active' if the user clicks anywhere that isn't the menu element", function() { + this.view.toggleDropdown($.Event()); + expect(this.view.$(".dropdown")).toHaveClass("active"); + + this.view.hideDropdown($.Event()); + expect(this.view.$(".dropdown")).not.toHaveClass("active"); + }); + }); +}); diff --git a/spec/javascripts/app/views/stream_view_spec.js b/spec/javascripts/app/views/stream_view_spec.js index f25a7dd4bc..b1fcda671b 100644 --- a/spec/javascripts/app/views/stream_view_spec.js +++ b/spec/javascripts/app/views/stream_view_spec.js @@ -20,7 +20,7 @@ describe("App.views.Stream", function(){ context("when rendering a Status Mesasage", function(){ it("shows the status message in the content area", function(){ - expect(this.statusElement.find(".post-content p").text()).toContain("jimmy's 2 whales") + expect(this.statusElement.find(".post-content p").text()).toContain("hella infos yo!") }) }) }) diff --git a/spec/javascripts/widgets/user-dropdown-spec.js b/spec/javascripts/widgets/user-dropdown-spec.js deleted file mode 100644 index 32cce8799d..0000000000 --- a/spec/javascripts/widgets/user-dropdown-spec.js +++ /dev/null @@ -1,25 +0,0 @@ -describe("Diaspora.Widgets.UserDropdown", function() { - var userDropdown; - beforeEach(function() { - spec.loadFixture("aspects_index"); - userDropdown = Diaspora.BaseWidget.instantiate("UserDropdown", $("#user_menu")); - }); - - describe("toggleDropdown", function() { - it("adds the class 'active'", function() { - expect(userDropdown.menuElement).not.toHaveClass("active"); - userDropdown.toggleDropdown($.Event()); - expect(userDropdown.menuElement).toHaveClass("active"); - }); - }); - - describe("hideDropdown", function() { - it("removes the class 'active' if the user clicks anywhere that isn't the menu element", function() { - userDropdown.toggleDropdown($.Event()); - expect(userDropdown.menuElement).toHaveClass("active"); - - userDropdown.hideDropdown(); - expect(userDropdown.menuElement).not.toHaveClass("active"); - }); - }); -}); \ No newline at end of file -- GitLab