Merge pull request #1353 from MayhemYDG/index

[WIP] Index navigation improvements - EP03
This commit is contained in:
Mayhem 2013-12-12 16:56:27 -08:00
commit 9e6cff93ac
4 changed files with 58 additions and 18 deletions

View File

@ -1,3 +1,8 @@
- More index navigation improvements:
- New setting: `Anchor Hidden Threads`, enabled by default. Hidden threads will be moved at the end of the index to fill the first pages.
- New setting: `Refreshed Navigation`, disabled by default. When enabled, navigating through pages will refresh the index.
- The last index refresh timer will now indicate the last time the index changed from 4chan's side, instead of the last time you refreshed the index.
### 3.14.3 - *2013-12-09* ### 3.14.3 - *2013-12-09*
- Minor bug fixes. - Minor bug fixes.

View File

@ -143,6 +143,8 @@ Config =
'Index Mode': 'paged' 'Index Mode': 'paged'
'Index Sort': 'bump' 'Index Sort': 'bump'
'Show Replies': true 'Show Replies': true
'Anchor Hidden Threads': true
'Refreshed Navigation': false
Header: Header:
'Header auto-hide': false 'Header auto-hide': false
'Header auto-hide on scroll': false 'Header auto-hide on scroll': false

View File

@ -37,18 +37,33 @@ Index =
$.on input, 'change', @cb.sort $.on input, 'change', @cb.sort
repliesEntry = repliesEntry =
el: $.el 'label', innerHTML: '<input type=checkbox name="Show Replies"> Show replies' el: $.el 'label',
input = repliesEntry.el.firstChild innerHTML: '<input type=checkbox name="Show Replies"> Show replies'
input.checked = Conf['Show Replies'] anchorEntry =
$.on input, 'change', $.cb.checked el: $.el 'label',
$.on input, 'change', @cb.replies innerHTML: '<input type=checkbox name="Anchor Hidden Threads"> Anchor hidden threads'
title: 'Move hidden threads at the end of the index.'
refNavEntry =
el: $.el 'label',
innerHTML: '<input type=checkbox name="Refreshed Navigation"> Refreshed navigation'
title: 'Refresh index when navigating through pages.'
for label in [repliesEntry, anchorEntry, refNavEntry]
input = label.el.firstChild
{name} = input
input.checked = Conf[name]
$.on input, 'change', $.cb.checked
switch name
when 'Show Replies'
$.on input, 'change', @cb.replies
when 'Anchor Hidden Threads'
$.on input, 'change', @cb.sort
$.event 'AddMenuEntry', $.event 'AddMenuEntry',
type: 'header' type: 'header'
el: $.el 'span', el: $.el 'span',
textContent: 'Index Navigation' textContent: 'Index Navigation'
order: 90 order: 90
subEntries: [modeEntry, sortEntry, repliesEntry] subEntries: [modeEntry, sortEntry, repliesEntry, anchorEntry, refNavEntry]
$.addClass doc, 'index-loading' $.addClass doc, 'index-loading'
@update() @update()
@ -110,13 +125,18 @@ Index =
return return
return if a.textContent is 'Catalog' return if a.textContent is 'Catalog'
e.preventDefault() e.preventDefault()
Index.pageNav +a.pathname.split('/')[2] Index.userPageNav +a.pathname.split('/')[2]
scrollToIndex: -> scrollToIndex: ->
Header.scrollToIfNeeded Index.root Header.scrollToIfNeeded Index.root
getCurrentPage: -> getCurrentPage: ->
+window.location.pathname.split('/')[2] +window.location.pathname.split('/')[2]
userPageNav: (pageNum) ->
if Conf['Refreshed Navigation'] and Conf['Index Mode'] is 'paged'
Index.update pageNum
else
Index.pageNav pageNum
pageNav: (pageNum) -> pageNav: (pageNum) ->
return if Index.currentPage is pageNum return if Index.currentPage is pageNum
history.pushState null, '', if pageNum is 0 then './' else pageNum history.pushState null, '', if pageNum is 0 then './' else pageNum
@ -173,7 +193,7 @@ Index =
$.before a, strong $.before a, strong
$.add strong, a $.add strong, a
update: -> update: (pageNum) ->
return unless navigator.onLine return unless navigator.onLine
Index.req?.abort() Index.req?.abort()
Index.notice?.close() Index.notice?.close()
@ -188,13 +208,15 @@ Index =
return unless Index.req and !Index.notice return unless Index.req and !Index.notice
Index.notice = new Notice 'info', 'Refreshing index...' Index.notice = new Notice 'info', 'Refreshing index...'
), 5 * $.SECOND - (Date.now() - now) ), 5 * $.SECOND - (Date.now() - now)
pageNum = null if typeof pageNum isnt 'number' # event
onload = (e) -> Index.load e, pageNum
Index.req = $.ajax "//a.4cdn.org/#{g.BOARD}/catalog.json", Index.req = $.ajax "//a.4cdn.org/#{g.BOARD}/catalog.json",
onabort: Index.load onabort: onload
onloadend: Index.load onloadend: onload
, ,
whenModified: true whenModified: true
$.addClass Index.button, 'fa-spin' $.addClass Index.button, 'fa-spin'
load: (e) -> load: (e, pageNum) ->
$.rmClass Index.button, 'fa-spin' $.rmClass Index.button, 'fa-spin'
{req, notice} = Index {req, notice} = Index
delete Index.req delete Index.req
@ -206,7 +228,10 @@ Index =
return return
try try
Index.parse JSON.parse req.response if req.status is 200 if req.status is 200
Index.parse JSON.parse(req.response), pageNum
else if req.status is 304 and pageNum?
Index.pageNav pageNum
catch err catch err
c.error 'Index failure:', err.stack c.error 'Index failure:', err.stack
# network error or non-JSON content for example. # network error or non-JSON content for example.
@ -224,15 +249,18 @@ Index =
setTimeout notice.close, $.SECOND setTimeout notice.close, $.SECOND
timeEl = $ '#index-last-refresh', Index.navLinks timeEl = $ '#index-last-refresh', Index.navLinks
timeEl.dataset.utc = e.timeStamp <% if (type === 'userscript') { %>/ 1000<% } %> timeEl.dataset.utc = Date.parse req.getResponseHeader 'Last-Modified'
RelativeDates.update timeEl RelativeDates.update timeEl
Index.scrollToIndex() Index.scrollToIndex()
parse: (pages) -> parse: (pages, pageNum) ->
Index.parseThreadList pages Index.parseThreadList pages
Index.buildThreads() Index.buildThreads()
Index.sort() Index.sort()
Index.buildIndex()
Index.buildPagelist() Index.buildPagelist()
if pageNum?
Index.pageNav pageNum
return
Index.buildIndex()
Index.setPage() Index.setPage()
parseThreadList: (pages) -> parseThreadList: (pages) ->
Index.pagesNum = pages.length Index.pagesNum = pages.length
@ -318,12 +346,17 @@ Index =
Index.sortedNodes.push Index.nodes[i], Index.nodes[i + 1] Index.sortedNodes.push Index.nodes[i], Index.nodes[i + 1]
if Index.isSearching if Index.isSearching
Index.sortedNodes = Index.querySearch(Index.searchInput.value) or Index.sortedNodes Index.sortedNodes = Index.querySearch(Index.searchInput.value) or Index.sortedNodes
# Put the sticky threads on top of the index. # Move non-hidden threads on top of the index.
if Conf['Anchor Hidden Threads']
offset = 0
for threadRoot, i in Index.sortedNodes by 2 when not Get.threadFromRoot(threadRoot).isHidden
Index.sortedNodes.splice offset++ * 2, 0, Index.sortedNodes.splice(i, 2)...
# Move sticky threads on top of the index.
offset = 0 offset = 0
for threadRoot, i in Index.sortedNodes by 2 when Get.threadFromRoot(threadRoot).isSticky for threadRoot, i in Index.sortedNodes by 2 when Get.threadFromRoot(threadRoot).isSticky
Index.sortedNodes.splice offset++ * 2, 0, Index.sortedNodes.splice(i, 2)... Index.sortedNodes.splice offset++ * 2, 0, Index.sortedNodes.splice(i, 2)...
return unless Conf['Filter'] return unless Conf['Filter']
# Put the highlighted thread & <hr> on top of the index # Move highlighted threads & <hr> on top of the index
# while keeping the original order they appear in. # while keeping the original order they appear in.
offset = 0 offset = 0
for threadRoot, i in Index.sortedNodes by 2 when Get.threadFromRoot(threadRoot).isOnTop for threadRoot, i in Index.sortedNodes by 2 when Get.threadFromRoot(threadRoot).isOnTop

View File

@ -75,7 +75,7 @@ Keybinds =
# Board Navigation # Board Navigation
when Conf['Front page'] when Conf['Front page']
if g.VIEW is 'index' if g.VIEW is 'index'
Index.pageNav 0 Index.userPageNav 0
else else
window.location = "/#{g.BOARD}/" window.location = "/#{g.BOARD}/"
when Conf['Open front page'] when Conf['Open front page']