You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
234 lines
13 KiB
234 lines
13 KiB
import React,{useRef} from 'react';
|
|
import { useForm, SubmitHandler } from "react-hook-form";
|
|
import { Select } from "./UX";
|
|
|
|
interface IFormInputs {
|
|
firstName: string
|
|
lastName: string
|
|
coach_telefon_number: string
|
|
body: string[]
|
|
}
|
|
|
|
const alerError = (props) => {
|
|
return <p className="mt-2 text-sm text-red-600 dark:text-red-500 font-medium">{props}</p>
|
|
}
|
|
|
|
export const RegistrationForm = (props): JSX.Element => {
|
|
const form = useRef(null);
|
|
const { register, handleSubmit, reset, formState: { errors } } = useForm();
|
|
|
|
const onSubmit: SubmitHandler<IFormInputs> = data => {
|
|
fetch('/api/registration', { method: 'POST', body: JSON.stringify(Object.values(data)) })
|
|
.then(props.updateData(2))
|
|
reset();
|
|
|
|
console.log(JSON.stringify(Object.values(data)));
|
|
}
|
|
return (
|
|
<>
|
|
<div className="mt-10 sm:mt-0">
|
|
<div className="md:grid md:grid-cols-3 md:gap-6">
|
|
<div className="md:col-span-1">
|
|
<div className="px-4 sm:px-0">
|
|
<h3 className="text-lg font-medium leading-6">Регистрация команды</h3>
|
|
<p className="mt-1 text-sm">Введите актуальные данные команды</p>
|
|
<p className="mt-1 text-sm">От каждого учебного заведения может быть зарегистрированно неограниченое количеставо команд</p>
|
|
<p className="mt-1 text-sm"> Подписывайтесь на наш<a href="https://t.me/robotop_competition" className="text-blue-600 dark:text-blue-500 hover:underline"> Telegram канал </a>, что-бы быть в курсе новосте про соревнование </p>
|
|
</div>
|
|
</div>
|
|
<div className="mt-5 md:mt-0 md:col-span-2">
|
|
<form ref={form} onSubmit={handleSubmit(onSubmit)}>
|
|
<div className="shadow overflow-hidden sm:rounded-md">
|
|
<div className="px-4 py-5 bg-white sm:p-6">
|
|
<div className="grid grid-cols-6 gap-6">
|
|
<div className="col-span-6 sm:col-span-3">
|
|
<label htmlFor="first-name" className="block text-sm font-medium text-gray-700">
|
|
ФИО тренера команды
|
|
</label>
|
|
<input
|
|
{...register("name_team_coach",{ required: true, maxLength: 80 })}
|
|
name="name_team_coach"
|
|
placeholder="Иванов Иван Иванович"
|
|
className="mt-1 block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
|
|
/>
|
|
{errors.name_team_coach && alerError('Введите ФИО тренера команды') }
|
|
</div>
|
|
|
|
<div className="col-span-6 sm:col-span-3">
|
|
<label htmlFor="last-name" className="block text-sm font-medium text-gray-700">
|
|
Номер теленона тренера
|
|
</label>
|
|
<input
|
|
{...register("coach_telefon_number",{ required: true, valueAsNumber: true })}
|
|
name="coach_telefon_number"
|
|
placeholder="+79181234567"
|
|
className="mt-1 block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
|
|
/>
|
|
{errors.coach_telefon_number && alerError('Введите номер телефона')}
|
|
</div>
|
|
|
|
<div className="col-span-6 sm:col-span-3">
|
|
<label htmlFor="email-address" className="block text-sm font-medium text-gray-700">
|
|
Email тренера
|
|
</label>
|
|
<input
|
|
{...register("trainer_mail",{ required: true, maxLength: 80, pattern: /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ })}
|
|
placeholder="you@example.com"
|
|
className="mt-1 block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
|
|
/>
|
|
{errors.trainer_mail && alerError('Введите коректный Email адресс')
|
|
}
|
|
</div>
|
|
|
|
<div className="col-span-6 sm:col-span-3">
|
|
<label htmlFor="email-address" className="block text-sm font-medium text-gray-700">
|
|
Город команда
|
|
</label>
|
|
<input
|
|
{...register("city_team",{ required: true, maxLength: 80 })}
|
|
name="city_team"
|
|
placeholder="Краснодар"
|
|
className="mt-1 block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
|
|
/>
|
|
{ errors.city_team && alerError('Введите город команды') }
|
|
</div>
|
|
|
|
<div className="col-span-3">
|
|
<label htmlFor="street-address" className="block text-sm font-medium text-gray-700">
|
|
Учебное заведение команды
|
|
</label>
|
|
<input
|
|
{...register("training_institution_team",{ required: true, maxLength: 150 })}
|
|
name="training_institution_team"
|
|
placeholder="МАОУ СОШ 103"
|
|
className="mt-1 block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
|
|
/>
|
|
{errors.training_institution_team && alerError('Введите название учебного заведения') }
|
|
</div>
|
|
|
|
<div className="col-span-3">
|
|
<label htmlFor="region" className="block text-sm font-medium text-gray-700">
|
|
Название команды
|
|
</label>
|
|
<input
|
|
{...register("team_name",{ required: true, maxLength: 150 })}
|
|
name="team_name"
|
|
placeholder="Фиксики"
|
|
className="mt-1 block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
|
|
/>
|
|
{errors.team_name && alerError('Введите название команды') }
|
|
</div>
|
|
|
|
<div className="col-span-6 sm:col-span-3">
|
|
<label htmlFor="city" className="block text-sm font-medium text-gray-700">
|
|
ФИО первого участника
|
|
</label>
|
|
<input
|
|
{...register("name_first_participant",{ required: true, maxLength: 150 })}
|
|
name="name_first_participant"
|
|
placeholder="Иванов Иван Иванович"
|
|
className="mt-1 block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
|
|
/>
|
|
{errors.name_first_participant && alerError('Введите ФИО участника') }
|
|
</div>
|
|
|
|
<div className="col-span-6 sm:col-span-3">
|
|
<Select text={'Класс участника'} name={'first_partial_class'}/>
|
|
</div>
|
|
|
|
<div className="col-span-6 sm:col-span-3">
|
|
<label htmlFor="city" className="block text-sm font-medium text-gray-700">
|
|
ФИО второго участника
|
|
</label>
|
|
<input
|
|
{...register("name_second_participant",{ maxLength: 150 })}
|
|
name="name_second_participant"
|
|
defaultValue='нет'
|
|
placeholder="Иванов Петр Иванович / нет"
|
|
className="mt-1 block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
|
|
/>
|
|
</div>
|
|
|
|
<div className="col-span-6 sm:col-span-3">
|
|
<label htmlFor="country" className="block text-sm font-medium text-gray-700">
|
|
Класс участника
|
|
</label>
|
|
<select
|
|
{...register("second_class")}
|
|
name="second_class"
|
|
defaultValue={''}
|
|
className="mt-1 block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
|
|
>
|
|
<option value="" selected>-- Выбрать --</option>
|
|
<option value="1">1</option>
|
|
<option value="2">2</option>
|
|
<option value="3">3</option>
|
|
<option value="4">4</option>
|
|
<option value="5">5</option>
|
|
<option value="6">6</option>
|
|
<option value="7">7</option>
|
|
<option value="8">8</option>
|
|
<option value="9">9</option>
|
|
<option value="10">10</option>
|
|
<option value="11">11</option>
|
|
</select>
|
|
</div>
|
|
|
|
<div className="col-span-6 sm:col-span-3">
|
|
<label htmlFor="city" className="block text-sm font-medium text-gray-700">
|
|
ФИО третьего участника
|
|
</label>
|
|
<input
|
|
{...register("name_third_party",{ maxLength: 150 })}
|
|
name="name_third_party"
|
|
defaultValue='нет'
|
|
placeholder="Иванов Дмитрий Иванович / нет"
|
|
className="mt-1 block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
|
|
/>
|
|
</div>
|
|
|
|
<div className="col-span-6 sm:col-span-3">
|
|
<label htmlFor="country" className="block text-sm font-medium text-gray-700">
|
|
Класс участника
|
|
</label>
|
|
<select
|
|
{...register("third_part_class")}
|
|
name="third_part_class"
|
|
defaultValue={''}
|
|
className="mt-1 block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
|
|
>
|
|
<option value="" selected>-- Выбрать --</option>
|
|
<option value="1">1</option>
|
|
<option value="2">2</option>
|
|
<option value="3">3</option>
|
|
<option value="4">4</option>
|
|
<option value="5">5</option>
|
|
<option value="6">6</option>
|
|
<option value="7">7</option>
|
|
<option value="8">8</option>
|
|
<option value="9">9</option>
|
|
<option value="10">10</option>
|
|
<option value="11">11</option>
|
|
</select>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
<div className="px-4 py-3 bg-gray-50 text-right sm:px-6">
|
|
<button
|
|
type="submit"
|
|
className="inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500"
|
|
>
|
|
Зарегистрировать команду
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</>
|
|
);
|
|
};
|
|
|
|
export default RegistrationForm;
|
|
|