Initial index catalog mode work.

Conflicts:
	css/style.css
	src/General/Build.coffee
	src/General/Index.coffee
This commit is contained in:
Mayhem 2014-01-25 17:01:06 +01:00 committed by ccd0
parent a37da6527f
commit 987d59bb24
4 changed files with 108 additions and 8 deletions

View File

@ -1,4 +1,6 @@
Build = Build =
staticPath: '//s.4cdn.org/image/'
gifIcon: if window.devicePixelRatio >= 2 then '@2x.gif' else '.gif'
initPixelRatio: window.devicePixelRatio initPixelRatio: window.devicePixelRatio
spoilerRange: {} spoilerRange: {}
unescape: (text) -> unescape: (text) ->
@ -303,9 +305,58 @@ Build =
[posts, files] = if Conf['Show Replies'] [posts, files] = if Conf['Show Replies']
[data.omitted_posts, data.omitted_images] [data.omitted_posts, data.omitted_images]
else else
# XXX data.images is not accurate. [data.replies, data.images]
[data.replies, data.omitted_images + data.last_replies.filter((data) -> !!data.ext).length]
nodes.push Build.summary board.ID, data.no, posts, files nodes.push Build.summary board.ID, data.no, posts, files
nodes nodes
fullThread: (board, data) -> Build.postFromObject data, board.ID fullThread: (board, data) -> Build.postFromObject data, board.ID
threadCatalog: (thread) ->
for data in Index.liveThreadData
break if data.no is thread.ID
if data.spoiler and !Conf['Reveal Spoiler Thumbnails']
src = "#{Build.staticPath}spoiler"
if spoilerRange = Build.spoilerRange[thread.board]
# Randomize the spoiler image.
src += "-#{thread.board}" + Math.floor 1 + spoilerRange * Math.random()
src += '.png'
imgWidth = imgHeight = 100
else if data.filedeleted
src = "#{Build.staticPath}filedeleted-res#{Build.gifIcon}"
imgWidth = 127
imgHeight = 13
else
src = thread.OP.file.thumbURL
max = Math.max data.tn_w, data.tn_h
imgWidth = data.tn_w * 150 / max
imgHeight = data.tn_h * 150 / max
postCount = data.replies + 1
fileCount = data.images + !!data.ext
pageCount = Index.liveThreadIDs.indexOf(thread.ID) // Index.threadsNumPerPage + 1
subject = if thread.OP.info.subject
<%= html('<div class="subject">${thread.OP.info.subject}</div>') %>
else
<%= html('') %>
root = $.el 'div',
className: 'catalog-thread'
$.extend root, <%= html(
'<a href="/${thread.board}/thread/${thread.ID}" target="_blank">' +
'<img src="${src}" class="thumb" width="${imgWidth}" height="${imgHeight}">' +
'</a>' +
'<div class="thread-stats" title="Post count / File count / Page count">' +
'<span class="post-count">${postCount}</span> / <span class="file-count">${fileCount}</span> / <span class="page-count">${pageCount}</span>' +
'</div>' +
'&{subject}' +
'<div class="comment">&{thread.OP.nodes.comment}</div>'
) %>
if data.bumplimit
$.addClass $('.post-count', root), 'warning'
if data.imagelimit
$.addClass $('.file-count', root), 'warning'
root

View File

