Changes
This commit is contained in:
140
src/components/admin/pages/event/EventEdit.svelte
Normal file
140
src/components/admin/pages/event/EventEdit.svelte
Normal file
@ -0,0 +1,140 @@
|
||||
<script lang="ts">
|
||||
import type {ExtendedEvent} from "../../types/event.js";
|
||||
import {Button, Heading, Input, Label, Modal, Range, Select, Toast, Toggle} from "flowbite-svelte";
|
||||
import {schemTypes} from "../../stores/stores.js";
|
||||
import moment from "moment/moment.js";
|
||||
import type {UpdateEvent} from "../../repo/event.js";
|
||||
import {eventRepo} from "../../repo/repo.js";
|
||||
import ErrorModal from "../../components/ErrorModal.svelte";
|
||||
import {replace} from "svelte-spa-router";
|
||||
import {CheckCircleOutline} from "flowbite-svelte-icons";
|
||||
|
||||
export let data: ExtendedEvent;
|
||||
let event = data.event;
|
||||
let name = event.name;
|
||||
let deadline = moment(event.deadline).utc(true).toISOString().slice(0, -1);
|
||||
let start = moment(event.start).utc(true).toISOString().slice(0, -1);
|
||||
let end = moment(event.end).utc(true).toISOString().slice(0, -1);
|
||||
let member = event.maxTeamMembers;
|
||||
let schemType = event.schemType;
|
||||
let publicOnly = event.publicSchemsOnly;
|
||||
let spectateSystem = event.spectateSystem;
|
||||
|
||||
let errorOpen = false;
|
||||
let error: Error = undefined;
|
||||
let deleteOpen = false;
|
||||
|
||||
$: deadlineDate = moment(deadline);
|
||||
$: startDate = moment(start);
|
||||
$: endDate = moment(end);
|
||||
$: selectTypes = [{
|
||||
value: null,
|
||||
name: "None"
|
||||
}, ...$schemTypes.map((type) => {
|
||||
return {
|
||||
value: type.db,
|
||||
name: type.name
|
||||
}
|
||||
})];
|
||||
|
||||
$: changed = name !== event.name ||
|
||||
deadlineDate.diff(moment(event.deadline)) !== 0 ||
|
||||
startDate.diff(moment(event.start)) !== 0 ||
|
||||
endDate.diff(moment(event.end)) !== 0 ||
|
||||
member !== event.maxTeamMembers ||
|
||||
schemType != event.schemType ||
|
||||
publicOnly !== event.publicSchemsOnly ||
|
||||
spectateSystem !== event.spectateSystem;
|
||||
|
||||
async function del() {
|
||||
try {
|
||||
await $eventRepo.deleteEvent(event.id.toString());
|
||||
await replace("/")
|
||||
} catch (e) {
|
||||
error = e;
|
||||
errorOpen = true;
|
||||
}
|
||||
}
|
||||
|
||||
let successToast: boolean = false;
|
||||
|
||||
async function update() {
|
||||
let ev: UpdateEvent = {
|
||||
deadline: deadlineDate,
|
||||
end: endDate,
|
||||
maxTeamMembers: member,
|
||||
name: name,
|
||||
publicSchemsOnly: publicOnly,
|
||||
schemType: schemType ?? 'null',
|
||||
spectateSystem: spectateSystem,
|
||||
start: startDate
|
||||
};
|
||||
|
||||
try {
|
||||
event = await $eventRepo.updateEvent(event.id.toString(), ev);
|
||||
successToast = true;
|
||||
setTimeout(() => successToast = false, 5000);
|
||||
} catch (e) {
|
||||
error = e;
|
||||
errorOpen = true;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
<title>{event.name} - Edit</title>
|
||||
</svelte:head>
|
||||
|
||||
<form class="m-4">
|
||||
<div class="mt-4">
|
||||
<Label for="event-name">Name</Label>
|
||||
<Input type="text" id="event-name" bind:value={name} class="w-80" size="lg"></Input>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
<Label for="event-deadline">Deadline</Label>
|
||||
<Input id="event-deadline" bind:value={name} class="w-80" let:props size="lg">
|
||||
<input type="datetime-local" {...props} bind:value={deadline}/>
|
||||
</Input>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
<Label for="event-start">Start</Label>
|
||||
<Input id="event-start" bind:value={name} class="w-80" let:props size="lg">
|
||||
<input type="datetime-local" {...props} bind:value={start}/>
|
||||
</Input>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
<Label for="event-end">End</Label>
|
||||
<Input id="event-end" bind:value={name} class="w-80" let:props size="lg">
|
||||
<input type="datetime-local" {...props} bind:value={end}/>
|
||||
</Input>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
<Label for="event-member">Member: {member}</Label>
|
||||
<Range id="event-member" bind:value={member} step="1" min="1" max="30"/>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
<Label for="event-type">Schematic Type:</Label>
|
||||
<Select bind:value={schemType} items={selectTypes}/>
|
||||
</div>
|
||||
<Toggle bind:checked={publicOnly} class="mt-4">Public Schematics Only</Toggle>
|
||||
<Toggle bind:checked={spectateSystem} class="mt-4">Spectate System</Toggle>
|
||||
<div class="flex mt-4">
|
||||
<Button disabled={!changed} on:click={update}>Update</Button>
|
||||
<Button class="ml-4" color="red" on:click={() => deleteOpen = true}>Delete</Button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<ErrorModal bind:open={errorOpen} bind:error={error}/>
|
||||
|
||||
<Modal bind:open={deleteOpen} outsideclose title="Delete {event.name}?">
|
||||
<p>Are you sure you want to delete {event.name}?</p>
|
||||
<div class="flex justify-end">
|
||||
<Button on:click={() => deleteOpen = false}>Cancel</Button>
|
||||
<Button class="ml-4" color="red" on:click={del}>Delete</Button>
|
||||
</div>
|
||||
</Modal>
|
||||
|
||||
<Toast bind:open={successToast} position="bottom-left" color="green">
|
||||
<CheckCircleOutline slot="icon"/>
|
||||
Updated Successfully
|
||||
</Toast>
|
||||
Reference in New Issue
Block a user