From 0df09267390f693d8a14aab81e9a502eb80d1f21 Mon Sep 17 00:00:00 2001 From: Steffen van Bergerem <svbergerem@online.de> Date: Sun, 2 Aug 2015 03:46:55 +0200 Subject: [PATCH] Convert BackToTop to a backbone view --- app/assets/javascripts/app/app.js | 1 + .../javascripts/app/views/back_to_top_view.js | 26 +++++++++ app/assets/javascripts/diaspora.js | 1 - app/assets/javascripts/widgets/back-to-top.js | 36 ------------- .../app/views/back_to_top_view_spec.js | 29 ++++++++++ spec/javascripts/widgets/back-to-top-spec.js | 53 ------------------- 6 files changed, 56 insertions(+), 90 deletions(-) create mode 100644 app/assets/javascripts/app/views/back_to_top_view.js delete mode 100644 app/assets/javascripts/widgets/back-to-top.js create mode 100644 spec/javascripts/app/views/back_to_top_view_spec.js delete mode 100644 spec/javascripts/widgets/back-to-top-spec.js diff --git a/app/assets/javascripts/app/app.js b/app/assets/javascripts/app/app.js index 11f5dd367a..841a0cbd2c 100644 --- a/app/assets/javascripts/app/app.js +++ b/app/assets/javascripts/app/app.js @@ -115,6 +115,7 @@ var app = { new app.views.AspectMembership({el: this}); }); app.sidebar = new app.views.Sidebar(); + app.backToTop = new app.views.BackToTop(); }, /* mixpanel wrapper function */ diff --git a/app/assets/javascripts/app/views/back_to_top_view.js b/app/assets/javascripts/app/views/back_to_top_view.js new file mode 100644 index 0000000000..66c5164755 --- /dev/null +++ b/app/assets/javascripts/app/views/back_to_top_view.js @@ -0,0 +1,26 @@ +// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later + +app.views.BackToTop = Backbone.View.extend({ + events: { + "click #back-to-top": "backToTop" + }, + + initialize: function() { + var throttledScroll = _.throttle(this.toggleVisibility, 250); + $(window).scroll(throttledScroll); + }, + + backToTop: function(evt) { + evt.preventDefault(); + $("html, body").animate({scrollTop: 0}); + }, + + toggleVisibility: function() { + if($("html, body").scrollTop() > 1000) { + $("#back-to-top").addClass("visible"); + } else { + $("#back-to-top").removeClass("visible"); + } + } +}); +// @license-end diff --git a/app/assets/javascripts/diaspora.js b/app/assets/javascripts/diaspora.js index 0549057869..b4a70e1f40 100644 --- a/app/assets/javascripts/diaspora.js +++ b/app/assets/javascripts/diaspora.js @@ -68,7 +68,6 @@ Diaspora.BasePage = function(body) { $.extend(this, Diaspora.BaseWidget); $.extend(this, { - backToTop: this.instantiate("BackToTop", body.find("#back-to-top")), directionDetector: this.instantiate("DirectionDetector"), events: function() { return Diaspora.page.eventsContainer.data("events"); }, flashMessages: this.instantiate("FlashMessages"), diff --git a/app/assets/javascripts/widgets/back-to-top.js b/app/assets/javascripts/widgets/back-to-top.js deleted file mode 100644 index bde326774e..0000000000 --- a/app/assets/javascripts/widgets/back-to-top.js +++ /dev/null @@ -1,36 +0,0 @@ -// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later - -(function() { - var BackToTop = function() { - var self = this; - - this.subscribe("widget/ready", function(evt, button) { - $.extend(self, { - button: button, - body: $("html, body"), - window: $(window) - }); - - self.button.click(self.backToTop); - - var throttledScroll = _.throttle($.proxy(self.toggleVisibility, self), 250); - self.window.scroll(throttledScroll); - }); - - this.backToTop = function(evt) { - evt.preventDefault(); - self.body.animate({scrollTop: 0}); - }; - - this.toggleVisibility = function() { - self.button[ - (self.body.scrollTop() > 1000) ? - 'addClass' : - 'removeClass' - ]('visible'); - }; - }; - - Diaspora.Widgets.BackToTop = BackToTop; -})(); -// @license-end diff --git a/spec/javascripts/app/views/back_to_top_view_spec.js b/spec/javascripts/app/views/back_to_top_view_spec.js new file mode 100644 index 0000000000..8cfed56967 --- /dev/null +++ b/spec/javascripts/app/views/back_to_top_view_spec.js @@ -0,0 +1,29 @@ +describe("app.views.BackToTop", function() { + beforeEach(function() { + spec.loadFixture("aspects_index"); + this.view = new app.views.BackToTop(); + }); + + describe("backToTop", function() { + it("scrolls to the top of the page", function() { + var spy = spyOn($.fn, "animate"); + this.view.backToTop($.Event()); + expect(spy).toHaveBeenCalledWith({scrollTop: 0}); + }); + }); + + describe("toggleVisibility", function() { + it("toggles the button visibility depending on the scroll position", function() { + expect($("#back-to-top")).not.toHaveClass("visible"); + var spy = spyOn($.fn, "scrollTop").and.returnValue(1000); + this.view.toggleVisibility(); + expect($("#back-to-top")).not.toHaveClass("visible"); + spy.and.returnValue(1001); + this.view.toggleVisibility(); + expect($("#back-to-top")).toHaveClass("visible"); + spy.and.returnValue(1000); + this.view.toggleVisibility(); + expect($("#back-to-top")).not.toHaveClass("visible"); + }); + }); +}); diff --git a/spec/javascripts/widgets/back-to-top-spec.js b/spec/javascripts/widgets/back-to-top-spec.js deleted file mode 100644 index 35543969a4..0000000000 --- a/spec/javascripts/widgets/back-to-top-spec.js +++ /dev/null @@ -1,53 +0,0 @@ -describe("Diaspora.Widgets.BackToTop", function() { - var backToTop; - beforeEach(function() { - spec.loadFixture("aspects_index"); - backToTop = Diaspora.BaseWidget.instantiate("BackToTop", $("#back-to-top")); - $.fx.off = true; - }); - - describe("integration", function() { - beforeEach(function() { - backToTop = new Diaspora.Widgets.BackToTop(); - - spyOn(backToTop, "backToTop"); - spyOn(backToTop, "toggleVisibility"); - - backToTop.publish("widget/ready", [$("#back-to-top")]); - }); - - it("calls backToTop when the button is clicked", function() { - backToTop.button.click(); - - expect(backToTop.backToTop).toHaveBeenCalled(); - }); - }); - - describe("backToTop", function() { - it("animates scrollTop to 0", function() { - backToTop.backToTop($.Event()); - - expect($("body").scrollTop()).toEqual(0); - }); - }); - - describe("toggleVisibility", function() { - it("adds a visibility class to the button", function() { - var spy = spyOn(backToTop.body, "scrollTop").and.returnValue(999); - - backToTop.toggleVisibility(); - - expect(backToTop.button.hasClass("visible")).toBe(false); - - spy.and.returnValue(1001); - - backToTop.toggleVisibility(); - - expect(backToTop.button.hasClass("visible")).toBe(true); - }); - }); - - afterEach(function() { - $.fx.off = false; - }); -}); -- GitLab