add validation
This commit is contained in:
parent
2dbd6742f7
commit
15c54bd3e6
|
@ -1,8 +1,7 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { object, string, type InferType } from 'yup'
|
|
||||||
import { apiBase } from '~/helpers';
|
import { apiBase } from '~/helpers';
|
||||||
import type { ApiTypeList, ApiTypeExternal } from '~/helpers';
|
import type { ApiTypeList, ApiTypeExternal, ApiElementSave } from '~/helpers';
|
||||||
import type { FormSubmitEvent } from '#ui/types'
|
import type { FormError, FormSubmitEvent } from '#ui/types'
|
||||||
|
|
||||||
const props = defineProps(['elements', 'partner'])
|
const props = defineProps(['elements', 'partner'])
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
|
@ -36,18 +35,25 @@ const external_data = reactive<ExternalDataType>({
|
||||||
element: [],
|
element: [],
|
||||||
})
|
})
|
||||||
const elements = ref(props.elements)
|
const elements = ref(props.elements)
|
||||||
const schema = object({
|
const validate = (state: any): FormError[] => {
|
||||||
element: string().required('Required'),
|
const errors = []
|
||||||
element_id: string().required('Required')
|
const txt = 'Это поле обязательно'
|
||||||
})
|
if (!state.partner) errors.push({ path: 'partner', message: txt })
|
||||||
type Schema = InferType<typeof schema>
|
if (!external_data || !external_data.partner || !external_data.partner.find(el => el.Ref_Key == state.partner)) {
|
||||||
|
errors.push({ path: 'partner', message: txt })
|
||||||
|
}
|
||||||
|
if (!state.element_id) errors.push({ path: 'element_id', message: txt })
|
||||||
|
return errors
|
||||||
|
}
|
||||||
|
|
||||||
async function onSubmit(event: FormSubmitEvent<Schema>) {
|
async function onSubmit(event: FormSubmitEvent<any>) {
|
||||||
const prepader_data = event.data
|
const prepader_data = event.data
|
||||||
|
if (!external_data || !external_data.partner) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
prepader_data.partner_name = external_data.partner.find(el => el.Ref_Key == state.partner)?.Description
|
prepader_data.partner_name = external_data.partner.find(el => el.Ref_Key == state.partner)?.Description
|
||||||
if(!prepader_data.partner_name) prepader_data.partner_name = prepader_data.partner
|
|
||||||
|
|
||||||
const data = await $fetch(`${apiBase}/element/`, { method: 'POST', body: JSON.stringify(prepader_data) })
|
const data = await $fetch<ApiElementSave>(`${apiBase}/element/`, { method: 'POST', body: JSON.stringify(prepader_data) })
|
||||||
const inv_id = route.params.inv_id || data.inventory?.id
|
const inv_id = route.params.inv_id || data.inventory?.id
|
||||||
if (!route.params.inv_id) {
|
if (!route.params.inv_id) {
|
||||||
navigateTo(`/organization/p_${data.partner.id}/i_${data.inventory.id}`)
|
navigateTo(`/organization/p_${data.partner.id}/i_${data.inventory.id}`)
|
||||||
|
@ -118,8 +124,8 @@ onMounted(async () => {
|
||||||
<template>
|
<template>
|
||||||
<div class="grid grid-cols-10 gap-4">
|
<div class="grid grid-cols-10 gap-4">
|
||||||
<div class="col-span-3">
|
<div class="col-span-3">
|
||||||
<UForm :state="state" class="flex flex-col gap-4" @submit="onSubmit">
|
<UForm :state="state" :validate="validate" class="flex flex-col gap-4" @submit="onSubmit">
|
||||||
<UFormGroup label="Выбрать организацию" name="organization">
|
<UFormGroup label="Выбрать организацию" name="partner">
|
||||||
<USelectMenu v-model="state.partner" :options="external_data.partner" value-attribute="Ref_Key"
|
<USelectMenu v-model="state.partner" :options="external_data.partner" value-attribute="Ref_Key"
|
||||||
option-attribute="Description" :searchable="searchInExternal"
|
option-attribute="Description" :searchable="searchInExternal"
|
||||||
searchable-placeholder="Выберите организацию из списка контрагентов" :loading="loading"
|
searchable-placeholder="Выберите организацию из списка контрагентов" :loading="loading"
|
||||||
|
@ -138,7 +144,8 @@ onMounted(async () => {
|
||||||
:placeholder="`Элементы (${external_data.element.length})`" />
|
:placeholder="`Элементы (${external_data.element.length})`" />
|
||||||
</UFormGroup>
|
</UFormGroup>
|
||||||
<UFormGroup v-if="state.element"
|
<UFormGroup v-if="state.element"
|
||||||
:label="`Данные об элементе «${external_data.element?.find(el => el['Ref_Key'] === state.element)?.Description}»`">
|
:label="`Данные об элементе «${external_data.element?.find(el => el['Ref_Key'] === state.element)?.Description}»`"
|
||||||
|
name="element_id">
|
||||||
<UInput placeholder="ID" v-model="state.element_id" />
|
<UInput placeholder="ID" v-model="state.element_id" />
|
||||||
</UFormGroup>
|
</UFormGroup>
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,11 @@ export type ApiTypeBase =
|
||||||
export type ApiPartner = { id: number, external_id: number, name: string, total_inventory: number }
|
export type ApiPartner = { id: number, external_id: number, name: string, total_inventory: number }
|
||||||
export type ApiInventory = { id: number, partner: number, name: string }
|
export type ApiInventory = { id: number, partner: number, name: string }
|
||||||
export type ApiElement = { id: number, external_id: string, element_id: number, photo: string, additional_text: string, inventory: number }
|
export type ApiElement = { id: number, external_id: string, element_id: number, photo: string, additional_text: string, inventory: number }
|
||||||
|
export type ApiElementSave = {
|
||||||
|
partner: ApiPartner,
|
||||||
|
inventory: ApiInventory,
|
||||||
|
element: ApiElement
|
||||||
|
}
|
||||||
export type ApiTypeExternal = {
|
export type ApiTypeExternal = {
|
||||||
'НаименованиеПолное': string;
|
'НаименованиеПолное': string;
|
||||||
Description: string;
|
Description: string;
|
||||||
|
|
Loading…
Reference in New Issue