diff --git a/public/s/css/f0ck.css b/public/s/css/f0ck.css index 01cc61c..899bc41 100644 --- a/public/s/css/f0ck.css +++ b/public/s/css/f0ck.css @@ -476,6 +476,11 @@ html, body { font-size: 14px; height: 100%; } +@supports (-moz-appearance:none) { + html, body { + height: auto !important; + } +} .noscript-badge { display: block; @@ -571,6 +576,7 @@ div#posts > a:hover::after { } .navbar { + position: -webkit-sticky; position: sticky; top: 0; padding: 0; @@ -1533,7 +1539,6 @@ table.table { min-width: max-content; } table.table thead tr { - text-align: left; font-weight: bolder; border-bottom: 1px solid var(--accent); } @@ -1542,6 +1547,7 @@ table.table tr { } table.table th, table.table td { padding: 7px 15px; + text-align: center; } table.table tbody tr:nth-of-type(odd) { background-color: var(--badge-tag); diff --git a/src/inc/routes/search.mjs b/src/inc/routes/search.mjs index ffd6f26..2fe2d65 100644 --- a/src/inc/routes/search.mjs +++ b/src/inc/routes/search.mjs @@ -2,41 +2,92 @@ import db from "../sql.mjs"; import lib from "../lib.mjs"; import search from "../routeinc/search.mjs"; +const _eps = 20; + export default (router, tpl) => { router.get(/^\/search(\/)?$/, lib.auth, async (req, res) => { let ret; - let tag = req.url.qs?.tag; - if(Object.keys(req.url.qs).length > 0) { - let rows; + let tag = req.url.qs.tag ?? []; + let page = req.url.qs.page ?? 1; + let total = 0; + let pagination, link; + + if(tag.length > 1) { + if(tag.startsWith('src:')) { + total = (await db` + select count(*) as total + from "items" + where src ilike ${'%' + tag.substring(4) + '%'} + group by "items".id, "tags".tag + `).length; + } + else { + total = (await db` + select count(*) as total + from "tags" + left join "tags_assign" on "tags_assign".tag_id = "tags".id + left join "items" on "items".id = "tags_assign".item_id + where "tags".tag ilike ${'%' + tag + '%'} + group by "items".id, "tags".tag + `).length; + } + + const pages = +Math.ceil(total / _eps); + const act_page = Math.min(pages, page || 1); + const offset = Math.max(0, (act_page - 1) * _eps); if(tag.startsWith('src:')) { - tag = tag.substring(4); ret = await db` select * from "items" - where src ilike ${'%' + tag + '%'} - limit 500 + where src ilike ${'%' + tag.substring(4) + '%'} + group by "items".id, "tags".tag + offset ${offset} + limit ${_eps} `; } else { - rows = await db` + const rows = await db` select "items".id, "items".username, "items".mime, "tags".tag from "tags" left join "tags_assign" on "tags_assign".tag_id = "tags".id left join "items" on "items".id = "tags_assign".item_id where "tags".tag ilike ${'%' + tag + '%'} - limit 500 + group by "items".id, "tags".tag + offset ${offset} + limit ${_eps} `; ret = search(rows, tag); } + + const cheat = []; + for(let i = Math.max(1, act_page - 3); i <= Math.min(act_page + 3, pages); i++) + cheat.push(i); + + pagination = { + start: 1, + end: pages, + prev: (act_page > 1) ? act_page - 1 : null, + next: (act_page < pages) ? act_page + 1 : null, + page: act_page, + cheat: cheat, + uff: false + }; + link = { + main: `/search/?tag=${tag}`, + path: '&page=' + }; } - + res.reply({ body: tpl.render("search", { result: ret, totals: await lib.countf0cks(), searchstring: tag, - tmp: null + count: total, + tmp: null, + pagination, + link }, req) }); }); diff --git a/views/search.html b/views/search.html index 9735fd3..668f423 100644 --- a/views/search.html +++ b/views/search.html @@ -5,26 +5,30 @@
@if(result) -

{{ result.length }} f0cks given:

- - - - - - - - - +

{{ count }} f0cks given (page {{ pagination.page }} of {{ pagination.end }}):

+
ThumbnailIDTagMimeUsernameScore
+ + + + + + + + + + + @each(result as line) - - - - - - - - + + + + + + + + @endeach +
ThumbnailIDTagMimeUsernameScore
{{ line.id }}{!! line.tag !!}{{ line.mime }}{!! line.username !!}{{ line.score.toFixed(2) }}
{{ line.id }}{!! line.tag !!}{{ line.mime }}{!! line.username !!}{{ line.score.toFixed(2) }}
@endif