From 95b12e3240f10e129cdbc946d1a9d6c9c00775a6 Mon Sep 17 00:00:00 2001 From: ccd0 Date: Sat, 8 Oct 2016 16:36:40 -0700 Subject: [PATCH 01/25] Clean up the callback spaghetti in Header and CatalogLinks a bit. --- src/General/Header.coffee | 64 +++++++++++++-------------- src/Miscellaneous/CatalogLinks.coffee | 36 ++++++++------- 2 files changed, 51 insertions(+), 49 deletions(-) diff --git a/src/General/Header.coffee b/src/General/Header.coffee index 0789fa93f..c651b4227 100644 --- a/src/General/Header.coffee +++ b/src/General/Header.coffee @@ -84,42 +84,39 @@ Header = $.on window, 'load popstate', Header.hashScroll $.on d, 'CreateNotification', @createNotification - $.asap (-> d.body), => + $.onExists doc, 'body', => return unless Main.isThisPageLegit() - # Wait for #boardNavMobile instead of #boardNavDesktop, - # it might be incomplete otherwise. - $.asap (-> $.id('boardNavMobile') or d.readyState isnt 'loading'), -> + $.prepend d.body, @bar + $.add d.body, Header.hover + @setBarPosition Conf['Bottom Header'] + + $.onExists doc, '#boardNavDesktop > *', Header.setBoardList + + Main.ready -> + if not (footer = $.id 'boardNavDesktopFoot') + return unless (absbot = $.id 'absbot') footer = $.id('boardNavDesktop').cloneNode true footer.id = 'boardNavDesktopFoot' $('#navtopright', footer).id = 'navbotright' $('#settingsWindowLink', footer).id = 'settingsWindowLinkBot' - Header.bottomBoardList = $ '.boardList', footer - if a = $ "a[href*='/#{g.BOARD}/']", footer - a.className = 'current' - Main.ready -> - if (oldFooter = $.id 'boardNavDesktopFoot') - $.replace $('.boardList', oldFooter), Header.bottomBoardList - else if (absbot = $.id 'absbot') - $.before absbot, footer - $.globalEval 'window.cloneTopNav = function() {};' - Header.setBoardList() - $.prepend d.body, @bar - $.add d.body, Header.hover - @setBarPosition Conf['Bottom Header'] - @ + $.before absbot, footer + $.globalEval 'window.cloneTopNav = function() {};' + if (a = $ "a[href*='/#{g.BOARD}/']", footer) + a.className = 'current' + Header.bottomBoardList = $ '.boardList', footer + CatalogLinks.setLinks Header.bottomBoardList - Main.ready => - if g.VIEW is 'catalog' or !Conf['Disable Native Extension'] - cs = $.el 'a', href: 'javascript:;' - if g.VIEW is 'catalog' - cs.title = cs.textContent = 'Catalog Settings' - cs.className = 'fa fa-book' - else - cs.title = cs.textContent = '4chan Settings' - cs.className = 'native-settings' - $.on cs, 'click', () -> - $.id('settingsWindowLink').click() - @addShortcut 'native', cs, 810 + if g.VIEW is 'catalog' or !Conf['Disable Native Extension'] + cs = $.el 'a', href: 'javascript:;' + if g.VIEW is 'catalog' + cs.title = cs.textContent = 'Catalog Settings' + cs.className = 'fa fa-book' + else + cs.title = cs.textContent = '4chan Settings' + cs.className = 'native-settings' + $.on cs, 'click', () -> + $.id('settingsWindowLink').click() + @addShortcut 'native', cs, 810 @enableDesktopNotifications() @@ -170,7 +167,9 @@ Header = a = node.cloneNode true a.className = 'current' if a.pathname.split('/')[1] is g.BOARD.ID nodes.push a - $.add $('.boardList', boardList), nodes + fullBoardList = $ '.boardList', boardList + $.add fullBoardList, nodes + CatalogLinks.setLinks fullBoardList $.add Header.bar, [Header.boardList, Header.shortcuts, Header.noticesRoot, Header.toggle] @@ -188,9 +187,8 @@ Header = as = $$ '#full-board-list a[title]', Header.boardList re = /[\w@]+(-(all|title|replace|full|index|catalog|archive|expired|(mode|sort|text):"[^"]+"(,"[^"]+")?))*|[^\w@]+/g nodes = (Header.mapCustomNavigation t, as for t in boardnav.match re) - $.add list, nodes - $.ready CatalogLinks.initBoardList + CatalogLinks.setLinks list mapCustomNavigation: (t, as) -> if /^[^\w@]/.test t diff --git a/src/Miscellaneous/CatalogLinks.coffee b/src/Miscellaneous/CatalogLinks.coffee index a3db30253..4b7f6aec6 100644 --- a/src/Miscellaneous/CatalogLinks.coffee +++ b/src/Miscellaneous/CatalogLinks.coffee @@ -41,34 +41,38 @@ CatalogLinks = a.href = "//boards.4chan.org/#{m[1]}/#{m[2] or '#catalog'}" return - # Set links on load or custom board list change. - # Called by Header when both board lists (header and footer) are ready. - initBoardList: -> - return unless CatalogLinks.el - CatalogLinks.set Conf['Header catalog links'] - toggle: -> $.event 'CloseMenu' $.set 'Header catalog links', @checked CatalogLinks.set @checked set: (useCatalog) -> - for a in $$('a:not([data-only])', Header.boardList).concat $$('a', Header.bottomBoardList) - continue if a.hostname not in ['boards.4chan.org', 'catalog.neet.tv'] or - !(board = a.pathname.split('/')[1]) or - board in ['f', 'status', '4chan'] or - a.pathname.split('/')[2] is 'archive' or - $.hasClass a, 'external' + Conf['Header catalog links'] = useCatalog + CatalogLinks.setLinks Header.boardList + CatalogLinks.setLinks Header.bottomBoardList + CatalogLinks.el.title = "Turn catalog links #{if useCatalog then 'off' else 'on'}." + $('input', CatalogLinks.el).checked = useCatalog + + # Also called by Header when board lists are loaded / generated. + setLinks: (list) -> + return unless CatalogLinks.el and list + + for a in $$('a:not([data-only])', list) + continue if ( + a.hostname not in ['boards.4chan.org', 'catalog.neet.tv'] or + !(board = a.pathname.split('/')[1]) or + board in ['f', 'status', '4chan'] or + a.pathname.split('/')[2] is 'archive' or + $.hasClass a, 'external' + ) # Href is easier than pathname because then we don't have # conditions where External Catalog has been disabled between switches. - a.href = if useCatalog then CatalogLinks.catalog(board) else "/#{board}/" + a.href = if Conf['Header catalog links'] then CatalogLinks.catalog(board) else "/#{board}/" if a.dataset.indexOptions and a.hostname is 'boards.4chan.org' and a.pathname.split('/')[2] is '' a.href += (if a.hash then '/' else '#') + a.dataset.indexOptions - - CatalogLinks.el.title = "Turn catalog links #{if useCatalog then 'off' else 'on'}." - $('input', CatalogLinks.el).checked = useCatalog + return catalog: (board=g.BOARD.ID) -> if Conf['External Catalog'] and board in ['a', 'c', 'g', 'biz', 'k', 'm', 'o', 'p', 'v', 'vg', 'vr', 'w', 'wg', 'cm', '3', 'adv', 'an', 'asp', 'cgl', 'ck', 'co', 'diy', 'fa', 'fit', 'gd', 'int', 'jp', 'lit', 'mlp', 'mu', 'n', 'out', 'po', 'sci', 'sp', 'tg', 'toy', 'trv', 'tv', 'vp', 'wsg', 'x', 'f', 'pol', 's4s', 'lgbt'] From 39792ad2cad2f7205fb51bd6d2b7c107632cb01e Mon Sep 17 00:00:00 2001 From: ccd0 Date: Sat, 8 Oct 2016 20:28:16 -0700 Subject: [PATCH 02/25] Move cooldown parsing into Boards class and use boards.json data rather than script on page. --- src/Posting/QR.cooldown.coffee | 14 +------------- src/classes/Board.coffee | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/Posting/QR.cooldown.coffee b/src/Posting/QR.cooldown.coffee index b6f050c76..a0a3e2e96 100644 --- a/src/Posting/QR.cooldown.coffee +++ b/src/Posting/QR.cooldown.coffee @@ -1,11 +1,5 @@ QR.cooldown = seconds: 0 - delays: - thread: 0 - reply: 0 - image: 0 - deletion: 60 # cooldown for deleting posts/files - thread_global: 300 # inter-board thread cooldown # Called from Main init: -> @@ -16,13 +10,7 @@ QR.cooldown = # Called from QR setup: -> # Read cooldown times - if m = Get.scriptData().match /\bcooldowns *= *({[^}]+})/ - $.extend QR.cooldown.delays, JSON.parse m[1] - - # Pass users have reduced cooldowns. - if d.cookie.indexOf('pass_enabled=1') >= 0 - for key in ['reply', 'image'] - QR.cooldown.delays[key] = Math.ceil(QR.cooldown.delays[key] / 2) + QR.cooldown.delays = g.BOARD.cooldowns() # The longest reply cooldown, for use in pruning old reply data QR.cooldown.maxDelay = 0 diff --git a/src/classes/Board.coffee b/src/classes/Board.coffee index dbf456d2f..de2d91116 100644 --- a/src/classes/Board.coffee +++ b/src/classes/Board.coffee @@ -7,3 +7,17 @@ class Board @config = BoardConfig.boards?[@ID] or {} g.boards[@] = @ + + cooldowns: -> + c2 = (@config or {}).cooldowns or {} + c = + thread: c2.threads or 0 + reply: c2.replies or 0 + image: c2.images or 0 + deletion: 60 # cooldown for deleting posts/files + thread_global: 300 # inter-board thread cooldown + # Pass users have reduced cooldowns. + if d.cookie.indexOf('pass_enabled=1') >= 0 + for key in ['reply', 'image'] + c[key] = Math.ceil(c[key] / 2) + c From 313ec30cd8578a46d62a83f3ad5b2f1d47e80fe5 Mon Sep 17 00:00:00 2001 From: ccd0 Date: Sun, 9 Oct 2016 13:33:21 -0700 Subject: [PATCH 03/25] Use thread ID as final fallback for excerpt instead of name block. --- src/General/Get.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/General/Get.coffee b/src/General/Get.coffee index 004011645..35276ab0c 100644 --- a/src/General/Get.coffee +++ b/src/General/Get.coffee @@ -5,7 +5,7 @@ Get = OP.info.subject?.trim() or OP.info.commentDisplay.replace(/\n+/g, ' // ') or OP.file?.name or - OP.info.nameBlock) + "No.#{OP}") return "#{excerpt[...70]}..." if excerpt.length > 73 excerpt threadFromRoot: (root) -> From 65d6de9e4974a27802603d3ee758a15c12f0d0f5 Mon Sep 17 00:00:00 2001 From: ccd0 Date: Sun, 9 Oct 2016 13:54:58 -0700 Subject: [PATCH 04/25] Fix IDs/capcodes being removed from stubs/notifications by Anonymize. #1129 --- src/classes/Post.coffee | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/classes/Post.coffee b/src/classes/Post.coffee index 968b7d950..272f572be 100644 --- a/src/classes/Post.coffee +++ b/src/classes/Post.coffee @@ -24,7 +24,6 @@ class Post @thread.kill() if @thread.isArchived @info = - nameBlock: if Conf['Anonymize'] then 'Anonymous' else @nodes.nameBlock.textContent.trim() subject: @nodes.subject?.textContent or undefined name: @nodes.name?.textContent tripcode: @nodes.tripcode?.textContent @@ -35,6 +34,13 @@ class Post flag: @nodes.flag?.title date: if @nodes.date then new Date(@nodes.date.dataset.utc * 1000) + if Conf['Anonymize'] + @info.nameBlock = 'Anonymous' + else + @info.nameBlock = "#{@info.name or ''} #{@info.tripcode or ''}".trim() + @info.nameBlock += " ## #{@info.capcode}" if @info.capcode + @info.nameBlock += " (ID: #{@info.uniqueID})" if @info.uniqueID + @parseComment() @parseQuotes() @parseFile() From 3921433292ac5b09e7973f979b8908700d628bf6 Mon Sep 17 00:00:00 2001 From: ccd0 Date: Sun, 9 Oct 2016 14:42:26 -0700 Subject: [PATCH 05/25] Let nodes.uniqueID be the ID part, and nodes.uniqueIDRoot be the whole thing. --- src/Miscellaneous/IDColor.coffee | 2 +- src/Miscellaneous/IDHighlight.coffee | 4 +-- src/Miscellaneous/IDPostCount.coffee | 2 +- src/classes/Post.coffee | 41 ++++++++++++++-------------- 4 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/Miscellaneous/IDColor.coffee b/src/Miscellaneous/IDColor.coffee index 9d956c3fe..bb4046c3c 100644 --- a/src/Miscellaneous/IDColor.coffee +++ b/src/Miscellaneous/IDColor.coffee @@ -10,7 +10,7 @@ IDColor = cb: @node node: -> - return if @isClone or !((uid = @info.uniqueID) and (span = $ 'span.hand', @nodes.uniqueID)) + return if @isClone or !((uid = @info.uniqueID) and (span = @nodes.uniqueID)) rgb = IDColor.ids[uid] or IDColor.compute uid diff --git a/src/Miscellaneous/IDHighlight.coffee b/src/Miscellaneous/IDHighlight.coffee index 759a8b607..bf8aaa933 100644 --- a/src/Miscellaneous/IDHighlight.coffee +++ b/src/Miscellaneous/IDHighlight.coffee @@ -9,8 +9,8 @@ IDHighlight = uniqueID: null node: -> - $.on @nodes.uniqueID, 'click', IDHighlight.click @ if @nodes.uniqueID - $.on @nodes.capcode, 'click', IDHighlight.click @ if @nodes.capcode + $.on @nodes.uniqueIDRoot, 'click', IDHighlight.click @ if @nodes.uniqueIDRoot + $.on @nodes.capcode, 'click', IDHighlight.click @ if @nodes.capcode IDHighlight.set @ unless @isClone set: (post) -> diff --git a/src/Miscellaneous/IDPostCount.coffee b/src/Miscellaneous/IDPostCount.coffee index cca9d1abb..5e8896c70 100644 --- a/src/Miscellaneous/IDPostCount.coffee +++ b/src/Miscellaneous/IDPostCount.coffee @@ -10,7 +10,7 @@ IDPostCount = node: -> if @nodes.uniqueID and @thread is IDPostCount.thread - $.on $('span.hand', @nodes.uniqueID), 'mouseover', IDPostCount.count + $.on @nodes.uniqueID, 'mouseover', IDPostCount.count count: -> {uniqueID} = Get.postFromNode(@).info diff --git a/src/classes/Post.coffee b/src/classes/Post.coffee index 272f572be..2f8050a1f 100644 --- a/src/classes/Post.coffee +++ b/src/classes/Post.coffee @@ -27,7 +27,7 @@ class Post subject: @nodes.subject?.textContent or undefined name: @nodes.name?.textContent tripcode: @nodes.tripcode?.textContent - uniqueID: @nodes.uniqueID?.firstElementChild.textContent + uniqueID: @nodes.uniqueID?.textContent capcode: @nodes.capcode?.textContent.replace '## ', '' pass: @nodes.pass?.title.match(/\d*$/)[0] flagCode: @nodes.flag?.className.match(/flag-(\w+)/)?[1].toUpperCase() @@ -65,25 +65,26 @@ class Post post = $ '.post', root info = $ '.postInfo', post nodes = - root: root - post: post - info: info - subject: $ '.subject', info - name: $ '.name', info - email: $ '.useremail', info - tripcode: $ '.postertrip', info - uniqueID: $ '.posteruid', info - capcode: $ '.capcode.hand', info - pass: $ '.n-pu', info - flag: $ '.flag, .countryFlag', info - date: $ '.dateTime', info - nameBlock: $ '.nameBlock', info - quote: $ '.postNum > a:nth-of-type(2)', info - reply: $ '.replylink', info - fileRoot: $ '.file', post - comment: $ '.postMessage', post - links: [] - quotelinks: [] + root: root + post: post + info: info + subject: $ '.subject', info + name: $ '.name', info + email: $ '.useremail', info + tripcode: $ '.postertrip', info + uniqueIDRoot: $ '.posteruid', info + uniqueID: $ '.posteruid > .hand', info + capcode: $ '.capcode.hand', info + pass: $ '.n-pu', info + flag: $ '.flag, .countryFlag', info + date: $ '.dateTime', info + nameBlock: $ '.nameBlock', info + quote: $ '.postNum > a:nth-of-type(2)', info + reply: $ '.replylink', info + fileRoot: $ '.file', post + comment: $ '.postMessage', post + links: [] + quotelinks: [] archivelinks: [] # XXX Edge invalidates HTMLCollections when an ancestor node is inserted into another node. From e7eb5fd2ab6c250b99f11ba46f042eadd40e9cce Mon Sep 17 00:00:00 2001 From: ccd0 Date: Sun, 9 Oct 2016 14:49:10 -0700 Subject: [PATCH 06/25] Remove post.nodes.links, unused since af62b44df1c097acceba002567ef98a7b3cd5b42. --- src/classes/Post.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/src/classes/Post.coffee b/src/classes/Post.coffee index 2f8050a1f..50474357d 100644 --- a/src/classes/Post.coffee +++ b/src/classes/Post.coffee @@ -83,7 +83,6 @@ class Post reply: $ '.replylink', info fileRoot: $ '.file', post comment: $ '.postMessage', post - links: [] quotelinks: [] archivelinks: [] From 6484f461d057d92391ee2fc867fb930efc1b5ee7 Mon Sep 17 00:00:00 2001 From: ccd0 Date: Sun, 9 Oct 2016 17:29:00 -0700 Subject: [PATCH 07/25] Include rolls and fortunes in filterable text but continue removing them from notifications and thread excerpts. --- src/General/Build.coffee | 5 ++-- src/General/Get.coffee | 2 +- src/Monitoring/Unread.coffee | 2 +- src/classes/Post.coffee | 49 ++++++++++++++++++++++-------------- 4 files changed, 35 insertions(+), 23 deletions(-) diff --git a/src/General/Build.coffee b/src/General/Build.coffee index bf7dbb308..0a1c6e123 100644 --- a/src/General/Build.coffee +++ b/src/General/Build.coffee @@ -83,8 +83,6 @@ Build = html = html .replace(//gi, '\n') .replace(/\n\nRolled [^<]*<\/b>/i, '') # Rolls (/tg/) - .replace(/]*>/g, '') Build.unescape html @@ -93,6 +91,9 @@ Build = unless Conf['Remove Spoilers'] or Conf['Reveal Spoilers'] while (html2 = html.replace /(?:(?!<\/?s>).)*<\/s>/g, '[spoiler]') isnt html html = html2 + html = html + .replace(/^Rolled [^<]*<\/b>/i, '') # Rolls (/tg/, /qst/) + .replace(/ 73 diff --git a/src/Monitoring/Unread.coffee b/src/Monitoring/Unread.coffee index d2b801cc8..f7784e592 100644 --- a/src/Monitoring/Unread.coffee +++ b/src/Monitoring/Unread.coffee @@ -132,7 +132,7 @@ Unread = openNotification: (post) -> return unless Header.areNotificationsEnabled notif = new Notification "#{post.info.nameBlock} replied to you", - body: post.info.commentDisplay + body: post.commentDisplay() icon: Favicon.logo notif.onclick = -> Header.scrollToIfNeeded post.nodes.root, true diff --git a/src/classes/Post.coffee b/src/classes/Post.coffee index 50474357d..ebf66201e 100644 --- a/src/classes/Post.coffee +++ b/src/classes/Post.coffee @@ -107,29 +107,22 @@ class Post # Remove: # 'Comment too long'... # EXIF data. (/p/) - # Rolls. (/tg/) - # Fortunes. (/s4s/) - bq = @nodes.comment.cloneNode true - for node in $$ '.abbr + br, .exif, b, .fortune', bq - $.rm node - if abbr = $ '.abbr', bq - $.rm abbr + @nodes.commentClean = bq = @nodes.comment.cloneNode true + @cleanComment bq @info.comment = @nodesToText bq - if abbr - @info.comment = @info.comment.replace /\n\n$/, '' - # Hide spoilers. - # Remove: + commentDisplay: -> + # Get the comment's text for display purposes (e.g. notifications, excerpts). + # In addition to what's done in generating `@info.comment`, remove: + # Spoilers. (filter to '[spoiler]') + # Rolls. (/tg/, /qst/) + # Fortunes. (/s4s/) # Preceding and following new lines. # Trailing spaces. - commentDisplay = @info.comment - unless Conf['Remove Spoilers'] or Conf['Reveal Spoilers'] - spoilers = $$ 's', bq - if spoilers.length - for node in spoilers - $.replace node, $.tn '[spoiler]' - commentDisplay = @nodesToText bq - @info.commentDisplay = commentDisplay.trim().replace /\s+$/gm, '' + bq = @nodes.commentClean.cloneNode true + @cleanSpoilers bq unless Conf['Remove Spoilers'] or Conf['Reveal Spoilers'] + @cleanCommentDisplay bq + @nodesToText(bq).trim().replace(/\s+$/gm, '') nodesToText: (bq) -> text = "" @@ -139,6 +132,24 @@ class Post text += node.data or '\n' text + cleanComment: (bq) -> + if (abbr = $ '.abbr', bq) # 'Comment too long' or 'EXIF data available' + for node in $$ '.abbr + br, .exif', bq + $.rm node + for i in [0...2] + $.rm br if (br = abbr.previousSibling) and br.nodeName is 'BR' + $.rm abbr + + cleanSpoilers: (bq) -> + spoilers = $$ 's', bq + for node in spoilers + $.replace node, $.tn '[spoiler]' + return + + cleanCommentDisplay: (bq) -> + $.rm b if (b = $ 'b', bq) and /^Rolled /.test(b.textContent) + $.rm $('.fortune', bq) + parseQuotes: -> @quotes = [] # XXX https://github.com/4chan/4chan-JS/issues/77 From 0e739d6711aeb8c3a4e8e93954c0e081f19348b3 Mon Sep 17 00:00:00 2001 From: Koushien Date: Fri, 28 Oct 2016 22:50:44 -0700 Subject: [PATCH 08/25] Let custom board navigation accept "rev" option. Explicitly add reversed hash commands and suggest option in settings description. --- src/General/Index.coffee | 18 ++++++++++++------ src/General/Settings/Advanced.html | 2 +- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/General/Index.coffee b/src/General/Index.coffee index 155ea87ab..7bde3661b 100644 --- a/src/General/Index.coffee +++ b/src/General/Index.coffee @@ -342,12 +342,18 @@ Index = 'all-pages': 'all pages' 'catalog': 'catalog' sort: - 'bump-order': 'bump' - 'last-reply': 'lastreply' - 'last-long-reply': 'lastlong' - 'creation-date': 'birth' - 'reply-count': 'replycount' - 'file-count': 'filecount' + 'bump-order': 'bump' + 'bump-order-rev': 'bump-rev' + 'last-reply': 'lastreply' + 'last-reply-rev': 'lastreply-rev' + 'last-long-reply': 'lastlong' + 'last-long-reply-rev': 'lastlong-rev' + 'creation-date': 'birth' + 'creation-date-rev': 'birth-rev' + 'reply-count': 'replycount' + 'reply-count-rev': 'replycount-rev' + 'file-count': 'filecount' + 'file-count-rev': 'filecount-rev' processHash: -> # XXX https://bugzilla.mozilla.org/show_bug.cgi?id=483304 diff --git a/src/General/Settings/Advanced.html b/src/General/Settings/Advanced.html index cb09ffc15..324e5e55c 100644 --- a/src/General/Settings/Advanced.html +++ b/src/General/Settings/Advanced.html @@ -40,7 +40,7 @@
Index-only link: g-index
Catalog-only link: g-catalog
Index mode: g-mode:"infinite scrolling"
-
Index sort: g-sort:"creation date"
+
Index sort: g-sort:"creation date rev"
External link: external-text:"Google","http://www.google.com"
Combinations are possible: g-index-text:"Technology Index"
Full board list toggle: toggle-all
From a1d2408dade030da970902dc31bfa3a2c56f32ba Mon Sep 17 00:00:00 2001 From: Koushien Date: Fri, 28 Oct 2016 22:52:04 -0700 Subject: [PATCH 09/25] Place reverse sort checkbox after Index dropdowns --- src/General/Index/NavLinks.html | 1 + src/css/style.css | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/General/Index/NavLinks.html b/src/General/Index/NavLinks.html index 90d1794fc..c458f35e0 100644 --- a/src/General/Index/NavLinks.html +++ b/src/General/Index/NavLinks.html @@ -6,6 +6,7 @@ × + × - +