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:
-
-
- Thumbnail |
- ID |
- Tag |
- Mime |
- Username |
- Score |
-
+ {{ count }} f0cks given (page {{ pagination.page }} of {{ pagination.end }}):
+
@endif