diff --git a/src/components/Button.vue b/src/components/Button.vue
new file mode 100644
index 0000000..fb373b4
--- /dev/null
+++ b/src/components/Button.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
diff --git a/src/components/item/NewItemModal.vue b/src/components/item/NewItemModal.vue
index b3f4f02..1d1b359 100644
--- a/src/components/item/NewItemModal.vue
+++ b/src/components/item/NewItemModal.vue
@@ -101,7 +101,12 @@
/>
-
+
+
+
+
@@ -127,17 +132,14 @@ import FormSelectField from '../form/fields/FormSelectField.vue';
import { IsRequired, MinLength } from '../form/validators';
import Modal from '../Modal.vue';
import { ItemType, ItemTypeName } from '../../enums/item-type.enum';
-import {
- TransactionType,
- TransactionTypeDescription,
- TransactionTypeName,
-} from '../../enums/transaction-type.enum';
+import { TransactionType } from '../../enums/transaction-type.enum';
import FormGroup from '../form/FormGroup.vue';
import FormDateField from '../form/fields/FormDateField.vue';
import FormAutocompleteField from '../form/fields/FormAutocompleteField.vue';
import { FormValidator } from '../form/validator.types';
import deepUnref from '../../utils/deep-unref';
import FormTextareaField from '../form/fields/FormTextareaField.vue';
+import Button from '../Button.vue';
const defaults: any = {
item: null,
@@ -159,6 +161,7 @@ const data: any = ref({
...deepUnref(defaults),
});
const error = ref('');
+const submitlock = ref(false);
const emit = defineEmits<{
(e: 'added', storage: StoredItem): void;
@@ -256,7 +259,10 @@ const startAddingNewItem = (insert: string) => {
const onSubmit = async (form: FormSubmit) => {
error.value = '';
- if (!form.isValid || !storage.value) return;
+ if (!form.isValid || !storage.value) {
+ submitlock.value = false;
+ return;
+ }
const body = {
...form.formData,
@@ -281,6 +287,10 @@ const onSubmit = async (form: FormSubmit) => {
}
emit('added', createdStoredItem);
+ if (submitlock.value) {
+ submitlock.value = false;
+ return;
+ }
modalRef.value?.closeModal();
};
diff --git a/src/components/item/NewStorageModal.vue b/src/components/item/NewStorageModal.vue
index 3eacbec..4172c3a 100644
--- a/src/components/item/NewStorageModal.vue
+++ b/src/components/item/NewStorageModal.vue
@@ -19,19 +19,10 @@
-
- Submit and add another
-
-
+
@@ -60,6 +51,7 @@ import FormSelectField from '../form/fields/FormSelectField.vue';
import { IsRequired, MinLength } from '../form/validators';
import Modal from '../Modal.vue';
import FormColorField from '../form/fields/FormColorField.vue';
+import Button from '../Button.vue';
const { authHeader } = useAccessToken();
const defaults = {
@@ -123,7 +115,10 @@ defineExpose({
const onSubmit = async (value: FormSubmit) => {
error.value = '';
- if (!value.isValid || !room.value) return;
+ if (!value.isValid || !room.value) {
+ submitlock.value = false;
+ return;
+ }
const createURL = `${BACKEND_URL}/storage${
set.value === true ? '/set' : ''
diff --git a/src/components/menu/Menu.vue b/src/components/menu/Menu.vue
index f09aed2..e3d6a5b 100644
--- a/src/components/menu/Menu.vue
+++ b/src/components/menu/Menu.vue
@@ -32,7 +32,7 @@
>
import { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/vue';
import { ChevronDownIcon } from '@heroicons/vue/24/outline';
-import { Component, computed } from 'vue';
-import { RouteLocationRaw, RouterLink } from 'vue-router';
+import { computed } from 'vue';
+import { RouterLink } from 'vue-router';
+import { MenuOption as MenuOptionType } from './menu.interfaces';
import MenuOption from './MenuOption.vue';
-export interface MenuOption {
- title: string;
- key?: string;
- link?: RouteLocationRaw;
- icon?: Component;
- onClick?: () => void;
- component?: Component;
-}
-
const props = defineProps<{
title: string;
- options: MenuOption[];
+ options: MenuOptionType[];
buttonClass?: string;
hideChevron?: boolean;
position?: 'left' | 'center' | 'right';
}>();
const positionClass = computed(() => {
- if (!props.position || props.position === 'right') return 'right-0';
- if (props.position === 'center') return 'left-1/2 -translate-x-1/2';
- if (props.position === 'left') return 'left-0';
+ if (!props.position || props.position === 'right')
+ return 'right-0 origin-top-right';
+ if (props.position === 'center')
+ return 'left-1/2 -translate-x-1/2 origin-top-center';
+ if (props.position === 'left') return 'left-0 origin-top-left';
return '';
});
diff --git a/src/components/menu/MenuOption.vue b/src/components/menu/MenuOption.vue
index d1f0b78..2cc62ac 100644
--- a/src/components/menu/MenuOption.vue
+++ b/src/components/menu/MenuOption.vue
@@ -17,7 +17,7 @@