From aa7f11cb97a04e0f6e63f223eccead682b9da672 Mon Sep 17 00:00:00 2001 From: ajdj100 Date: Sat, 17 Jan 2026 23:11:23 -0500 Subject: [PATCH 1/4] implemented submission guard for promotion form --- ui/src/components/promotions/promotionForm.vue | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/ui/src/components/promotions/promotionForm.vue b/ui/src/components/promotions/promotionForm.vue index a6708f6..4e614ce 100644 --- a/ui/src/components/promotions/promotionForm.vue +++ b/ui/src/components/promotions/promotionForm.vue @@ -31,8 +31,12 @@ const { handleSubmit, errors, values, resetForm, setFieldValue, submitCount } = validateOnMount: false, }) +const submitting = ref(false); + const submitForm = handleSubmit( async (vals) => { + if (submitting.value) return; + submitting.value = true; try { let output = vals; output.promotions.map(p => p.start_date = new Date(p.start_date).toISOString()) @@ -42,6 +46,8 @@ const submitForm = handleSubmit( } catch (error) { submitError.value = error; console.error(error); + } finally { + submitting.value = false; } } ); @@ -281,7 +287,12 @@ function setAllToday() {
- +

{{ submitError }}

Date: Mon, 19 Jan 2026 19:02:43 -0500 Subject: [PATCH 2/4] added submit guard to LOA form --- ui/src/components/loa/loaForm.vue | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/ui/src/components/loa/loaForm.vue b/ui/src/components/loa/loaForm.vue index c6f71c2..b1a360b 100644 --- a/ui/src/components/loa/loaForm.vue +++ b/ui/src/components/loa/loaForm.vue @@ -72,8 +72,12 @@ const { handleSubmit, values, resetForm } = useForm({ }) const formSubmitted = ref(false); +const submitting = ref(false); const onSubmit = handleSubmit(async (values) => { + //catch double submit + if (submitting.value) return; + submitting.value = true; const out: LOARequest = { member_id: values.member_id, start_date: values.start_date, @@ -88,6 +92,7 @@ const onSubmit = handleSubmit(async (values) => { userStore.loadUser(); } formSubmitted.value = true; + submitting.value = false; }) onMounted(async () => { @@ -325,7 +330,12 @@ const filteredMembers = computed(() => {

- +
From 4069b7274dce4f1a6292f138f2233f965d654e5c Mon Sep 17 00:00:00 2001 From: ajdj100 Date: Mon, 19 Jan 2026 19:04:45 -0500 Subject: [PATCH 3/4] added submit guard to manage groups --- ui/src/components/roles/addMember.vue | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/ui/src/components/roles/addMember.vue b/ui/src/components/roles/addMember.vue index 2294c3e..d127408 100644 --- a/ui/src/components/roles/addMember.vue +++ b/ui/src/components/roles/addMember.vue @@ -13,6 +13,7 @@ import Button from '../ui/button/Button.vue'; import InputGroup from '../ui/input-group/InputGroup.vue'; import InputGroupAddon from '../ui/input-group/InputGroupAddon.vue'; import { SearchIcon } from 'lucide-vue-next'; +import Spinner from '../ui/spinner/Spinner.vue'; const props = defineProps<{ allMembers: MemberLight[], @@ -43,8 +44,11 @@ function openDialog() { showAddMemberDialog.value = true; } - +const submitting = ref(false); async function handleAddMember() { + //catch double submit + if (submitting.value) return; + submitting.value = true; //guard if (memberToAdd.value == null) return; @@ -52,6 +56,7 @@ async function handleAddMember() { await addMemberToRole(memberToAdd.value.id, props.role.id); emit('submit'); showAddMemberDialog.value = false; + submitting.value = false; } @@ -94,8 +99,11 @@ async function handleAddMember() { - From 9baf2b97b93cc9cfc1e2827c1ece737538c95c32 Mon Sep 17 00:00:00 2001 From: ajdj100 Date: Mon, 19 Jan 2026 19:04:53 -0500 Subject: [PATCH 4/4] Added spinner reference --- ui/src/components/loa/loaForm.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/src/components/loa/loaForm.vue b/ui/src/components/loa/loaForm.vue index b1a360b..cfa2077 100644 --- a/ui/src/components/loa/loaForm.vue +++ b/ui/src/components/loa/loaForm.vue @@ -66,6 +66,7 @@ import { loaSchema } from '@shared/schemas/loaSchema' import { toTypedSchema } from "@vee-validate/zod"; import Calendar from "../ui/calendar/Calendar.vue"; import { useUserStore } from "@/stores/user"; +import Spinner from "../ui/spinner/Spinner.vue"; const { handleSubmit, values, resetForm } = useForm({ validationSchema: toTypedSchema(loaSchema),