FEATURE: Remember scroll position in private message lists (#8212)

* FEATURE: remember position in private message lists

* Unified saving scroll position between topic lists

* added discovery-topics-list template

* ran prettier

* removed dynamic scroll key

* JS cleanup
This commit is contained in:
Mark VanLandingham 2019-10-18 13:16:52 -05:00 committed by GitHub
parent 95114f87ae
commit 054fbd7846
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 56 additions and 14 deletions

View File

@ -36,11 +36,6 @@ const DiscoveryTopicsListComponent = Ember.Component.extend(
this.session.set("topicListScrollPosition", $(window).scrollTop());
},
scrolled() {
this._super(...arguments);
this.saveScrollPosition();
},
actions: {
loadMore() {
Discourse.updateContextCount(0);

View File

@ -2,8 +2,9 @@ import {
default as computed,
observes
} from "ember-addons/ember-computed-decorators";
import LoadMore from "discourse/mixins/load-more";
export default Ember.Component.extend({
export default Ember.Component.extend(LoadMore, {
tagName: "table",
classNames: ["topic-list"],
showTopicPostBadges: true,
@ -54,6 +55,30 @@ export default Ember.Component.extend({
this.refreshLastVisited();
},
scrolled() {
this._super(...arguments);
let onScroll = this.onScroll;
if (!onScroll) return;
onScroll.call(this);
},
scrollToLastPosition() {
if (!this.scrollOnLoad) return;
let scrollTo = this.session.get("topicListScrollPosition");
if (scrollTo && scrollTo >= 0) {
Ember.run.schedule("afterRender", () =>
$(window).scrollTop(scrollTo + 1)
);
}
},
didInsertElement() {
this._super(...arguments);
this.scrollToLastPosition();
},
_updateLastVisitedTopic(topics, order, ascending, top) {
this.set("lastVisitedTopic", null);

View File

@ -16,6 +16,10 @@ export default Ember.Controller.extend({
this.newIncoming = [];
},
saveScrollPosition: function() {
this.session.set("topicListScrollPosition", $(window).scrollTop());
},
_showFooter: function() {
this.set("application.showFooter", !this.get("model.canLoadMore"));
}.observes("model.canLoadMore"),

View File

@ -18,10 +18,19 @@ export default (viewName, path, channel) => {
},
model() {
return this.store.findFiltered("topicList", {
filter:
"topics/" + path + "/" + this.modelFor("user").get("username_lower")
});
const session = Discourse.Session.current();
let filter =
"topics/" + path + "/" + this.modelFor("user").get("username_lower");
let lastTopicList = session.get("topicList");
if (lastTopicList && lastTopicList.filter === filter) {
return lastTopicList;
} else {
session.setProperties({
topicList: null,
topicListScrollPosition: null
});
return this.store.findFiltered("topicList", { filter });
}
},
setupController() {

View File

@ -18,7 +18,10 @@
canBulkSelect=canBulkSelect
selected=selected
skipHeader=skipHeader
tagsForUser=tagsForUser}}
tagsForUser=tagsForUser
onScroll=onScroll
scrollOnLoad=scrollOnLoad}}
{{else}}
{{#unless loadingMore}}
<div class='alert alert-info'>

View File

@ -0,0 +1,3 @@
{{yield (hash
saveScrollPosition=saveScrollPosition
)}}

View File

@ -26,7 +26,7 @@
{{bulk-select-button selected=selected action=(action "refresh") category=category}}
{{#discovery-topics-list model=model refresh=(action "refresh") incomingCount=topicTrackingState.incomingCount}}
{{#discovery-topics-list model=model refresh=(action "refresh") incomingCount=topicTrackingState.incomingCount as |discoveryTopicList|}}
{{#if top}}
<div class='top-lists'>
{{period-chooser period=period action=(action "changePeriod")}}
@ -61,7 +61,8 @@
expandAllPinned=expandAllPinned
category=category
topics=model.topics
discoveryList=true}}
discoveryList=true
onScroll=discoveryTopicList.saveScrollPosition}}
{{/if}}
{{/discovery-topics-list}}

View File

@ -7,7 +7,9 @@
hasIncoming=hasIncoming
incomingCount=incomingCount
showInserted=(action "showInserted")
tagsForUser=tagsForUser}}
tagsForUser=tagsForUser
onScroll=saveScrollPosition
scrollOnLoad=true}}
{{conditional-loading-spinner condition=model.loadingMore}}
{{/load-more}}