fix: prevent resetting dialog state on error (#524)

This commit is contained in:
Hayden 2023-07-31 08:22:08 -08:00 committed by GitHub
parent 5a219f6a9c
commit 8c7d91ea52
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 7 deletions

View file

@ -0,0 +1,19 @@
type DeferFunction<TArgs extends any[], TReturn> = (...args: TArgs) => TReturn;
// useDefer is a function that takes a function and returns a function that
// calls the original function and then calls the onComplete function.
export function useDefer<TArgs extends any[], TReturn>(
onComplete: (...args: TArgs) => void,
func: DeferFunction<TArgs, TReturn>
): DeferFunction<TArgs, TReturn> {
return (...args: TArgs) => {
let result: TReturn;
try {
result = func(...args);
} finally {
onComplete(...args);
}
return result;
};
}

View file

@ -71,6 +71,7 @@
} }
function resetEntry() { function resetEntry() {
console.log("Resetting entry");
entry.id = null; entry.id = null;
entry.name = ""; entry.name = "";
entry.completedDate = null; entry.completedDate = null;
@ -79,13 +80,26 @@
entry.cost = ""; entry.cost = "";
} }
async function createEntry() { watch(
() => entry.modal,
(v, pv) => {
if (pv === true && v === false) {
resetEntry();
}
}
);
// Calls either edit or create depending on entry.id being set
async function dispatchFormSubmit() {
if (entry.id) { if (entry.id) {
editEntry(); await editEntry();
resetEntry();
return; return;
} }
await createEntry();
}
async function createEntry() {
const { error } = await api.items.maintenance.create(props.item.id, { const { error } = await api.items.maintenance.create(props.item.id, {
name: entry.name, name: entry.name,
completedDate: entry.completedDate ?? "", completedDate: entry.completedDate ?? "",
@ -123,14 +137,13 @@
} }
function openEditDialog(e: MaintenanceEntry) { function openEditDialog(e: MaintenanceEntry) {
console.log(e);
entry.modal = true;
entry.id = e.id; entry.id = e.id;
entry.name = e.name; entry.name = e.name;
entry.completedDate = new Date(e.completedDate); entry.completedDate = new Date(e.completedDate);
entry.scheduledDate = new Date(e.scheduledDate); entry.scheduledDate = new Date(e.scheduledDate);
entry.description = e.description; entry.description = e.description;
entry.cost = e.cost; entry.cost = e.cost;
entry.modal = true;
} }
async function editEntry() { async function editEntry() {
@ -152,7 +165,6 @@
} }
entry.modal = false; entry.modal = false;
refreshLog(); refreshLog();
} }
</script> </script>
@ -163,7 +175,7 @@
<template #title> <template #title>
{{ entry.id ? "Edit Entry" : "New Entry" }} {{ entry.id ? "Edit Entry" : "New Entry" }}
</template> </template>
<form @submit.prevent="createEntry"> <form @submit.prevent="dispatchFormSubmit">
<FormTextField v-model="entry.name" autofocus label="Entry Name" /> <FormTextField v-model="entry.name" autofocus label="Entry Name" />
<DatePicker v-model="entry.completedDate" label="Completed Date" /> <DatePicker v-model="entry.completedDate" label="Completed Date" />
<DatePicker v-model="entry.scheduledDate" label="Scheduled Date" /> <DatePicker v-model="entry.scheduledDate" label="Scheduled Date" />