diff --git a/Changelog.md b/Changelog.md index f9d8dab4bbf1460fe33b150050fe38ec2b5375b8..0f12823e643c6bf88e03862b04308a48b39b865c 100644 --- a/Changelog.md +++ b/Changelog.md @@ -26,6 +26,8 @@ If so, please delete it since it will prevent the federation from working proper * Move back to top to the right to avoid misclicks [#7516](https://github.com/diaspora/diaspora/pull/7516) * Include count in mobile post action link [#7520](https://github.com/diaspora/diaspora/pull/7520) * Update the user data export archive format [#6726](https://github.com/diaspora/diaspora/pull/6726) +* Use id as fallback when sorting posts [#7523](https://github.com/diaspora/diaspora/pull/7523) +* Remove no-posts-info when adding posts to the stream [#7523](https://github.com/diaspora/diaspora/pull/7523) ## Bug fixes diff --git a/app/assets/javascripts/app/models/stream.js b/app/assets/javascripts/app/models/stream.js index f1978eb765302e1359acdceec72c3c6d18390472..119107144e361e0ebf92e7b6c4d66093c878f8e4 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/app/assets/javascripts/app/views/infinite_stream_view.js b/app/assets/javascripts/app/views/infinite_stream_view.js index d5783d5595c4b64d70089c686e815de6fd415796..0a800da4290eb57ec72895ef5c73a63e97bf8152 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(); diff --git a/spec/javascripts/app/models/stream_spec.js b/spec/javascripts/app/models/stream_spec.js index 0778dbf1fa0d4c9d844863eb729224f6aff7dc9c..e107a0d5212c67a1183a3c0df8466de6c79e6550 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});