Compare commits
No commits in common. "8a80b0a9e0a687b49f4a08f2f2a3d19182ce52e2" and "56aa3c2673384c97847692ac8e86e8cc0237e655" have entirely different histories.
8a80b0a9e0
...
56aa3c2673
@ -5,7 +5,6 @@
|
|||||||
export let searchSuggestionFunc: (
|
export let searchSuggestionFunc: (
|
||||||
input: string
|
input: string
|
||||||
) => Promise<{ name: string; value: string }[]> = () => Promise.resolve([]);
|
) => Promise<{ name: string; value: string }[]> = () => Promise.resolve([]);
|
||||||
export let invalidMessage: string | null = null;
|
|
||||||
export let size: 'xs' | 'sm' | 'md' | 'lg' = 'md';
|
export let size: 'xs' | 'sm' | 'md' | 'lg' = 'md';
|
||||||
export let label: string | null = null;
|
export let label: string | null = null;
|
||||||
export let required = false;
|
export let required = false;
|
||||||
@ -33,26 +32,21 @@
|
|||||||
class:input-xs={size === 'xs'}
|
class:input-xs={size === 'xs'}
|
||||||
class:input-sm={size === 'sm'}
|
class:input-sm={size === 'sm'}
|
||||||
class:input-md={size === 'md'}
|
class:input-md={size === 'md'}
|
||||||
class:input-lg={size === 'lg'}
|
class:input-lg={size === 'md'}
|
||||||
{id}
|
{id}
|
||||||
{required}
|
{required}
|
||||||
bind:value={inputValue}
|
bind:value={inputValue}
|
||||||
on:input={(e) => {
|
on:input={() => {
|
||||||
value = '';
|
value = '';
|
||||||
searchSuggestionFunc(inputValue).then((v) => {
|
searchSuggestionFunc(inputValue).then((v) => {
|
||||||
searchSuggestions = v;
|
searchSuggestions = v;
|
||||||
const searchSuggestion = v.find((v) => v.name === inputValue);
|
let searchSuggestionValue = v.find((v) => v.name === inputValue);
|
||||||
if (searchSuggestion !== undefined) {
|
if (searchSuggestionValue !== undefined) {
|
||||||
inputValue = searchSuggestion.name;
|
value = searchSuggestionValue.value;
|
||||||
value = searchSuggestion.value;
|
|
||||||
searchSuggestions = [];
|
searchSuggestions = [];
|
||||||
e.target?.setCustomValidity('');
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
on:invalid={(e) => {
|
|
||||||
if (invalidMessage != null) e.target?.setCustomValidity(invalidMessage);
|
|
||||||
}}
|
|
||||||
pattern={suggestionRequired ? `${value ? inputValue : 'a^'}` : null}
|
pattern={suggestionRequired ? `${value ? inputValue : 'a^'}` : null}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
@ -146,31 +146,10 @@
|
|||||||
class="relative flex flex-col w-2/5 bg-base-200/50 px-4 py-6 overflow-scroll"
|
class="relative flex flex-col w-2/5 bg-base-200/50 px-4 py-6 overflow-scroll"
|
||||||
transition:fly={{ x: 200, duration: 200 }}
|
transition:fly={{ x: 200, duration: 200 }}
|
||||||
>
|
>
|
||||||
<div class="absolute right-2 top-2 flex justify-center">
|
|
||||||
<form class="dropdown dropdown-end">
|
|
||||||
<!-- svelte-ignore a11y-no-noninteractive-tabindex a11y-label-has-associated-control -->
|
|
||||||
<label tabindex="0" class="btn btn-sm btn-circle btn-ghost text-center">
|
|
||||||
<IconOutline name="share-outline" height="1rem" width="auto" />
|
|
||||||
</label>
|
|
||||||
<!-- svelte-ignore a11y-no-noninteractive-tabindex -->
|
|
||||||
<ul
|
|
||||||
tabindex="0"
|
|
||||||
class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-max"
|
|
||||||
>
|
|
||||||
<li>
|
|
||||||
<button
|
<button
|
||||||
on:click={() =>
|
class="btn btn-sm btn-circle btn-ghost absolute right-2 top-2"
|
||||||
navigator.clipboard.writeText(
|
on:click={() => (activeReport = null)}>✕</button
|
||||||
`${window.location.protocol}//${window.location.host}${env.PUBLIC_BASE_PATH}/report/${activeReport.url_hash}`
|
|
||||||
)}>Öffentlichen Link kopieren</button
|
|
||||||
>
|
>
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</form>
|
|
||||||
<button class="btn btn-sm btn-circle btn-ghost" on:click={() => (activeReport = null)}
|
|
||||||
>✕</button
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
<h3 class="font-roboto font-semibold text-2xl">Report</h3>
|
<h3 class="font-roboto font-semibold text-2xl">Report</h3>
|
||||||
<div class="break-words my-2">
|
<div class="break-words my-2">
|
||||||
<i class="font-medium">{activeReport.reporter.username}</i> hat
|
<i class="font-medium">{activeReport.reporter.username}</i> hat
|
||||||
|
@ -58,7 +58,6 @@
|
|||||||
size="sm"
|
size="sm"
|
||||||
suggestionRequired={true}
|
suggestionRequired={true}
|
||||||
searchSuggestionFunc={usernameSuggestions}
|
searchSuggestionFunc={usernameSuggestions}
|
||||||
invalidMessage="Es können nur registrierte Spieler Report Autoren sein"
|
|
||||||
label="Reporter"
|
label="Reporter"
|
||||||
required={true}
|
required={true}
|
||||||
bind:value={reporter}
|
bind:value={reporter}
|
||||||
@ -67,7 +66,6 @@
|
|||||||
size="sm"
|
size="sm"
|
||||||
suggestionRequired={true}
|
suggestionRequired={true}
|
||||||
searchSuggestionFunc={usernameSuggestions}
|
searchSuggestionFunc={usernameSuggestions}
|
||||||
invalidMessage="Es können nur registrierte Spieler reportet werden"
|
|
||||||
label="Reporteter User"
|
label="Reporteter User"
|
||||||
required={true}
|
required={true}
|
||||||
bind:value={reported}
|
bind:value={reported}
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
let userFilter = { name: null, edition: null };
|
let userFilter = { name: null, edition: null };
|
||||||
let userTableContainerElement: HTMLDivElement;
|
let userTableContainerElement: HTMLDivElement;
|
||||||
|
|
||||||
function fetchPageUsers(page: number) {
|
function fetchPageUsers(page: number, filter: any) {
|
||||||
if (!browser) return;
|
if (!browser) return;
|
||||||
|
|
||||||
if (userTableContainerElement) userTableContainerElement.scrollTop = 0;
|
if (userTableContainerElement) userTableContainerElement.scrollTop = 0;
|
||||||
@ -29,7 +29,7 @@
|
|||||||
currentPageUsersRequest = new Promise(async (resolve, reject) => {
|
currentPageUsersRequest = new Promise(async (resolve, reject) => {
|
||||||
const response = await fetch(`${env.PUBLIC_BASE_PATH}/admin/users`, {
|
const response = await fetch(`${env.PUBLIC_BASE_PATH}/admin/users`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: JSON.stringify({ ...userFilter, limit: usersPerPage, from: usersPerPage * page })
|
body: JSON.stringify({ ...filter, limit: usersPerPage, from: usersPerPage * page })
|
||||||
});
|
});
|
||||||
if (response.ok) {
|
if (response.ok) {
|
||||||
currentPageUsers = await response.json();
|
currentPageUsers = await response.json();
|
||||||
@ -40,10 +40,7 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
$: fetchPageUsers(userPage);
|
$: fetchPageUsers(userPage, userFilter);
|
||||||
// prettier-ignore
|
|
||||||
function fetchFilterPageUsers(_: any) { userPage == 0 ? fetchPageUsers(0) : userPage = 0 }
|
|
||||||
$: fetchFilterPageUsers(userFilter);
|
|
||||||
|
|
||||||
let sortKey: string | null = null;
|
let sortKey: string | null = null;
|
||||||
let sortAsc = false;
|
let sortAsc = false;
|
||||||
@ -210,7 +207,7 @@
|
|||||||
</table>
|
</table>
|
||||||
<div class="flex justify-center items-center mb-2 mt-4 w-full">
|
<div class="flex justify-center items-center mb-2 mt-4 w-full">
|
||||||
<div class="join">
|
<div class="join">
|
||||||
{#each Array(currentPageUsers.length === usersPerPage || userPage > 0 ? Math.ceil(data.count / usersPerPage) || 1 : 1) as _, i}
|
{#each Array(Math.ceil(data.count / usersPerPage) || 1) as _, i}
|
||||||
<button
|
<button
|
||||||
class="join-item btn"
|
class="join-item btn"
|
||||||
class:btn-active={i === userPage}
|
class:btn-active={i === userPage}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user