From 41cc1e7c832c5cfc7871267ed5c831e5f2b94f9c Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Thu, 6 Feb 2025 07:31:31 +0300 Subject: [PATCH] feat: add requests --- src/api/request.ts | 5 + src/components/request/RequestForm.vue | 123 ++++++++++++++++++++++++ src/components/request/RequestTable.vue | 45 +++++++++ src/components/ui/AppModal.vue | 24 +++++ src/components/ui/AppSpinner.vue | 25 +++++ src/hooks/useRequestForm.ts | 65 +++++++++++++ src/layout/MainLayout.vue | 4 +- src/router/index.ts | 2 + src/store/index.ts | 2 + src/store/modules/request.module.ts | 51 ++++++++++ src/views/HomePage.vue | 75 +++++++++++++-- 11 files changed, 413 insertions(+), 8 deletions(-) create mode 100644 src/api/request.ts create mode 100644 src/components/request/RequestForm.vue create mode 100644 src/components/request/RequestTable.vue create mode 100644 src/components/ui/AppModal.vue create mode 100644 src/components/ui/AppSpinner.vue create mode 100644 src/hooks/useRequestForm.ts create mode 100644 src/store/modules/request.module.ts diff --git a/src/api/request.ts b/src/api/request.ts new file mode 100644 index 0000000..1c1a855 --- /dev/null +++ b/src/api/request.ts @@ -0,0 +1,5 @@ +import axios from 'axios'; + +export const requestApi = axios.create({ + baseURL: import.meta.env.VITE_API_BASE_URL, +}) diff --git a/src/components/request/RequestForm.vue b/src/components/request/RequestForm.vue new file mode 100644 index 0000000..22d118f --- /dev/null +++ b/src/components/request/RequestForm.vue @@ -0,0 +1,123 @@ + + + diff --git a/src/components/request/RequestTable.vue b/src/components/request/RequestTable.vue new file mode 100644 index 0000000..a2d32ca --- /dev/null +++ b/src/components/request/RequestTable.vue @@ -0,0 +1,45 @@ + + + diff --git a/src/components/ui/AppModal.vue b/src/components/ui/AppModal.vue new file mode 100644 index 0000000..5bcbe7c --- /dev/null +++ b/src/components/ui/AppModal.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/components/ui/AppSpinner.vue b/src/components/ui/AppSpinner.vue new file mode 100644 index 0000000..3f08feb --- /dev/null +++ b/src/components/ui/AppSpinner.vue @@ -0,0 +1,25 @@ + + + diff --git a/src/hooks/useRequestForm.ts b/src/hooks/useRequestForm.ts new file mode 100644 index 0000000..5194f72 --- /dev/null +++ b/src/hooks/useRequestForm.ts @@ -0,0 +1,65 @@ +import { toTypedSchema } from '@vee-validate/zod'; +import { type SubmissionHandler, useField, useForm } from 'vee-validate'; +import * as z from 'zod'; + +const schema = z.object({ + fio: z + .string() + .trim() + .min(1, 'Обязательное поле') + .default(''), + phone: z + .string() + .trim() + .min(1, 'Обязательное поле') + .default(''), + amount: z + .coerce + .string() + .trim() + .default('') + .transform(value => Number(value || 0)), + + status: z + .enum(["done", "cancelled", "active", "pending"]) +}); + +type Values = z.infer; + + +type UseRequestFormProps = { + onSubmit: SubmissionHandler +} +const useRequestForm = (props: UseRequestFormProps) => { + const {onSubmit} = props; + const {isSubmitting, handleSubmit} = useForm({ + validationSchema: toTypedSchema(schema), + initialValues: { + status: 'active', + amount: 0, + phone: '', + fio: '' + } + }); + const { value: fio, errorMessage: fError, handleBlur: fBlur } = useField('fio'); + const { value: phone, errorMessage: pError, handleBlur: pBlur } = useField('phone'); + const { value: amount, errorMessage: aError, handleBlur: aBlur } = useField('amount'); + const { value: status } = useField('status'); + + return { + status, + isSubmitting, + onSubmit: handleSubmit(onSubmit), + fio, + phone, + amount, + fError, + fBlur, + pError, + pBlur, + aError, + aBlur, + } +} + +export default useRequestForm diff --git a/src/layout/MainLayout.vue b/src/layout/MainLayout.vue index 8361cc2..b72de48 100644 --- a/src/layout/MainLayout.vue +++ b/src/layout/MainLayout.vue @@ -1,6 +1,7 @@