mirror of
https://github.com/discourse/discourse.git
synced 2025-01-31 19:06:14 +08:00
REFACTOR: topic-list model (#7658)
This commit is contained in:
parent
63264158cf
commit
1db7fd6f9b
|
@ -1,15 +1,17 @@
|
|||
import { ajax } from "discourse/lib/ajax";
|
||||
import RestModel from "discourse/models/rest";
|
||||
import Model from "discourse/models/model";
|
||||
import { getOwner } from "discourse-common/lib/get-owner";
|
||||
|
||||
// Whether to show the category badge in topic lists
|
||||
function displayCategoryInList(site, category) {
|
||||
if (category) {
|
||||
if (category.get("has_children")) {
|
||||
if (category.has_children) {
|
||||
return true;
|
||||
}
|
||||
let draftCategoryId = site.get("shared_drafts_category_id");
|
||||
if (draftCategoryId && category.get("id") === draftCategoryId) {
|
||||
|
||||
const draftCategoryId = site.shared_drafts_category_id;
|
||||
if (draftCategoryId && category.id === draftCategoryId) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -25,7 +27,7 @@ const TopicList = RestModel.extend({
|
|||
forEachNew(topics, callback) {
|
||||
const topicIds = [];
|
||||
|
||||
this.topics.forEach(topic => (topicIds[topic.get("id")] = true));
|
||||
this.topics.forEach(topic => (topicIds[topic.id] = true));
|
||||
|
||||
topics.forEach(topic => {
|
||||
if (!topicIds[topic.id]) {
|
||||
|
@ -68,30 +70,27 @@ const TopicList = RestModel.extend({
|
|||
moreUrl += "?" + params;
|
||||
}
|
||||
|
||||
const self = this;
|
||||
this.set("loadingMore", true);
|
||||
|
||||
const store = this.store;
|
||||
return ajax({ url: moreUrl }).then(function(result) {
|
||||
return ajax({ url: moreUrl }).then(result => {
|
||||
let topicsAdded = 0;
|
||||
|
||||
if (result) {
|
||||
// the new topics loaded from the server
|
||||
const newTopics = TopicList.topicsFrom(store, result);
|
||||
const topics = self.get("topics");
|
||||
const newTopics = TopicList.topicsFrom(this.store, result);
|
||||
|
||||
self.forEachNew(newTopics, function(t) {
|
||||
this.forEachNew(newTopics, t => {
|
||||
t.set("highlight", topicsAdded++ === 0);
|
||||
topics.pushObject(t);
|
||||
this.topics.pushObject(t);
|
||||
});
|
||||
|
||||
self.setProperties({
|
||||
this.setProperties({
|
||||
loadingMore: false,
|
||||
more_topics_url: result.topic_list.more_topics_url
|
||||
});
|
||||
|
||||
Discourse.Session.currentProp("topicList", self);
|
||||
return self.get("more_topics_url");
|
||||
Discourse.Session.currentProp("topicList", this);
|
||||
return this.more_topics_url;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
|
@ -102,37 +101,32 @@ const TopicList = RestModel.extend({
|
|||
|
||||
// loads topics with these ids "before" the current topics
|
||||
loadBefore(topic_ids, storeInSession) {
|
||||
const topicList = this,
|
||||
topics = this.topics;
|
||||
|
||||
// refresh dupes
|
||||
topics.removeObjects(
|
||||
topics.filter(topic => topic_ids.indexOf(topic.get("id")) >= 0)
|
||||
this.topics.removeObjects(
|
||||
this.topics.filter(topic => topic_ids.indexOf(topic.id) >= 0)
|
||||
);
|
||||
|
||||
const url = `${Discourse.getURL("/")}${this.get(
|
||||
"filter"
|
||||
)}.json?topic_ids=${topic_ids.join(",")}`;
|
||||
const store = this.store;
|
||||
const url = `${Discourse.getURL("/")}${
|
||||
this.filter
|
||||
}.json?topic_ids=${topic_ids.join(",")}`;
|
||||
|
||||
return ajax({ url, data: this.params }).then(result => {
|
||||
let i = 0;
|
||||
topicList.forEachNew(TopicList.topicsFrom(store, result), function(t) {
|
||||
this.forEachNew(TopicList.topicsFrom(this.store, result), t => {
|
||||
// highlight the first of the new topics so we can get a visual feedback
|
||||
t.set("highlight", true);
|
||||
topics.insertAt(i, t);
|
||||
this.topics.insertAt(i, t);
|
||||
i++;
|
||||
});
|
||||
if (storeInSession) Discourse.Session.currentProp("topicList", topicList);
|
||||
|
||||
if (storeInSession) Discourse.Session.currentProp("topicList", this);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
TopicList.reopenClass({
|
||||
topicsFrom(store, result, opts) {
|
||||
if (!result) {
|
||||
return;
|
||||
}
|
||||
if (!result) return;
|
||||
|
||||
opts = opts || {};
|
||||
let listKey = opts.listKey || "topics";
|
||||
|
@ -143,9 +137,9 @@ TopicList.reopenClass({
|
|||
users = Model.extractByKey(result.users, Discourse.User),
|
||||
groups = Model.extractByKey(result.primary_groups, Ember.Object);
|
||||
|
||||
return result.topic_list[listKey].map(function(t) {
|
||||
return result.topic_list[listKey].map(t => {
|
||||
t.category = categories.findBy("id", t.category_id);
|
||||
t.posters.forEach(function(p) {
|
||||
t.posters.forEach(p => {
|
||||
p.user = users[p.user_id];
|
||||
p.extraClasses = p.extras;
|
||||
if (p.primary_group_id) {
|
||||
|
@ -157,11 +151,11 @@ TopicList.reopenClass({
|
|||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (t.participants) {
|
||||
t.participants.forEach(function(p) {
|
||||
p.user = users[p.user_id];
|
||||
});
|
||||
t.participants.forEach(p => (p.user = users[p.user_id]));
|
||||
}
|
||||
|
||||
return store.createRecord("topic", t);
|
||||
});
|
||||
},
|
||||
|
@ -188,7 +182,7 @@ TopicList.reopenClass({
|
|||
},
|
||||
|
||||
find(filter, params) {
|
||||
const store = Discourse.__container__.lookup("service:store");
|
||||
const store = getOwner(this).lookup("service:store");
|
||||
return store.findFiltered("topicList", { filter, params });
|
||||
},
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user