Loggest thine Stuff
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

118 lines
3.2 KiB

<script lang="ts">
import { getStores } from "$app/stores";
import { sl3 } from "$lib/clients/sl3";
import Modal from "$lib/components/common/Modal.svelte";
import ModalBody from "$lib/components/common/ModalBody.svelte";
import { getModalContext } from "$lib/components/contexts/ModalContext.svelte";
import { getScopeContext } from "$lib/components/contexts/ScopeContext.svelte";
import Checkbox from "$lib/components/layout/Checkbox.svelte";
import type { Requirement } from "$lib/models/project";
import type Scope from "$lib/models/scope";
import type { StatInput } from "$lib/models/stat";
import type Stat from "$lib/models/stat";
const {currentModal, closeModal} = getModalContext();
const {scope, upsertStat} = getScopeContext();
const {page} = getStores();
let stat: StatInput
let statId: number
let op: string
let error: string
let loading: boolean
let show: boolean
$: switch ($currentModal.name) {
case "stat.create":
initCreate($scope)
break;
case "stat.edit":
initEdit($currentModal.stat)
break;
default:
loading = false;
error = null;
show = false;
}
function initCreate(scope: Scope, requirement?: Requirement) {
let stats = requirement?.stats.map(s => ({statId: s.id, required: 0, acquired: 0}));
if (stats == null) {
stats = scope.stats.map(s => ({statId: s.id, required: 0, acquired: 0}))
}
stat = {
name: "",
weight: 1,
primary: false,
description: "",
allowedAmounts: null,
}
op = "Create"
show = true;
}
function initEdit(current: Stat) {
stat = {
name: current.name,
weight: current.weight,
primary: current.primary,
description: current.description,
allowedAmounts: current.allowedAmounts ? current.allowedAmounts.slice() : void(0),
};
statId = current.id;
op = "Edit"
show = true;
}
async function submit() {
error = null;
loading = true;
try {
switch (op) {
case "Create":
const createdStat = await sl3(fetch, $page.stuff.idToken).createStat($scope.id, stat);
upsertStat(createdStat);
break;
case "Edit":
const editedStat = await sl3(fetch, $page.stuff.idToken).updateStat($scope.id, statId, {
...stat,
allowedAmounts: void(0),
});
upsertStat(editedStat);
break;
}
closeModal();
} catch(err) {
if (err.statusCode != null) {
error = err.statusMessage;
} else {
error = err
}
} finally {
loading = false;
}
}
</script>
<form on:submit|preventDefault={submit}>
<Modal closable show={show} verb={op} noun="Stat" disabled={loading} error={error}>
<ModalBody>
<label for="name">Name</label>
<input name="name" type="text" bind:value={stat.name} />
<label for="weight">Weight</label>
<input name="weight" type="number" min={0} step={0.001} bind:value={stat.weight} />
<label for="description">Description</label>
<textarea name="description" bind:value={stat.description} />
<Checkbox bind:checked={stat.primary} label="Primary" />
</ModalBody>
</Modal>
</form>