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.4 KiB

<script lang="ts">
import { goto } from "$app/navigation";
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 { getProjectContext } from "$lib/components/contexts/ProjectContext.svelte";
import { getProjectListContext } from "$lib/components/contexts/ProjectListContext.svelte";
import { getScopeContext } from "$lib/components/contexts/ScopeContext.svelte";
import StatusSelect from "$lib/components/controls/StatusSelect.svelte";
import type Project from "$lib/models/project";
import type { ProjectEntry, ProjectInput, Requirement, RequirementInput } from "$lib/models/project";
import Status from "$lib/models/status";
import { projectPrettyId, scopePrettyId } from "$lib/utils/prettyIds";
const {currentModal, closeModal} = getModalContext();
const {scope} = getScopeContext();
const {reloadProject} = getProjectContext();
const {reloadProjectList} = getProjectListContext();
const {page} = getStores();
let project: ProjectInput
let projectId: number
let oldStats: RequirementInput["stats"]
let error: string
let loading: boolean
let show: boolean
let op: "Create" | "Edit" | "Delete"
$: switch ($currentModal.name) {
case "project.create":
initCreate();
op = "Create";
break;
case "project.edit":
initEdit($currentModal.project);
op = "Edit";
break;
default:
loading = false;
error = null;
show = false;
}
function initCreate() {
project = {
name: "",
description: "",
status: Status.Available,
createdTime: void(0),
}
show = true;
}
function initEdit(current: Project) {
project = {
name: current.name,
description: current.description,
status: current.status,
}
projectId = current.id;
show = true;
}
async function submit() {
error = null;
loading = true;
try {
switch (op) {
case "Create":
const newProject = await sl3(fetch, $page.stuff.idToken).createProject($scope.id, project);
projectId = newProject.id
break;
case "Edit":
await sl3(fetch, $page.stuff.idToken).updateProject($scope.id, projectId, project);
break;
}
// Wait for project to reload
await reloadProject();
await reloadProjectList();
goto(`/${scopePrettyId($scope)}/projects/${projectPrettyId({id: projectId, name: project.name})}`, {replaceState: op === "Edit"})
closeModal();
} catch(err) {
if (err.statusCode != null) {
error = err.statusMessage;
} else {
error = err
}
} finally {
loading = false;
}
}
</script>
<form on:submit|preventDefault={submit}>
<Modal show={show} closable verb={op} noun="Project" disabled={loading} error={error}>
<ModalBody>
<label for="name">Name</label>
<input name="name" type="text" bind:value={project.name} />
<label for="description">Description</label>
<textarea name="description" bind:value={project.description} />
<label for="stats">Status</label>
<StatusSelect bind:status={project.status} />
</ModalBody>
</Modal>
</form>