136 lines
4.6 KiB
CoffeeScript
136 lines
4.6 KiB
CoffeeScript
ReplyPruning =
|
|
init: ->
|
|
return unless g.VIEW is 'thread' and Conf['Reply Pruning']
|
|
|
|
@container = $.frag()
|
|
|
|
@summary = $.el 'span',
|
|
hidden: true
|
|
className: 'summary'
|
|
@summary.style.cursor = 'pointer'
|
|
$.on @summary, 'click', =>
|
|
@inputs.enabled.checked = !@inputs.enabled.checked
|
|
$.event 'change', null, @inputs.enabled
|
|
|
|
label = UI.checkbox 'Prune Replies', 'Show Last', Conf['Prune All Threads']
|
|
el = $.el 'span',
|
|
title: 'Maximum number of replies to show.'
|
|
,
|
|
<%= html(' <input type="number" name="Max Replies" min="0" step="1" value="${Conf["Max Replies"]}" class="field">') %>
|
|
$.prepend el, label
|
|
|
|
@inputs =
|
|
enabled: label.firstElementChild
|
|
replies: el.lastElementChild
|
|
|
|
@setEnabled.call @inputs.enabled
|
|
$.on @inputs.enabled, 'change', @setEnabled
|
|
$.on @inputs.replies, 'change', $.cb.value
|
|
|
|
Header.menu.addEntry
|
|
el: el
|
|
order: 190
|
|
|
|
Callbacks.Thread.push
|
|
name: 'Reply Pruning'
|
|
cb: @node
|
|
|
|
position: 0
|
|
hidden: 0
|
|
hiddenFiles: 0
|
|
total: 0
|
|
totalFiles: 0
|
|
|
|
setEnabled: ->
|
|
other = QuoteThreading.input
|
|
if @checked and other?.checked
|
|
other.checked = false
|
|
$.event 'change', null, other
|
|
ReplyPruning.active = @checked
|
|
|
|
showIfHidden: (id) ->
|
|
if ReplyPruning.container and $("##{id}", ReplyPruning.container)
|
|
ReplyPruning.inputs.enabled.checked = false
|
|
$.event 'change', null, ReplyPruning.inputs.enabled
|
|
|
|
node: ->
|
|
ReplyPruning.thread = @
|
|
|
|
if @isSticky
|
|
ReplyPruning.active = ReplyPruning.inputs.enabled.checked = true
|
|
if QuoteThreading.input
|
|
# Disable Quote Threading for this thread but don't save the setting.
|
|
Conf['Thread Quotes'] = QuoteThreading.input.checked = false
|
|
|
|
@posts.forEach (post) ->
|
|
if post.isReply
|
|
ReplyPruning.total++
|
|
(ReplyPruning.totalFiles++ if post.file)
|
|
|
|
# If we're linked to a post that we would hide, don't hide the posts in the first place.
|
|
if (
|
|
ReplyPruning.active and
|
|
/^#p\d+$/.test(location.hash) and
|
|
1 <= @posts.keys.indexOf(location.hash[2..]) < 1 + Math.max(ReplyPruning.total - +Conf["Max Replies"], 0)
|
|
)
|
|
ReplyPruning.active = ReplyPruning.inputs.enabled.checked = false
|
|
|
|
$.after @OP.nodes.root, ReplyPruning.summary
|
|
|
|
$.on ReplyPruning.inputs.enabled, 'change', ReplyPruning.update
|
|
$.on ReplyPruning.inputs.replies, 'change', ReplyPruning.update
|
|
$.on d, 'ThreadUpdate', ReplyPruning.updateCount
|
|
$.on d, 'ThreadUpdate', ReplyPruning.update
|
|
|
|
ReplyPruning.update()
|
|
|
|
updateCount: (e) ->
|
|
return if e.detail[404]
|
|
for fullID in e.detail.newPosts
|
|
ReplyPruning.total++
|
|
ReplyPruning.totalFiles++ if g.posts[fullID].file
|
|
return
|
|
|
|
update: ->
|
|
hidden1 = ReplyPruning.hidden
|
|
hidden2 = if ReplyPruning.active
|
|
Math.max(ReplyPruning.total - +Conf["Max Replies"], 0)
|
|
else
|
|
0
|
|
|
|
# Record position from bottom of document
|
|
oldPos = d.body.clientHeight - window.scrollY
|
|
|
|
{posts} = ReplyPruning.thread
|
|
|
|
if ReplyPruning.hidden < hidden2
|
|
while ReplyPruning.hidden < hidden2 and ReplyPruning.position < posts.keys.length
|
|
post = posts[posts.keys[ReplyPruning.position++]]
|
|
if post.isReply and not post.isFetchedQuote
|
|
$.add ReplyPruning.container, node while (node = ReplyPruning.summary.nextSibling) and node isnt post.nodes.root
|
|
$.add ReplyPruning.container, post.nodes.root
|
|
ReplyPruning.hidden++
|
|
ReplyPruning.hiddenFiles++ if post.file
|
|
|
|
else if ReplyPruning.hidden > hidden2
|
|
frag = $.frag()
|
|
while ReplyPruning.hidden > hidden2 and ReplyPruning.position > 0
|
|
post = posts[posts.keys[--ReplyPruning.position]]
|
|
if post.isReply and not post.isFetchedQuote
|
|
$.prepend frag, node while (node = ReplyPruning.container.lastChild) and node isnt post.nodes.root
|
|
$.prepend frag, post.nodes.root
|
|
ReplyPruning.hidden--
|
|
ReplyPruning.hiddenFiles-- if post.file
|
|
$.after ReplyPruning.summary, frag
|
|
$.event 'PostsInserted', null, ReplyPruning.summary.parentNode
|
|
|
|
ReplyPruning.summary.textContent = if ReplyPruning.active
|
|
Build.summaryText '+', ReplyPruning.hidden, ReplyPruning.hiddenFiles
|
|
else
|
|
Build.summaryText '-', ReplyPruning.total, ReplyPruning.totalFiles
|
|
ReplyPruning.summary.hidden = (ReplyPruning.total <= +Conf["Max Replies"])
|
|
|
|
# Maintain position in thread when posts are added/removed above
|
|
if hidden1 isnt hidden2 and (boardTop = Header.getTopOf $('.board')) < 0
|
|
window.scrollBy 0, Math.max(d.body.clientHeight - oldPos, window.scrollY + boardTop) - window.scrollY
|