@ -18,6 +18,7 @@ Index =
{ el: $.el 'label', <%= html('<input type="radio" name="Index Mode" value="paged"> Paged') %> } { el: $.el 'label', <%= html('<input type="radio" name="Index Mode" value="paged"> Paged') %> }
{ el: $.el 'label', <%= html('<input type="radio" name="Index Mode" value="infinite"> Infinite scrolling') %> } { el: $.el 'label', <%= html('<input type="radio" name="Index Mode" value="infinite"> Infinite scrolling') %> }
{ el: $.el 'label', <%= html('<input type="radio" name="Index Mode" value="all pages"> All threads') %> } { el: $.el 'label', <%= html('<input type="radio" name="Index Mode" value="all pages"> All threads') %> }
{ el: $.el 'label', <%= html('<input type="radio" name="Index Mode" value="catalog"> Catalog') %> }
] ]
for label in modeEntry.subEntries for label in modeEntry.subEntries
input = label.el.firstChild input = label.el.firstChild
@ -63,6 +64,7 @@ Index =
$.addClass doc, 'index-loading' $.addClass doc, 'index-loading'
@root = $.el 'div', className: 'board' @root = $.el 'div', className: 'board'
Index.cb.rootClass()
@pagelist = $.el 'div', @pagelist = $.el 'div',
className: 'pagelist' className: 'pagelist'
hidden: true hidden: true
@ -130,7 +132,10 @@ Index =
setTimeout reset, 3 * $.SECOND setTimeout reset, 3 * $.SECOND
cb: cb:
rootClass: ->
(if Conf['Index Mode'] is 'catalog' then $.addClass else $.rmClass) Index.root, 'catalog-mode'
mode: -> mode: ->
Index.cb.rootClass()
Index.togglePagelist() Index.togglePagelist()
Index.buildIndex() Index.buildIndex()
sort: -> sort: ->
@ -410,14 +415,23 @@ Index =
Index.sortedNodes = topNodes.concat(bottomNodes) Index.sortedNodes = topNodes.concat(bottomNodes)
buildIndex: -> buildIndex: ->
if Conf['Index Mode'] isnt 'all pages' switch Conf['Index Mode']
nodes = Index.buildSinglePage Index.getCurrentPage() when 'all pages'
else nodes = Index.sortedNodes
nodes = Index.sortedNodes when 'catalog'
nodes = Index.sortedNodes
.map((threadRoot) -> Get.threadFromRoot threadRoot)
.filter((thread) -> !thread.isHidden)
.map (thread) -> thread.getCatalogView()
else
nodes = Index.buildSinglePage Index.getCurrentPage()
$.rmAll Index.root $.rmAll Index.root
$.rmAll Header.hover $.rmAll Header.hover
Index.buildReplies nodes if Conf['Show Replies'] if Conf['Index Mode'] is 'catalog'
Index.buildStructure nodes $.add Index.root, nodes
else
Index.buildReplies nodes if Conf['Show Replies']
Index.buildStructure nodes
buildSinglePage: (pageNum) -> buildSinglePage: (pageNum) ->
nodesPerPage = Index.threadsNumPerPage nodesPerPage = Index.threadsNumPerPage

View File

@ -497,6 +497,37 @@ hr ~ div.center:not(.ad-cnt) {
.summary { .summary {
text-decoration: none; text-decoration: none;
} }
.catalog-mode {
text-align: center;
}
.catalog-thread {
display: inline-block;
vertical-align: top;
padding-top: 5px;
width: 165px;
max-height: 320px;
overflow: hidden;
word-break: break-word;
}
.thumb {
max-width: 150px;
max-height: 150px;
box-shadow: 0 0 5px rgba(0, 0, 0, .25);
}
.thread-stats {
cursor: help;
font-size: 10px;
font-weight: 700;
line-height: .8;
margin-top: 1px;
float: none;
}
.catalog-thread .subject {
font-weight: 700;
}
.catalog-thread .comment br + br {
display: none;
}
/* Announcement Hiding */ /* Announcement Hiding */
:root.hide-announcement #globalMessage { :root.hide-announcement #globalMessage {

View File

@ -39,6 +39,10 @@ class Thread
$ '[title="Reply to this post"]', @OP.nodes.info $ '[title="Reply to this post"]', @OP.nodes.info
$.after root, [$.tn(' '), icon] $.after root, [$.tn(' '), icon]
getCatalogView: ->
return @catalogView if @catalogView
@catalogView = Build.threadCatalog @
kill: -> kill: ->
@isDead = true @isDead = true
@timeOfDeath = Date.now() @timeOfDeath = Date.now()