From 4c7948c7f7d3cf7bf191dca8c2b0c88071714ff2 Mon Sep 17 00:00:00 2001 From: Steffen van Bergerem Date: Fri, 11 Aug 2017 02:08:15 +0200 Subject: [PATCH 1/2] Use id in stream comparator as fallback --- app/assets/javascripts/app/models/stream.js | 12 ++++++-- spec/javascripts/app/models/stream_spec.js | 32 +++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/app/models/stream.js b/app/assets/javascripts/app/models/stream.js index f1978eb76..119107144 100644 --- a/app/assets/javascripts/app/models/stream.js +++ b/app/assets/javascripts/app/models/stream.js @@ -13,8 +13,16 @@ app.models.Stream = Backbone.Collection.extend({ }, collectionOptions :function(){ - var order = this.sortOrder(); - return { comparator : function(item) { return -item[order](); } }; + var order = this.sortOrder(); + return { + comparator: function(item1, item2) { + if (item1[order]() < item2[order]()) { return 1; } + if (item1[order]() > item2[order]()) { return -1; } + if (item1.id < item2.id) { return 1; } + if (item1.id > item2.id) { return -1; } + return 0; + } + }; }, url : function(){ diff --git a/spec/javascripts/app/models/stream_spec.js b/spec/javascripts/app/models/stream_spec.js index 0778dbf1f..e107a0d52 100644 --- a/spec/javascripts/app/models/stream_spec.js +++ b/spec/javascripts/app/models/stream_spec.js @@ -7,6 +7,38 @@ describe("app.models.Stream", function() { expectedPath = document.location.pathname; }); + describe("collectionOptions", function() { + beforeEach(function() { + this.post1 = new app.models.Post({"id": 1, "created_at": 12, "interacted_at": 123}); + this.post2 = new app.models.Post({"id": 2, "created_at": 13, "interacted_at": 123}); + this.post3 = new app.models.Post({"id": 3, "created_at": 13, "interacted_at": 122}); + this.post4 = new app.models.Post({"id": 4, "created_at": 10, "interacted_at": 100}); + }); + + it("returns a comparator for posts that compares created_at and ids by default", function() { + this.options = stream.collectionOptions(); + expect(this.options.comparator(this.post1, this.post2)).toBe(1); + expect(this.options.comparator(this.post2, this.post1)).toBe(-1); + expect(this.options.comparator(this.post2, this.post3)).toBe(1); + expect(this.options.comparator(this.post3, this.post2)).toBe(-1); + expect(this.options.comparator(this.post1, this.post4)).toBe(-1); + expect(this.options.comparator(this.post4, this.post1)).toBe(1); + expect(this.options.comparator(this.post1, this.post1)).toBe(0); + }); + + it("returns a comparator for posts that compares interacted_at and ids for the activity stream", function() { + spyOn(stream, "basePath").and.returnValue("activity"); + this.options = stream.collectionOptions(); + expect(this.options.comparator(this.post1, this.post2)).toBe(1); + expect(this.options.comparator(this.post2, this.post1)).toBe(-1); + expect(this.options.comparator(this.post2, this.post3)).toBe(-1); + expect(this.options.comparator(this.post3, this.post2)).toBe(1); + expect(this.options.comparator(this.post1, this.post4)).toBe(-1); + expect(this.options.comparator(this.post4, this.post1)).toBe(1); + expect(this.options.comparator(this.post1, this.post1)).toBe(0); + }); + }); + describe("#_fetchOpts", function() { it("it fetches posts from the window's url, and ads them to the collection", function() { expect( stream._fetchOpts() ).toEqual({ remove: false, url: expectedPath}); From ba9a2cbebad40cd5081c8e5f5647f0e38b3e8d90 Mon Sep 17 00:00:00 2001 From: Steffen van Bergerem Date: Fri, 11 Aug 2017 02:22:54 +0200 Subject: [PATCH 2/2] Remove no posts info after rendering with available posts --- app/assets/javascripts/app/views/infinite_stream_view.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/assets/javascripts/app/views/infinite_stream_view.js b/app/assets/javascripts/app/views/infinite_stream_view.js index d5783d559..0a800da42 100644 --- a/app/assets/javascripts/app/views/infinite_stream_view.js +++ b/app/assets/javascripts/app/views/infinite_stream_view.js @@ -51,6 +51,12 @@ app.views.InfScroll = app.views.Base.extend({ } }, + postRenderTemplate: function() { + if (this.postViews.length > 0) { + this.$(".no-posts-info").closest(".stream-element").remove(); + } + }, + showNoPostsInfo: function() { if (this.postViews.length === 0) { var noPostsInfo = new app.views.NoPostsInfo();