Add eslint
This commit is contained in:
+149
-144
@@ -21,16 +21,13 @@ const { init } = useToast();
|
||||
const { name, id } = app.$slugData.huntSlug!;
|
||||
const titleStore = useTitleStore();
|
||||
|
||||
const { data, pending, refresh, error } = await useFetch(
|
||||
`/api/admin/hunt/${id}`,
|
||||
{
|
||||
transform: (value) => {
|
||||
return superjson.deserialize(
|
||||
value as unknown as SuperJSONResult
|
||||
) as unknown as typeof value;
|
||||
}
|
||||
const { data, pending, refresh } = await useFetch(`/api/admin/hunt/${id}`, {
|
||||
transform: (value) => {
|
||||
return superjson.deserialize(
|
||||
value as unknown as SuperJSONResult
|
||||
) as unknown as typeof value;
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
const formData = useCloned(data, {
|
||||
clone: (source) => superjson.deserialize(superjson.serialize(source))
|
||||
@@ -158,148 +155,156 @@ async function addUser() {
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<h1>admin</h1>
|
||||
<VaForm v-if="formData.cloned.value && data" class="flex flex-col gap-4">
|
||||
<VaInput
|
||||
label="Name DE"
|
||||
v-model="formData.cloned.value.name_de"
|
||||
clearable
|
||||
:clear-value="data.name_de"
|
||||
clearable-icon="replay"
|
||||
/>
|
||||
<VaInput
|
||||
label="Name EN"
|
||||
v-model="formData.cloned.value.name_en"
|
||||
clearable
|
||||
:clear-value="data.name_en"
|
||||
clearable-icon="replay"
|
||||
/>
|
||||
<VaTextarea
|
||||
label="Description DE"
|
||||
v-model="formData.cloned.value.description_de"
|
||||
clearable
|
||||
:clear-value="data.description_de"
|
||||
clearable-icon="replay"
|
||||
/>
|
||||
<VaTextarea
|
||||
label="Description EN"
|
||||
v-model="formData.cloned.value.description_en"
|
||||
clearable
|
||||
:clear-value="data.description_en"
|
||||
clearable-icon="replay"
|
||||
/>
|
||||
<VaCheckbox label="Virtual" v-model="formData.cloned.value.virtual" />
|
||||
<VaCheckbox label="Allow Join" v-model="formData.cloned.value.allowJoin" />
|
||||
<VaCheckbox
|
||||
label="Reveal Quests"
|
||||
v-model="formData.cloned.value.revealQuests"
|
||||
/>
|
||||
<VaCheckbox
|
||||
label="Reveal Answers"
|
||||
v-model="formData.cloned.value.revealAnswers"
|
||||
/>
|
||||
<div class="flex flex-row gap-2">
|
||||
<div>
|
||||
<h1>admin</h1>
|
||||
<VaForm v-if="formData.cloned.value && data" class="flex flex-col gap-4">
|
||||
<VaInput
|
||||
v-model="formData.cloned.value.name_de"
|
||||
label="Name DE"
|
||||
clearable
|
||||
:clear-value="data.name_de"
|
||||
clearable-icon="replay"
|
||||
/>
|
||||
<VaInput
|
||||
v-model="formData.cloned.value.name_en"
|
||||
label="Name EN"
|
||||
clearable
|
||||
:clear-value="data.name_en"
|
||||
clearable-icon="replay"
|
||||
/>
|
||||
<VaTextarea
|
||||
v-model="formData.cloned.value.description_de"
|
||||
label="Description DE"
|
||||
clearable
|
||||
:clear-value="data.description_de"
|
||||
clearable-icon="replay"
|
||||
/>
|
||||
<VaTextarea
|
||||
v-model="formData.cloned.value.description_en"
|
||||
label="Description EN"
|
||||
clearable
|
||||
:clear-value="data.description_en"
|
||||
clearable-icon="replay"
|
||||
/>
|
||||
<VaCheckbox v-model="formData.cloned.value.virtual" label="Virtual" />
|
||||
<VaCheckbox
|
||||
label="Start?"
|
||||
:model-value="!!formData.cloned.value.start"
|
||||
@update:model-value="
|
||||
(newVal) =>
|
||||
(formData.cloned.value!.start = newVal ? new Date() : null)
|
||||
"
|
||||
v-model="formData.cloned.value.allowJoin"
|
||||
label="Allow Join"
|
||||
/>
|
||||
<VaDateInput
|
||||
v-if="formData.cloned.value.start"
|
||||
label="Start"
|
||||
v-model="formData.cloned.value.start"
|
||||
manual-input
|
||||
/>
|
||||
<VaTimeInput
|
||||
v-if="formData.cloned.value.start"
|
||||
label="Start"
|
||||
v-model="formData.cloned.value.start"
|
||||
view="seconds"
|
||||
manual-input
|
||||
/>
|
||||
</div>
|
||||
<div class="flex flex-row gap-2">
|
||||
<VaCheckbox
|
||||
label="End?"
|
||||
:model-value="!!formData.cloned.value.end"
|
||||
@update:model-value="
|
||||
(newVal) => (formData.cloned.value!.end = newVal ? new Date() : null)
|
||||
"
|
||||
v-model="formData.cloned.value.revealQuests"
|
||||
label="Reveal Quests"
|
||||
/>
|
||||
<VaDateInput
|
||||
v-if="formData.cloned.value.end"
|
||||
label="End"
|
||||
v-model="formData.cloned.value.end"
|
||||
manual-input
|
||||
<VaCheckbox
|
||||
v-model="formData.cloned.value.revealAnswers"
|
||||
label="Reveal Answers"
|
||||
/>
|
||||
<VaTimeInput
|
||||
v-if="formData.cloned.value.end"
|
||||
label="End"
|
||||
v-model="formData.cloned.value.end"
|
||||
view="seconds"
|
||||
manual-input
|
||||
/>
|
||||
</div>
|
||||
<p>
|
||||
Last update:
|
||||
{{ d(data.updatedAt, fullDate) }}
|
||||
</p>
|
||||
<VaButtonGroup :loading="pending" :disabled="pending">
|
||||
<VaButton
|
||||
icon="replay"
|
||||
:disabled="!formData.isModified.value"
|
||||
@click.prevent="formData.sync()"
|
||||
>Reset all values</VaButton
|
||||
>
|
||||
<VaButton :disabled="formData.isModified.value" @click.prevent="refresh()"
|
||||
>Refresh</VaButton
|
||||
>
|
||||
<VaButton :disabled="!formData.isModified.value" @click.prevent="submit"
|
||||
>Save</VaButton
|
||||
>
|
||||
</VaButtonGroup>
|
||||
</VaForm>
|
||||
<div class="flex flex-row gap-2">
|
||||
<VaCheckbox
|
||||
label="Start?"
|
||||
:model-value="!!formData.cloned.value.start"
|
||||
@update:model-value="
|
||||
(newVal) =>
|
||||
(formData.cloned.value!.start = newVal ? new Date() : null)
|
||||
"
|
||||
/>
|
||||
<VaDateInput
|
||||
v-if="formData.cloned.value.start"
|
||||
v-model="formData.cloned.value.start"
|
||||
label="Start"
|
||||
manual-input
|
||||
/>
|
||||
<VaTimeInput
|
||||
v-if="formData.cloned.value.start"
|
||||
v-model="formData.cloned.value.start"
|
||||
label="Start"
|
||||
view="seconds"
|
||||
manual-input
|
||||
/>
|
||||
</div>
|
||||
<div class="flex flex-row gap-2">
|
||||
<VaCheckbox
|
||||
label="End?"
|
||||
:model-value="!!formData.cloned.value.end"
|
||||
@update:model-value="
|
||||
(newVal) =>
|
||||
(formData.cloned.value!.end = newVal ? new Date() : null)
|
||||
"
|
||||
/>
|
||||
<VaDateInput
|
||||
v-if="formData.cloned.value.end"
|
||||
v-model="formData.cloned.value.end"
|
||||
label="End"
|
||||
manual-input
|
||||
/>
|
||||
<VaTimeInput
|
||||
v-if="formData.cloned.value.end"
|
||||
v-model="formData.cloned.value.end"
|
||||
label="End"
|
||||
view="seconds"
|
||||
manual-input
|
||||
/>
|
||||
</div>
|
||||
<p>
|
||||
Last update:
|
||||
{{ d(data.updatedAt, fullDate) }}
|
||||
</p>
|
||||
<VaButtonGroup :loading="pending" :disabled="pending">
|
||||
<VaButton
|
||||
icon="replay"
|
||||
:disabled="!formData.isModified.value"
|
||||
@click.prevent="formData.sync()"
|
||||
>Reset all values</VaButton
|
||||
>
|
||||
<VaButton
|
||||
:disabled="formData.isModified.value"
|
||||
@click.prevent="refresh()"
|
||||
>Refresh</VaButton
|
||||
>
|
||||
<VaButton :disabled="!formData.isModified.value" @click.prevent="submit"
|
||||
>Save</VaButton
|
||||
>
|
||||
</VaButtonGroup>
|
||||
</VaForm>
|
||||
|
||||
<VaDivider />
|
||||
<h2 class="text-2xl">Hunt admin members:</h2>
|
||||
<div
|
||||
class="mt-8 grid grid-cols-1 gap-2 md:grid-cols-3 lg:grid-cols-5"
|
||||
v-if="data"
|
||||
>
|
||||
<VaButton
|
||||
color="danger"
|
||||
v-for="member in data.members"
|
||||
:key="member.member.id"
|
||||
:disabled="loading"
|
||||
:loading="loading"
|
||||
@click="kick(member)"
|
||||
>Kick {{ member.member.name }} ({{ member.member.email }})</VaButton
|
||||
>
|
||||
<VaChip v-if="data.members.length <= 0">No members yet</VaChip>
|
||||
</div>
|
||||
<div class="mt-8 flex flex-col gap-2 md:flex-row" v-if="data">
|
||||
<VaSelect
|
||||
label="New Admin Member"
|
||||
placeholder="Start typing their email..."
|
||||
autocomplete
|
||||
highlight-matched-text
|
||||
:options="users"
|
||||
v-model="newUser"
|
||||
v-model:search="search"
|
||||
:loading="searchPending"
|
||||
track-by="id"
|
||||
text-by="email"
|
||||
/><VaButton
|
||||
icon="add"
|
||||
color="danger"
|
||||
:disabled="!newUser || loading"
|
||||
:loading="loading"
|
||||
@click="addUser"
|
||||
>Add admin</VaButton
|
||||
<VaDivider />
|
||||
<h2 class="text-2xl">Hunt admin members:</h2>
|
||||
<div
|
||||
v-if="data"
|
||||
class="mt-8 grid grid-cols-1 gap-2 md:grid-cols-3 lg:grid-cols-5"
|
||||
>
|
||||
<VaButton
|
||||
v-for="member in data.members"
|
||||
:key="member.member.id"
|
||||
color="danger"
|
||||
:disabled="loading"
|
||||
:loading="loading"
|
||||
@click="kick(member)"
|
||||
>Kick {{ member.member.name }} ({{ member.member.email }})</VaButton
|
||||
>
|
||||
<VaChip v-if="data.members.length <= 0">No members yet</VaChip>
|
||||
</div>
|
||||
<div v-if="data" class="mt-8 flex flex-col gap-2 md:flex-row">
|
||||
<VaSelect
|
||||
v-model="newUser"
|
||||
v-model:search="search"
|
||||
label="New Admin Member"
|
||||
placeholder="Start typing their email..."
|
||||
autocomplete
|
||||
highlight-matched-text
|
||||
:options="users"
|
||||
:loading="searchPending"
|
||||
track-by="id"
|
||||
text-by="email"
|
||||
/><VaButton
|
||||
icon="add"
|
||||
color="danger"
|
||||
:disabled="!newUser || loading"
|
||||
:loading="loading"
|
||||
@click="addUser"
|
||||
>Add admin</VaButton
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user