More sorting options + timestamps
This commit is contained in:
parent
010bccc89d
commit
5972139552
9 changed files with 57 additions and 18 deletions
|
@ -41,7 +41,6 @@
|
||||||
fData.append('last',i == (images.length - 1));
|
fData.append('last',i == (images.length - 1));
|
||||||
fData.append('id',rId);
|
fData.append('id',rId);
|
||||||
|
|
||||||
method: 'POST',
|
|
||||||
form = await fetch(`/api/fileCreate`, {
|
form = await fetch(`/api/fileCreate`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: fData,
|
body: fData,
|
||||||
|
|
|
@ -3,7 +3,12 @@
|
||||||
import PostButton from '$lib/components/PostButton.svelte';
|
import PostButton from '$lib/components/PostButton.svelte';
|
||||||
import PostBody from '$lib/components/PostBody.svelte';
|
import PostBody from '$lib/components/PostBody.svelte';
|
||||||
|
|
||||||
export let success, username, content, upvotes, downvotes, id, isAuthor;
|
export let success, username, content, upvotes, downvotes, id, isAuthor, time;
|
||||||
|
|
||||||
|
let date = 'Time unknown';
|
||||||
|
|
||||||
|
if (time)
|
||||||
|
date = new Date(time / 1000);
|
||||||
|
|
||||||
let query = (id) ? `/post/${id}` : '';
|
let query = (id) ? `/post/${id}` : '';
|
||||||
|
|
||||||
|
@ -53,6 +58,12 @@
|
||||||
img {
|
img {
|
||||||
max-width: 250px;
|
max-width: 250px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.date {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
{#if success}
|
{#if success}
|
||||||
|
@ -73,6 +84,9 @@
|
||||||
<a href='/user/{username}'>
|
<a href='/user/{username}'>
|
||||||
{username}
|
{username}
|
||||||
</a>
|
</a>
|
||||||
|
<span class='date'>
|
||||||
|
{date}
|
||||||
|
</span>
|
||||||
</span>
|
</span>
|
||||||
<span slot="main">
|
<span slot="main">
|
||||||
<PostBody content={content} />
|
<PostBody content={content} />
|
||||||
|
|
|
@ -1,10 +1,16 @@
|
||||||
<script>
|
<script>
|
||||||
import Post from '$lib/components/Post.svelte';
|
import Post from '$lib/components/Post.svelte';
|
||||||
import Button from '$lib/components/Button.svelte'
|
import Button from '$lib/components/Button.svelte';
|
||||||
|
import {setLocation} from '$lib/util.js';
|
||||||
|
|
||||||
export let data;
|
export let data;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<Button clickFunc={() => { window.location.search = setLocation(window.location,'sort','rating')}}>Sort by rating</Button>
|
||||||
|
<Button clickFunc={() => { window.location.search = setLocation(window.location,'sort','time')}}>Sort by time</Button>
|
||||||
|
</p>
|
||||||
|
|
||||||
{#if data && data.postJson && data.postJson.data}
|
{#if data && data.postJson && data.postJson.data}
|
||||||
{#each data.postJson.data as post}
|
{#each data.postJson.data as post}
|
||||||
<Post
|
<Post
|
||||||
|
@ -15,11 +21,12 @@
|
||||||
downvotes={post.downvotes}
|
downvotes={post.downvotes}
|
||||||
id={post.id}
|
id={post.id}
|
||||||
isAuthor={post.isAuthor}
|
isAuthor={post.isAuthor}
|
||||||
|
time={post.time}
|
||||||
></Post>
|
></Post>
|
||||||
{/each}
|
{/each}
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<Button clickFunc={() => { window.location.search = 'page=' + ((data.id)-1) }}>Previous page</Button>
|
<Button clickFunc={() => { window.location.search = setLocation(window.location,'page',((data.id)-1)) }}>Previous page</Button>
|
||||||
<Button clickFunc={() => { window.location.search = 'page=' + ((data.id)+1) }}>Next page</Button>
|
<Button clickFunc={() => { window.location.search = setLocation(window.location,'page',((data.id)+1)) }}>Next page</Button>
|
||||||
</p>
|
</p>
|
|
@ -7,6 +7,11 @@ const AUTH_ACTIONS = [
|
||||||
'postDelete'
|
'postDelete'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const LEGAL_SORTS = [
|
||||||
|
'time',
|
||||||
|
'rating'
|
||||||
|
]
|
||||||
|
|
||||||
const FILE_SIZE_LIMIT = 1024*1024*16;
|
const FILE_SIZE_LIMIT = 1024*1024*16;
|
||||||
|
|
||||||
const VALID_EXTENSIONS = ['png','jpg','jpeg','gif','svg']
|
const VALID_EXTENSIONS = ['png','jpg','jpeg','gif','svg']
|
||||||
|
@ -29,7 +34,7 @@ async function initDb() {
|
||||||
|
|
||||||
await db.run('CREATE TABLE IF NOT EXISTS auth (username CHAR(64), password CHAR(1024))');
|
await db.run('CREATE TABLE IF NOT EXISTS auth (username CHAR(64), password CHAR(1024))');
|
||||||
await db.run('CREATE TABLE IF NOT EXISTS token (username CHAR(64), token CHAR(1024))');
|
await db.run('CREATE TABLE IF NOT EXISTS token (username CHAR(64), token CHAR(1024))');
|
||||||
await db.run('CREATE TABLE IF NOT EXISTS post (username CHAR(64), id CHAR(64), content CHAR(10240), upvotes INTEGER, downvotes INTEGER, rating REAL, reply CHAR(64))');
|
await db.run('CREATE TABLE IF NOT EXISTS post (username CHAR(64), id CHAR(64), content CHAR(10240), upvotes INTEGER, downvotes INTEGER, rating REAL, reply CHAR(64), time INTEGER)');
|
||||||
await db.run('CREATE TABLE IF NOT EXISTS vote (id CHAR(64), username CHAR(64), type INTEGER)');
|
await db.run('CREATE TABLE IF NOT EXISTS vote (id CHAR(64), username CHAR(64), type INTEGER)');
|
||||||
await db.run('CREATE TABLE IF NOT EXISTS user (username CHAR(64), followers INTEGER, following INTEGER, upvotes INTEGER, downvotes INTEGER, reputation REAL)');
|
await db.run('CREATE TABLE IF NOT EXISTS user (username CHAR(64), followers INTEGER, following INTEGER, upvotes INTEGER, downvotes INTEGER, reputation REAL)');
|
||||||
await db.run('CREATE TABLE IF NOT EXISTS bio (username CHAR(64), content CHAR(10240), roles INTEGER)');
|
await db.run('CREATE TABLE IF NOT EXISTS bio (username CHAR(64), content CHAR(10240), roles INTEGER)');
|
||||||
|
@ -155,12 +160,13 @@ backend.postCreate = async ({content, user}) => {
|
||||||
if (reply)
|
if (reply)
|
||||||
reply = reply.url.split('/').pop();
|
reply = reply.url.split('/').pop();
|
||||||
|
|
||||||
await db.run('INSERT INTO post (username, id, content, rating, reply) VALUES (?, ?, ?, ?, ?)', [
|
await db.run('INSERT INTO post (username, id, content, rating, reply, time) VALUES (?, ?, ?, ?, ?, ?)', [
|
||||||
user,
|
user,
|
||||||
id,
|
id,
|
||||||
content,
|
content,
|
||||||
calcVote(0,0),
|
calcVote(0,0),
|
||||||
reply || ''
|
reply || '',
|
||||||
|
Math.floor(new Date() * 1000)
|
||||||
])
|
])
|
||||||
|
|
||||||
return {'success': 'Your post has been broadcasted!', 'href': `/post/${id}` };
|
return {'success': 'Your post has been broadcasted!', 'href': `/post/${id}` };
|
||||||
|
@ -200,13 +206,15 @@ backend.userBio = async ({user}) => {
|
||||||
return {data: posts[0]};
|
return {data: posts[0]};
|
||||||
}
|
}
|
||||||
|
|
||||||
backend.postBulk = async ({page, id, user, cookies}) => {
|
backend.postBulk = async ({page, id, user, cookies, sort}) => {
|
||||||
var posts;
|
var posts;
|
||||||
|
|
||||||
var userAuth = (await backend.token({cookies})).data;
|
var userAuth = (await backend.token({cookies})).data;
|
||||||
|
|
||||||
|
sort = (LEGAL_SORTS.indexOf(sort) == -1) ? 'rating' : sort;
|
||||||
|
|
||||||
if (!user && !id) {
|
if (!user && !id) {
|
||||||
posts = await db.all('SELECT * from post ORDER BY rating DESC LIMIT ?, ?', [
|
posts = await db.all('SELECT * from post ORDER BY '+sort+' DESC LIMIT ?, ?', [
|
||||||
page*ROW_COUNT,
|
page*ROW_COUNT,
|
||||||
ROW_COUNT
|
ROW_COUNT
|
||||||
])
|
])
|
||||||
|
@ -217,14 +225,14 @@ backend.postBulk = async ({page, id, user, cookies}) => {
|
||||||
|
|
||||||
if (posts.length == 0) posts.push({});
|
if (posts.length == 0) posts.push({});
|
||||||
|
|
||||||
posts.push(...(await db.all('SELECT * from post WHERE reply = ? ORDER BY rating DESC LIMIT ?, ?', [
|
posts.push(...(await db.all('SELECT * from post WHERE reply = ? ORDER BY '+sort+' DESC LIMIT ?, ?', [
|
||||||
id,
|
id,
|
||||||
page*ROW_COUNT,
|
page*ROW_COUNT,
|
||||||
ROW_COUNT
|
ROW_COUNT
|
||||||
])))
|
])))
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
posts = await db.all('SELECT * from post WHERE username = ? ORDER BY rating DESC LIMIT ?, ?', [
|
posts = await db.all('SELECT * from post WHERE username = ? ORDER BY '+sort+' DESC LIMIT ?, ?', [
|
||||||
user,
|
user,
|
||||||
page*ROW_COUNT,
|
page*ROW_COUNT,
|
||||||
ROW_COUNT
|
ROW_COUNT
|
||||||
|
|
|
@ -105,6 +105,13 @@ let safePath = function(path) {
|
||||||
return path.replace(/[\/]+/g, '')
|
return path.replace(/[\/]+/g, '')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let setLocation = function(location, key, value) {
|
||||||
|
var loc = new URL(location).searchParams;
|
||||||
|
|
||||||
|
loc.set(key,value);
|
||||||
|
return loc.toString();
|
||||||
|
}
|
||||||
|
|
||||||
export {
|
export {
|
||||||
checkLength,
|
checkLength,
|
||||||
checkRegex,
|
checkRegex,
|
||||||
|
@ -112,5 +119,6 @@ export {
|
||||||
handleSubmit,
|
handleSubmit,
|
||||||
formatPost,
|
formatPost,
|
||||||
block,
|
block,
|
||||||
safePath
|
safePath,
|
||||||
|
setLocation
|
||||||
};
|
};
|
|
@ -2,13 +2,13 @@
|
||||||
export async function load({ fetch, params, url }) {
|
export async function load({ fetch, params, url }) {
|
||||||
var search = url.searchParams;
|
var search = url.searchParams;
|
||||||
|
|
||||||
var voteType = search.get('vote');
|
|
||||||
|
|
||||||
var id = search.get('page') * 1;
|
var id = search.get('page') * 1;
|
||||||
|
|
||||||
|
var sort = search.get('sort') || 'rating';
|
||||||
|
|
||||||
await new Promise(resolve => setTimeout(resolve, 100));
|
await new Promise(resolve => setTimeout(resolve, 100));
|
||||||
|
|
||||||
const res = await fetch(`/api/postBulk?page=${id}`);
|
const res = await fetch(`/api/postBulk?page=${id}&sort=${sort}`);
|
||||||
const postJson = await res.json();
|
const postJson = await res.json();
|
||||||
|
|
||||||
return { postJson, id };
|
return { postJson, id };
|
||||||
|
|
|
@ -4,11 +4,12 @@ import { redirect } from '@sveltejs/kit';
|
||||||
export async function load({ fetch, params, url }) {
|
export async function load({ fetch, params, url }) {
|
||||||
|
|
||||||
var id = params.post;
|
var id = params.post;
|
||||||
|
var sort = url.searchParams.get('sort');
|
||||||
var page = url.searchParams.get('page') * 1;
|
var page = url.searchParams.get('page') * 1;
|
||||||
|
|
||||||
await new Promise(resolve => setTimeout(resolve, 100));
|
await new Promise(resolve => setTimeout(resolve, 100));
|
||||||
|
|
||||||
const res = await fetch(`/api/postBulk?id=${id}&page=${page}`);
|
const res = await fetch(`/api/postBulk?id=${id}&page=${page}&sort=${sort}`);
|
||||||
const postJson = (await res.json());
|
const postJson = (await res.json());
|
||||||
|
|
||||||
return {postJson, id: page};
|
return {postJson, id: page};
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
downvotes={firstEntry.downvotes}
|
downvotes={firstEntry.downvotes}
|
||||||
id={firstEntry.id}
|
id={firstEntry.id}
|
||||||
isAuthor={firstEntry.isAuthor}
|
isAuthor={firstEntry.isAuthor}
|
||||||
|
time={firstEntry.time}
|
||||||
></Post>
|
></Post>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ export async function load({ fetch, params, url }) {
|
||||||
var search = url.searchParams;
|
var search = url.searchParams;
|
||||||
|
|
||||||
var voteType = search.get('vote');
|
var voteType = search.get('vote');
|
||||||
|
var sort = search.get('sort');
|
||||||
|
|
||||||
var id = search.get('page') * 1;
|
var id = search.get('page') * 1;
|
||||||
|
|
||||||
|
@ -10,7 +11,7 @@ export async function load({ fetch, params, url }) {
|
||||||
|
|
||||||
await new Promise(resolve => setTimeout(resolve, 100));
|
await new Promise(resolve => setTimeout(resolve, 100));
|
||||||
|
|
||||||
const res = await fetch(`/api/postBulk?user=${user}&page=${id}`);
|
const res = await fetch(`/api/postBulk?user=${user}&page=${id}&sort=${sort}`);
|
||||||
const postJson = await res.json();
|
const postJson = await res.json();
|
||||||
|
|
||||||
const resUser = await fetch(`/api/userGet?user=${user}`);
|
const resUser = await fetch(`/api/userGet?user=${user}`);
|
||||||
|
|
Loading…
Reference in a new issue