add report selection via url hash
All checks were successful
delpoy / build-and-deploy (push) Successful in 48s
All checks were successful
delpoy / build-and-deploy (push) Successful in 48s
This commit is contained in:
parent
444631f649
commit
1f8cf66e90
@ -22,8 +22,6 @@
|
|||||||
export let data: LayoutData;
|
export let data: LayoutData;
|
||||||
if (data.reportCount) $reportCount = data.reportCount;
|
if (data.reportCount) $reportCount = data.reportCount;
|
||||||
if (data.adminCount) $adminCount = data.adminCount;
|
if (data.adminCount) $adminCount = data.adminCount;
|
||||||
|
|
||||||
errorMessage.subscribe(console.log);
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if $page.url.pathname !== `${env.PUBLIC_BASE_PATH}/admin/login`}
|
{#if $page.url.pathname !== `${env.PUBLIC_BASE_PATH}/admin/login`}
|
||||||
|
@ -11,10 +11,13 @@
|
|||||||
import HeaderBar from './HeaderBar.svelte';
|
import HeaderBar from './HeaderBar.svelte';
|
||||||
import { IconOutline } from 'svelte-heros-v2';
|
import { IconOutline } from 'svelte-heros-v2';
|
||||||
import NewReportModal from './NewReportModal.svelte';
|
import NewReportModal from './NewReportModal.svelte';
|
||||||
|
import { onDestroy, onMount } from 'svelte';
|
||||||
|
import { goto } from '$app/navigation';
|
||||||
|
|
||||||
export let data: PageData;
|
export let data: PageData;
|
||||||
|
|
||||||
let currentPageReports: (typeof Report.prototype.dataValues)[] = [];
|
let currentPageReports: (typeof Report.prototype.dataValues)[] = [];
|
||||||
|
let currentPageReportsRequest: Promise<any> = Promise.resolve();
|
||||||
let reportsPerPage = 50;
|
let reportsPerPage = 50;
|
||||||
let reportPage = 0;
|
let reportPage = 0;
|
||||||
let reportFilter = { draft: false, status: null, reporter: null, reported: null };
|
let reportFilter = { draft: false, status: null, reporter: null, reported: null };
|
||||||
@ -22,8 +25,8 @@
|
|||||||
|
|
||||||
async function fetchPageReports(
|
async function fetchPageReports(
|
||||||
page: number,
|
page: number,
|
||||||
filter: any
|
filter: typeof reportFilter | { hash: string }
|
||||||
): Promise<(typeof Report.prototype.dataValues)[]> {
|
): Promise<typeof currentPageReports> {
|
||||||
if (!browser) return [];
|
if (!browser) return [];
|
||||||
|
|
||||||
const response = await fetch(`${env.PUBLIC_BASE_PATH}/admin/reports`, {
|
const response = await fetch(`${env.PUBLIC_BASE_PATH}/admin/reports`, {
|
||||||
@ -31,10 +34,46 @@
|
|||||||
body: JSON.stringify({ ...filter, limit: reportsPerPage, from: reportPage * page })
|
body: JSON.stringify({ ...filter, limit: reportsPerPage, from: reportPage * page })
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (activeReport) {
|
||||||
|
activeReport = null;
|
||||||
|
await goto(window.location.href.split('#')[0], { replaceState: true });
|
||||||
|
}
|
||||||
|
|
||||||
return await response.json();
|
return await response.json();
|
||||||
}
|
}
|
||||||
|
|
||||||
$: fetchPageReports(reportPage, reportFilter).then((r) => (currentPageReports = r));
|
$: currentPageReportsRequest = fetchPageReports(reportPage, reportFilter).then((r) => {
|
||||||
|
currentPageReports = r;
|
||||||
|
});
|
||||||
|
|
||||||
|
async function openHashReport() {
|
||||||
|
if (!window.location.hash) return;
|
||||||
|
|
||||||
|
const requestedHash = window.location.hash.substring(1);
|
||||||
|
let report = currentPageReports.find((r) => r.url_hash === requestedHash);
|
||||||
|
if (!report) {
|
||||||
|
const hashReport = (await fetchPageReports(0, { hash: requestedHash }))[0];
|
||||||
|
if (hashReport) {
|
||||||
|
currentPageReports = [hashReport, ...currentPageReports];
|
||||||
|
report = hashReport;
|
||||||
|
} else {
|
||||||
|
await goto(window.location.href.split('#')[0], { replaceState: true });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
activeReport = report;
|
||||||
|
activeReport.originalStatus = report;
|
||||||
|
}
|
||||||
|
onMount(async () => {
|
||||||
|
await currentPageReportsRequest;
|
||||||
|
await openHashReport();
|
||||||
|
|
||||||
|
if (browser) window.addEventListener('hashchange', openHashReport);
|
||||||
|
});
|
||||||
|
onDestroy(() => {
|
||||||
|
if (browser) window.removeEventListener('hashchange', openHashReport);
|
||||||
|
});
|
||||||
|
|
||||||
async function updateActiveReport() {
|
async function updateActiveReport() {
|
||||||
await fetch(`${env.PUBLIC_BASE_PATH}/admin/reports`, {
|
await fetch(`${env.PUBLIC_BASE_PATH}/admin/reports`, {
|
||||||
@ -80,8 +119,11 @@
|
|||||||
{#each currentPageReports as report}
|
{#each currentPageReports as report}
|
||||||
<tr
|
<tr
|
||||||
class="hover [&>*]:text-sm cursor-pointer"
|
class="hover [&>*]:text-sm cursor-pointer"
|
||||||
class:bg-base-200={activeReport === report}
|
class:bg-base-200={activeReport?.url_hash === report.url_hash}
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
|
goto(`${window.location.href.split('#')[0]}#${report.url_hash}`, {
|
||||||
|
replaceState: true
|
||||||
|
});
|
||||||
activeReport = report;
|
activeReport = report;
|
||||||
activeReport.originalStatus = report.status;
|
activeReport.originalStatus = report.status;
|
||||||
}}
|
}}
|
||||||
@ -158,6 +200,15 @@
|
|||||||
class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-max"
|
class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-max"
|
||||||
>
|
>
|
||||||
<li>
|
<li>
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
navigator.clipboard.writeText(
|
||||||
|
`${window.location.protocol}//${window.location.host}${env.PUBLIC_BASE_PATH}/admin/reports#${activeReport.url_hash}`
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Internen Link kopieren
|
||||||
|
</button>
|
||||||
<button
|
<button
|
||||||
on:click={() =>
|
on:click={() =>
|
||||||
navigator.clipboard.writeText(
|
navigator.clipboard.writeText(
|
||||||
@ -167,8 +218,12 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</form>
|
</form>
|
||||||
<button class="btn btn-sm btn-circle btn-ghost" on:click={() => (activeReport = null)}
|
<button
|
||||||
>✕</button
|
class="btn btn-sm btn-circle btn-ghost"
|
||||||
|
on:click={() => {
|
||||||
|
activeReport = null;
|
||||||
|
goto(window.location.href.split('#')[0], { replaceState: true });
|
||||||
|
}}>✕</button
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
<h3 class="font-roboto font-semibold text-2xl">Report</h3>
|
<h3 class="font-roboto font-semibold text-2xl">Report</h3>
|
||||||
|
@ -22,9 +22,11 @@ export const POST = (async ({ request, cookies }) => {
|
|||||||
status: 'none' | 'review' | 'reviewed' | null;
|
status: 'none' | 'review' | 'reviewed' | null;
|
||||||
reporter: string | null;
|
reporter: string | null;
|
||||||
reported: string | null;
|
reported: string | null;
|
||||||
|
|
||||||
|
hash: string | null;
|
||||||
} = await request.json();
|
} = await request.json();
|
||||||
|
|
||||||
const reportFindOptions: Attributes<Report> = {};
|
let reportFindOptions: Attributes<Report> = {};
|
||||||
if (data.draft != null) reportFindOptions.draft = data.draft;
|
if (data.draft != null) reportFindOptions.draft = data.draft;
|
||||||
reportFindOptions.status = data.status == null ? ['none', 'review'] : data.status;
|
reportFindOptions.status = data.status == null ? ['none', 'review'] : data.status;
|
||||||
if (data.reporter != null) {
|
if (data.reporter != null) {
|
||||||
@ -41,6 +43,13 @@ export const POST = (async ({ request, cookies }) => {
|
|||||||
});
|
});
|
||||||
reportFindOptions.reported_id = reported_ids.map((u) => u.id);
|
reportFindOptions.reported_id = reported_ids.map((u) => u.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (data.hash != null) {
|
||||||
|
reportFindOptions = { url_hash: data.hash };
|
||||||
|
data.from = 0;
|
||||||
|
data.limit = 1;
|
||||||
|
}
|
||||||
|
|
||||||
let reports = await Report.findAll({
|
let reports = await Report.findAll({
|
||||||
where: reportFindOptions,
|
where: reportFindOptions,
|
||||||
include: [
|
include: [
|
||||||
|
Loading…
x
Reference in New Issue
Block a user