106 lines
3.6 KiB
CoffeeScript
106 lines
3.6 KiB
CoffeeScript
window.Discourse.TopicList = Discourse.Model.extend
|
|
|
|
emptyListTip: (->
|
|
return null unless @get('loaded')
|
|
|
|
t = @get('topics')
|
|
return null if t && t.length > 0
|
|
|
|
Em.String.i18n('topics.no_' + @get('filter'))
|
|
).property('topics', 'topics@each', 'filter', 'loaded')
|
|
|
|
loadMoreTopics: ->
|
|
promise = new RSVP.Promise()
|
|
if moreUrl = @get('more_topics_url')
|
|
Discourse.replaceState("/#{@get('filter')}/more")
|
|
$.ajax moreUrl,
|
|
success: (result) =>
|
|
if result
|
|
newTopics = Discourse.TopicList.topicsFrom(result)
|
|
topics = @get('topics')
|
|
topicIds = []
|
|
topics.each (t) -> topicIds[t.get('id')] = true
|
|
newTopics.each (t) -> topics.pushObject(t) unless topicIds[t.get('id')]
|
|
@set('more_topics_url', result.topic_list.more_topics_url)
|
|
Discourse.set('transient.topicsList', this)
|
|
|
|
promise.resolve(if result.topic_list.more_topics_url then true else false)
|
|
else
|
|
promise.resolve(false)
|
|
|
|
promise
|
|
|
|
insert: (json) ->
|
|
newTopic = Discourse.TopicList.decodeTopic(json)
|
|
|
|
# New Topics are always unseen
|
|
newTopic.set('unseen', true)
|
|
|
|
newTopic.set('highlightAfterInsert', true)
|
|
@get('inserted').unshiftObject(newTopic)
|
|
|
|
|
|
window.Discourse.TopicList.reopenClass
|
|
|
|
decodeTopic: (result) ->
|
|
categories = @extractByKey(result.categories, Discourse.Category)
|
|
users = @extractByKey(result.users, Discourse.User)
|
|
|
|
topic = result.topic_list_item
|
|
topic.category = categories[topic.category]
|
|
topic.posters.each (p) ->
|
|
p.user = users[p.user_id] || users[p.user]
|
|
|
|
Discourse.Topic.create(topic)
|
|
|
|
topicsFrom: (result) ->
|
|
# Stitch together our side loaded data
|
|
categories = @extractByKey(result.categories, Discourse.Category)
|
|
users = @extractByKey(result.users, Discourse.User)
|
|
|
|
topics = Em.A()
|
|
result.topic_list.topics.each (ft) ->
|
|
ft.category = categories[ft.category_id]
|
|
ft.posters.each (p) -> p.user = users[p.user_id]
|
|
topics.pushObject(Discourse.Topic.create(ft))
|
|
topics
|
|
|
|
list: (menuItem) ->
|
|
|
|
filter = menuItem.name
|
|
topic_list = Discourse.TopicList.create()
|
|
topic_list.set('inserted', Em.A())
|
|
topic_list.set('filter', filter)
|
|
|
|
url = "/#{filter}.json"
|
|
if menuItem.filters && menuItem.filters.length > 0
|
|
url += "?exclude_category=" + menuItem.filters[0].substring(1)
|
|
|
|
if list = Discourse.get('transient.topicsList')
|
|
if (list.get('filter') is filter) and window.location.pathname.indexOf('more') > 0
|
|
promise = new RSVP.Promise()
|
|
list.set('loaded', true)
|
|
promise.resolve(list)
|
|
return promise
|
|
|
|
## Clear the cache if exists
|
|
Discourse.set('transient.topicsList', null)
|
|
Discourse.set('transient.topicListScrollPos', null)
|
|
|
|
promise = new RSVP.Promise()
|
|
found = PreloadStore.contains('topic_list')
|
|
PreloadStore.get("topic_list", -> jQuery.getJSON(url)).then (result) ->
|
|
topic_list.set('topics', Discourse.TopicList.topicsFrom(result))
|
|
topic_list.set('can_create_topic', result.topic_list.can_create_topic)
|
|
topic_list.set('more_topics_url', result.topic_list.more_topics_url)
|
|
topic_list.set('filter_summary', result.topic_list.filter_summary)
|
|
topic_list.set('draft_key', result.topic_list.draft_key)
|
|
topic_list.set('draft_sequence', result.topic_list.draft_sequence)
|
|
topic_list.set('draft', result.topic_list.draft)
|
|
if result.topic_list.filtered_category
|
|
topic_list.set('category', Discourse.Category.create(result.topic_list.filtered_category))
|
|
topic_list.set('loaded', true)
|
|
promise.resolve(topic_list)
|
|
|
|
promise
|