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
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>
|