From 5a63f00f514d811b203665c693dd4f05a0026f65 Mon Sep 17 00:00:00 2001 From: Evert Prants Date: Sat, 4 Feb 2023 13:34:50 +0200 Subject: [PATCH] button --- src/components/Button.vue | 29 +++++++ src/components/item/NewItemModal.vue | 24 +++-- src/components/item/NewStorageModal.vue | 21 ++--- src/components/menu/Menu.vue | 26 +++--- src/components/menu/MenuOption.vue | 2 +- src/components/menu/menu.interfaces.ts | 11 +++ src/views/Login.vue | 87 ++++++++----------- src/views/building/BuildingView.vue | 1 + src/views/building/floors/FloorView.vue | 2 + src/views/building/floors/RoomPolygon.vue | 4 +- .../building/floors/storage/StorageView.vue | 2 + 11 files changed, 117 insertions(+), 92 deletions(-) create mode 100644 src/components/Button.vue create mode 100644 src/components/menu/menu.interfaces.ts 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 @@